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>