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

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)
        !            33:                            
        !            34: #define OSPF_IF_PARAM_CONFIGURED(S, P) ((S) && (S)->P##__config)
        !            35: #define OSPF_IF_PARAM(O, P) \
        !            36:         (OSPF_IF_PARAM_CONFIGURED ((O)->params, P)?\
        !            37:                         (O)->params->P:IF_DEF_PARAMS((O)->ifp)->P)
        !            38: 
        !            39: #define DECLARE_IF_PARAM(T, P) T P; u_char P##__config:1
        !            40: #define UNSET_IF_PARAM(S, P) ((S)->P##__config) = 0
        !            41: #define SET_IF_PARAM(S, P) ((S)->P##__config) = 1
        !            42: 
        !            43: struct ospf_if_params
        !            44: {
        !            45:   DECLARE_IF_PARAM (u_int32_t, transmit_delay); /* Interface Transmisson Delay */
        !            46:   DECLARE_IF_PARAM (u_int32_t, output_cost_cmd);/* Command Interface Output Cost */
        !            47:   DECLARE_IF_PARAM (u_int32_t, retransmit_interval); /* Retransmission Interval */
        !            48:   DECLARE_IF_PARAM (u_char, passive_interface);      /* OSPF Interface is passive: no sending or receiving (no need to join multicast groups) */
        !            49:   DECLARE_IF_PARAM (u_char, priority);               /* OSPF Interface priority */
        !            50:   DECLARE_IF_PARAM (u_char, type);                   /* type of interface */
        !            51: #define OSPF_IF_ACTIVE                  0
        !            52: #define OSPF_IF_PASSIVE                        1
        !            53: 
        !            54: #define OSPF_IF_PASSIVE_STATUS(O) \
        !            55:        (OSPF_IF_PARAM_CONFIGURED((O)->params, passive_interface) ? \
        !            56:          (O)->params->passive_interface : \
        !            57:          (OSPF_IF_PARAM_CONFIGURED(IF_DEF_PARAMS((O)->ifp), passive_interface) ? \
        !            58:            IF_DEF_PARAMS((O)->ifp)->passive_interface : \
        !            59:            (O)->ospf->passive_interface_default))
        !            60:   
        !            61:   DECLARE_IF_PARAM (u_int32_t, v_hello);             /* Hello Interval */
        !            62:   DECLARE_IF_PARAM (u_int32_t, v_wait);              /* Router Dead Interval */
        !            63: 
        !            64:   /* MTU mismatch check (see RFC2328, chap 10.6) */ 
        !            65:   DECLARE_IF_PARAM (u_char, mtu_ignore);
        !            66:   
        !            67:   /* Fast-Hellos */
        !            68:   DECLARE_IF_PARAM (u_char, fast_hello);
        !            69:   
        !            70:   /* Authentication data. */
        !            71:   u_char auth_simple[OSPF_AUTH_SIMPLE_SIZE + 1];       /* Simple password. */
        !            72:   u_char auth_simple__config:1;
        !            73:   
        !            74:   DECLARE_IF_PARAM (struct list *, auth_crypt);    /* List of Auth cryptographic data. */
        !            75:   DECLARE_IF_PARAM (int, auth_type);               /* OSPF authentication type */
        !            76:   
        !            77:   /* Other, non-configuration state */
        !            78:   u_int32_t network_lsa_seqnum;                /* Network LSA seqnum */
        !            79: };
        !            80: 
        !            81: enum
        !            82: {
        !            83:   MEMBER_ALLROUTERS = 0,
        !            84:   MEMBER_DROUTERS,
        !            85:   MEMBER_MAX,
        !            86: };
        !            87: 
        !            88: struct ospf_if_info
        !            89: {
        !            90:   struct ospf_if_params *def_params;
        !            91:   struct route_table *params;
        !            92:   struct route_table *oifs;
        !            93:   unsigned int membership_counts[MEMBER_MAX];  /* multicast group refcnts */
        !            94: };
        !            95: 
        !            96: struct ospf_interface;
        !            97: 
        !            98: struct ospf_vl_data
        !            99: {
        !           100:   struct in_addr    vl_peer;      /* Router-ID of the peer for VLs. */
        !           101:   struct in_addr    vl_area_id;           /* Transit area for this VL. */
        !           102:   int format;                      /* area ID format */
        !           103:   struct ospf_interface *vl_oi;           /* Interface data structure for the VL. */
        !           104:   struct vertex_nexthop nexthop;   /* Nexthop router and oi to use */
        !           105:   struct in_addr    peer_addr;    /* Address used to reach the peer. */
        !           106:   u_char flags;
        !           107: };
        !           108: 
        !           109: 
        !           110: #define OSPF_VL_MAX_COUNT 256
        !           111: #define OSPF_VL_MTU      1500
        !           112: 
        !           113: #define OSPF_VL_FLAG_APPROVED 0x01
        !           114: 
        !           115: struct crypt_key
        !           116: {
        !           117:   u_char key_id;
        !           118:   u_char auth_key[OSPF_AUTH_MD5_SIZE + 1];
        !           119: };
        !           120: 
        !           121: /* OSPF interface structure. */
        !           122: struct ospf_interface
        !           123: {
        !           124:   /* This interface's parent ospf instance. */
        !           125:   struct ospf *ospf;
        !           126: 
        !           127:   /* OSPF Area. */
        !           128:   struct ospf_area *area;
        !           129: 
        !           130:   /* Interface data from zebra. */
        !           131:   struct interface *ifp;
        !           132:   struct ospf_vl_data *vl_data;                /* Data for Virtual Link */
        !           133:   
        !           134:   /* Packet send buffer. */
        !           135:   struct ospf_fifo *obuf;              /* Output queue */
        !           136: 
        !           137:   /* OSPF Network Type. */
        !           138:   u_char type;
        !           139: #define OSPF_IFTYPE_NONE               0
        !           140: #define OSPF_IFTYPE_POINTOPOINT                1
        !           141: #define OSPF_IFTYPE_BROADCAST          2
        !           142: #define OSPF_IFTYPE_NBMA               3
        !           143: #define OSPF_IFTYPE_POINTOMULTIPOINT   4
        !           144: #define OSPF_IFTYPE_VIRTUALLINK                5
        !           145: #define OSPF_IFTYPE_LOOPBACK            6
        !           146: #define OSPF_IFTYPE_MAX                        7
        !           147: 
        !           148:   /* State of Interface State Machine. */
        !           149:   u_char state;
        !           150: 
        !           151:   /* To which multicast groups do we currently belong? */
        !           152:   u_char multicast_memberships;
        !           153: #define OI_MEMBER_FLAG(M) (1 << (M))
        !           154: #define OI_MEMBER_COUNT(O,M) (IF_OSPF_IF_INFO(oi->ifp)->membership_counts[(M)])
        !           155: #define OI_MEMBER_CHECK(O,M) \
        !           156:     (CHECK_FLAG((O)->multicast_memberships, OI_MEMBER_FLAG(M)))
        !           157: #define OI_MEMBER_JOINED(O,M) \
        !           158:   do { \
        !           159:     SET_FLAG ((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \
        !           160:     IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]++; \
        !           161:   } while (0)
        !           162: #define OI_MEMBER_LEFT(O,M) \
        !           163:   do { \
        !           164:     UNSET_FLAG ((O)->multicast_memberships, OI_MEMBER_FLAG(M)); \
        !           165:     IF_OSPF_IF_INFO((O)->ifp)->membership_counts[(M)]--; \
        !           166:   } while (0)
        !           167: 
        !           168:   struct prefix *address;              /* Interface prefix */
        !           169:   struct connected *connected;          /* Pointer to connected */ 
        !           170: 
        !           171:   /* Configured varables. */
        !           172:   struct ospf_if_params *params;
        !           173:   
        !           174:   u_int32_t crypt_seqnum;              /* Cryptographic Sequence Number */ 
        !           175:   u_int32_t output_cost;               /* Acutual Interface Output Cost */
        !           176: 
        !           177:   /* Neighbor information. */
        !           178:   struct route_table *nbrs;             /* OSPF Neighbor List */
        !           179:   struct ospf_neighbor *nbr_self;      /* Neighbor Self */
        !           180: #define DR(I)                  ((I)->nbr_self->d_router)
        !           181: #define BDR(I)                 ((I)->nbr_self->bd_router)
        !           182: #define OPTIONS(I)             ((I)->nbr_self->options)
        !           183: #define PRIORITY(I)            ((I)->nbr_self->priority)
        !           184: 
        !           185:   /* List of configured NBMA neighbor. */
        !           186:   struct list *nbr_nbma;
        !           187: 
        !           188:   /* self-originated LSAs. */
        !           189:   struct ospf_lsa *network_lsa_self;   /* network-LSA. */
        !           190: #ifdef HAVE_OPAQUE_LSA
        !           191:   struct list *opaque_lsa_self;                        /* Type-9 Opaque-LSAs */
        !           192: #endif /* HAVE_OPAQUE_LSA */
        !           193: 
        !           194:   struct route_table *ls_upd_queue;
        !           195: 
        !           196:   struct list *ls_ack;                 /* Link State Acknowledgment list. */
        !           197:   
        !           198:   struct
        !           199:   {
        !           200:     struct list *ls_ack;
        !           201:     struct in_addr dst;
        !           202:   } ls_ack_direct;
        !           203: 
        !           204:   /* Timer values. */
        !           205:   u_int32_t v_ls_ack;                  /* Delayed Link State Acknowledgment */
        !           206: 
        !           207:   /* Threads. */
        !           208:   struct thread *t_hello;               /* timer */
        !           209:   struct thread *t_wait;                /* timer */
        !           210:   struct thread *t_ls_ack;              /* timer */
        !           211:   struct thread *t_ls_ack_direct;       /* event */
        !           212:   struct thread *t_ls_upd_event;        /* event */
        !           213: #ifdef HAVE_OPAQUE_LSA
        !           214:   struct thread *t_opaque_lsa_self;     /* Type-9 Opaque-LSAs */
        !           215: #endif /* HAVE_OPAQUE_LSA */
        !           216: 
        !           217:   int on_write_q;
        !           218:   
        !           219:   /* Statistics fields. */
        !           220:   u_int32_t hello_in;          /* Hello message input count. */
        !           221:   u_int32_t hello_out;         /* Hello message output count. */
        !           222:   u_int32_t db_desc_in;         /* database desc. message input count. */
        !           223:   u_int32_t db_desc_out;        /* database desc. message output count. */
        !           224:   u_int32_t ls_req_in;          /* LS request message input count. */
        !           225:   u_int32_t ls_req_out;         /* LS request message output count. */
        !           226:   u_int32_t ls_upd_in;          /* LS update message input count. */
        !           227:   u_int32_t ls_upd_out;         /* LS update message output count. */
        !           228:   u_int32_t ls_ack_in;          /* LS Ack message input count. */
        !           229:   u_int32_t ls_ack_out;         /* LS Ack message output count. */
        !           230:   u_int32_t discarded;         /* discarded input count by error. */
        !           231:   u_int32_t state_change;      /* Number of status change. */
        !           232: 
        !           233:   u_int32_t full_nbrs;
        !           234: };
        !           235: 
        !           236: /* Prototypes. */
        !           237: extern char *ospf_if_name (struct ospf_interface *);
        !           238: extern struct ospf_interface *ospf_if_new (struct ospf *, struct interface *,
        !           239:                                           struct prefix *);
        !           240: extern void ospf_if_cleanup (struct ospf_interface *);
        !           241: extern void ospf_if_free (struct ospf_interface *);
        !           242: extern int ospf_if_up (struct ospf_interface *);
        !           243: extern int ospf_if_down (struct ospf_interface *);
        !           244: 
        !           245: extern int ospf_if_is_up (struct ospf_interface *);
        !           246: extern struct ospf_interface *ospf_if_exists (struct ospf_interface *);
        !           247: extern struct ospf_interface *ospf_if_lookup_by_local_addr (struct ospf *,
        !           248:                                                            struct interface
        !           249:                                                            *,
        !           250:                                                            struct in_addr);
        !           251: extern struct ospf_interface *ospf_if_lookup_by_prefix (struct ospf *,
        !           252:                                                        struct prefix_ipv4 *);
        !           253: extern struct ospf_interface *ospf_if_table_lookup (struct interface *,
        !           254:                                                    struct prefix *);
        !           255: extern struct ospf_interface *ospf_if_addr_local (struct in_addr);
        !           256: extern struct ospf_interface *ospf_if_lookup_recv_if (struct ospf *,
        !           257:                                                      struct in_addr,
        !           258:                                                      struct interface *);
        !           259: extern struct ospf_interface *ospf_if_is_configured (struct ospf *,
        !           260:                                                     struct in_addr *);
        !           261: 
        !           262: extern struct ospf_if_params *ospf_lookup_if_params (struct interface *,
        !           263:                                                     struct in_addr);
        !           264: extern struct ospf_if_params *ospf_get_if_params (struct interface *,
        !           265:                                                  struct in_addr);
        !           266: extern void ospf_del_if_params (struct ospf_if_params *);
        !           267: extern void ospf_free_if_params (struct interface *, struct in_addr);
        !           268: extern void ospf_if_update_params (struct interface *, struct in_addr);
        !           269: 
        !           270: extern int ospf_if_new_hook (struct interface *);
        !           271: extern void ospf_if_init (void);
        !           272: extern void ospf_if_stream_set (struct ospf_interface *);
        !           273: extern void ospf_if_stream_unset (struct ospf_interface *);
        !           274: extern void ospf_if_reset_variables (struct ospf_interface *);
        !           275: extern int ospf_if_is_enable (struct ospf_interface *);
        !           276: extern int ospf_if_get_output_cost (struct ospf_interface *);
        !           277: extern void ospf_if_recalculate_output_cost (struct interface *);
        !           278: 
        !           279: /* Simulate down/up on the interface. */
        !           280: extern void ospf_if_reset (struct interface *);
        !           281: 
        !           282: extern struct ospf_interface *ospf_vl_new (struct ospf *,
        !           283:                                           struct ospf_vl_data *);
        !           284: extern struct ospf_vl_data *ospf_vl_data_new (struct ospf_area *,
        !           285:                                              struct in_addr);
        !           286: extern struct ospf_vl_data *ospf_vl_lookup (struct ospf *, struct ospf_area *,
        !           287:                                            struct in_addr);
        !           288: extern void ospf_vl_data_free (struct ospf_vl_data *);
        !           289: extern void ospf_vl_add (struct ospf *, struct ospf_vl_data *);
        !           290: extern void ospf_vl_delete (struct ospf *, struct ospf_vl_data *);
        !           291: extern void ospf_vl_up_check (struct ospf_area *, struct in_addr,
        !           292:                              struct vertex *);
        !           293: extern void ospf_vl_unapprove (struct ospf *);
        !           294: extern void ospf_vl_shut_unapproved (struct ospf *);
        !           295: extern int ospf_full_virtual_nbrs (struct ospf_area *);
        !           296: extern int ospf_vls_in_area (struct ospf_area *);
        !           297: 
        !           298: extern struct crypt_key *ospf_crypt_key_lookup (struct list *, u_char);
        !           299: extern struct crypt_key *ospf_crypt_key_new (void);
        !           300: extern void ospf_crypt_key_add (struct list *, struct crypt_key *);
        !           301: extern int ospf_crypt_key_delete (struct list *, u_char);
        !           302: 
        !           303: extern u_char ospf_default_iftype (struct interface *ifp);
        !           304: 
        !           305: /* Set all multicast memberships appropriately based on the type and
        !           306:    state of the interface. */
        !           307: extern void ospf_if_set_multicast (struct ospf_interface *);
        !           308: 
        !           309: #endif /* _ZEBRA_OSPF_INTERFACE_H */

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