iof-bird-daemon / proto / ospf / config.Y @ 04632fd7
History | View | Annotate | Download (16.3 KB)
1 |
/* |
---|---|
2 |
* BIRD -- OSPF Configuration |
3 |
* |
4 |
* (c) 1999--2004 Ondrej Filip <feela@network.cz> |
5 |
* |
6 |
* Can be freely distributed and used under the terms of the GNU GPL. |
7 |
*/ |
8 |
|
9 |
CF_HDR |
10 |
|
11 |
#include "proto/ospf/ospf.h" |
12 |
|
13 |
CF_DEFINES |
14 |
|
15 |
#define OSPF_CFG ((struct ospf_config *) this_proto) |
16 |
#define OSPF_PATT ((struct ospf_iface_patt *) this_ipatt) |
17 |
|
18 |
static struct ospf_area_config *this_area; |
19 |
static struct nbma_node *this_nbma; |
20 |
static list *this_nets; |
21 |
static struct area_net_config *this_pref; |
22 |
static struct ospf_stubnet_config *this_stubnet; |
23 |
|
24 |
static inline int ospf_cfg_is_v2(void) { return OSPF_CFG->ospf2; } |
25 |
static inline int ospf_cfg_is_v3(void) { return ! OSPF_CFG->ospf2; } |
26 |
|
27 |
static void |
28 |
ospf_iface_finish(void) |
29 |
{ |
30 |
struct ospf_iface_patt *ip = OSPF_PATT; |
31 |
|
32 |
if (ip->deadint == 0) |
33 |
ip->deadint = ip->deadc * ip->helloint; |
34 |
|
35 |
if (ip->waitint == 0) |
36 |
ip->waitint = ip->deadc * ip->helloint; |
37 |
|
38 |
ip->passwords = get_passwords(); |
39 |
|
40 |
if ((ip->autype == OSPF_AUTH_CRYPT) && (ip->helloint < 5)) |
41 |
log(L_WARN "Hello or poll interval less that 5 makes cryptographic authenication prone to replay attacks"); |
42 |
|
43 |
if ((ip->autype == OSPF_AUTH_NONE) && (ip->passwords != NULL)) |
44 |
log(L_WARN "Password option without authentication option does not make sense"); |
45 |
} |
46 |
|
47 |
static void |
48 |
ospf_area_finish(void) |
49 |
{ |
50 |
if ((this_area->areaid == 0) && (this_area->type != OPT_E)) |
51 |
cf_error("Backbone area cannot be stub/NSSA"); |
52 |
|
53 |
if (this_area->summary && (this_area->type == OPT_E)) |
54 |
cf_error("Only stub/NSSA areas can use summary propagation"); |
55 |
|
56 |
if (this_area->default_nssa && ((this_area->type != OPT_N) || ! this_area->summary)) |
57 |
cf_error("Only NSSA areas with summary propagation can use NSSA default route"); |
58 |
|
59 |
if ((this_area->default_cost & LSA_EXT3_EBIT) && ! this_area->default_nssa) |
60 |
cf_error("Only NSSA default route can use type 2 metric"); |
61 |
} |
62 |
|
63 |
static void |
64 |
ospf_proto_finish(void) |
65 |
{ |
66 |
struct ospf_config *cf = OSPF_CFG; |
67 |
|
68 |
if (EMPTY_LIST(cf->area_list)) |
69 |
cf_error( "No configured areas in OSPF"); |
70 |
|
71 |
int areano = 0; |
72 |
int backbone = 0; |
73 |
int nssa = 0; |
74 |
struct ospf_area_config *ac; |
75 |
WALK_LIST(ac, cf->area_list) |
76 |
{ |
77 |
areano++; |
78 |
if (ac->areaid == 0) |
79 |
backbone = 1; |
80 |
if (ac->type == OPT_N) |
81 |
nssa = 1; |
82 |
} |
83 |
|
84 |
cf->abr = areano > 1; |
85 |
|
86 |
/* Route export or NSSA translation (RFC 3101 3.1) */ |
87 |
cf->asbr = (this_proto->out_filter != FILTER_REJECT) || (nssa && cf->abr); |
88 |
|
89 |
if (cf->abr && !backbone) |
90 |
{ |
91 |
struct ospf_area_config *ac = cfg_allocz(sizeof(struct ospf_area_config)); |
92 |
ac->type = OPT_E; /* Backbone is non-stub */ |
93 |
add_head(&cf->area_list, NODE ac); |
94 |
init_list(&ac->patt_list); |
95 |
init_list(&ac->net_list); |
96 |
init_list(&ac->enet_list); |
97 |
init_list(&ac->stubnet_list); |
98 |
} |
99 |
|
100 |
if (!cf->abr && !EMPTY_LIST(cf->vlink_list)) |
101 |
cf_error("Vlinks cannot be used on single area router"); |
102 |
|
103 |
if (cf->asbr && (areano == 1) && (this_area->type == 0)) |
104 |
cf_error("ASBR must be in non-stub area"); |
105 |
} |
106 |
|
107 |
static inline void |
108 |
ospf_check_defcost(int cost) |
109 |
{ |
110 |
if ((cost <= 0) || (cost >= LSINFINITY)) |
111 |
cf_error("Default cost must be in range 1-%d", LSINFINITY-1); |
112 |
} |
113 |
|
114 |
static inline void |
115 |
ospf_check_auth(void) |
116 |
{ |
117 |
if (ospf_cfg_is_v3()) |
118 |
cf_error("Authentication not supported in OSPFv3"); |
119 |
} |
120 |
|
121 |
|
122 |
CF_DECLS |
123 |
|
124 |
CF_KEYWORDS(OSPF, AREA, OSPF_METRIC1, OSPF_METRIC2, OSPF_TAG, OSPF_ROUTER_ID) |
125 |
CF_KEYWORDS(NEIGHBORS, RFC1583COMPAT, STUB, TICK, COST, COST2, RETRANSMIT) |
126 |
CF_KEYWORDS(HELLO, TRANSMIT, PRIORITY, DEAD, TYPE, BROADCAST, BCAST, DEFAULT) |
127 |
CF_KEYWORDS(NONBROADCAST, NBMA, POINTOPOINT, PTP, POINTOMULTIPOINT, PTMP) |
128 |
CF_KEYWORDS(NONE, SIMPLE, AUTHENTICATION, STRICT, CRYPTOGRAPHIC, TTL, SECURITY) |
129 |
CF_KEYWORDS(ELIGIBLE, POLL, NETWORKS, HIDDEN, VIRTUAL, CHECK, LINK, ONLY, BFD) |
130 |
CF_KEYWORDS(RX, BUFFER, LARGE, NORMAL, STUBNET, HIDDEN, SUMMARY, TAG, EXTERNAL) |
131 |
CF_KEYWORDS(WAIT, DELAY, LSADB, ECMP, LIMIT, WEIGHT, NSSA, TRANSLATOR, STABILITY) |
132 |
CF_KEYWORDS(GLOBAL, LSID, ROUTER, SELF, INSTANCE, REAL, NETMASK, TX, PRIORITY, LENGTH) |
133 |
CF_KEYWORDS(SECONDARY, MERGE, LSA, SUPPRESSION, OSPF2, OSPF3) |
134 |
|
135 |
%type <ld> lsadb_args |
136 |
%type <i> ospf_variant nbma_eligible |
137 |
|
138 |
CF_GRAMMAR |
139 |
|
140 |
CF_ADDTO(proto, ospf_proto '}' { ospf_proto_finish(); } ) |
141 |
|
142 |
ospf_variant: |
143 |
OSPF { $$ = 1; } |
144 |
| OSPF2 { $$ = 1; } |
145 |
| OSPF3 { $$ = 0; } |
146 |
; |
147 |
|
148 |
ospf_proto_start: proto_start ospf_variant { |
149 |
this_proto = proto_config_new(&proto_ospf, $1); |
150 |
init_list(&OSPF_CFG->area_list); |
151 |
init_list(&OSPF_CFG->vlink_list); |
152 |
OSPF_CFG->tick = OSPF_DEFAULT_TICK; |
153 |
OSPF_CFG->ospf2 = $2; |
154 |
} |
155 |
; |
156 |
|
157 |
ospf_proto: |
158 |
ospf_proto_start proto_name '{' |
159 |
| ospf_proto ospf_proto_item ';' |
160 |
; |
161 |
|
162 |
ospf_proto_item: |
163 |
proto_item |
164 |
| RFC1583COMPAT bool { OSPF_CFG->rfc1583 = $2; } |
165 |
| STUB ROUTER bool { OSPF_CFG->stub_router = $3; } |
166 |
| ECMP bool { OSPF_CFG->ecmp = $2 ? OSPF_DEFAULT_ECMP_LIMIT : 0; } |
167 |
| ECMP bool LIMIT expr { OSPF_CFG->ecmp = $2 ? $4 : 0; if ($4 < 0) cf_error("ECMP limit cannot be negative"); } |
168 |
| MERGE EXTERNAL bool { OSPF_CFG->merge_external = $3; } |
169 |
| TICK expr { OSPF_CFG->tick = $2; if($2<=0) cf_error("Tick must be greater than zero"); } |
170 |
| INSTANCE ID expr { OSPF_CFG->instance_id = $3; if (($3<0) || ($3>255)) cf_error("Instance ID must be in range 0-255"); } |
171 |
| ospf_area |
172 |
; |
173 |
|
174 |
ospf_area_start: AREA idval { |
175 |
this_area = cfg_allocz(sizeof(struct ospf_area_config)); |
176 |
add_tail(&OSPF_CFG->area_list, NODE this_area); |
177 |
this_area->areaid = $2; |
178 |
this_area->default_cost = OSPF_DEFAULT_STUB_COST; |
179 |
this_area->type = OPT_E; |
180 |
this_area->transint = OSPF_DEFAULT_TRANSINT; |
181 |
|
182 |
init_list(&this_area->patt_list); |
183 |
init_list(&this_area->net_list); |
184 |
init_list(&this_area->enet_list); |
185 |
init_list(&this_area->stubnet_list); |
186 |
} |
187 |
; |
188 |
|
189 |
ospf_area: ospf_area_start '{' ospf_area_opts '}' { ospf_area_finish(); } |
190 |
; |
191 |
|
192 |
ospf_area_opts: |
193 |
/* empty */ |
194 |
| ospf_area_opts ospf_area_item ';' |
195 |
; |
196 |
|
197 |
ospf_area_item: |
198 |
STUB bool { this_area->type = $2 ? 0 : OPT_E; /* We should remove the option */ } |
199 |
| NSSA { this_area->type = OPT_N; } |
200 |
| SUMMARY bool { this_area->summary = $2; } |
201 |
| DEFAULT NSSA bool { this_area->default_nssa = $3; } |
202 |
| DEFAULT COST expr { this_area->default_cost = $3; ospf_check_defcost($3); } |
203 |
| DEFAULT COST2 expr { this_area->default_cost = $3 | LSA_EXT3_EBIT; ospf_check_defcost($3); } |
204 |
| STUB COST expr { this_area->default_cost = $3; ospf_check_defcost($3); } |
205 |
| TRANSLATOR bool { this_area->translator = $2; } |
206 |
| TRANSLATOR STABILITY expr { this_area->transint = $3; } |
207 |
| NETWORKS { this_nets = &this_area->net_list; } '{' pref_list '}' |
208 |
| EXTERNAL { this_nets = &this_area->enet_list; } '{' pref_list '}' |
209 |
| STUBNET ospf_stubnet |
210 |
| INTERFACE ospf_iface |
211 |
| ospf_vlink |
212 |
; |
213 |
|
214 |
ospf_stubnet: |
215 |
ospf_stubnet_start '{' ospf_stubnet_opts '}' |
216 |
| ospf_stubnet_start |
217 |
; |
218 |
|
219 |
ospf_stubnet_start: |
220 |
net_ip { |
221 |
this_stubnet = cfg_allocz(sizeof(struct ospf_stubnet_config)); |
222 |
add_tail(&this_area->stubnet_list, NODE this_stubnet); |
223 |
this_stubnet->prefix = $1; |
224 |
this_stubnet->cost = COST_D; |
225 |
} |
226 |
; |
227 |
|
228 |
ospf_stubnet_opts: |
229 |
/* empty */ |
230 |
| ospf_stubnet_opts ospf_stubnet_item ';' |
231 |
; |
232 |
|
233 |
ospf_stubnet_item: |
234 |
HIDDEN bool { this_stubnet->hidden = $2; } |
235 |
| SUMMARY bool { this_stubnet->summary = $2; } |
236 |
| COST expr { this_stubnet->cost = $2; } |
237 |
; |
238 |
|
239 |
ospf_vlink: |
240 |
ospf_vlink_start ospf_instance_id '{' ospf_vlink_opts '}' { ospf_iface_finish(); } |
241 |
| ospf_vlink_start ospf_instance_id { ospf_iface_finish(); } |
242 |
; |
243 |
|
244 |
ospf_vlink_opts: |
245 |
/* empty */ |
246 |
| ospf_vlink_opts ospf_vlink_item ';' |
247 |
; |
248 |
|
249 |
ospf_vlink_item: |
250 |
| HELLO expr { OSPF_PATT->helloint = $2 ; if (($2<=0) || ($2>65535)) cf_error("Hello interval must be in range 1-65535"); } |
251 |
| RETRANSMIT expr { OSPF_PATT->rxmtint = $2 ; if ($2<=1) cf_error("Retransmit int must be greater than one"); } |
252 |
| TRANSMIT DELAY expr { OSPF_PATT->inftransdelay = $3 ; if (($3<=0) || ($3>65535)) cf_error("Transmit delay must be in range 1-65535"); } |
253 |
| WAIT expr { OSPF_PATT->waitint = $2 ; if ($2<=1) cf_error("Wait interval must be greater than one"); } |
254 |
| DEAD expr { OSPF_PATT->deadint = $2 ; if ($2<=1) cf_error("Dead interval must be greater than one"); } |
255 |
| DEAD COUNT expr { OSPF_PATT->deadc = $3 ; if ($3<=1) cf_error("Dead count must be greater than one"); } |
256 |
| AUTHENTICATION NONE { OSPF_PATT->autype = OSPF_AUTH_NONE; } |
257 |
| AUTHENTICATION SIMPLE { OSPF_PATT->autype = OSPF_AUTH_SIMPLE; ospf_check_auth(); } |
258 |
| AUTHENTICATION CRYPTOGRAPHIC { OSPF_PATT->autype = OSPF_AUTH_CRYPT; ospf_check_auth(); } |
259 |
| password_list { ospf_check_auth(); } |
260 |
; |
261 |
|
262 |
ospf_vlink_start: VIRTUAL LINK idval |
263 |
{ |
264 |
if (this_area->areaid == 0) cf_error("Virtual link cannot be in backbone"); |
265 |
this_ipatt = cfg_allocz(sizeof(struct ospf_iface_patt)); |
266 |
add_tail(&OSPF_CFG->vlink_list, NODE this_ipatt); |
267 |
init_list(&this_ipatt->ipn_list); |
268 |
OSPF_PATT->voa = this_area->areaid; |
269 |
OSPF_PATT->vid = $3; |
270 |
OSPF_PATT->helloint = HELLOINT_D; |
271 |
OSPF_PATT->rxmtint = RXMTINT_D; |
272 |
OSPF_PATT->inftransdelay = INFTRANSDELAY_D; |
273 |
OSPF_PATT->deadc = DEADC_D; |
274 |
OSPF_PATT->type = OSPF_IT_VLINK; |
275 |
OSPF_PATT->instance_id = OSPF_CFG->instance_id; |
276 |
init_list(&OSPF_PATT->nbma_list); |
277 |
reset_passwords(); |
278 |
} |
279 |
; |
280 |
|
281 |
ospf_iface_item: |
282 |
COST expr { OSPF_PATT->cost = $2 ; if (($2<=0) || ($2>65535)) cf_error("Cost must be in range 1-65535"); } |
283 |
| HELLO expr { OSPF_PATT->helloint = $2 ; if (($2<=0) || ($2>65535)) cf_error("Hello interval must be in range 1-65535"); } |
284 |
| POLL expr { OSPF_PATT->pollint = $2 ; if ($2<=0) cf_error("Poll int must be greater than zero"); } |
285 |
| RETRANSMIT expr { OSPF_PATT->rxmtint = $2 ; if ($2<=1) cf_error("Retransmit int must be greater than one"); } |
286 |
| WAIT expr { OSPF_PATT->waitint = $2 ; if ($2<=1) cf_error("Wait interval must be greater than one"); } |
287 |
| DEAD expr { OSPF_PATT->deadint = $2 ; if ($2<=1) cf_error("Dead interval must be greater than one"); } |
288 |
| DEAD COUNT expr { OSPF_PATT->deadc = $3 ; if ($3<=1) cf_error("Dead count must be greater than one"); } |
289 |
| TYPE BROADCAST { OSPF_PATT->type = OSPF_IT_BCAST ; } |
290 |
| TYPE BCAST { OSPF_PATT->type = OSPF_IT_BCAST ; } |
291 |
| TYPE NONBROADCAST { OSPF_PATT->type = OSPF_IT_NBMA ; } |
292 |
| TYPE NBMA { OSPF_PATT->type = OSPF_IT_NBMA ; } |
293 |
| TYPE POINTOPOINT { OSPF_PATT->type = OSPF_IT_PTP ; } |
294 |
| TYPE PTP { OSPF_PATT->type = OSPF_IT_PTP ; } |
295 |
| TYPE POINTOMULTIPOINT { OSPF_PATT->type = OSPF_IT_PTMP ; } |
296 |
| TYPE PTMP { OSPF_PATT->type = OSPF_IT_PTMP ; } |
297 |
| REAL BROADCAST bool { OSPF_PATT->real_bcast = $3; if (!ospf_cfg_is_v2()) cf_error("Real broadcast option requires OSPFv2"); } |
298 |
| PTP NETMASK bool { OSPF_PATT->ptp_netmask = $3; if (!ospf_cfg_is_v2()) cf_error("PtP netmask option requires OSPFv2"); } |
299 |
| TRANSMIT DELAY expr { OSPF_PATT->inftransdelay = $3 ; if (($3<=0) || ($3>65535)) cf_error("Transmit delay must be in range 1-65535"); } |
300 |
| PRIORITY expr { OSPF_PATT->priority = $2 ; if (($2<0) || ($2>255)) cf_error("Priority must be in range 0-255"); } |
301 |
| STRICT NONBROADCAST bool { OSPF_PATT->strictnbma = $3 ; } |
302 |
| STUB bool { OSPF_PATT->stub = $2 ; } |
303 |
| CHECK LINK bool { OSPF_PATT->check_link = $3; } |
304 |
| ECMP WEIGHT expr { OSPF_PATT->ecmp_weight = $3 - 1; if (($3<1) || ($3>256)) cf_error("ECMP weight must be in range 1-256"); } |
305 |
| LINK LSA SUPPRESSION bool { OSPF_PATT->link_lsa_suppression = $4; if (!ospf_cfg_is_v3()) cf_error("Link LSA suppression option requires OSPFv3"); } |
306 |
| NEIGHBORS '{' nbma_list '}' |
307 |
| AUTHENTICATION NONE { OSPF_PATT->autype = OSPF_AUTH_NONE; } |
308 |
| AUTHENTICATION SIMPLE { OSPF_PATT->autype = OSPF_AUTH_SIMPLE; ospf_check_auth(); } |
309 |
| AUTHENTICATION CRYPTOGRAPHIC { OSPF_PATT->autype = OSPF_AUTH_CRYPT; ospf_check_auth(); } |
310 |
| RX BUFFER NORMAL { OSPF_PATT->rx_buffer = 0; } |
311 |
| RX BUFFER LARGE { OSPF_PATT->rx_buffer = OSPF_MAX_PKT_SIZE; } |
312 |
| RX BUFFER expr { OSPF_PATT->rx_buffer = $3; if (($3 < OSPF_MIN_PKT_SIZE) || ($3 > OSPF_MAX_PKT_SIZE)) cf_error("Buffer size must be in range 256-65535"); } |
313 |
| TX tos { OSPF_PATT->tx_tos = $2; } |
314 |
| TX PRIORITY expr { OSPF_PATT->tx_priority = $3; } |
315 |
| TX LENGTH expr { OSPF_PATT->tx_length = $3; if (($3 < OSPF_MIN_PKT_SIZE) || ($3 > OSPF_MAX_PKT_SIZE)) cf_error("TX length must be in range 256-65535"); } |
316 |
| TTL SECURITY bool { OSPF_PATT->ttl_security = $3; } |
317 |
| TTL SECURITY TX ONLY { OSPF_PATT->ttl_security = 2; } |
318 |
| BFD bool { OSPF_PATT->bfd = $2; cf_check_bfd($2); } |
319 |
| password_list { ospf_check_auth(); } |
320 |
; |
321 |
|
322 |
pref_list: |
323 |
/* empty */ |
324 |
| pref_list pref_item |
325 |
; |
326 |
|
327 |
pref_item: pref_base pref_opt ';' ; |
328 |
|
329 |
pref_base: net_ip |
330 |
{ |
331 |
this_pref = cfg_allocz(sizeof(struct area_net_config)); |
332 |
add_tail(this_nets, NODE this_pref); |
333 |
this_pref->prefix = $1; |
334 |
} |
335 |
; |
336 |
|
337 |
pref_opt: |
338 |
/* empty */ |
339 |
| HIDDEN { this_pref->hidden = 1; } |
340 |
| TAG expr { this_pref->tag = $2; } |
341 |
; |
342 |
|
343 |
nbma_list: |
344 |
/* empty */ |
345 |
| nbma_list nbma_item |
346 |
; |
347 |
|
348 |
nbma_eligible: |
349 |
/* empty */ { $$ = 0; } |
350 |
| ELIGIBLE { $$ = 1; } |
351 |
; |
352 |
|
353 |
nbma_item: ipa nbma_eligible ';' |
354 |
{ |
355 |
this_nbma = cfg_allocz(sizeof(struct nbma_node)); |
356 |
add_tail(&OSPF_PATT->nbma_list, NODE this_nbma); |
357 |
this_nbma->ip=$1; |
358 |
this_nbma->eligible=$2; |
359 |
} |
360 |
; |
361 |
|
362 |
ospf_iface_start: |
363 |
{ |
364 |
this_ipatt = cfg_allocz(sizeof(struct ospf_iface_patt)); |
365 |
add_tail(&this_area->patt_list, NODE this_ipatt); |
366 |
init_list(&this_ipatt->ipn_list); |
367 |
OSPF_PATT->cost = COST_D; |
368 |
OSPF_PATT->helloint = HELLOINT_D; |
369 |
OSPF_PATT->pollint = POLLINT_D; |
370 |
OSPF_PATT->rxmtint = RXMTINT_D; |
371 |
OSPF_PATT->inftransdelay = INFTRANSDELAY_D; |
372 |
OSPF_PATT->priority = PRIORITY_D; |
373 |
OSPF_PATT->deadc = DEADC_D; |
374 |
OSPF_PATT->type = OSPF_IT_UNDEF; |
375 |
OSPF_PATT->instance_id = OSPF_CFG->instance_id; |
376 |
init_list(&OSPF_PATT->nbma_list); |
377 |
OSPF_PATT->ptp_netmask = 2; /* not specified */ |
378 |
OSPF_PATT->tx_tos = IP_PREC_INTERNET_CONTROL; |
379 |
OSPF_PATT->tx_priority = sk_priority_control; |
380 |
reset_passwords(); |
381 |
} |
382 |
; |
383 |
|
384 |
ospf_instance_id: |
385 |
/* empty */ |
386 |
| INSTANCE expr { OSPF_PATT->instance_id = $2; if (($2<0) || ($2>255)) cf_error("Instance ID must be in range 0-255"); } |
387 |
; |
388 |
|
389 |
ospf_iface_patt_list: |
390 |
iface_patt_list { if (ospf_cfg_is_v3()) iface_patt_check(); } ospf_instance_id |
391 |
; |
392 |
|
393 |
ospf_iface_opts: |
394 |
/* empty */ |
395 |
| ospf_iface_opts ospf_iface_item ';' |
396 |
; |
397 |
|
398 |
ospf_iface_opt_list: |
399 |
/* empty */ |
400 |
| '{' ospf_iface_opts '}' |
401 |
; |
402 |
|
403 |
ospf_iface: |
404 |
ospf_iface_start ospf_iface_patt_list ospf_iface_opt_list { ospf_iface_finish(); } |
405 |
; |
406 |
|
407 |
CF_ADDTO(dynamic_attr, OSPF_METRIC1 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC1); }) |
408 |
CF_ADDTO(dynamic_attr, OSPF_METRIC2 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC2); }) |
409 |
CF_ADDTO(dynamic_attr, OSPF_TAG { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_TAG); }) |
410 |
CF_ADDTO(dynamic_attr, OSPF_ROUTER_ID { $$ = f_new_dynamic_attr(EAF_TYPE_ROUTER_ID | EAF_TEMP, T_QUAD, EA_OSPF_ROUTER_ID); }) |
411 |
|
412 |
CF_CLI_HELP(SHOW OSPF, ..., [[Show information about OSPF protocol]]); |
413 |
CF_CLI(SHOW OSPF, optsym, [<name>], [[Show information about OSPF protocol XXX]]) |
414 |
{ ospf_sh(proto_get_named($3, &proto_ospf)); }; |
415 |
|
416 |
CF_CLI(SHOW OSPF NEIGHBORS, optsym opttext, [<name>] [\"<interface>\"], [[Show information about OSPF neighbors]]) |
417 |
{ ospf_sh_neigh(proto_get_named($4, &proto_ospf), $5); }; |
418 |
|
419 |
CF_CLI(SHOW OSPF INTERFACE, optsym opttext, [<name>] [\"<interface>\"], [[Show information about interface]]) |
420 |
{ ospf_sh_iface(proto_get_named($4, &proto_ospf), $5); }; |
421 |
|
422 |
CF_CLI_HELP(SHOW OSPF TOPOLOGY, [all] [<name>], [[Show information about OSPF network topology]]) |
423 |
|
424 |
CF_CLI(SHOW OSPF TOPOLOGY, optsym opttext, [<name>], [[Show information about reachable OSPF network topology]]) |
425 |
{ ospf_sh_state(proto_get_named($4, &proto_ospf), 0, 1); }; |
426 |
|
427 |
CF_CLI(SHOW OSPF TOPOLOGY ALL, optsym opttext, [<name>], [[Show information about all OSPF network topology]]) |
428 |
{ ospf_sh_state(proto_get_named($5, &proto_ospf), 0, 0); }; |
429 |
|
430 |
CF_CLI_HELP(SHOW OSPF STATE, [all] [<name>], [[Show information about OSPF network state]]) |
431 |
|
432 |
CF_CLI(SHOW OSPF STATE, optsym opttext, [<name>], [[Show information about reachable OSPF network state]]) |
433 |
{ ospf_sh_state(proto_get_named($4, &proto_ospf), 1, 1); }; |
434 |
|
435 |
CF_CLI(SHOW OSPF STATE ALL, optsym opttext, [<name>], [[Show information about all OSPF network state]]) |
436 |
{ ospf_sh_state(proto_get_named($5, &proto_ospf), 1, 0); }; |
437 |
|
438 |
CF_CLI_HELP(SHOW OSPF LSADB, ..., [[Show content of OSPF LSA database]]); |
439 |
CF_CLI(SHOW OSPF LSADB, lsadb_args, [global | area <id> | link] [type <num>] [lsid <id>] [self | router <id>] [<proto>], [[Show content of OSPF LSA database]]) |
440 |
{ ospf_sh_lsadb($4); }; |
441 |
|
442 |
lsadb_args: |
443 |
/* empty */ { |
444 |
$$ = cfg_allocz(sizeof(struct lsadb_show_data)); |
445 |
} |
446 |
| lsadb_args GLOBAL { $$ = $1; $$->scope = LSA_SCOPE_AS; } |
447 |
| lsadb_args AREA idval { $$ = $1; $$->scope = LSA_SCOPE_AREA; $$->area = $3; } |
448 |
| lsadb_args LINK { $$ = $1; $$->scope = 1; /* hack, 0 is no filter */ } |
449 |
| lsadb_args TYPE NUM { $$ = $1; $$->type = $3; } |
450 |
| lsadb_args LSID idval { $$ = $1; $$->lsid = $3; } |
451 |
| lsadb_args SELF { $$ = $1; $$->router = SH_ROUTER_SELF; } |
452 |
| lsadb_args ROUTER idval { $$ = $1; $$->router = $3; } |
453 |
| lsadb_args SYM { $$ = $1; $$->name = $2; } |
454 |
; |
455 |
|
456 |
CF_CODE |
457 |
|
458 |
CF_END |