Import Upstream version 1.2.2
[quagga-debian.git] / ospfd / ospf_interface.h
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 /* Despite the name, this macro probably is for specialist use only */
35 #define OSPF_IF_PARAM_CONFIGURED(S, P) ((S) && (S)->P##__config)
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
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 */
59   DECLARE_IF_PARAM (struct in_addr, if_area);        /* Enable OSPF on this interface with area if_area */
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
140   /* Position range in Router LSA */
141   uint16_t lsa_pos_beg; /* inclusive, >= */
142   uint16_t lsa_pos_end; /* exclusive, <  */
143
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 *);
249 extern struct ospf_interface *ospf_if_lookup_by_lsa_pos (struct ospf_area *,
250                                                          int);
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 void ospf_if_reset_type (struct interface *, u_char type);
280 extern int ospf_if_is_enable (struct ospf_interface *);
281 extern int ospf_if_get_output_cost (struct ospf_interface *);
282 extern void ospf_if_recalculate_output_cost (struct interface *);
283
284 /* Simulate down/up on the interface. */
285 extern void ospf_if_reset (struct interface *);
286
287 extern struct ospf_interface *ospf_vl_new (struct ospf *,
288                                            struct ospf_vl_data *);
289 extern struct ospf_vl_data *ospf_vl_data_new (struct ospf_area *,
290                                               struct in_addr);
291 extern struct ospf_vl_data *ospf_vl_lookup (struct ospf *, struct ospf_area *,
292                                             struct in_addr);
293 extern void ospf_vl_data_free (struct ospf_vl_data *);
294 extern void ospf_vl_add (struct ospf *, struct ospf_vl_data *);
295 extern void ospf_vl_delete (struct ospf *, struct ospf_vl_data *);
296 extern void ospf_vl_up_check (struct ospf_area *, struct in_addr,
297                               struct vertex *);
298 extern void ospf_vl_unapprove (struct ospf *);
299 extern void ospf_vl_shut_unapproved (struct ospf *);
300 extern int ospf_full_virtual_nbrs (struct ospf_area *);
301 extern int ospf_vls_in_area (struct ospf_area *);
302
303 extern struct crypt_key *ospf_crypt_key_lookup (struct list *, u_char);
304 extern struct crypt_key *ospf_crypt_key_new (void);
305 extern void ospf_crypt_key_add (struct list *, struct crypt_key *);
306 extern int ospf_crypt_key_delete (struct list *, u_char);
307
308 extern u_char ospf_default_iftype (struct interface *ifp);
309
310 /* Set all multicast memberships appropriately based on the type and
311    state of the interface. */
312 extern void ospf_if_set_multicast (struct ospf_interface *);
313
314 #endif /* _ZEBRA_OSPF_INTERFACE_H */