]> git.proxmox.com Git - mirror_frr.git/blobdiff - ospf6d/ospf6_intra.h
isisd: implement the 'lsp-generation' notification
[mirror_frr.git] / ospf6d / ospf6_intra.h
index 8a9474a815f7f653a6d58cc45766095b8ab85708..672e288bf3d9248b9e629f4ff68a37be5a05e636 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING.  If not, write to the 
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
- * Boston, MA 02111-1307, USA.  
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #ifndef OSPF6_INTRA_H
 
 /* Debug option */
 extern unsigned char conf_debug_ospf6_brouter;
-extern u_int32_t conf_debug_ospf6_brouter_specific_router_id;
-extern u_int32_t conf_debug_ospf6_brouter_specific_area_id;
+extern uint32_t conf_debug_ospf6_brouter_specific_router_id;
+extern uint32_t conf_debug_ospf6_brouter_specific_area_id;
 #define OSPF6_DEBUG_BROUTER_SUMMARY         0x01
 #define OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER 0x02
 #define OSPF6_DEBUG_BROUTER_SPECIFIC_AREA   0x04
-#define OSPF6_DEBUG_BROUTER_ON() \
-  (conf_debug_ospf6_brouter |= OSPF6_DEBUG_BROUTER_SUMMARY)
-#define OSPF6_DEBUG_BROUTER_OFF() \
-  (conf_debug_ospf6_brouter &= ~OSPF6_DEBUG_BROUTER_SUMMARY)
-#define IS_OSPF6_DEBUG_BROUTER \
-  (conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SUMMARY)
-
-#define OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_ON(router_id)             \
-  do {                                                                \
-    conf_debug_ospf6_brouter_specific_router_id = (router_id);        \
-    conf_debug_ospf6_brouter |= OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER;  \
-  } while (0)
-#define OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_OFF()                     \
-  do {                                                                \
-    conf_debug_ospf6_brouter_specific_router_id = 0;                  \
-    conf_debug_ospf6_brouter &= ~OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER; \
-  } while (0)
-#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER                        \
-  (conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER)
-#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_ID(router_id)          \
-  (IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER &&                          \
-   conf_debug_ospf6_brouter_specific_router_id == (router_id))
-
-#define OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_ON(area_id)                 \
-  do {                                                                \
-    conf_debug_ospf6_brouter_specific_area_id = (area_id);            \
-    conf_debug_ospf6_brouter |= OSPF6_DEBUG_BROUTER_SPECIFIC_AREA;    \
-  } while (0)
-#define OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_OFF()                       \
-  do {                                                                \
-    conf_debug_ospf6_brouter_specific_area_id = 0;                    \
-    conf_debug_ospf6_brouter &= ~OSPF6_DEBUG_BROUTER_SPECIFIC_AREA;   \
-  } while (0)
-#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA                          \
-  (conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SPECIFIC_AREA)
-#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_ID(area_id)              \
-  (IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA &&                            \
-   conf_debug_ospf6_brouter_specific_area_id == (area_id))
+#define OSPF6_DEBUG_BROUTER_ON()                                               \
+       (conf_debug_ospf6_brouter |= OSPF6_DEBUG_BROUTER_SUMMARY)
+#define OSPF6_DEBUG_BROUTER_OFF()                                              \
+       (conf_debug_ospf6_brouter &= ~OSPF6_DEBUG_BROUTER_SUMMARY)
+#define IS_OSPF6_DEBUG_BROUTER                                                 \
+       (conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SUMMARY)
+
+#define OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_ON(router_id)                      \
+       do {                                                                   \
+               conf_debug_ospf6_brouter_specific_router_id = (router_id);     \
+               conf_debug_ospf6_brouter |=                                    \
+                       OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER;                   \
+       } while (0)
+#define OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_OFF()                              \
+       do {                                                                   \
+               conf_debug_ospf6_brouter_specific_router_id = 0;               \
+               conf_debug_ospf6_brouter &=                                    \
+                       ~OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER;                  \
+       } while (0)
+#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER                                 \
+       (conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER)
+#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_ID(router_id)                   \
+       (IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER                                \
+        && conf_debug_ospf6_brouter_specific_router_id == (router_id))
+
+#define OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_ON(area_id)                          \
+       do {                                                                   \
+               conf_debug_ospf6_brouter_specific_area_id = (area_id);         \
+               conf_debug_ospf6_brouter |= OSPF6_DEBUG_BROUTER_SPECIFIC_AREA; \
+       } while (0)
+#define OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_OFF()                                \
+       do {                                                                   \
+               conf_debug_ospf6_brouter_specific_area_id = 0;                 \
+               conf_debug_ospf6_brouter &=                                    \
+                       ~OSPF6_DEBUG_BROUTER_SPECIFIC_AREA;                    \
+       } while (0)
+#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA                                   \
+       (conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SPECIFIC_AREA)
+#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_ID(area_id)                       \
+       (IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA                                  \
+        && conf_debug_ospf6_brouter_specific_area_id == (area_id))
 
 /* Router-LSA */
-struct ospf6_router_lsa
-{
-  u_char bits;
-  u_char options[3];
-  /* followed by ospf6_router_lsdesc(s) */
+#define OSPF6_ROUTER_LSA_MIN_SIZE              4U
+struct ospf6_router_lsa {
+       uint8_t bits;
+       uint8_t options[3];
+       /* followed by ospf6_router_lsdesc(s) */
 };
 
 /* Link State Description in Router-LSA */
-struct ospf6_router_lsdesc
-{
-  u_char    type;
-  u_char    reserved;
-  u_int16_t metric;                /* output cost */
-  u_int32_t interface_id;
-  u_int32_t neighbor_interface_id;
-  u_int32_t neighbor_router_id;
+#define OSPF6_ROUTER_LSDESC_FIX_SIZE          16U
+struct ospf6_router_lsdesc {
+       uint8_t type;
+       uint8_t reserved;
+       uint16_t metric; /* output cost */
+       uint32_t interface_id;
+       uint32_t neighbor_interface_id;
+       uint32_t neighbor_router_id;
 };
 
 #define OSPF6_ROUTER_LSDESC_POINTTOPOINT       1
@@ -92,123 +94,150 @@ struct ospf6_router_lsdesc
 #define OSPF6_ROUTER_LSDESC_STUB_NETWORK       3
 #define OSPF6_ROUTER_LSDESC_VIRTUAL_LINK       4
 
-#define ROUTER_LSDESC_IS_TYPE(t,x)                         \
-  ((((struct ospf6_router_lsdesc *)(x))->type ==           \
-   OSPF6_ROUTER_LSDESC_ ## t) ? 1 : 0)
-#define ROUTER_LSDESC_GET_METRIC(x)                        \
-  (ntohs (((struct ospf6_router_lsdesc *)(x))->metric))
-#define ROUTER_LSDESC_GET_IFID(x)                          \
-  (ntohl (((struct ospf6_router_lsdesc *)(x))->interface_id))
-#define ROUTER_LSDESC_GET_NBR_IFID(x)                      \
-  (ntohl (((struct ospf6_router_lsdesc *)(x))->neighbor_interface_id))
-#define ROUTER_LSDESC_GET_NBR_ROUTERID(x)                  \
-  (((struct ospf6_router_lsdesc *)(x))->neighbor_router_id)
+enum stub_router_mode {
+       OSPF6_NOT_STUB_ROUTER,
+       OSPF6_IS_STUB_ROUTER,
+       OSPF6_IS_STUB_ROUTER_V6,
+};
+
+#define ROUTER_LSDESC_IS_TYPE(t, x)                                            \
+       ((((struct ospf6_router_lsdesc *)(x))->type                            \
+         == OSPF6_ROUTER_LSDESC_##t)                                          \
+                ? 1                                                           \
+                : 0)
+#define ROUTER_LSDESC_GET_METRIC(x)                                            \
+       (ntohs(((struct ospf6_router_lsdesc *)(x))->metric))
+#define ROUTER_LSDESC_GET_IFID(x)                                              \
+       (ntohl(((struct ospf6_router_lsdesc *)(x))->interface_id))
+#define ROUTER_LSDESC_GET_NBR_IFID(x)                                          \
+       (ntohl(((struct ospf6_router_lsdesc *)(x))->neighbor_interface_id))
+#define ROUTER_LSDESC_GET_NBR_ROUTERID(x)                                      \
+       (((struct ospf6_router_lsdesc *)(x))->neighbor_router_id)
 
 /* Network-LSA */
-struct ospf6_network_lsa
-{
-  u_char reserved;
-  u_char options[3];
-  /* followed by ospf6_netowrk_lsd(s) */
+#define OSPF6_NETWORK_LSA_MIN_SIZE             4U
+struct ospf6_network_lsa {
+       uint8_t reserved;
+       uint8_t options[3];
+       /* followed by ospf6_netowrk_lsd(s) */
 };
 
 /* Link State Description in Router-LSA */
-struct ospf6_network_lsdesc
-{
-  u_int32_t router_id;
+#define OSPF6_NETWORK_LSDESC_FIX_SIZE          4U
+struct ospf6_network_lsdesc {
+       uint32_t router_id;
 };
-#define NETWORK_LSDESC_GET_NBR_ROUTERID(x)                  \
-  (((struct ospf6_network_lsdesc *)(x))->router_id)
+#define NETWORK_LSDESC_GET_NBR_ROUTERID(x)                                     \
+       (((struct ospf6_network_lsdesc *)(x))->router_id)
 
 /* Link-LSA */
-struct ospf6_link_lsa
-{
-  u_char          priority;
-  u_char          options[3];
-  struct in6_addr linklocal_addr;
-  u_int32_t       prefix_num;
-  /* followed by ospf6 prefix(es) */
+#define OSPF6_LINK_LSA_MIN_SIZE               24U /* w/o 1st IPv6 prefix */
+struct ospf6_link_lsa {
+       uint8_t priority;
+       uint8_t options[3];
+       struct in6_addr linklocal_addr;
+       uint32_t prefix_num;
+       /* followed by ospf6 prefix(es) */
 };
 
 /* Intra-Area-Prefix-LSA */
-struct ospf6_intra_prefix_lsa
-{
-  u_int16_t prefix_num;
-  u_int16_t ref_type;
-  u_int32_t ref_id;
-  u_int32_t ref_adv_router;
-  /* followed by ospf6 prefix(es) */
+#define OSPF6_INTRA_PREFIX_LSA_MIN_SIZE       12U /* w/o 1st IPv6 prefix */
+struct ospf6_intra_prefix_lsa {
+       uint16_t prefix_num;
+       uint16_t ref_type;
+       uint32_t ref_id;
+       uint32_t ref_adv_router;
+       /* followed by ospf6 prefix(es) */
 };
 
-\f
-#define OSPF6_ROUTER_LSA_SCHEDULE(oa) \
-  do { \
-    if (! (oa)->thread_router_lsa) \
-      (oa)->thread_router_lsa = \
-        thread_add_event (master, ospf6_router_lsa_originate, oa, 0); \
-  } while (0)
-#define OSPF6_NETWORK_LSA_SCHEDULE(oi) \
-  do { \
-    if (! (oi)->thread_network_lsa) \
-      (oi)->thread_network_lsa = \
-        thread_add_event (master, ospf6_network_lsa_originate, oi, 0); \
-  } while (0)
-#define OSPF6_LINK_LSA_SCHEDULE(oi) \
-  do { \
-    if (! (oi)->thread_link_lsa) \
-      (oi)->thread_link_lsa = \
-        thread_add_event (master, ospf6_link_lsa_originate, oi, 0); \
-  } while (0)
-#define OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB(oa) \
-  do { \
-    if (! (oa)->thread_intra_prefix_lsa) \
-      (oa)->thread_intra_prefix_lsa = \
-        thread_add_event (master, ospf6_intra_prefix_lsa_originate_stub, \
-                          oa, 0); \
-  } while (0)
-#define OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT(oi) \
-  do { \
-    if (! (oi)->thread_intra_prefix_lsa) \
-      (oi)->thread_intra_prefix_lsa = \
-        thread_add_event (master, ospf6_intra_prefix_lsa_originate_transit, \
-                          oi, 0); \
-  } while (0)
-
-#define OSPF6_NETWORK_LSA_EXECUTE(oi) \
-  do { \
-    THREAD_OFF ((oi)->thread_network_lsa); \
-    thread_execute (master, ospf6_network_lsa_originate, oi, 0); \
-  } while (0)
-#define OSPF6_INTRA_PREFIX_LSA_EXECUTE_TRANSIT(oi) \
-  do { \
-    THREAD_OFF ((oi)->thread_intra_prefix_lsa); \
-    thread_execute (master, ospf6_intra_prefix_lsa_originate_transit, oi, 0); \
-  } while (0)
 
+#define OSPF6_ROUTER_LSA_SCHEDULE(oa)                                          \
+       do {                                                                   \
+               if (CHECK_FLAG((oa)->flag, OSPF6_AREA_ENABLE))                 \
+                       thread_add_event(master, ospf6_router_lsa_originate,   \
+                                        oa, 0, &(oa)->thread_router_lsa);     \
+       } while (0)
+#define OSPF6_NETWORK_LSA_SCHEDULE(oi)                                         \
+       do {                                                                   \
+               if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE))          \
+                       thread_add_event(master, ospf6_network_lsa_originate,  \
+                                        oi, 0, &(oi)->thread_network_lsa);    \
+       } while (0)
+#define OSPF6_LINK_LSA_SCHEDULE(oi)                                            \
+       do {                                                                   \
+               if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE))          \
+                       thread_add_event(master, ospf6_link_lsa_originate, oi, \
+                                        0, &(oi)->thread_link_lsa);           \
+       } while (0)
+#define OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB(oa)                               \
+       do {                                                                   \
+               if (CHECK_FLAG((oa)->flag, OSPF6_AREA_ENABLE))                 \
+                       thread_add_event(                                      \
+                               master, ospf6_intra_prefix_lsa_originate_stub, \
+                               oa, 0, &(oa)->thread_intra_prefix_lsa);        \
+       } while (0)
+#define OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT(oi)                            \
+       do {                                                                   \
+               if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE))          \
+                       thread_add_event(                                      \
+                               master,                                        \
+                               ospf6_intra_prefix_lsa_originate_transit, oi,  \
+                               0, &(oi)->thread_intra_prefix_lsa);            \
+       } while (0)
+
+#define OSPF6_AS_EXTERN_LSA_SCHEDULE(oi)                                       \
+       do {                                                                   \
+               if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE))          \
+                       thread_add_event(master, ospf6_orig_as_external_lsa,   \
+                                        oi, 0, &(oi)->thread_as_extern_lsa);  \
+       } while (0)
+
+#define OSPF6_NETWORK_LSA_EXECUTE(oi)                                          \
+       do {                                                                   \
+               THREAD_OFF((oi)->thread_network_lsa);                          \
+               thread_execute(master, ospf6_network_lsa_originate, oi, 0);    \
+       } while (0)
+
+#define OSPF6_INTRA_PREFIX_LSA_EXECUTE_TRANSIT(oi)                             \
+       do {                                                                   \
+               THREAD_OFF((oi)->thread_intra_prefix_lsa);                     \
+               thread_execute(master,                                         \
+                              ospf6_intra_prefix_lsa_originate_transit, oi,   \
+                              0);                                             \
+       } while (0)
+
+#define OSPF6_AS_EXTERN_LSA_EXECUTE(oi)                                        \
+       do {                                                                   \
+               THREAD_OFF((oi)->thread_as_extern_lsa);                        \
+               thread_execute(master, ospf6_orig_as_external_lsa, oi, 0);     \
+       } while (0)
 
 /* Function Prototypes */
-char *ospf6_router_lsdesc_lookup (u_char type, u_int32_t interface_id,
-                            u_int32_t neighbor_interface_id,
-                            u_int32_t neighbor_router_id,
-                            struct ospf6_lsa *lsa);
-char *ospf6_network_lsdesc_lookup (u_int32_t router_id,
-                                   struct ospf6_lsa *lsa);
-
-int ospf6_router_lsa_originate (struct thread *);
-int ospf6_network_lsa_originate (struct thread *);
-int ospf6_link_lsa_originate (struct thread *);
-int ospf6_intra_prefix_lsa_originate_transit (struct thread *);
-int ospf6_intra_prefix_lsa_originate_stub (struct thread *);
-void ospf6_intra_prefix_lsa_add (struct ospf6_lsa *lsa);
-void ospf6_intra_prefix_lsa_remove (struct ospf6_lsa *lsa);
-
-void ospf6_intra_route_calculation (struct ospf6_area *oa);
-void ospf6_intra_brouter_calculation (struct ospf6_area *oa);
-
-void ospf6_intra_init ();
-
-int config_write_ospf6_debug_brouter (struct vty *vty);
-void install_element_ospf6_debug_brouter ();
+extern char *ospf6_router_lsdesc_lookup(uint8_t type, uint32_t interface_id,
+                                       uint32_t neighbor_interface_id,
+                                       uint32_t neighbor_router_id,
+                                       struct ospf6_lsa *lsa);
+extern char *ospf6_network_lsdesc_lookup(uint32_t router_id,
+                                        struct ospf6_lsa *lsa);
+
+extern int ospf6_router_is_stub_router(struct ospf6_lsa *lsa);
+extern int ospf6_router_lsa_originate(struct thread *);
+extern int ospf6_network_lsa_originate(struct thread *);
+extern int ospf6_link_lsa_originate(struct thread *);
+extern int ospf6_intra_prefix_lsa_originate_transit(struct thread *);
+extern int ospf6_intra_prefix_lsa_originate_stub(struct thread *);
+extern void ospf6_intra_prefix_lsa_add(struct ospf6_lsa *lsa);
+extern void ospf6_intra_prefix_lsa_remove(struct ospf6_lsa *lsa);
+extern int ospf6_orig_as_external_lsa(struct thread *thread);
+extern void ospf6_intra_route_calculation(struct ospf6_area *oa);
+extern void ospf6_intra_brouter_calculation(struct ospf6_area *oa);
+extern void ospf6_intra_prefix_route_ecmp_path(struct ospf6_area *oa,
+                                              struct ospf6_route *old,
+                                              struct ospf6_route *route);
+
+extern void ospf6_intra_init(void);
+
+extern int config_write_ospf6_debug_brouter(struct vty *vty);
+extern void install_element_ospf6_debug_brouter(void);
 
 #endif /* OSPF6_LSA_H */
-