diff options
Diffstat (limited to 'ospfd/ospf_interface.h')
-rw-r--r-- | ospfd/ospf_interface.h | 463 |
1 files changed, 232 insertions, 231 deletions
diff --git a/ospfd/ospf_interface.h b/ospfd/ospf_interface.h index afb282010..d4b495b20 100644 --- a/ospfd/ospf_interface.h +++ b/ospfd/ospf_interface.h @@ -38,87 +38,93 @@ /* Test whether an OSPF interface parameter is set, generally, given some * existing ospf interface */ -#define OSPF_IF_PARAM_IS_SET(O,P) \ - (OSPF_IF_PARAM_CONFIGURED ((O)->params, P) || \ - OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS((O)->ifp)->P)) +#define OSPF_IF_PARAM_IS_SET(O, P) \ + (OSPF_IF_PARAM_CONFIGURED((O)->params, P) \ + || OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS((O)->ifp)->P)) -#define OSPF_IF_PARAM(O, P) \ - (OSPF_IF_PARAM_CONFIGURED ((O)->params, P)?\ - (O)->params->P:IF_DEF_PARAMS((O)->ifp)->P) +#define OSPF_IF_PARAM(O, P) \ + (OSPF_IF_PARAM_CONFIGURED((O)->params, P) \ + ? (O)->params->P \ + : IF_DEF_PARAMS((O)->ifp)->P) #define DECLARE_IF_PARAM(T, P) T P; u_char P##__config:1 #define UNSET_IF_PARAM(S, P) ((S)->P##__config) = 0 #define SET_IF_PARAM(S, P) ((S)->P##__config) = 1 -struct ospf_if_params -{ - DECLARE_IF_PARAM (u_int32_t, transmit_delay); /* Interface Transmisson Delay */ - DECLARE_IF_PARAM (u_int32_t, output_cost_cmd);/* Command Interface Output Cost */ - DECLARE_IF_PARAM (u_int32_t, retransmit_interval); /* Retransmission Interval */ - DECLARE_IF_PARAM (u_char, passive_interface); /* OSPF Interface is passive: no sending or receiving (no need to join multicast groups) */ - DECLARE_IF_PARAM (u_char, priority); /* OSPF Interface priority */ - /* Enable OSPF on this interface with area if_area */ - DECLARE_IF_PARAM (struct in_addr, if_area); - DECLARE_IF_PARAM (u_char, type); /* type of interface */ +struct ospf_if_params { + DECLARE_IF_PARAM(u_int32_t, + transmit_delay); /* Interface Transmisson Delay */ + DECLARE_IF_PARAM(u_int32_t, + output_cost_cmd); /* Command Interface Output Cost */ + DECLARE_IF_PARAM(u_int32_t, + retransmit_interval); /* Retransmission Interval */ + DECLARE_IF_PARAM(u_char, passive_interface); /* OSPF Interface is + passive: no sending or + receiving (no need to + join multicast groups) + */ + DECLARE_IF_PARAM(u_char, priority); /* OSPF Interface priority */ + /* Enable OSPF on this interface with area if_area */ + DECLARE_IF_PARAM(struct in_addr, if_area); + DECLARE_IF_PARAM(u_char, type); /* type of interface */ #define OSPF_IF_ACTIVE 0 #define OSPF_IF_PASSIVE 1 -#define OSPF_IF_PASSIVE_STATUS(O) \ - (OSPF_IF_PARAM_CONFIGURED((O)->params, passive_interface) ? \ - (O)->params->passive_interface : \ - (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS((O)->ifp), passive_interface) ? \ - IF_DEF_PARAMS((O)->ifp)->passive_interface : \ - (O)->ospf->passive_interface_default)) - - DECLARE_IF_PARAM (u_int32_t, v_hello); /* Hello Interval */ - DECLARE_IF_PARAM (u_int32_t, v_wait); /* Router Dead Interval */ - - /* MTU mismatch check (see RFC2328, chap 10.6) */ - DECLARE_IF_PARAM (u_char, mtu_ignore); - - /* Fast-Hellos */ - DECLARE_IF_PARAM (u_char, fast_hello); - - /* Authentication data. */ - u_char auth_simple[OSPF_AUTH_SIMPLE_SIZE + 1]; /* Simple password. */ - u_char auth_simple__config:1; - - DECLARE_IF_PARAM (struct list *, auth_crypt); /* List of Auth cryptographic data. */ - DECLARE_IF_PARAM (int, auth_type); /* OSPF authentication type */ - - /* Other, non-configuration state */ - u_int32_t network_lsa_seqnum; /* Network LSA seqnum */ - - /* BFD configuration */ - struct bfd_info *bfd_info; +#define OSPF_IF_PASSIVE_STATUS(O) \ + (OSPF_IF_PARAM_CONFIGURED((O)->params, passive_interface) \ + ? (O)->params->passive_interface \ + : (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS((O)->ifp), \ + passive_interface) \ + ? IF_DEF_PARAMS((O)->ifp)->passive_interface \ + : (O)->ospf->passive_interface_default)) + + DECLARE_IF_PARAM(u_int32_t, v_hello); /* Hello Interval */ + DECLARE_IF_PARAM(u_int32_t, v_wait); /* Router Dead Interval */ + + /* MTU mismatch check (see RFC2328, chap 10.6) */ + DECLARE_IF_PARAM(u_char, mtu_ignore); + + /* Fast-Hellos */ + DECLARE_IF_PARAM(u_char, fast_hello); + + /* Authentication data. */ + u_char auth_simple[OSPF_AUTH_SIMPLE_SIZE + 1]; /* Simple password. */ + u_char auth_simple__config : 1; + + DECLARE_IF_PARAM(struct list *, + auth_crypt); /* List of Auth cryptographic data. */ + DECLARE_IF_PARAM(int, auth_type); /* OSPF authentication type */ + + /* Other, non-configuration state */ + u_int32_t network_lsa_seqnum; /* Network LSA seqnum */ + + /* BFD configuration */ + struct bfd_info *bfd_info; }; -enum -{ - MEMBER_ALLROUTERS = 0, - MEMBER_DROUTERS, - MEMBER_MAX, +enum { MEMBER_ALLROUTERS = 0, + MEMBER_DROUTERS, + MEMBER_MAX, }; -struct ospf_if_info -{ - struct ospf_if_params *def_params; - struct route_table *params; - struct route_table *oifs; - unsigned int membership_counts[MEMBER_MAX]; /* multicast group refcnts */ +struct ospf_if_info { + struct ospf_if_params *def_params; + struct route_table *params; + struct route_table *oifs; + unsigned int + membership_counts[MEMBER_MAX]; /* multicast group refcnts */ }; struct ospf_interface; -struct ospf_vl_data -{ - struct in_addr vl_peer; /* Router-ID of the peer */ - struct in_addr vl_area_id; /* Transit area */ - int vl_area_id_fmt; /* Area ID format */ - struct ospf_interface *vl_oi; /* Interface data structure */ - struct vertex_nexthop nexthop; /* Nexthop router and oi to use */ - struct in_addr peer_addr; /* Address used to reach the peer */ - u_char flags; +struct ospf_vl_data { + struct in_addr vl_peer; /* Router-ID of the peer */ + struct in_addr vl_area_id; /* Transit area */ + int vl_area_id_fmt; /* Area ID format */ + struct ospf_interface *vl_oi; /* Interface data structure */ + struct vertex_nexthop nexthop; /* Nexthop router and oi to use */ + struct in_addr peer_addr; /* Address used to reach the peer */ + u_char flags; }; @@ -127,198 +133,193 @@ struct ospf_vl_data #define OSPF_VL_FLAG_APPROVED 0x01 -struct crypt_key -{ - u_char key_id; - u_char auth_key[OSPF_AUTH_MD5_SIZE + 1]; +struct crypt_key { + u_char key_id; + u_char auth_key[OSPF_AUTH_MD5_SIZE + 1]; }; /* OSPF interface structure. */ -struct ospf_interface -{ - /* This interface's parent ospf instance. */ - struct ospf *ospf; +struct ospf_interface { + /* This interface's parent ospf instance. */ + struct ospf *ospf; - /* OSPF Area. */ - struct ospf_area *area; + /* OSPF Area. */ + struct ospf_area *area; - /* Position range in Router LSA */ - uint16_t lsa_pos_beg; /* inclusive, >= */ - uint16_t lsa_pos_end; /* exclusive, < */ + /* Position range in Router LSA */ + uint16_t lsa_pos_beg; /* inclusive, >= */ + uint16_t lsa_pos_end; /* exclusive, < */ - /* Interface data from zebra. */ - struct interface *ifp; - struct ospf_vl_data *vl_data; /* Data for Virtual Link */ - - /* Packet send buffer. */ - struct ospf_fifo *obuf; /* Output queue */ + /* Interface data from zebra. */ + struct interface *ifp; + struct ospf_vl_data *vl_data; /* Data for Virtual Link */ - /* OSPF Network Type. */ - u_char type; + /* Packet send buffer. */ + struct ospf_fifo *obuf; /* Output queue */ - /* State of Interface State Machine. */ - u_char state; + /* OSPF Network Type. */ + u_char type; - /* To which multicast groups do we currently belong? */ - u_char multicast_memberships; + /* State of Interface State Machine. */ + u_char state; + + /* To which multicast groups do we currently belong? */ + u_char multicast_memberships; #define OI_MEMBER_FLAG(M) (1 << (M)) #define OI_MEMBER_COUNT(O,M) (IF_OSPF_IF_INFO(oi->ifp)->membership_counts[(M)]) -#define OI_MEMBER_CHECK(O,M) \ - (CHECK_FLAG((O)->multicast_memberships, OI_MEMBER_FLAG(M))) -#define OI_MEMBER_JOINED(O,M) \ - do { \ - SET_FLAG ((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \ - IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]++; \ - } while (0) -#define OI_MEMBER_LEFT(O,M) \ - do { \ - UNSET_FLAG ((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \ - IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]--; \ - } while (0) - - struct prefix *address; /* Interface prefix */ - struct connected *connected; /* Pointer to connected */ - - /* Configured varables. */ - struct ospf_if_params *params; - - u_int32_t crypt_seqnum; /* Cryptographic Sequence Number */ - u_int32_t output_cost; /* Acutual Interface Output Cost */ - - /* Neighbor information. */ - struct route_table *nbrs; /* OSPF Neighbor List */ - struct ospf_neighbor *nbr_self; /* Neighbor Self */ +#define OI_MEMBER_CHECK(O, M) \ + (CHECK_FLAG((O)->multicast_memberships, OI_MEMBER_FLAG(M))) +#define OI_MEMBER_JOINED(O, M) \ + do { \ + SET_FLAG((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \ + IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]++; \ + } while (0) +#define OI_MEMBER_LEFT(O, M) \ + do { \ + UNSET_FLAG((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \ + IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]--; \ + } while (0) + + struct prefix *address; /* Interface prefix */ + struct connected *connected; /* Pointer to connected */ + + /* Configured varables. */ + struct ospf_if_params *params; + + u_int32_t crypt_seqnum; /* Cryptographic Sequence Number */ + u_int32_t output_cost; /* Acutual Interface Output Cost */ + + /* Neighbor information. */ + struct route_table *nbrs; /* OSPF Neighbor List */ + struct ospf_neighbor *nbr_self; /* Neighbor Self */ + /* $FRR indent$ */ + /* clang-format off */ #define DR(I) ((I)->nbr_self->d_router) #define BDR(I) ((I)->nbr_self->bd_router) #define OPTIONS(I) ((I)->nbr_self->options) #define PRIORITY(I) ((I)->nbr_self->priority) - /* List of configured NBMA neighbor. */ - struct list *nbr_nbma; - - /* self-originated LSAs. */ - struct ospf_lsa *network_lsa_self; /* network-LSA. */ - struct list *opaque_lsa_self; /* Type-9 Opaque-LSAs */ - - struct route_table *ls_upd_queue; - - struct list *ls_ack; /* Link State Acknowledgment list. */ - - struct - { - struct list *ls_ack; - struct in_addr dst; - } ls_ack_direct; - - /* Timer values. */ - u_int32_t v_ls_ack; /* Delayed Link State Acknowledgment */ - - /* Threads. */ - struct thread *t_hello; /* timer */ - struct thread *t_wait; /* timer */ - struct thread *t_ls_ack; /* timer */ - struct thread *t_ls_ack_direct; /* event */ - struct thread *t_ls_upd_event; /* event */ - struct thread *t_opaque_lsa_self; /* Type-9 Opaque-LSAs */ - - int on_write_q; - - /* Statistics fields. */ - u_int32_t hello_in; /* Hello message input count. */ - u_int32_t hello_out; /* Hello message output count. */ - u_int32_t db_desc_in; /* database desc. message input count. */ - u_int32_t db_desc_out; /* database desc. message output count. */ - u_int32_t ls_req_in; /* LS request message input count. */ - u_int32_t ls_req_out; /* LS request message output count. */ - u_int32_t ls_upd_in; /* LS update message input count. */ - u_int32_t ls_upd_out; /* LS update message output count. */ - u_int32_t ls_ack_in; /* LS Ack message input count. */ - u_int32_t ls_ack_out; /* LS Ack message output count. */ - u_int32_t discarded; /* discarded input count by error. */ - u_int32_t state_change; /* Number of status change. */ - - u_int32_t full_nbrs; - - QOBJ_FIELDS + /* List of configured NBMA neighbor. */ + struct list *nbr_nbma; + + /* self-originated LSAs. */ + struct ospf_lsa *network_lsa_self; /* network-LSA. */ + struct list *opaque_lsa_self; /* Type-9 Opaque-LSAs */ + + struct route_table *ls_upd_queue; + + struct list *ls_ack; /* Link State Acknowledgment list. */ + + struct { + struct list *ls_ack; + struct in_addr dst; + } ls_ack_direct; + + /* Timer values. */ + u_int32_t v_ls_ack; /* Delayed Link State Acknowledgment */ + + /* Threads. */ + struct thread *t_hello; /* timer */ + struct thread *t_wait; /* timer */ + struct thread *t_ls_ack; /* timer */ + struct thread *t_ls_ack_direct; /* event */ + struct thread *t_ls_upd_event; /* event */ + struct thread *t_opaque_lsa_self; /* Type-9 Opaque-LSAs */ + + int on_write_q; + + /* Statistics fields. */ + u_int32_t hello_in; /* Hello message input count. */ + u_int32_t hello_out; /* Hello message output count. */ + u_int32_t db_desc_in; /* database desc. message input count. */ + u_int32_t db_desc_out; /* database desc. message output count. */ + u_int32_t ls_req_in; /* LS request message input count. */ + u_int32_t ls_req_out; /* LS request message output count. */ + u_int32_t ls_upd_in; /* LS update message input count. */ + u_int32_t ls_upd_out; /* LS update message output count. */ + u_int32_t ls_ack_in; /* LS Ack message input count. */ + u_int32_t ls_ack_out; /* LS Ack message output count. */ + u_int32_t discarded; /* discarded input count by error. */ + u_int32_t state_change; /* Number of status change. */ + + u_int32_t full_nbrs; + + QOBJ_FIELDS }; DECLARE_QOBJ_TYPE(ospf_interface) /* Prototypes. */ -extern char *ospf_if_name (struct ospf_interface *); -extern struct ospf_interface *ospf_if_new (struct ospf *, struct interface *, - struct prefix *); -extern void ospf_if_cleanup (struct ospf_interface *); -extern void ospf_if_free (struct ospf_interface *); -extern int ospf_if_up (struct ospf_interface *); -extern int ospf_if_down (struct ospf_interface *); - -extern int ospf_if_is_up (struct ospf_interface *); -extern struct ospf_interface *ospf_if_exists (struct ospf_interface *); -extern struct ospf_interface *ospf_if_lookup_by_lsa_pos (struct ospf_area *, - int); -extern struct ospf_interface *ospf_if_lookup_by_local_addr (struct ospf *, - struct interface - *, - struct in_addr); -extern struct ospf_interface *ospf_if_lookup_by_prefix (struct ospf *, - struct prefix_ipv4 *); -extern struct ospf_interface *ospf_if_table_lookup (struct interface *, - struct prefix *); -extern struct ospf_interface *ospf_if_addr_local (struct in_addr); -extern struct ospf_interface *ospf_if_lookup_recv_if (struct ospf *, - struct in_addr, - struct interface *); -extern struct ospf_interface *ospf_if_is_configured (struct ospf *, - struct in_addr *); - -extern struct ospf_if_params *ospf_lookup_if_params (struct interface *, - struct in_addr); -extern struct ospf_if_params *ospf_get_if_params (struct interface *, - struct in_addr); -extern void ospf_del_if_params (struct ospf_if_params *); -extern void ospf_free_if_params (struct interface *, struct in_addr); -extern void ospf_if_update_params (struct interface *, struct in_addr); - -extern int ospf_if_new_hook (struct interface *); -extern void ospf_if_init (void); -extern void ospf_if_stream_set (struct ospf_interface *); -extern void ospf_if_stream_unset (struct ospf_interface *); -extern void ospf_if_reset_variables (struct ospf_interface *); -extern int ospf_if_is_enable (struct ospf_interface *); -extern int ospf_if_get_output_cost (struct ospf_interface *); -extern void ospf_if_recalculate_output_cost (struct interface *); +extern char *ospf_if_name(struct ospf_interface *); +extern struct ospf_interface *ospf_if_new(struct ospf *, struct interface *, + struct prefix *); +extern void ospf_if_cleanup(struct ospf_interface *); +extern void ospf_if_free(struct ospf_interface *); +extern int ospf_if_up(struct ospf_interface *); +extern int ospf_if_down(struct ospf_interface *); + +extern int ospf_if_is_up(struct ospf_interface *); +extern struct ospf_interface *ospf_if_exists(struct ospf_interface *); +extern struct ospf_interface *ospf_if_lookup_by_lsa_pos(struct ospf_area *, + int); +extern struct ospf_interface * +ospf_if_lookup_by_local_addr(struct ospf *, struct interface *, struct in_addr); +extern struct ospf_interface *ospf_if_lookup_by_prefix(struct ospf *, + struct prefix_ipv4 *); +extern struct ospf_interface *ospf_if_table_lookup(struct interface *, + struct prefix *); +extern struct ospf_interface *ospf_if_addr_local(struct in_addr); +extern struct ospf_interface * +ospf_if_lookup_recv_if(struct ospf *, struct in_addr, struct interface *); +extern struct ospf_interface *ospf_if_is_configured(struct ospf *, + struct in_addr *); + +extern struct ospf_if_params *ospf_lookup_if_params(struct interface *, + struct in_addr); +extern struct ospf_if_params *ospf_get_if_params(struct interface *, + struct in_addr); +extern void ospf_del_if_params(struct ospf_if_params *); +extern void ospf_free_if_params(struct interface *, struct in_addr); +extern void ospf_if_update_params(struct interface *, struct in_addr); + +extern int ospf_if_new_hook(struct interface *); +extern void ospf_if_init(void); +extern void ospf_if_stream_set(struct ospf_interface *); +extern void ospf_if_stream_unset(struct ospf_interface *); +extern void ospf_if_reset_variables(struct ospf_interface *); +extern int ospf_if_is_enable(struct ospf_interface *); +extern int ospf_if_get_output_cost(struct ospf_interface *); +extern void ospf_if_recalculate_output_cost(struct interface *); /* Simulate down/up on the interface. */ -extern void ospf_if_reset (struct interface *); - -extern struct ospf_interface *ospf_vl_new (struct ospf *, - struct ospf_vl_data *); -extern struct ospf_vl_data *ospf_vl_data_new (struct ospf_area *, - struct in_addr); -extern struct ospf_vl_data *ospf_vl_lookup (struct ospf *, struct ospf_area *, - struct in_addr); -extern void ospf_vl_data_free (struct ospf_vl_data *); -extern void ospf_vl_add (struct ospf *, struct ospf_vl_data *); -extern void ospf_vl_delete (struct ospf *, struct ospf_vl_data *); -extern void ospf_vl_up_check (struct ospf_area *, struct in_addr, - struct vertex *); -extern void ospf_vl_unapprove (struct ospf *); -extern void ospf_vl_shut_unapproved (struct ospf *); -extern int ospf_full_virtual_nbrs (struct ospf_area *); -extern int ospf_vls_in_area (struct ospf_area *); - -extern struct crypt_key *ospf_crypt_key_lookup (struct list *, u_char); -extern struct crypt_key *ospf_crypt_key_new (void); -extern void ospf_crypt_key_add (struct list *, struct crypt_key *); -extern int ospf_crypt_key_delete (struct list *, u_char); - -extern u_char ospf_default_iftype (struct interface *ifp); +extern void ospf_if_reset(struct interface *); + +extern struct ospf_interface *ospf_vl_new(struct ospf *, struct ospf_vl_data *); +extern struct ospf_vl_data *ospf_vl_data_new(struct ospf_area *, + struct in_addr); +extern struct ospf_vl_data *ospf_vl_lookup(struct ospf *, struct ospf_area *, + struct in_addr); +extern void ospf_vl_data_free(struct ospf_vl_data *); +extern void ospf_vl_add(struct ospf *, struct ospf_vl_data *); +extern void ospf_vl_delete(struct ospf *, struct ospf_vl_data *); +extern void ospf_vl_up_check(struct ospf_area *, struct in_addr, + struct vertex *); +extern void ospf_vl_unapprove(struct ospf *); +extern void ospf_vl_shut_unapproved(struct ospf *); +extern int ospf_full_virtual_nbrs(struct ospf_area *); +extern int ospf_vls_in_area(struct ospf_area *); + +extern struct crypt_key *ospf_crypt_key_lookup(struct list *, u_char); +extern struct crypt_key *ospf_crypt_key_new(void); +extern void ospf_crypt_key_add(struct list *, struct crypt_key *); +extern int ospf_crypt_key_delete(struct list *, u_char); + +extern u_char ospf_default_iftype(struct interface *ifp); /* Set all multicast memberships appropriately based on the type and state of the interface. */ -extern void ospf_if_set_multicast (struct ospf_interface *); +extern void ospf_if_set_multicast(struct ospf_interface *); -DECLARE_HOOK(ospf_vl_add, (struct ospf_vl_data *vd), (vd)) -DECLARE_HOOK(ospf_vl_delete, (struct ospf_vl_data *vd), (vd)) +DECLARE_HOOK(ospf_vl_add, (struct ospf_vl_data * vd), (vd)) +DECLARE_HOOK(ospf_vl_delete, (struct ospf_vl_data * vd), (vd)) #endif /* _ZEBRA_OSPF_INTERFACE_H */ |