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>