Annotation of embedaddon/quagga/ospfd/ospf_interface.h, revision 1.1.1.3

1.1       misho       1: /*
                      2:  * OSPF Interface functions.
                      3:  * Copyright (C) 1999 Toshiaki Takada
                      4:  *
                      5:  * This file is part of GNU Zebra.
                      6:  * 
                      7:  * GNU Zebra is free software; you can redistribute it and/or modify
                      8:  * it under the terms of the GNU General Public License as published
                      9:  * by the Free Software Foundation; either version 2, or (at your
                     10:  * option) any later version.
                     11:  *
                     12:  * GNU Zebra is distributed in the hope that it will be useful, but
                     13:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     15:  * General Public License for more details.
                     16:  *
                     17:  * You should have received a copy of the GNU General Public License
                     18:  * along with GNU Zebra; see the file COPYING.  If not, write to the
                     19:  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
                     20:  * Boston, MA 02111-1307, USA.
                     21:  */
                     22: 
                     23: #ifndef _ZEBRA_OSPF_INTERFACE_H
                     24: #define _ZEBRA_OSPF_INTERFACE_H
                     25: 
                     26: #include "ospfd/ospf_packet.h"
                     27: #include "ospfd/ospf_spf.h"
                     28: 
                     29: #define IF_OSPF_IF_INFO(I) ((struct ospf_if_info *)((I)->info))
                     30: #define IF_DEF_PARAMS(I) (IF_OSPF_IF_INFO (I)->def_params)
                     31: #define IF_OIFS(I)  (IF_OSPF_IF_INFO (I)->oifs)
                     32: #define IF_OIFS_PARAMS(I) (IF_OSPF_IF_INFO (I)->params)
1.1.1.3 ! misho      33: 
        !            34: /* Despite the name, this macro probably is for specialist use only */
1.1       misho      35: #define OSPF_IF_PARAM_CONFIGURED(S, P) ((S) && (S)->P##__config)
1.1.1.3 ! misho      36: 
        !            37: /* Test whether an OSPF interface parameter is set, generally, given some
        !            38:  * existing ospf interface
        !            39:  */
        !            40: #define OSPF_IF_PARAM_IS_SET(O,P) \
        !            41:       (OSPF_IF_PARAM_CONFIGURED ((O)->params, P) || \
        !            42:       OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS((O)->ifp)->P))
        !            43: 
1.1       misho      44: #define OSPF_IF_PARAM(O, P) \
                     45:         (OSPF_IF_PARAM_CONFIGURED ((O)->params, P)?\
                     46:                         (O)->params->P:IF_DEF_PARAMS((O)->ifp)->P)
                     47: 
                     48: #define DECLARE_IF_PARAM(T, P) T P; u_char P##__config:1
                     49: #define UNSET_IF_PARAM(S, P) ((S)->P##__config) = 0
                     50: #define SET_IF_PARAM(S, P) ((S)->P##__config) = 1
                     51: 
                     52: struct ospf_if_params
                     53: {
                     54:   DECLARE_IF_PARAM (u_int32_t, transmit_delay); /* Interface Transmisson Delay */
                     55:   DECLARE_IF_PARAM (u_int32_t, output_cost_cmd);/* Command Interface Output Cost */
                     56:   DECLARE_IF_PARAM (u_int32_t, retransmit_interval); /* Retransmission Interval */
                     57:   DECLARE_IF_PARAM (u_char, passive_interface);      /* OSPF Interface is passive: no sending or receiving (no need to join multicast groups) */
                     58:   DECLARE_IF_PARAM (u_char, priority);               /* OSPF Interface priority */
1.1.1.3 ! misho      59:   DECLARE_IF_PARAM (struct in_addr, if_area);        /* Enable OSPF on this interface with area if_area */
1.1       misho      60:   DECLARE_IF_PARAM (u_char, type);                   /* type of interface */
                     61: #define OSPF_IF_ACTIVE                  0
                     62: #define OSPF_IF_PASSIVE                        1
                     63: 
                     64: #define OSPF_IF_PASSIVE_STATUS(O) \
                     65:        (OSPF_IF_PARAM_CONFIGURED((O)->params, passive_interface) ? \
                     66:          (O)->params->passive_interface : \
                     67:          (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS((O)->ifp), passive_interface) ? \
                     68:            IF_DEF_PARAMS((O)->ifp)->passive_interface : \
                     69:            (O)->ospf->passive_interface_default))
                     70:   
                     71:   DECLARE_IF_PARAM (u_int32_t, v_hello);             /* Hello Interval */
                     72:   DECLARE_IF_PARAM (u_int32_t, v_wait);              /* Router Dead Interval */
                     73: 
                     74:   /* MTU mismatch check (see RFC2328, chap 10.6) */ 
                     75:   DECLARE_IF_PARAM (u_char, mtu_ignore);
                     76:   
                     77:   /* Fast-Hellos */
                     78:   DECLARE_IF_PARAM (u_char, fast_hello);
                     79:   
                     80:   /* Authentication data. */
                     81:   u_char auth_simple[OSPF_AUTH_SIMPLE_SIZE + 1];       /* Simple password. */
                     82:   u_char auth_simple__config:1;
                     83:   
                     84:   DECLARE_IF_PARAM (struct list *, auth_crypt);    /* List of Auth cryptographic data. */
                     85:   DECLARE_IF_PARAM (int, auth_type);               /* OSPF authentication type */
                     86:   
                     87:   /* Other, non-configuration state */
                     88:   u_int32_t network_lsa_seqnum;                /* Network LSA seqnum */
                     89: };
                     90: 
                     91: enum
                     92: {
                     93:   MEMBER_ALLROUTERS = 0,
                     94:   MEMBER_DROUTERS,
                     95:   MEMBER_MAX,
                     96: };
                     97: 
                     98: struct ospf_if_info
                     99: {
                    100:   struct ospf_if_params *def_params;
                    101:   struct route_table *params;
                    102:   struct route_table *oifs;
                    103:   unsigned int membership_counts[MEMBER_MAX];  /* multicast group refcnts */
                    104: };
                    105: 
                    106: struct ospf_interface;
                    107: 
                    108: struct ospf_vl_data
                    109: {
                    110:   struct in_addr    vl_peer;      /* Router-ID of the peer for VLs. */
                    111:   struct in_addr    vl_area_id;           /* Transit area for this VL. */
                    112:   int format;                      /* area ID format */
                    113:   struct ospf_interface *vl_oi;           /* Interface data structure for the VL. */
                    114:   struct vertex_nexthop nexthop;   /* Nexthop router and oi to use */
                    115:   struct in_addr    peer_addr;    /* Address used to reach the peer. */
                    116:   u_char flags;
                    117: };
                    118: 
                    119: 
                    120: #define OSPF_VL_MAX_COUNT 256
                    121: #define OSPF_VL_MTU      1500
                    122: 
                    123: #define OSPF_VL_FLAG_APPROVED 0x01
                    124: 
                    125: struct crypt_key
                    126: {
                    127:   u_char key_id;
                    128:   u_char auth_key[OSPF_AUTH_MD5_SIZE + 1];
                    129: };
                    130: 
                    131: /* OSPF interface structure. */
                    132: struct ospf_interface
                    133: {
                    134:   /* This interface's parent ospf instance. */
                    135:   struct ospf *ospf;
                    136: 
                    137:   /* OSPF Area. */
                    138:   struct ospf_area *area;
                    139: 
1.1.1.2   misho     140:   /* Position range in Router LSA */
                    141:   uint16_t lsa_pos_beg; /* inclusive, >= */
                    142:   uint16_t lsa_pos_end; /* exclusive, <  */
                    143: 
1.1       misho     144:   /* Interface data from zebra. */
                    145:   struct interface *ifp;
                    146:   struct ospf_vl_data *vl_data;                /* Data for Virtual Link */
                    147:   
                    148:   /* Packet send buffer. */
                    149:   struct ospf_fifo *obuf;              /* Output queue */
                    150: 
                    151:   /* OSPF Network Type. */
                    152:   u_char type;
                    153: 
                    154:   /* State of Interface State Machine. */
                    155:   u_char state;
                    156: 
                    157:   /* To which multicast groups do we currently belong? */
                    158:   u_char multicast_memberships;
                    159: #define OI_MEMBER_FLAG(M) (1 << (M))
                    160: #define OI_MEMBER_COUNT(O,M) (IF_OSPF_IF_INFO(oi->ifp)->membership_counts[(M)])
                    161: #define OI_MEMBER_CHECK(O,M) \
                    162:     (CHECK_FLAG((O)->multicast_memberships, OI_MEMBER_FLAG(M)))
                    163: #define OI_MEMBER_JOINED(O,M) \
                    164:   do { \
                    165:     SET_FLAG ((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \
                    166:     IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]++; \
                    167:   } while (0)
                    168: #define OI_MEMBER_LEFT(O,M) \
                    169:   do { \
                    170:     UNSET_FLAG ((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \
                    171:     IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]--; \
                    172:   } while (0)
                    173: 
                    174:   struct prefix *address;              /* Interface prefix */
                    175:   struct connected *connected;          /* Pointer to connected */ 
                    176: 
                    177:   /* Configured varables. */
                    178:   struct ospf_if_params *params;
                    179:   
                    180:   u_int32_t crypt_seqnum;              /* Cryptographic Sequence Number */ 
                    181:   u_int32_t output_cost;               /* Acutual Interface Output Cost */
                    182: 
                    183:   /* Neighbor information. */
                    184:   struct route_table *nbrs;             /* OSPF Neighbor List */
                    185:   struct ospf_neighbor *nbr_self;      /* Neighbor Self */
                    186: #define DR(I)                  ((I)->nbr_self->d_router)
                    187: #define BDR(I)                 ((I)->nbr_self->bd_router)
                    188: #define OPTIONS(I)             ((I)->nbr_self->options)
                    189: #define PRIORITY(I)            ((I)->nbr_self->priority)
                    190: 
                    191:   /* List of configured NBMA neighbor. */
                    192:   struct list *nbr_nbma;
                    193: 
                    194:   /* self-originated LSAs. */
                    195:   struct ospf_lsa *network_lsa_self;   /* network-LSA. */
                    196:   struct list *opaque_lsa_self;                        /* Type-9 Opaque-LSAs */
                    197: 
                    198:   struct route_table *ls_upd_queue;
                    199: 
                    200:   struct list *ls_ack;                 /* Link State Acknowledgment list. */
                    201:   
                    202:   struct
                    203:   {
                    204:     struct list *ls_ack;
                    205:     struct in_addr dst;
                    206:   } ls_ack_direct;
                    207: 
                    208:   /* Timer values. */
                    209:   u_int32_t v_ls_ack;                  /* Delayed Link State Acknowledgment */
                    210: 
                    211:   /* Threads. */
                    212:   struct thread *t_hello;               /* timer */
                    213:   struct thread *t_wait;                /* timer */
                    214:   struct thread *t_ls_ack;              /* timer */
                    215:   struct thread *t_ls_ack_direct;       /* event */
                    216:   struct thread *t_ls_upd_event;        /* event */
                    217:   struct thread *t_opaque_lsa_self;     /* Type-9 Opaque-LSAs */
                    218: 
                    219:   int on_write_q;
                    220:   
                    221:   /* Statistics fields. */
                    222:   u_int32_t hello_in;          /* Hello message input count. */
                    223:   u_int32_t hello_out;         /* Hello message output count. */
                    224:   u_int32_t db_desc_in;         /* database desc. message input count. */
                    225:   u_int32_t db_desc_out;        /* database desc. message output count. */
                    226:   u_int32_t ls_req_in;          /* LS request message input count. */
                    227:   u_int32_t ls_req_out;         /* LS request message output count. */
                    228:   u_int32_t ls_upd_in;          /* LS update message input count. */
                    229:   u_int32_t ls_upd_out;         /* LS update message output count. */
                    230:   u_int32_t ls_ack_in;          /* LS Ack message input count. */
                    231:   u_int32_t ls_ack_out;         /* LS Ack message output count. */
                    232:   u_int32_t discarded;         /* discarded input count by error. */
                    233:   u_int32_t state_change;      /* Number of status change. */
                    234: 
                    235:   u_int32_t full_nbrs;
                    236: };
                    237: 
                    238: /* Prototypes. */
                    239: extern char *ospf_if_name (struct ospf_interface *);
                    240: extern struct ospf_interface *ospf_if_new (struct ospf *, struct interface *,
                    241:                                           struct prefix *);
                    242: extern void ospf_if_cleanup (struct ospf_interface *);
                    243: extern void ospf_if_free (struct ospf_interface *);
                    244: extern int ospf_if_up (struct ospf_interface *);
                    245: extern int ospf_if_down (struct ospf_interface *);
                    246: 
                    247: extern int ospf_if_is_up (struct ospf_interface *);
                    248: extern struct ospf_interface *ospf_if_exists (struct ospf_interface *);
1.1.1.2   misho     249: extern struct ospf_interface *ospf_if_lookup_by_lsa_pos (struct ospf_area *,
                    250:                                                         int);
1.1       misho     251: extern struct ospf_interface *ospf_if_lookup_by_local_addr (struct ospf *,
                    252:                                                            struct interface
                    253:                                                            *,
                    254:                                                            struct in_addr);
                    255: extern struct ospf_interface *ospf_if_lookup_by_prefix (struct ospf *,
                    256:                                                        struct prefix_ipv4 *);
                    257: extern struct ospf_interface *ospf_if_table_lookup (struct interface *,
                    258:                                                    struct prefix *);
                    259: extern struct ospf_interface *ospf_if_addr_local (struct in_addr);
                    260: extern struct ospf_interface *ospf_if_lookup_recv_if (struct ospf *,
                    261:                                                      struct in_addr,
                    262:                                                      struct interface *);
                    263: extern struct ospf_interface *ospf_if_is_configured (struct ospf *,
                    264:                                                     struct in_addr *);
                    265: 
                    266: extern struct ospf_if_params *ospf_lookup_if_params (struct interface *,
                    267:                                                     struct in_addr);
                    268: extern struct ospf_if_params *ospf_get_if_params (struct interface *,
                    269:                                                  struct in_addr);
                    270: extern void ospf_del_if_params (struct ospf_if_params *);
                    271: extern void ospf_free_if_params (struct interface *, struct in_addr);
                    272: extern void ospf_if_update_params (struct interface *, struct in_addr);
                    273: 
                    274: extern int ospf_if_new_hook (struct interface *);
                    275: extern void ospf_if_init (void);
                    276: extern void ospf_if_stream_set (struct ospf_interface *);
                    277: extern void ospf_if_stream_unset (struct ospf_interface *);
                    278: extern void ospf_if_reset_variables (struct ospf_interface *);
                    279: extern int ospf_if_is_enable (struct ospf_interface *);
                    280: extern int ospf_if_get_output_cost (struct ospf_interface *);
                    281: extern void ospf_if_recalculate_output_cost (struct interface *);
                    282: 
                    283: /* Simulate down/up on the interface. */
                    284: extern void ospf_if_reset (struct interface *);
                    285: 
                    286: extern struct ospf_interface *ospf_vl_new (struct ospf *,
                    287:                                           struct ospf_vl_data *);
                    288: extern struct ospf_vl_data *ospf_vl_data_new (struct ospf_area *,
                    289:                                              struct in_addr);
                    290: extern struct ospf_vl_data *ospf_vl_lookup (struct ospf *, struct ospf_area *,
                    291:                                            struct in_addr);
                    292: extern void ospf_vl_data_free (struct ospf_vl_data *);
                    293: extern void ospf_vl_add (struct ospf *, struct ospf_vl_data *);
                    294: extern void ospf_vl_delete (struct ospf *, struct ospf_vl_data *);
                    295: extern void ospf_vl_up_check (struct ospf_area *, struct in_addr,
                    296:                              struct vertex *);
                    297: extern void ospf_vl_unapprove (struct ospf *);
                    298: extern void ospf_vl_shut_unapproved (struct ospf *);
                    299: extern int ospf_full_virtual_nbrs (struct ospf_area *);
                    300: extern int ospf_vls_in_area (struct ospf_area *);
                    301: 
                    302: extern struct crypt_key *ospf_crypt_key_lookup (struct list *, u_char);
                    303: extern struct crypt_key *ospf_crypt_key_new (void);
                    304: extern void ospf_crypt_key_add (struct list *, struct crypt_key *);
                    305: extern int ospf_crypt_key_delete (struct list *, u_char);
                    306: 
                    307: extern u_char ospf_default_iftype (struct interface *ifp);
                    308: 
                    309: /* Set all multicast memberships appropriately based on the type and
                    310:    state of the interface. */
                    311: extern void ospf_if_set_multicast (struct ospf_interface *);
                    312: 
                    313: #endif /* _ZEBRA_OSPF_INTERFACE_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>