Annotation of embedaddon/quagga/ospfd/ospf_interface.h, revision 1.1.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>