Annotation of embedaddon/quagga/ospf6d/ospf6_interface.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2003 Yasuhiro Ohara
3: *
4: * This file is part of GNU Zebra.
5: *
6: * GNU Zebra is free software; you can redistribute it and/or modify it
7: * under the terms of the GNU General Public License as published by the
8: * Free Software Foundation; either version 2, or (at your option) any
9: * later version.
10: *
11: * GNU Zebra is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * General Public License for more details.
15: *
16: * You should have received a copy of the GNU General Public License
17: * along with GNU Zebra; see the file COPYING. If not, write to the
18: * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19: * Boston, MA 02111-1307, USA.
20: */
21:
22: #include <zebra.h>
23:
24: #include "memory.h"
25: #include "if.h"
26: #include "log.h"
27: #include "command.h"
28: #include "thread.h"
29: #include "prefix.h"
30: #include "plist.h"
31:
32: #include "ospf6_lsa.h"
33: #include "ospf6_lsdb.h"
34: #include "ospf6_network.h"
35: #include "ospf6_message.h"
36: #include "ospf6_route.h"
37: #include "ospf6_top.h"
38: #include "ospf6_area.h"
39: #include "ospf6_interface.h"
40: #include "ospf6_neighbor.h"
41: #include "ospf6_intra.h"
42: #include "ospf6_spf.h"
43: #include "ospf6d.h"
44:
45: unsigned char conf_debug_ospf6_interface = 0;
46:
47: const char *ospf6_interface_state_str[] =
48: {
49: "None",
50: "Down",
51: "Loopback",
52: "Waiting",
53: "PointToPoint",
54: "DROther",
55: "BDR",
56: "DR",
57: NULL
58: };
59:
60: struct ospf6_interface *
61: ospf6_interface_lookup_by_ifindex (int ifindex)
62: {
63: struct ospf6_interface *oi;
64: struct interface *ifp;
65:
66: ifp = if_lookup_by_index (ifindex);
67: if (ifp == NULL)
68: return (struct ospf6_interface *) NULL;
69:
70: oi = (struct ospf6_interface *) ifp->info;
71: return oi;
72: }
73:
74: /* schedule routing table recalculation */
75: static void
76: ospf6_interface_lsdb_hook (struct ospf6_lsa *lsa)
77: {
78: switch (ntohs (lsa->header->type))
79: {
80: case OSPF6_LSTYPE_LINK:
81: if (OSPF6_INTERFACE (lsa->lsdb->data)->state == OSPF6_INTERFACE_DR)
82: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (OSPF6_INTERFACE (lsa->lsdb->data));
83: ospf6_spf_schedule (OSPF6_INTERFACE (lsa->lsdb->data)->area);
84: break;
85:
86: default:
87: break;
88: }
89: }
90:
91: /* Create new ospf6 interface structure */
92: struct ospf6_interface *
93: ospf6_interface_create (struct interface *ifp)
94: {
95: struct ospf6_interface *oi;
96: unsigned int iobuflen;
97:
98: oi = (struct ospf6_interface *)
99: XCALLOC (MTYPE_OSPF6_IF, sizeof (struct ospf6_interface));
100:
101: if (!oi)
102: {
103: zlog_err ("Can't malloc ospf6_interface for ifindex %d", ifp->ifindex);
104: return (struct ospf6_interface *) NULL;
105: }
106:
107: oi->area = (struct ospf6_area *) NULL;
108: oi->neighbor_list = list_new ();
109: oi->neighbor_list->cmp = ospf6_neighbor_cmp;
110: oi->linklocal_addr = (struct in6_addr *) NULL;
111: oi->instance_id = 0;
112: oi->transdelay = 1;
113: oi->priority = 1;
114:
115: oi->hello_interval = 10;
116: oi->dead_interval = 40;
117: oi->rxmt_interval = 5;
118: oi->cost = 1;
119: oi->state = OSPF6_INTERFACE_DOWN;
120: oi->flag = 0;
121: oi->mtu_ignore = 0;
122:
123: /* Try to adjust I/O buffer size with IfMtu */
124: oi->ifmtu = ifp->mtu6;
125: iobuflen = ospf6_iobuf_size (ifp->mtu6);
126: if (oi->ifmtu > iobuflen)
127: {
128: if (IS_OSPF6_DEBUG_INTERFACE)
129: zlog_debug ("Interface %s: IfMtu is adjusted to I/O buffer size: %d.",
130: ifp->name, iobuflen);
131: oi->ifmtu = iobuflen;
132: }
133:
134: oi->lsupdate_list = ospf6_lsdb_create (oi);
135: oi->lsack_list = ospf6_lsdb_create (oi);
136: oi->lsdb = ospf6_lsdb_create (oi);
137: oi->lsdb->hook_add = ospf6_interface_lsdb_hook;
138: oi->lsdb->hook_remove = ospf6_interface_lsdb_hook;
139: oi->lsdb_self = ospf6_lsdb_create (oi);
140:
141: oi->route_connected = OSPF6_ROUTE_TABLE_CREATE (INTERFACE, CONNECTED_ROUTES);
142: oi->route_connected->scope = oi;
143:
144: /* link both */
145: oi->interface = ifp;
146: ifp->info = oi;
147:
148: return oi;
149: }
150:
151: void
152: ospf6_interface_delete (struct ospf6_interface *oi)
153: {
154: struct listnode *node, *nnode;
155: struct ospf6_neighbor *on;
156:
157: for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
158: ospf6_neighbor_delete (on);
159:
160: list_delete (oi->neighbor_list);
161:
162: THREAD_OFF (oi->thread_send_hello);
163: THREAD_OFF (oi->thread_send_lsupdate);
164: THREAD_OFF (oi->thread_send_lsack);
165:
166: ospf6_lsdb_remove_all (oi->lsdb);
167: ospf6_lsdb_remove_all (oi->lsupdate_list);
168: ospf6_lsdb_remove_all (oi->lsack_list);
169:
170: ospf6_lsdb_delete (oi->lsdb);
171: ospf6_lsdb_delete (oi->lsdb_self);
172:
173: ospf6_lsdb_delete (oi->lsupdate_list);
174: ospf6_lsdb_delete (oi->lsack_list);
175:
176: ospf6_route_table_delete (oi->route_connected);
177:
178: /* cut link */
179: oi->interface->info = NULL;
180:
181: /* plist_name */
182: if (oi->plist_name)
183: XFREE (MTYPE_PREFIX_LIST_STR, oi->plist_name);
184:
185: XFREE (MTYPE_OSPF6_IF, oi);
186: }
187:
188: void
189: ospf6_interface_enable (struct ospf6_interface *oi)
190: {
191: UNSET_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE);
192:
193: oi->thread_send_hello =
194: thread_add_event (master, ospf6_hello_send, oi, 0);
195: }
196:
197: void
198: ospf6_interface_disable (struct ospf6_interface *oi)
199: {
200: struct listnode *node, *nnode;
201: struct ospf6_neighbor *on;
202:
203: SET_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE);
204:
205: for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
206: ospf6_neighbor_delete (on);
207:
208: list_delete_all_node (oi->neighbor_list);
209:
210: ospf6_lsdb_remove_all (oi->lsdb);
211: ospf6_lsdb_remove_all (oi->lsupdate_list);
212: ospf6_lsdb_remove_all (oi->lsack_list);
213:
214: THREAD_OFF (oi->thread_send_hello);
215: THREAD_OFF (oi->thread_send_lsupdate);
216: THREAD_OFF (oi->thread_send_lsack);
217: }
218:
219: static struct in6_addr *
220: ospf6_interface_get_linklocal_address (struct interface *ifp)
221: {
222: struct listnode *n;
223: struct connected *c;
224: struct in6_addr *l = (struct in6_addr *) NULL;
225:
226: /* for each connected address */
227: for (ALL_LIST_ELEMENTS_RO (ifp->connected, n, c))
228: {
229: /* if family not AF_INET6, ignore */
230: if (c->address->family != AF_INET6)
231: continue;
232:
233: /* linklocal scope check */
234: if (IN6_IS_ADDR_LINKLOCAL (&c->address->u.prefix6))
235: l = &c->address->u.prefix6;
236: }
237: return l;
238: }
239:
240: void
241: ospf6_interface_if_add (struct interface *ifp)
242: {
243: struct ospf6_interface *oi;
244: unsigned int iobuflen;
245:
246: oi = (struct ospf6_interface *) ifp->info;
247: if (oi == NULL)
248: return;
249:
250: /* Try to adjust I/O buffer size with IfMtu */
251: if (oi->ifmtu == 0)
252: oi->ifmtu = ifp->mtu6;
253: iobuflen = ospf6_iobuf_size (ifp->mtu6);
254: if (oi->ifmtu > iobuflen)
255: {
256: if (IS_OSPF6_DEBUG_INTERFACE)
257: zlog_debug ("Interface %s: IfMtu is adjusted to I/O buffer size: %d.",
258: ifp->name, iobuflen);
259: oi->ifmtu = iobuflen;
260: }
261:
262: /* interface start */
263: if (oi->area)
264: thread_add_event (master, interface_up, oi, 0);
265: }
266:
267: void
268: ospf6_interface_if_del (struct interface *ifp)
269: {
270: struct ospf6_interface *oi;
271:
272: oi = (struct ospf6_interface *) ifp->info;
273: if (oi == NULL)
274: return;
275:
276: /* interface stop */
277: if (oi->area)
278: thread_execute (master, interface_down, oi, 0);
279:
280: listnode_delete (oi->area->if_list, oi);
281: oi->area = (struct ospf6_area *) NULL;
282:
283: /* cut link */
284: oi->interface = NULL;
285: ifp->info = NULL;
286:
287: ospf6_interface_delete (oi);
288: }
289:
290: void
291: ospf6_interface_state_update (struct interface *ifp)
292: {
293: struct ospf6_interface *oi;
294:
295: oi = (struct ospf6_interface *) ifp->info;
296: if (oi == NULL)
297: return;
298: if (oi->area == NULL)
299: return;
300:
301: if (if_is_up (ifp))
302: thread_add_event (master, interface_up, oi, 0);
303: else
304: thread_add_event (master, interface_down, oi, 0);
305:
306: return;
307: }
308:
309: void
310: ospf6_interface_connected_route_update (struct interface *ifp)
311: {
312: struct ospf6_interface *oi;
313: struct ospf6_route *route;
314: struct connected *c;
315: struct listnode *node, *nnode;
316:
317: oi = (struct ospf6_interface *) ifp->info;
318: if (oi == NULL)
319: return;
320:
321: /* reset linklocal pointer */
322: oi->linklocal_addr = ospf6_interface_get_linklocal_address (ifp);
323:
324: /* if area is null, do not make connected-route list */
325: if (oi->area == NULL)
326: return;
327:
328: /* update "route to advertise" interface route table */
329: ospf6_route_remove_all (oi->route_connected);
330:
331: for (ALL_LIST_ELEMENTS (oi->interface->connected, node, nnode, c))
332: {
333: if (c->address->family != AF_INET6)
334: continue;
335:
336: CONTINUE_IF_ADDRESS_LINKLOCAL (IS_OSPF6_DEBUG_INTERFACE, c->address);
337: CONTINUE_IF_ADDRESS_UNSPECIFIED (IS_OSPF6_DEBUG_INTERFACE, c->address);
338: CONTINUE_IF_ADDRESS_LOOPBACK (IS_OSPF6_DEBUG_INTERFACE, c->address);
339: CONTINUE_IF_ADDRESS_V4COMPAT (IS_OSPF6_DEBUG_INTERFACE, c->address);
340: CONTINUE_IF_ADDRESS_V4MAPPED (IS_OSPF6_DEBUG_INTERFACE, c->address);
341:
342: /* apply filter */
343: if (oi->plist_name)
344: {
345: struct prefix_list *plist;
346: enum prefix_list_type ret;
347: char buf[128];
348:
349: prefix2str (c->address, buf, sizeof (buf));
350: plist = prefix_list_lookup (AFI_IP6, oi->plist_name);
351: ret = prefix_list_apply (plist, (void *) c->address);
352: if (ret == PREFIX_DENY)
353: {
354: if (IS_OSPF6_DEBUG_INTERFACE)
355: zlog_debug ("%s on %s filtered by prefix-list %s ",
356: buf, oi->interface->name, oi->plist_name);
357: continue;
358: }
359: }
360:
361: route = ospf6_route_create ();
362: memcpy (&route->prefix, c->address, sizeof (struct prefix));
363: apply_mask (&route->prefix);
364: route->type = OSPF6_DEST_TYPE_NETWORK;
365: route->path.area_id = oi->area->area_id;
366: route->path.type = OSPF6_PATH_TYPE_INTRA;
367: route->path.cost = oi->cost;
368: route->nexthop[0].ifindex = oi->interface->ifindex;
369: inet_pton (AF_INET6, "::1", &route->nexthop[0].address);
370: ospf6_route_add (route, oi->route_connected);
371: }
372:
373: /* create new Link-LSA */
374: OSPF6_LINK_LSA_SCHEDULE (oi);
375: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
376: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
377: }
378:
379: static void
380: ospf6_interface_state_change (u_char next_state, struct ospf6_interface *oi)
381: {
382: u_char prev_state;
383:
384: prev_state = oi->state;
385: oi->state = next_state;
386:
387: if (prev_state == next_state)
388: return;
389:
390: /* log */
391: if (IS_OSPF6_DEBUG_INTERFACE)
392: {
393: zlog_debug ("Interface state change %s: %s -> %s", oi->interface->name,
394: ospf6_interface_state_str[prev_state],
395: ospf6_interface_state_str[next_state]);
396: }
397:
398: if ((prev_state == OSPF6_INTERFACE_DR ||
399: prev_state == OSPF6_INTERFACE_BDR) &&
400: (next_state != OSPF6_INTERFACE_DR &&
401: next_state != OSPF6_INTERFACE_BDR))
402: ospf6_leave_alldrouters (oi->interface->ifindex);
403: if ((prev_state != OSPF6_INTERFACE_DR &&
404: prev_state != OSPF6_INTERFACE_BDR) &&
405: (next_state == OSPF6_INTERFACE_DR ||
406: next_state == OSPF6_INTERFACE_BDR))
407: ospf6_join_alldrouters (oi->interface->ifindex);
408:
409: OSPF6_ROUTER_LSA_SCHEDULE (oi->area);
410: if (next_state == OSPF6_INTERFACE_DOWN)
411: {
412: OSPF6_NETWORK_LSA_EXECUTE (oi);
413: OSPF6_INTRA_PREFIX_LSA_EXECUTE_TRANSIT (oi);
414: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
415: }
416: else if (prev_state == OSPF6_INTERFACE_DR ||
417: next_state == OSPF6_INTERFACE_DR)
418: {
419: OSPF6_NETWORK_LSA_SCHEDULE (oi);
420: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
421: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
422: }
423: }
424:
425:
426: /* DR Election, RFC2328 section 9.4 */
427:
428: #define IS_ELIGIBLE(n) \
429: ((n)->state >= OSPF6_NEIGHBOR_TWOWAY && (n)->priority != 0)
430:
431: static struct ospf6_neighbor *
432: better_bdrouter (struct ospf6_neighbor *a, struct ospf6_neighbor *b)
433: {
434: if ((a == NULL || ! IS_ELIGIBLE (a) || a->drouter == a->router_id) &&
435: (b == NULL || ! IS_ELIGIBLE (b) || b->drouter == b->router_id))
436: return NULL;
437: else if (a == NULL || ! IS_ELIGIBLE (a) || a->drouter == a->router_id)
438: return b;
439: else if (b == NULL || ! IS_ELIGIBLE (b) || b->drouter == b->router_id)
440: return a;
441:
442: if (a->bdrouter == a->router_id && b->bdrouter != b->router_id)
443: return a;
444: if (a->bdrouter != a->router_id && b->bdrouter == b->router_id)
445: return b;
446:
447: if (a->priority > b->priority)
448: return a;
449: if (a->priority < b->priority)
450: return b;
451:
452: if (ntohl (a->router_id) > ntohl (b->router_id))
453: return a;
454: if (ntohl (a->router_id) < ntohl (b->router_id))
455: return b;
456:
457: zlog_warn ("Router-ID duplicate ?");
458: return a;
459: }
460:
461: static struct ospf6_neighbor *
462: better_drouter (struct ospf6_neighbor *a, struct ospf6_neighbor *b)
463: {
464: if ((a == NULL || ! IS_ELIGIBLE (a) || a->drouter != a->router_id) &&
465: (b == NULL || ! IS_ELIGIBLE (b) || b->drouter != b->router_id))
466: return NULL;
467: else if (a == NULL || ! IS_ELIGIBLE (a) || a->drouter != a->router_id)
468: return b;
469: else if (b == NULL || ! IS_ELIGIBLE (b) || b->drouter != b->router_id)
470: return a;
471:
472: if (a->drouter == a->router_id && b->drouter != b->router_id)
473: return a;
474: if (a->drouter != a->router_id && b->drouter == b->router_id)
475: return b;
476:
477: if (a->priority > b->priority)
478: return a;
479: if (a->priority < b->priority)
480: return b;
481:
482: if (ntohl (a->router_id) > ntohl (b->router_id))
483: return a;
484: if (ntohl (a->router_id) < ntohl (b->router_id))
485: return b;
486:
487: zlog_warn ("Router-ID duplicate ?");
488: return a;
489: }
490:
491: static u_char
492: dr_election (struct ospf6_interface *oi)
493: {
494: struct listnode *node, *nnode;
495: struct ospf6_neighbor *on, *drouter, *bdrouter, myself;
496: struct ospf6_neighbor *best_drouter, *best_bdrouter;
497: u_char next_state = 0;
498:
499: drouter = bdrouter = NULL;
500: best_drouter = best_bdrouter = NULL;
501:
502: /* pseudo neighbor myself, including noting current DR/BDR (1) */
503: memset (&myself, 0, sizeof (myself));
504: inet_ntop (AF_INET, &oi->area->ospf6->router_id, myself.name,
505: sizeof (myself.name));
506: myself.state = OSPF6_NEIGHBOR_TWOWAY;
507: myself.drouter = oi->drouter;
508: myself.bdrouter = oi->bdrouter;
509: myself.priority = oi->priority;
510: myself.router_id = oi->area->ospf6->router_id;
511:
512: /* Electing BDR (2) */
513: for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
514: bdrouter = better_bdrouter (bdrouter, on);
515:
516: best_bdrouter = bdrouter;
517: bdrouter = better_bdrouter (best_bdrouter, &myself);
518:
519: /* Electing DR (3) */
520: for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
521: drouter = better_drouter (drouter, on);
522:
523: best_drouter = drouter;
524: drouter = better_drouter (best_drouter, &myself);
525: if (drouter == NULL)
526: drouter = bdrouter;
527:
528: /* the router itself is newly/no longer DR/BDR (4) */
529: if ((drouter == &myself && myself.drouter != myself.router_id) ||
530: (drouter != &myself && myself.drouter == myself.router_id) ||
531: (bdrouter == &myself && myself.bdrouter != myself.router_id) ||
532: (bdrouter != &myself && myself.bdrouter == myself.router_id))
533: {
534: myself.drouter = (drouter ? drouter->router_id : htonl (0));
535: myself.bdrouter = (bdrouter ? bdrouter->router_id : htonl (0));
536:
537: /* compatible to Electing BDR (2) */
538: bdrouter = better_bdrouter (best_bdrouter, &myself);
539:
540: /* compatible to Electing DR (3) */
541: drouter = better_drouter (best_drouter, &myself);
542: if (drouter == NULL)
543: drouter = bdrouter;
544: }
545:
546: /* Set interface state accordingly (5) */
547: if (drouter && drouter == &myself)
548: next_state = OSPF6_INTERFACE_DR;
549: else if (bdrouter && bdrouter == &myself)
550: next_state = OSPF6_INTERFACE_BDR;
551: else
552: next_state = OSPF6_INTERFACE_DROTHER;
553:
554: /* If NBMA, schedule Start for each neighbor having priority of 0 (6) */
555: /* XXX */
556:
557: /* If DR or BDR change, invoke AdjOK? for each neighbor (7) */
558: /* RFC 2328 section 12.4. Originating LSAs (3) will be handled
559: accordingly after AdjOK */
560: if (oi->drouter != (drouter ? drouter->router_id : htonl (0)) ||
561: oi->bdrouter != (bdrouter ? bdrouter->router_id : htonl (0)))
562: {
563: if (IS_OSPF6_DEBUG_INTERFACE)
564: zlog_debug ("DR Election on %s: DR: %s BDR: %s", oi->interface->name,
565: (drouter ? drouter->name : "0.0.0.0"),
566: (bdrouter ? bdrouter->name : "0.0.0.0"));
567:
568: for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, node, on))
569: {
570: if (on->state < OSPF6_NEIGHBOR_TWOWAY)
571: continue;
572: /* Schedule AdjOK. */
573: thread_add_event (master, adj_ok, on, 0);
574: }
575: }
576:
577: oi->drouter = (drouter ? drouter->router_id : htonl (0));
578: oi->bdrouter = (bdrouter ? bdrouter->router_id : htonl (0));
579: return next_state;
580: }
581:
582:
583: /* Interface State Machine */
584: int
585: interface_up (struct thread *thread)
586: {
587: struct ospf6_interface *oi;
588:
589: oi = (struct ospf6_interface *) THREAD_ARG (thread);
590: assert (oi && oi->interface);
591:
592: if (IS_OSPF6_DEBUG_INTERFACE)
593: zlog_debug ("Interface Event %s: [InterfaceUp]",
594: oi->interface->name);
595:
596: /* check physical interface is up */
597: if (! if_is_up (oi->interface))
598: {
599: if (IS_OSPF6_DEBUG_INTERFACE)
600: zlog_debug ("Interface %s is down, can't execute [InterfaceUp]",
601: oi->interface->name);
602: return 0;
603: }
604:
605: /* if already enabled, do nothing */
606: if (oi->state > OSPF6_INTERFACE_DOWN)
607: {
608: if (IS_OSPF6_DEBUG_INTERFACE)
609: zlog_debug ("Interface %s already enabled",
610: oi->interface->name);
611: return 0;
612: }
613:
614: /* Join AllSPFRouters */
615: ospf6_join_allspfrouters (oi->interface->ifindex);
616:
617: /* Update interface route */
618: ospf6_interface_connected_route_update (oi->interface);
619:
620: /* Schedule Hello */
621: if (! CHECK_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE))
622: thread_add_event (master, ospf6_hello_send, oi, 0);
623:
624: /* decide next interface state */
625: if (if_is_pointopoint (oi->interface))
626: ospf6_interface_state_change (OSPF6_INTERFACE_POINTTOPOINT, oi);
627: else if (oi->priority == 0)
628: ospf6_interface_state_change (OSPF6_INTERFACE_DROTHER, oi);
629: else
630: {
631: ospf6_interface_state_change (OSPF6_INTERFACE_WAITING, oi);
632: thread_add_timer (master, wait_timer, oi, oi->dead_interval);
633: }
634:
635: return 0;
636: }
637:
638: int
639: wait_timer (struct thread *thread)
640: {
641: struct ospf6_interface *oi;
642:
643: oi = (struct ospf6_interface *) THREAD_ARG (thread);
644: assert (oi && oi->interface);
645:
646: if (IS_OSPF6_DEBUG_INTERFACE)
647: zlog_debug ("Interface Event %s: [WaitTimer]",
648: oi->interface->name);
649:
650: if (oi->state == OSPF6_INTERFACE_WAITING)
651: ospf6_interface_state_change (dr_election (oi), oi);
652:
653: return 0;
654: }
655:
656: int
657: backup_seen (struct thread *thread)
658: {
659: struct ospf6_interface *oi;
660:
661: oi = (struct ospf6_interface *) THREAD_ARG (thread);
662: assert (oi && oi->interface);
663:
664: if (IS_OSPF6_DEBUG_INTERFACE)
665: zlog_debug ("Interface Event %s: [BackupSeen]",
666: oi->interface->name);
667:
668: if (oi->state == OSPF6_INTERFACE_WAITING)
669: ospf6_interface_state_change (dr_election (oi), oi);
670:
671: return 0;
672: }
673:
674: int
675: neighbor_change (struct thread *thread)
676: {
677: struct ospf6_interface *oi;
678:
679: oi = (struct ospf6_interface *) THREAD_ARG (thread);
680: assert (oi && oi->interface);
681:
682: if (IS_OSPF6_DEBUG_INTERFACE)
683: zlog_debug ("Interface Event %s: [NeighborChange]",
684: oi->interface->name);
685:
686: if (oi->state == OSPF6_INTERFACE_DROTHER ||
687: oi->state == OSPF6_INTERFACE_BDR ||
688: oi->state == OSPF6_INTERFACE_DR)
689: ospf6_interface_state_change (dr_election (oi), oi);
690:
691: return 0;
692: }
693:
694: int
695: interface_down (struct thread *thread)
696: {
697: struct ospf6_interface *oi;
698: struct listnode *node, *nnode;
699: struct ospf6_neighbor *on;
700:
701: oi = (struct ospf6_interface *) THREAD_ARG (thread);
702: assert (oi && oi->interface);
703:
704: if (IS_OSPF6_DEBUG_INTERFACE)
705: zlog_debug ("Interface Event %s: [InterfaceDown]",
706: oi->interface->name);
707:
708: /* Leave AllSPFRouters */
709: if (oi->state > OSPF6_INTERFACE_DOWN)
710: ospf6_leave_allspfrouters (oi->interface->ifindex);
711:
712: ospf6_interface_state_change (OSPF6_INTERFACE_DOWN, oi);
713:
714: for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
715: ospf6_neighbor_delete (on);
716:
717: list_delete_all_node (oi->neighbor_list);
718:
719: return 0;
720: }
721:
722:
723: /* show specified interface structure */
724: static int
725: ospf6_interface_show (struct vty *vty, struct interface *ifp)
726: {
727: struct ospf6_interface *oi;
728: struct connected *c;
729: struct prefix *p;
730: struct listnode *i;
731: char strbuf[64], drouter[32], bdrouter[32];
732: const char *updown[3] = {"down", "up", NULL};
733: const char *type;
734: struct timeval res, now;
735: char duration[32];
736: struct ospf6_lsa *lsa;
737:
738: /* check physical interface type */
739: if (if_is_loopback (ifp))
740: type = "LOOPBACK";
741: else if (if_is_broadcast (ifp))
742: type = "BROADCAST";
743: else if (if_is_pointopoint (ifp))
744: type = "POINTOPOINT";
745: else
746: type = "UNKNOWN";
747:
748: vty_out (vty, "%s is %s, type %s%s",
749: ifp->name, updown[if_is_up (ifp)], type,
750: VNL);
751: vty_out (vty, " Interface ID: %d%s", ifp->ifindex, VNL);
752:
753: if (ifp->info == NULL)
754: {
755: vty_out (vty, " OSPF not enabled on this interface%s", VNL);
756: return 0;
757: }
758: else
759: oi = (struct ospf6_interface *) ifp->info;
760:
761: vty_out (vty, " Internet Address:%s", VNL);
762:
763: for (ALL_LIST_ELEMENTS_RO (ifp->connected, i, c))
764: {
765: p = c->address;
766: prefix2str (p, strbuf, sizeof (strbuf));
767: switch (p->family)
768: {
769: case AF_INET:
770: vty_out (vty, " inet : %s%s", strbuf,
771: VNL);
772: break;
773: case AF_INET6:
774: vty_out (vty, " inet6: %s%s", strbuf,
775: VNL);
776: break;
777: default:
778: vty_out (vty, " ??? : %s%s", strbuf,
779: VNL);
780: break;
781: }
782: }
783:
784: if (oi->area)
785: {
786: vty_out (vty, " Instance ID %d, Interface MTU %d (autodetect: %d)%s",
787: oi->instance_id, oi->ifmtu, ifp->mtu6, VNL);
788: vty_out (vty, " MTU mismatch detection: %s%s", oi->mtu_ignore ?
789: "disabled" : "enabled", VNL);
790: inet_ntop (AF_INET, &oi->area->area_id,
791: strbuf, sizeof (strbuf));
792: vty_out (vty, " Area ID %s, Cost %hu%s", strbuf, oi->cost,
793: VNL);
794: }
795: else
796: vty_out (vty, " Not Attached to Area%s", VNL);
797:
798: vty_out (vty, " State %s, Transmit Delay %d sec, Priority %d%s",
799: ospf6_interface_state_str[oi->state],
800: oi->transdelay, oi->priority,
801: VNL);
802: vty_out (vty, " Timer intervals configured:%s", VNL);
803: vty_out (vty, " Hello %d, Dead %d, Retransmit %d%s",
804: oi->hello_interval, oi->dead_interval, oi->rxmt_interval,
805: VNL);
806:
807: inet_ntop (AF_INET, &oi->drouter, drouter, sizeof (drouter));
808: inet_ntop (AF_INET, &oi->bdrouter, bdrouter, sizeof (bdrouter));
809: vty_out (vty, " DR: %s BDR: %s%s", drouter, bdrouter, VNL);
810:
811: vty_out (vty, " Number of I/F scoped LSAs is %u%s",
812: oi->lsdb->count, VNL);
813:
814: quagga_gettime (QUAGGA_CLK_MONOTONIC, &now);
815:
816: timerclear (&res);
817: if (oi->thread_send_lsupdate)
818: timersub (&oi->thread_send_lsupdate->u.sands, &now, &res);
819: timerstring (&res, duration, sizeof (duration));
820: vty_out (vty, " %d Pending LSAs for LSUpdate in Time %s [thread %s]%s",
821: oi->lsupdate_list->count, duration,
822: (oi->thread_send_lsupdate ? "on" : "off"),
823: VNL);
824: for (lsa = ospf6_lsdb_head (oi->lsupdate_list); lsa;
825: lsa = ospf6_lsdb_next (lsa))
826: vty_out (vty, " %s%s", lsa->name, VNL);
827:
828: timerclear (&res);
829: if (oi->thread_send_lsack)
830: timersub (&oi->thread_send_lsack->u.sands, &now, &res);
831: timerstring (&res, duration, sizeof (duration));
832: vty_out (vty, " %d Pending LSAs for LSAck in Time %s [thread %s]%s",
833: oi->lsack_list->count, duration,
834: (oi->thread_send_lsack ? "on" : "off"),
835: VNL);
836: for (lsa = ospf6_lsdb_head (oi->lsack_list); lsa;
837: lsa = ospf6_lsdb_next (lsa))
838: vty_out (vty, " %s%s", lsa->name, VNL);
839:
840: return 0;
841: }
842:
843: /* show interface */
844: DEFUN (show_ipv6_ospf6_interface,
845: show_ipv6_ospf6_interface_ifname_cmd,
846: "show ipv6 ospf6 interface IFNAME",
847: SHOW_STR
848: IP6_STR
849: OSPF6_STR
850: INTERFACE_STR
851: IFNAME_STR
852: )
853: {
854: struct interface *ifp;
855: struct listnode *i;
856:
857: if (argc)
858: {
859: ifp = if_lookup_by_name (argv[0]);
860: if (ifp == NULL)
861: {
862: vty_out (vty, "No such Interface: %s%s", argv[0],
863: VNL);
864: return CMD_WARNING;
865: }
866: ospf6_interface_show (vty, ifp);
867: }
868: else
869: {
870: for (ALL_LIST_ELEMENTS_RO (iflist, i, ifp))
871: ospf6_interface_show (vty, ifp);
872: }
873:
874: return CMD_SUCCESS;
875: }
876:
877: ALIAS (show_ipv6_ospf6_interface,
878: show_ipv6_ospf6_interface_cmd,
879: "show ipv6 ospf6 interface",
880: SHOW_STR
881: IP6_STR
882: OSPF6_STR
883: INTERFACE_STR
884: )
885:
886: DEFUN (show_ipv6_ospf6_interface_ifname_prefix,
887: show_ipv6_ospf6_interface_ifname_prefix_cmd,
888: "show ipv6 ospf6 interface IFNAME prefix",
889: SHOW_STR
890: IP6_STR
891: OSPF6_STR
892: INTERFACE_STR
893: IFNAME_STR
894: "Display connected prefixes to advertise\n"
895: )
896: {
897: struct interface *ifp;
898: struct ospf6_interface *oi;
899:
900: ifp = if_lookup_by_name (argv[0]);
901: if (ifp == NULL)
902: {
903: vty_out (vty, "No such Interface: %s%s", argv[0], VNL);
904: return CMD_WARNING;
905: }
906:
907: oi = ifp->info;
908: if (oi == NULL)
909: {
910: vty_out (vty, "OSPFv3 is not enabled on %s%s", argv[0], VNL);
911: return CMD_WARNING;
912: }
913:
914: argc--;
915: argv++;
916: ospf6_route_table_show (vty, argc, argv, oi->route_connected);
917:
918: return CMD_SUCCESS;
919: }
920:
921: ALIAS (show_ipv6_ospf6_interface_ifname_prefix,
922: show_ipv6_ospf6_interface_ifname_prefix_detail_cmd,
923: "show ipv6 ospf6 interface IFNAME prefix (X:X::X:X|X:X::X:X/M|detail)",
924: SHOW_STR
925: IP6_STR
926: OSPF6_STR
927: INTERFACE_STR
928: IFNAME_STR
929: "Display connected prefixes to advertise\n"
930: OSPF6_ROUTE_ADDRESS_STR
931: OSPF6_ROUTE_PREFIX_STR
932: "Display details of the prefixes\n"
933: )
934:
935: ALIAS (show_ipv6_ospf6_interface_ifname_prefix,
936: show_ipv6_ospf6_interface_ifname_prefix_match_cmd,
937: "show ipv6 ospf6 interface IFNAME prefix X:X::X:X/M (match|detail)",
938: SHOW_STR
939: IP6_STR
940: OSPF6_STR
941: INTERFACE_STR
942: IFNAME_STR
943: "Display connected prefixes to advertise\n"
944: OSPF6_ROUTE_PREFIX_STR
945: OSPF6_ROUTE_MATCH_STR
946: "Display details of the prefixes\n"
947: )
948:
949: DEFUN (show_ipv6_ospf6_interface_prefix,
950: show_ipv6_ospf6_interface_prefix_cmd,
951: "show ipv6 ospf6 interface prefix",
952: SHOW_STR
953: IP6_STR
954: OSPF6_STR
955: INTERFACE_STR
956: "Display connected prefixes to advertise\n"
957: )
958: {
959: struct listnode *i;
960: struct ospf6_interface *oi;
961: struct interface *ifp;
962:
963: for (ALL_LIST_ELEMENTS_RO (iflist, i, ifp))
964: {
965: oi = (struct ospf6_interface *) ifp->info;
966: if (oi == NULL)
967: continue;
968:
969: ospf6_route_table_show (vty, argc, argv, oi->route_connected);
970: }
971:
972: return CMD_SUCCESS;
973: }
974:
975: ALIAS (show_ipv6_ospf6_interface_prefix,
976: show_ipv6_ospf6_interface_prefix_detail_cmd,
977: "show ipv6 ospf6 interface prefix (X:X::X:X|X:X::X:X/M|detail)",
978: SHOW_STR
979: IP6_STR
980: OSPF6_STR
981: INTERFACE_STR
982: "Display connected prefixes to advertise\n"
983: OSPF6_ROUTE_ADDRESS_STR
984: OSPF6_ROUTE_PREFIX_STR
985: "Display details of the prefixes\n"
986: )
987:
988: ALIAS (show_ipv6_ospf6_interface_prefix,
989: show_ipv6_ospf6_interface_prefix_match_cmd,
990: "show ipv6 ospf6 interface prefix X:X::X:X/M (match|detail)",
991: SHOW_STR
992: IP6_STR
993: OSPF6_STR
994: INTERFACE_STR
995: "Display connected prefixes to advertise\n"
996: OSPF6_ROUTE_PREFIX_STR
997: OSPF6_ROUTE_MATCH_STR
998: "Display details of the prefixes\n"
999: )
1000:
1001:
1002: /* interface variable set command */
1003: DEFUN (ipv6_ospf6_ifmtu,
1004: ipv6_ospf6_ifmtu_cmd,
1005: "ipv6 ospf6 ifmtu <1-65535>",
1006: IP6_STR
1007: OSPF6_STR
1008: "Interface MTU\n"
1009: "OSPFv3 Interface MTU\n"
1010: )
1011: {
1012: struct ospf6_interface *oi;
1013: struct interface *ifp;
1014: unsigned int ifmtu, iobuflen;
1015: struct listnode *node, *nnode;
1016: struct ospf6_neighbor *on;
1017:
1018: ifp = (struct interface *) vty->index;
1019: assert (ifp);
1020:
1021: oi = (struct ospf6_interface *) ifp->info;
1022: if (oi == NULL)
1023: oi = ospf6_interface_create (ifp);
1024: assert (oi);
1025:
1026: ifmtu = strtol (argv[0], NULL, 10);
1027:
1028: if (oi->ifmtu == ifmtu)
1029: return CMD_SUCCESS;
1030:
1031: if (ifp->mtu6 != 0 && ifp->mtu6 < ifmtu)
1032: {
1033: vty_out (vty, "%s's ospf6 ifmtu cannot go beyond physical mtu (%d)%s",
1034: ifp->name, ifp->mtu6, VNL);
1035: return CMD_WARNING;
1036: }
1037:
1038: if (oi->ifmtu < ifmtu)
1039: {
1040: iobuflen = ospf6_iobuf_size (ifmtu);
1041: if (iobuflen < ifmtu)
1042: {
1043: vty_out (vty, "%s's ifmtu is adjusted to I/O buffer size (%d).%s",
1044: ifp->name, iobuflen, VNL);
1045: oi->ifmtu = iobuflen;
1046: }
1047: else
1048: oi->ifmtu = ifmtu;
1049: }
1050: else
1051: oi->ifmtu = ifmtu;
1052:
1053: /* re-establish adjacencies */
1054: for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
1055: {
1056: THREAD_OFF (on->inactivity_timer);
1057: thread_add_event (master, inactivity_timer, on, 0);
1058: }
1059:
1060: return CMD_SUCCESS;
1061: }
1062:
1063: DEFUN (no_ipv6_ospf6_ifmtu,
1064: no_ipv6_ospf6_ifmtu_cmd,
1065: "no ipv6 ospf6 ifmtu",
1066: NO_STR
1067: IP6_STR
1068: OSPF6_STR
1069: "Interface MTU\n"
1070: )
1071: {
1072: struct ospf6_interface *oi;
1073: struct interface *ifp;
1074: unsigned int iobuflen;
1075: struct listnode *node, *nnode;
1076: struct ospf6_neighbor *on;
1077:
1078: ifp = (struct interface *) vty->index;
1079: assert (ifp);
1080:
1081: oi = (struct ospf6_interface *) ifp->info;
1082: if (oi == NULL)
1083: oi = ospf6_interface_create (ifp);
1084: assert (oi);
1085:
1086: if (oi->ifmtu < ifp->mtu)
1087: {
1088: iobuflen = ospf6_iobuf_size (ifp->mtu);
1089: if (iobuflen < ifp->mtu)
1090: {
1091: vty_out (vty, "%s's ifmtu is adjusted to I/O buffer size (%d).%s",
1092: ifp->name, iobuflen, VNL);
1093: oi->ifmtu = iobuflen;
1094: }
1095: else
1096: oi->ifmtu = ifp->mtu;
1097: }
1098: else
1099: oi->ifmtu = ifp->mtu;
1100:
1101: /* re-establish adjacencies */
1102: for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
1103: {
1104: THREAD_OFF (on->inactivity_timer);
1105: thread_add_event (master, inactivity_timer, on, 0);
1106: }
1107:
1108: return CMD_SUCCESS;
1109: }
1110:
1111: DEFUN (ipv6_ospf6_cost,
1112: ipv6_ospf6_cost_cmd,
1113: "ipv6 ospf6 cost <1-65535>",
1114: IP6_STR
1115: OSPF6_STR
1116: "Interface cost\n"
1117: "Outgoing metric of this interface\n"
1118: )
1119: {
1120: struct ospf6_interface *oi;
1121: struct interface *ifp;
1122: unsigned long int lcost;
1123:
1124: ifp = (struct interface *) vty->index;
1125: assert (ifp);
1126:
1127: oi = (struct ospf6_interface *) ifp->info;
1128: if (oi == NULL)
1129: oi = ospf6_interface_create (ifp);
1130: assert (oi);
1131:
1132: lcost = strtol (argv[0], NULL, 10);
1133:
1134: if (lcost > UINT32_MAX)
1135: {
1136: vty_out (vty, "Cost %ld is out of range%s", lcost, VNL);
1137: return CMD_WARNING;
1138: }
1139:
1140: if (oi->cost == lcost)
1141: return CMD_SUCCESS;
1142:
1143: oi->cost = lcost;
1144:
1145: /* update cost held in route_connected list in ospf6_interface */
1146: ospf6_interface_connected_route_update (oi->interface);
1147:
1148: /* execute LSA hooks */
1149: if (oi->area)
1150: {
1151: OSPF6_LINK_LSA_SCHEDULE (oi);
1152: OSPF6_ROUTER_LSA_SCHEDULE (oi->area);
1153: OSPF6_NETWORK_LSA_SCHEDULE (oi);
1154: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
1155: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
1156: }
1157:
1158: return CMD_SUCCESS;
1159: }
1160:
1161: DEFUN (ipv6_ospf6_hellointerval,
1162: ipv6_ospf6_hellointerval_cmd,
1163: "ipv6 ospf6 hello-interval <1-65535>",
1164: IP6_STR
1165: OSPF6_STR
1166: "Interval time of Hello packets\n"
1167: SECONDS_STR
1168: )
1169: {
1170: struct ospf6_interface *oi;
1171: struct interface *ifp;
1172:
1173: ifp = (struct interface *) vty->index;
1174: assert (ifp);
1175:
1176: oi = (struct ospf6_interface *) ifp->info;
1177: if (oi == NULL)
1178: oi = ospf6_interface_create (ifp);
1179: assert (oi);
1180:
1181: oi->hello_interval = strtol (argv[0], NULL, 10);
1182: return CMD_SUCCESS;
1183: }
1184:
1185: /* interface variable set command */
1186: DEFUN (ipv6_ospf6_deadinterval,
1187: ipv6_ospf6_deadinterval_cmd,
1188: "ipv6 ospf6 dead-interval <1-65535>",
1189: IP6_STR
1190: OSPF6_STR
1191: "Interval time after which a neighbor is declared down\n"
1192: SECONDS_STR
1193: )
1194: {
1195: struct ospf6_interface *oi;
1196: struct interface *ifp;
1197:
1198: ifp = (struct interface *) vty->index;
1199: assert (ifp);
1200:
1201: oi = (struct ospf6_interface *) ifp->info;
1202: if (oi == NULL)
1203: oi = ospf6_interface_create (ifp);
1204: assert (oi);
1205:
1206: oi->dead_interval = strtol (argv[0], NULL, 10);
1207: return CMD_SUCCESS;
1208: }
1209:
1210: /* interface variable set command */
1211: DEFUN (ipv6_ospf6_transmitdelay,
1212: ipv6_ospf6_transmitdelay_cmd,
1213: "ipv6 ospf6 transmit-delay <1-3600>",
1214: IP6_STR
1215: OSPF6_STR
1216: "Transmit delay of this interface\n"
1217: SECONDS_STR
1218: )
1219: {
1220: struct ospf6_interface *oi;
1221: struct interface *ifp;
1222:
1223: ifp = (struct interface *) vty->index;
1224: assert (ifp);
1225:
1226: oi = (struct ospf6_interface *) ifp->info;
1227: if (oi == NULL)
1228: oi = ospf6_interface_create (ifp);
1229: assert (oi);
1230:
1231: oi->transdelay = strtol (argv[0], NULL, 10);
1232: return CMD_SUCCESS;
1233: }
1234:
1235: /* interface variable set command */
1236: DEFUN (ipv6_ospf6_retransmitinterval,
1237: ipv6_ospf6_retransmitinterval_cmd,
1238: "ipv6 ospf6 retransmit-interval <1-65535>",
1239: IP6_STR
1240: OSPF6_STR
1241: "Time between retransmitting lost link state advertisements\n"
1242: SECONDS_STR
1243: )
1244: {
1245: struct ospf6_interface *oi;
1246: struct interface *ifp;
1247:
1248: ifp = (struct interface *) vty->index;
1249: assert (ifp);
1250:
1251: oi = (struct ospf6_interface *) ifp->info;
1252: if (oi == NULL)
1253: oi = ospf6_interface_create (ifp);
1254: assert (oi);
1255:
1256: oi->rxmt_interval = strtol (argv[0], NULL, 10);
1257: return CMD_SUCCESS;
1258: }
1259:
1260: /* interface variable set command */
1261: DEFUN (ipv6_ospf6_priority,
1262: ipv6_ospf6_priority_cmd,
1263: "ipv6 ospf6 priority <0-255>",
1264: IP6_STR
1265: OSPF6_STR
1266: "Router priority\n"
1267: "Priority value\n"
1268: )
1269: {
1270: struct ospf6_interface *oi;
1271: struct interface *ifp;
1272:
1273: ifp = (struct interface *) vty->index;
1274: assert (ifp);
1275:
1276: oi = (struct ospf6_interface *) ifp->info;
1277: if (oi == NULL)
1278: oi = ospf6_interface_create (ifp);
1279: assert (oi);
1280:
1281: oi->priority = strtol (argv[0], NULL, 10);
1282:
1283: if (oi->area)
1284: ospf6_interface_state_change (dr_election (oi), oi);
1285:
1286: return CMD_SUCCESS;
1287: }
1288:
1289: DEFUN (ipv6_ospf6_instance,
1290: ipv6_ospf6_instance_cmd,
1291: "ipv6 ospf6 instance-id <0-255>",
1292: IP6_STR
1293: OSPF6_STR
1294: "Instance ID for this interface\n"
1295: "Instance ID value\n"
1296: )
1297: {
1298: struct ospf6_interface *oi;
1299: struct interface *ifp;
1300:
1301: ifp = (struct interface *)vty->index;
1302: assert (ifp);
1303:
1304: oi = (struct ospf6_interface *)ifp->info;
1305: if (oi == NULL)
1306: oi = ospf6_interface_create (ifp);
1307: assert (oi);
1308:
1309: oi->instance_id = strtol (argv[0], NULL, 10);
1310: return CMD_SUCCESS;
1311: }
1312:
1313: DEFUN (ipv6_ospf6_passive,
1314: ipv6_ospf6_passive_cmd,
1315: "ipv6 ospf6 passive",
1316: IP6_STR
1317: OSPF6_STR
1318: "passive interface, No adjacency will be formed on this interface\n"
1319: )
1320: {
1321: struct ospf6_interface *oi;
1322: struct interface *ifp;
1323: struct listnode *node, *nnode;
1324: struct ospf6_neighbor *on;
1325:
1326: ifp = (struct interface *) vty->index;
1327: assert (ifp);
1328:
1329: oi = (struct ospf6_interface *) ifp->info;
1330: if (oi == NULL)
1331: oi = ospf6_interface_create (ifp);
1332: assert (oi);
1333:
1334: SET_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE);
1335: THREAD_OFF (oi->thread_send_hello);
1336:
1337: for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
1338: {
1339: THREAD_OFF (on->inactivity_timer);
1340: thread_add_event (master, inactivity_timer, on, 0);
1341: }
1342:
1343: return CMD_SUCCESS;
1344: }
1345:
1346: DEFUN (no_ipv6_ospf6_passive,
1347: no_ipv6_ospf6_passive_cmd,
1348: "no ipv6 ospf6 passive",
1349: NO_STR
1350: IP6_STR
1351: OSPF6_STR
1352: "passive interface: No Adjacency will be formed on this I/F\n"
1353: )
1354: {
1355: struct ospf6_interface *oi;
1356: struct interface *ifp;
1357:
1358: ifp = (struct interface *) vty->index;
1359: assert (ifp);
1360:
1361: oi = (struct ospf6_interface *) ifp->info;
1362: if (oi == NULL)
1363: oi = ospf6_interface_create (ifp);
1364: assert (oi);
1365:
1366: UNSET_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE);
1367: THREAD_OFF (oi->thread_send_hello);
1368: oi->thread_send_hello =
1369: thread_add_event (master, ospf6_hello_send, oi, 0);
1370:
1371: return CMD_SUCCESS;
1372: }
1373:
1374: DEFUN (ipv6_ospf6_mtu_ignore,
1375: ipv6_ospf6_mtu_ignore_cmd,
1376: "ipv6 ospf6 mtu-ignore",
1377: IP6_STR
1378: OSPF6_STR
1379: "Ignore MTU mismatch on this interface\n"
1380: )
1381: {
1382: struct ospf6_interface *oi;
1383: struct interface *ifp;
1384:
1385: ifp = (struct interface *) vty->index;
1386: assert (ifp);
1387:
1388: oi = (struct ospf6_interface *) ifp->info;
1389: if (oi == NULL)
1390: oi = ospf6_interface_create (ifp);
1391: assert (oi);
1392:
1393: oi->mtu_ignore = 1;
1394:
1395: return CMD_SUCCESS;
1396: }
1397:
1398: DEFUN (no_ipv6_ospf6_mtu_ignore,
1399: no_ipv6_ospf6_mtu_ignore_cmd,
1400: "no ipv6 ospf6 mtu-ignore",
1401: NO_STR
1402: IP6_STR
1403: OSPF6_STR
1404: "Ignore MTU mismatch on this interface\n"
1405: )
1406: {
1407: struct ospf6_interface *oi;
1408: struct interface *ifp;
1409:
1410: ifp = (struct interface *) vty->index;
1411: assert (ifp);
1412:
1413: oi = (struct ospf6_interface *) ifp->info;
1414: if (oi == NULL)
1415: oi = ospf6_interface_create (ifp);
1416: assert (oi);
1417:
1418: oi->mtu_ignore = 0;
1419:
1420: return CMD_SUCCESS;
1421: }
1422:
1423: DEFUN (ipv6_ospf6_advertise_prefix_list,
1424: ipv6_ospf6_advertise_prefix_list_cmd,
1425: "ipv6 ospf6 advertise prefix-list WORD",
1426: IP6_STR
1427: OSPF6_STR
1428: "Advertising options\n"
1429: "Filter prefix using prefix-list\n"
1430: "Prefix list name\n"
1431: )
1432: {
1433: struct ospf6_interface *oi;
1434: struct interface *ifp;
1435:
1436: ifp = (struct interface *) vty->index;
1437: assert (ifp);
1438:
1439: oi = (struct ospf6_interface *) ifp->info;
1440: if (oi == NULL)
1441: oi = ospf6_interface_create (ifp);
1442: assert (oi);
1443:
1444: if (oi->plist_name)
1445: XFREE (MTYPE_PREFIX_LIST_STR, oi->plist_name);
1446: oi->plist_name = XSTRDUP (MTYPE_PREFIX_LIST_STR, argv[0]);
1447:
1448: ospf6_interface_connected_route_update (oi->interface);
1449:
1450: if (oi->area)
1451: {
1452: OSPF6_LINK_LSA_SCHEDULE (oi);
1453: if (oi->state == OSPF6_INTERFACE_DR)
1454: {
1455: OSPF6_NETWORK_LSA_SCHEDULE (oi);
1456: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
1457: }
1458: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
1459: }
1460:
1461: return CMD_SUCCESS;
1462: }
1463:
1464: DEFUN (no_ipv6_ospf6_advertise_prefix_list,
1465: no_ipv6_ospf6_advertise_prefix_list_cmd,
1466: "no ipv6 ospf6 advertise prefix-list",
1467: NO_STR
1468: IP6_STR
1469: OSPF6_STR
1470: "Advertising options\n"
1471: "Filter prefix using prefix-list\n"
1472: )
1473: {
1474: struct ospf6_interface *oi;
1475: struct interface *ifp;
1476:
1477: ifp = (struct interface *) vty->index;
1478: assert (ifp);
1479:
1480: oi = (struct ospf6_interface *) ifp->info;
1481: if (oi == NULL)
1482: oi = ospf6_interface_create (ifp);
1483: assert (oi);
1484:
1485: if (oi->plist_name)
1486: {
1487: XFREE (MTYPE_PREFIX_LIST_STR, oi->plist_name);
1488: oi->plist_name = NULL;
1489: }
1490:
1491: ospf6_interface_connected_route_update (oi->interface);
1492:
1493: if (oi->area)
1494: {
1495: OSPF6_LINK_LSA_SCHEDULE (oi);
1496: if (oi->state == OSPF6_INTERFACE_DR)
1497: {
1498: OSPF6_NETWORK_LSA_SCHEDULE (oi);
1499: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
1500: }
1501: OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
1502: }
1503:
1504: return CMD_SUCCESS;
1505: }
1506:
1507: static int
1508: config_write_ospf6_interface (struct vty *vty)
1509: {
1510: struct listnode *i;
1511: struct ospf6_interface *oi;
1512: struct interface *ifp;
1513:
1514: for (ALL_LIST_ELEMENTS_RO (iflist, i, ifp))
1515: {
1516: oi = (struct ospf6_interface *) ifp->info;
1517: if (oi == NULL)
1518: continue;
1519:
1520: vty_out (vty, "interface %s%s",
1521: oi->interface->name, VNL);
1522:
1523: if (ifp->desc)
1524: vty_out (vty, " description %s%s", ifp->desc, VNL);
1525:
1526: if (ifp->mtu6 != oi->ifmtu)
1527: vty_out (vty, " ipv6 ospf6 ifmtu %d%s", oi->ifmtu, VNL);
1528: vty_out (vty, " ipv6 ospf6 cost %d%s",
1529: oi->cost, VNL);
1530: vty_out (vty, " ipv6 ospf6 hello-interval %d%s",
1531: oi->hello_interval, VNL);
1532: vty_out (vty, " ipv6 ospf6 dead-interval %d%s",
1533: oi->dead_interval, VNL);
1534: vty_out (vty, " ipv6 ospf6 retransmit-interval %d%s",
1535: oi->rxmt_interval, VNL);
1536: vty_out (vty, " ipv6 ospf6 priority %d%s",
1537: oi->priority, VNL);
1538: vty_out (vty, " ipv6 ospf6 transmit-delay %d%s",
1539: oi->transdelay, VNL);
1540: vty_out (vty, " ipv6 ospf6 instance-id %d%s",
1541: oi->instance_id, VNL);
1542:
1543: if (oi->plist_name)
1544: vty_out (vty, " ipv6 ospf6 advertise prefix-list %s%s",
1545: oi->plist_name, VNL);
1546:
1547: if (CHECK_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE))
1548: vty_out (vty, " ipv6 ospf6 passive%s", VNL);
1549:
1550: if (oi->mtu_ignore)
1551: vty_out (vty, " ipv6 ospf6 mtu-ignore%s", VNL);
1552:
1553: vty_out (vty, "!%s", VNL);
1554: }
1555: return 0;
1556: }
1557:
1558: static struct cmd_node interface_node =
1559: {
1560: INTERFACE_NODE,
1561: "%s(config-if)# ",
1562: 1 /* VTYSH */
1563: };
1564:
1565: void
1566: ospf6_interface_init (void)
1567: {
1568: /* Install interface node. */
1569: install_node (&interface_node, config_write_ospf6_interface);
1570:
1571: install_element (VIEW_NODE, &show_ipv6_ospf6_interface_cmd);
1572: install_element (VIEW_NODE, &show_ipv6_ospf6_interface_prefix_cmd);
1573: install_element (VIEW_NODE, &show_ipv6_ospf6_interface_prefix_detail_cmd);
1574: install_element (VIEW_NODE, &show_ipv6_ospf6_interface_prefix_match_cmd);
1575: install_element (VIEW_NODE, &show_ipv6_ospf6_interface_ifname_cmd);
1576: install_element (VIEW_NODE, &show_ipv6_ospf6_interface_ifname_prefix_cmd);
1577: install_element (VIEW_NODE, &show_ipv6_ospf6_interface_ifname_prefix_detail_cmd);
1578: install_element (VIEW_NODE, &show_ipv6_ospf6_interface_ifname_prefix_match_cmd);
1579: install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_cmd);
1580: install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_prefix_cmd);
1581: install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_prefix_detail_cmd);
1582: install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_prefix_match_cmd);
1583: install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_ifname_cmd);
1584: install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_ifname_prefix_cmd);
1585: install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_ifname_prefix_detail_cmd);
1586: install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_ifname_prefix_match_cmd);
1587:
1588: install_element (CONFIG_NODE, &interface_cmd);
1589: install_default (INTERFACE_NODE);
1590: install_element (INTERFACE_NODE, &interface_desc_cmd);
1591: install_element (INTERFACE_NODE, &no_interface_desc_cmd);
1592: install_element (INTERFACE_NODE, &ipv6_ospf6_cost_cmd);
1593: install_element (INTERFACE_NODE, &ipv6_ospf6_ifmtu_cmd);
1594: install_element (INTERFACE_NODE, &no_ipv6_ospf6_ifmtu_cmd);
1595: install_element (INTERFACE_NODE, &ipv6_ospf6_deadinterval_cmd);
1596: install_element (INTERFACE_NODE, &ipv6_ospf6_hellointerval_cmd);
1597: install_element (INTERFACE_NODE, &ipv6_ospf6_priority_cmd);
1598: install_element (INTERFACE_NODE, &ipv6_ospf6_retransmitinterval_cmd);
1599: install_element (INTERFACE_NODE, &ipv6_ospf6_transmitdelay_cmd);
1600: install_element (INTERFACE_NODE, &ipv6_ospf6_instance_cmd);
1601:
1602: install_element (INTERFACE_NODE, &ipv6_ospf6_passive_cmd);
1603: install_element (INTERFACE_NODE, &no_ipv6_ospf6_passive_cmd);
1604:
1605: install_element (INTERFACE_NODE, &ipv6_ospf6_mtu_ignore_cmd);
1606: install_element (INTERFACE_NODE, &no_ipv6_ospf6_mtu_ignore_cmd);
1607:
1608: install_element (INTERFACE_NODE, &ipv6_ospf6_advertise_prefix_list_cmd);
1609: install_element (INTERFACE_NODE, &no_ipv6_ospf6_advertise_prefix_list_cmd);
1610: }
1611:
1612: DEFUN (debug_ospf6_interface,
1613: debug_ospf6_interface_cmd,
1614: "debug ospf6 interface",
1615: DEBUG_STR
1616: OSPF6_STR
1617: "Debug OSPFv3 Interface\n"
1618: )
1619: {
1620: OSPF6_DEBUG_INTERFACE_ON ();
1621: return CMD_SUCCESS;
1622: }
1623:
1624: DEFUN (no_debug_ospf6_interface,
1625: no_debug_ospf6_interface_cmd,
1626: "no debug ospf6 interface",
1627: NO_STR
1628: DEBUG_STR
1629: OSPF6_STR
1630: "Debug OSPFv3 Interface\n"
1631: )
1632: {
1633: OSPF6_DEBUG_INTERFACE_OFF ();
1634: return CMD_SUCCESS;
1635: }
1636:
1637: int
1638: config_write_ospf6_debug_interface (struct vty *vty)
1639: {
1640: if (IS_OSPF6_DEBUG_INTERFACE)
1641: vty_out (vty, "debug ospf6 interface%s", VNL);
1642: return 0;
1643: }
1644:
1645: void
1646: install_element_ospf6_debug_interface (void)
1647: {
1648: install_element (ENABLE_NODE, &debug_ospf6_interface_cmd);
1649: install_element (ENABLE_NODE, &no_debug_ospf6_interface_cmd);
1650: install_element (CONFIG_NODE, &debug_ospf6_interface_cmd);
1651: install_element (CONFIG_NODE, &no_debug_ospf6_interface_cmd);
1652: }
1653:
1654:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>