Annotation of embedaddon/quagga/zebra/irdp_interface.c, revision 1.1.1.1
1.1 misho 1: /*
2: *
3: * Copyright (C) 2000 Robert Olsson.
4: * Swedish University of Agricultural Sciences
5: *
6: * This file is part of GNU Zebra.
7: *
8: * GNU Zebra is free software; you can redistribute it and/or modify it
9: * under the terms of the GNU General Public License as published by the
10: * Free Software Foundation; either version 2, or (at your option) any
11: * later version.
12: *
13: * GNU Zebra is distributed in the hope that it will be useful, but
14: * WITHOUT ANY WARRANTY; without even the implied warranty of
15: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16: * General Public License for more details.
17: *
18: * You should have received a copy of the GNU General Public License
19: * along with GNU Zebra; see the file COPYING. If not, write to the Free
20: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21: * 02111-1307, USA.
22: */
23:
24: /*
25: * This work includes work with the following copywrite:
26: *
27: * Copyright (C) 1997, 2000 Kunihiro Ishiguro
28: *
29: */
30:
31: /*
32: * Thanks to Jens Låås at Swedish University of Agricultural Sciences
33: * for reviewing and tests.
34: */
35:
36:
37: #include <zebra.h>
38:
39: #ifdef HAVE_IRDP
40:
41: #include "if.h"
42: #include "vty.h"
43: #include "sockunion.h"
44: #include "prefix.h"
45: #include "command.h"
46: #include "memory.h"
47: #include "stream.h"
48: #include "ioctl.h"
49: #include "connected.h"
50: #include "log.h"
51: #include "zclient.h"
52: #include "thread.h"
53: #include "zebra/interface.h"
54: #include "zebra/rtadv.h"
55: #include "zebra/rib.h"
56: #include "zebra/zserv.h"
57: #include "zebra/redistribute.h"
58: #include "zebra/irdp.h"
59: #include <netinet/ip_icmp.h>
60: #include "if.h"
61: #include "sockunion.h"
62: #include "log.h"
63:
64:
65: /* Master of threads. */
66: extern struct zebra_t zebrad;
67:
68: extern int irdp_sock;
69:
70: static const char *
71: inet_2a(u_int32_t a, char *b)
72: {
73: sprintf(b, "%u.%u.%u.%u",
74: (a ) & 0xFF,
75: (a>> 8) & 0xFF,
76: (a>>16) & 0xFF,
77: (a>>24) & 0xFF);
78: return b;
79: }
80:
81:
82: static struct prefix *
83: irdp_get_prefix(struct interface *ifp)
84: {
85: struct listnode *node;
86: struct connected *ifc;
87:
88: if (ifp->connected)
89: for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc))
90: return ifc->address;
91:
92: return NULL;
93: }
94:
95: /* Join to the add/leave multicast group. */
96: static int
97: if_group (struct interface *ifp,
98: int sock,
99: u_int32_t group,
100: int add_leave)
101: {
102: struct zebra_if *zi;
103: struct ip_mreq m;
104: struct prefix *p;
105: int ret;
106: char b1[INET_ADDRSTRLEN];
107:
108: zi = ifp->info;
109:
110: memset (&m, 0, sizeof (m));
111: m.imr_multiaddr.s_addr = htonl (group);
112: p = irdp_get_prefix(ifp);
113:
114: if(!p) {
115: zlog_warn ("IRDP: can't get address for %s", ifp->name);
116: return 1;
117: }
118:
119: m.imr_interface = p->u.prefix4;
120:
121: ret = setsockopt (sock, IPPROTO_IP, add_leave,
122: (char *) &m, sizeof (struct ip_mreq));
123: if (ret < 0)
124: zlog_warn ("IRDP: %s can't setsockopt %s: %s",
125: add_leave == IP_ADD_MEMBERSHIP? "join group":"leave group",
126: inet_2a(group, b1),
127: safe_strerror (errno));
128:
129: return ret;
130: }
131:
132: static int
133: if_add_group (struct interface *ifp)
134: {
135: struct zebra_if *zi= ifp->info;
136: struct irdp_interface *irdp = &zi->irdp;
137: int ret;
138: char b1[INET_ADDRSTRLEN];
139:
140: ret = if_group (ifp, irdp_sock, INADDR_ALLRTRS_GROUP, IP_ADD_MEMBERSHIP);
141: if (ret < 0) {
142: return ret;
143: }
144:
145: if(irdp->flags & IF_DEBUG_MISC )
146: zlog_debug("IRDP: Adding group %s for %s",
147: inet_2a(htonl(INADDR_ALLRTRS_GROUP), b1),
148: ifp->name);
149: return 0;
150: }
151:
152: static int
153: if_drop_group (struct interface *ifp)
154: {
155: struct zebra_if *zi= ifp->info;
156: struct irdp_interface *irdp = &zi->irdp;
157: int ret;
158: char b1[INET_ADDRSTRLEN];
159:
160: ret = if_group (ifp, irdp_sock, INADDR_ALLRTRS_GROUP, IP_DROP_MEMBERSHIP);
161: if (ret < 0)
162: return ret;
163:
164: if(irdp->flags & IF_DEBUG_MISC)
165: zlog_debug("IRDP: Leaving group %s for %s",
166: inet_2a(htonl(INADDR_ALLRTRS_GROUP), b1),
167: ifp->name);
168: return 0;
169: }
170:
171: static void
172: if_set_defaults(struct interface *ifp)
173: {
174: struct zebra_if *zi=ifp->info;
175: struct irdp_interface *irdp=&zi->irdp;
176:
177: irdp->MaxAdvertInterval = IRDP_MAXADVERTINTERVAL;
178: irdp->MinAdvertInterval = IRDP_MINADVERTINTERVAL;
179: irdp->Preference = IRDP_PREFERENCE;
180: irdp->Lifetime = IRDP_LIFETIME;
181: }
182:
183:
184: static struct Adv *Adv_new (void)
185: {
186: return XCALLOC (MTYPE_TMP, sizeof (struct Adv));
187: }
188:
189: static void
190: Adv_free (struct Adv *adv)
191: {
192: XFREE (MTYPE_TMP, adv);
193: }
194:
195: static void
196: irdp_if_start(struct interface *ifp, int multicast, int set_defaults)
197: {
198: struct zebra_if *zi= ifp->info;
199: struct irdp_interface *irdp = &zi->irdp;
200: struct listnode *node;
201: struct connected *ifc;
202: u_int32_t timer, seed;
203:
204: if (irdp->flags & IF_ACTIVE ) {
205: zlog_warn("IRDP: Interface is already active %s", ifp->name);
206: return;
207: }
208: if ((irdp_sock < 0) && ((irdp_sock = irdp_sock_init()) < 0)) {
209: zlog_warn("IRDP: Cannot activate interface %s (cannot create "
210: "IRDP socket)", ifp->name);
211: return;
212: }
213: irdp->flags |= IF_ACTIVE;
214:
215: if(!multicast)
216: irdp->flags |= IF_BROADCAST;
217:
218: if_add_update(ifp);
219:
220: if (! (ifp->flags & IFF_UP)) {
221: zlog_warn("IRDP: Interface is down %s", ifp->name);
222: }
223:
224: /* Shall we cancel if_start if if_add_group fails? */
225:
226: if( multicast) {
227: if_add_group(ifp);
228:
229: if (! (ifp->flags & (IFF_MULTICAST|IFF_ALLMULTI))) {
230: zlog_warn("IRDP: Interface not multicast enabled %s", ifp->name);
231: }
232: }
233:
234: if(set_defaults)
235: if_set_defaults(ifp);
236:
237: irdp->irdp_sent = 0;
238:
239: /* The spec suggests this for randomness */
240:
241: seed = 0;
242: if( ifp->connected)
243: for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc))
244: {
245: seed = ifc->address->u.prefix4.s_addr;
246: break;
247: }
248:
249: srandom(seed);
250: timer = (random () % IRDP_DEFAULT_INTERVAL) + 1;
251:
252: irdp->AdvPrefList = list_new();
253: irdp->AdvPrefList->del = (void (*)(void *)) Adv_free; /* Destructor */
254:
255:
256: /* And this for startup. Speed limit from 1991 :-). But it's OK*/
257:
258: if(irdp->irdp_sent < MAX_INITIAL_ADVERTISEMENTS &&
259: timer > MAX_INITIAL_ADVERT_INTERVAL )
260: timer= MAX_INITIAL_ADVERT_INTERVAL;
261:
262:
263: if(irdp->flags & IF_DEBUG_MISC)
264: zlog_debug("IRDP: Init timer for %s set to %u",
265: ifp->name,
266: timer);
267:
268: irdp->t_advertise = thread_add_timer(zebrad.master,
269: irdp_send_thread,
270: ifp,
271: timer);
272: }
273:
274: static void
275: irdp_if_stop(struct interface *ifp)
276: {
277: struct zebra_if *zi=ifp->info;
278: struct irdp_interface *irdp=&zi->irdp;
279:
280: if (irdp == NULL) {
281: zlog_warn ("Interface %s structure is NULL", ifp->name);
282: return;
283: }
284:
285: if (! (irdp->flags & IF_ACTIVE )) {
286: zlog_warn("Interface is not active %s", ifp->name);
287: return;
288: }
289:
290: if(! (irdp->flags & IF_BROADCAST))
291: if_drop_group(ifp);
292:
293: irdp_advert_off(ifp);
294:
295: list_delete(irdp->AdvPrefList);
296: irdp->AdvPrefList=NULL;
297:
298: irdp->flags = 0;
299: }
300:
301:
302: static void
303: irdp_if_shutdown(struct interface *ifp)
304: {
305: struct zebra_if *zi= ifp->info;
306: struct irdp_interface *irdp = &zi->irdp;
307:
308: if (irdp->flags & IF_SHUTDOWN ) {
309: zlog_warn("IRDP: Interface is already shutdown %s", ifp->name);
310: return;
311: }
312:
313: irdp->flags |= IF_SHUTDOWN;
314: irdp->flags &= ~IF_ACTIVE;
315:
316: if(! (irdp->flags & IF_BROADCAST))
317: if_drop_group(ifp);
318:
319: /* Tell the hosts we are out of service */
320: irdp_advert_off(ifp);
321: }
322:
323: static void
324: irdp_if_no_shutdown(struct interface *ifp)
325: {
326: struct zebra_if *zi= ifp->info;
327: struct irdp_interface *irdp = &zi->irdp;
328:
329: if (! (irdp->flags & IF_SHUTDOWN )) {
330: zlog_warn("IRDP: Interface is not shutdown %s", ifp->name);
331: return;
332: }
333:
334: irdp->flags &= ~IF_SHUTDOWN;
335:
336: irdp_if_start(ifp, irdp->flags & IF_BROADCAST? FALSE : TRUE, FALSE);
337:
338: }
339:
340:
341: /* Write configuration to user */
342:
343: void irdp_config_write (struct vty *vty, struct interface *ifp)
344: {
345: struct zebra_if *zi=ifp->info;
346: struct irdp_interface *irdp=&zi->irdp;
347: struct Adv *adv;
348: struct listnode *node;
349: char b1[INET_ADDRSTRLEN];
350:
351: if(irdp->flags & IF_ACTIVE || irdp->flags & IF_SHUTDOWN) {
352:
353: if( irdp->flags & IF_SHUTDOWN)
354: vty_out (vty, " ip irdp shutdown %s", VTY_NEWLINE);
355:
356: if( irdp->flags & IF_BROADCAST)
357: vty_out (vty, " ip irdp broadcast%s", VTY_NEWLINE);
358: else
359: vty_out (vty, " ip irdp multicast%s", VTY_NEWLINE);
360:
361: vty_out (vty, " ip irdp preference %ld%s",
362: irdp->Preference, VTY_NEWLINE);
363:
364: for (ALL_LIST_ELEMENTS_RO (irdp->AdvPrefList, node, adv))
365: vty_out (vty, " ip irdp address %s preference %d%s",
366: inet_2a(adv->ip.s_addr, b1),
367: adv->pref,
368: VTY_NEWLINE);
369:
370: vty_out (vty, " ip irdp holdtime %d%s",
371: irdp->Lifetime, VTY_NEWLINE);
372:
373: vty_out (vty, " ip irdp minadvertinterval %ld%s",
374: irdp->MinAdvertInterval, VTY_NEWLINE);
375:
376: vty_out (vty, " ip irdp maxadvertinterval %ld%s",
377: irdp->MaxAdvertInterval, VTY_NEWLINE);
378:
379: }
380: }
381:
382:
383: DEFUN (ip_irdp_multicast,
384: ip_irdp_multicast_cmd,
385: "ip irdp multicast",
386: IP_STR
387: "ICMP Router discovery on this interface using multicast\n")
388: {
389: struct interface *ifp;
390:
391: ifp = (struct interface *) vty->index;
392: if(!ifp) {
393: return CMD_WARNING;
394: }
395:
396: irdp_if_start(ifp, TRUE, TRUE);
397: return CMD_SUCCESS;
398: }
399:
400: DEFUN (ip_irdp_broadcast,
401: ip_irdp_broadcast_cmd,
402: "ip irdp broadcast",
403: IP_STR
404: "ICMP Router discovery on this interface using broadcast\n")
405: {
406: struct interface *ifp;
407:
408: ifp = (struct interface *) vty->index;
409: if(!ifp) {
410: return CMD_WARNING;
411: }
412:
413: irdp_if_start(ifp, FALSE, TRUE);
414: return CMD_SUCCESS;
415: }
416:
417: DEFUN (no_ip_irdp,
418: no_ip_irdp_cmd,
419: "no ip irdp",
420: NO_STR
421: IP_STR
422: "Disable ICMP Router discovery on this interface\n")
423: {
424: struct interface *ifp;
425:
426: ifp = (struct interface *) vty->index;
427: if(!ifp) {
428: return CMD_WARNING;
429: }
430:
431: irdp_if_stop(ifp);
432: return CMD_SUCCESS;
433: }
434:
435: DEFUN (ip_irdp_shutdown,
436: ip_irdp_shutdown_cmd,
437: "ip irdp shutdown",
438: IP_STR
439: "ICMP Router discovery shutdown on this interface\n")
440: {
441: struct interface *ifp;
442:
443: ifp = (struct interface *) vty->index;
444: if(!ifp) {
445: return CMD_WARNING;
446: }
447:
448: irdp_if_shutdown(ifp);
449: return CMD_SUCCESS;
450: }
451:
452: DEFUN (no_ip_irdp_shutdown,
453: no_ip_irdp_shutdown_cmd,
454: "no ip irdp shutdown",
455: NO_STR
456: IP_STR
457: "ICMP Router discovery no shutdown on this interface\n")
458: {
459: struct interface *ifp;
460:
461: ifp = (struct interface *) vty->index;
462: if(!ifp) {
463: return CMD_WARNING;
464: }
465:
466: irdp_if_no_shutdown(ifp);
467: return CMD_SUCCESS;
468: }
469:
470: DEFUN (ip_irdp_holdtime,
471: ip_irdp_holdtime_cmd,
472: "ip irdp holdtime <0-9000>",
473: IP_STR
474: "ICMP Router discovery on this interface\n"
475: "Set holdtime value\n"
476: "Holdtime value in seconds. Default is 1800 seconds\n")
477: {
478: struct interface *ifp;
479: struct zebra_if *zi;
480: struct irdp_interface *irdp;
481: ifp = (struct interface *) vty->index;
482: if(!ifp) {
483: return CMD_WARNING;
484: }
485:
486: zi=ifp->info;
487: irdp=&zi->irdp;
488:
489: irdp->Lifetime = atoi(argv[0]);
490: return CMD_SUCCESS;
491: }
492:
493: DEFUN (ip_irdp_minadvertinterval,
494: ip_irdp_minadvertinterval_cmd,
495: "ip irdp minadvertinterval <3-1800>",
496: IP_STR
497: "ICMP Router discovery on this interface\n"
498: "Set minimum time between advertisement\n"
499: "Minimum advertisement interval in seconds\n")
500: {
501: struct interface *ifp;
502: struct zebra_if *zi;
503: struct irdp_interface *irdp;
504: ifp = (struct interface *) vty->index;
505: if(!ifp) {
506: return CMD_WARNING;
507: }
508:
509: zi=ifp->info;
510: irdp=&zi->irdp;
511:
512: if( (unsigned) atoi(argv[0]) <= irdp->MaxAdvertInterval) {
513: irdp->MinAdvertInterval = atoi(argv[0]);
514:
515: return CMD_SUCCESS;
516: }
517:
518: vty_out (vty, "ICMP warning maxadvertinterval is greater or equal than minadvertinterval%s",
519: VTY_NEWLINE);
520:
521: vty_out (vty, "Please correct!%s",
522: VTY_NEWLINE);
523: return CMD_WARNING;
524: }
525:
526: DEFUN (ip_irdp_maxadvertinterval,
527: ip_irdp_maxadvertinterval_cmd,
528: "ip irdp maxadvertinterval <4-1800>",
529: IP_STR
530: "ICMP Router discovery on this interface\n"
531: "Set maximum time between advertisement\n"
532: "Maximum advertisement interval in seconds\n")
533: {
534: struct interface *ifp;
535: struct zebra_if *zi;
536: struct irdp_interface *irdp;
537: ifp = (struct interface *) vty->index;
538: if(!ifp) {
539: return CMD_WARNING;
540: }
541:
542: zi=ifp->info;
543: irdp=&zi->irdp;
544:
545:
546: if( irdp->MinAdvertInterval <= (unsigned) atoi(argv[0]) ) {
547: irdp->MaxAdvertInterval = atoi(argv[0]);
548:
549: return CMD_SUCCESS;
550: }
551:
552: vty_out (vty, "ICMP warning maxadvertinterval is greater or equal than minadvertinterval%s",
553: VTY_NEWLINE);
554:
555: vty_out (vty, "Please correct!%s",
556: VTY_NEWLINE);
557: return CMD_WARNING;
558: }
559:
560: /* DEFUN needs to be fixed for negative ranages...
561: * "ip irdp preference <-2147483648-2147483647>",
562: * Be positive for now. :-)
563: */
564:
565: DEFUN (ip_irdp_preference,
566: ip_irdp_preference_cmd,
567: "ip irdp preference <0-2147483647>",
568: IP_STR
569: "ICMP Router discovery on this interface\n"
570: "Set default preference level for this interface\n"
571: "Preference level\n")
572: {
573: struct interface *ifp;
574: struct zebra_if *zi;
575: struct irdp_interface *irdp;
576: ifp = (struct interface *) vty->index;
577: if(!ifp) {
578: return CMD_WARNING;
579: }
580:
581: zi=ifp->info;
582: irdp=&zi->irdp;
583:
584: irdp->Preference = atoi(argv[0]);
585: return CMD_SUCCESS;
586: }
587:
588: DEFUN (ip_irdp_address_preference,
589: ip_irdp_address_preference_cmd,
590: "ip irdp address A.B.C.D preference <0-2147483647>",
591: IP_STR
592: "Alter ICMP Router discovery preference this interface\n"
593: "Specify IRDP non-default preference to advertise\n"
594: "Set IRDP address for advertise\n"
595: "Preference level\n")
596: {
597: struct listnode *node;
598: struct in_addr ip;
599: int pref;
600: int ret;
601: struct interface *ifp;
602: struct zebra_if *zi;
603: struct irdp_interface *irdp;
604: struct Adv *adv;
605:
606: ifp = (struct interface *) vty->index;
607: if(!ifp) {
608: return CMD_WARNING;
609: }
610:
611: zi=ifp->info;
612: irdp=&zi->irdp;
613:
614: ret = inet_aton(argv[0], &ip);
615: if(!ret) return CMD_WARNING;
616:
617: pref = atoi(argv[1]);
618:
619: for (ALL_LIST_ELEMENTS_RO (irdp->AdvPrefList, node, adv))
620: if(adv->ip.s_addr == ip.s_addr)
621: return CMD_SUCCESS;
622:
623: adv = Adv_new();
624: adv->ip = ip;
625: adv->pref = pref;
626: listnode_add(irdp->AdvPrefList, adv);
627:
628: return CMD_SUCCESS;
629:
630: }
631:
632: DEFUN (no_ip_irdp_address_preference,
633: no_ip_irdp_address_preference_cmd,
634: "no ip irdp address A.B.C.D preference <0-2147483647>",
635: NO_STR
636: IP_STR
637: "Alter ICMP Router discovery preference this interface\n"
638: "Removes IRDP non-default preference\n"
639: "Select IRDP address\n"
640: "Old preference level\n")
641: {
642: struct listnode *node, *nnode;
643: struct in_addr ip;
644: int pref;
645: int ret;
646: struct interface *ifp;
647: struct zebra_if *zi;
648: struct irdp_interface *irdp;
649: struct Adv *adv;
650:
651: ifp = (struct interface *) vty->index;
652: if(!ifp) {
653: return CMD_WARNING;
654: }
655:
656: zi=ifp->info;
657: irdp=&zi->irdp;
658:
659: ret = inet_aton(argv[0], &ip);
660: if (!ret)
661: return CMD_WARNING;
662:
663: pref = atoi(argv[1]);
664:
665: for (ALL_LIST_ELEMENTS (irdp->AdvPrefList, node, nnode, adv))
666: {
667: if(adv->ip.s_addr == ip.s_addr )
668: {
669: listnode_delete(irdp->AdvPrefList, adv);
670: break;
671: }
672: }
673:
674: return CMD_SUCCESS;
675: }
676:
677: DEFUN (ip_irdp_debug_messages,
678: ip_irdp_debug_messages_cmd,
679: "ip irdp debug messages",
680: IP_STR
681: "ICMP Router discovery debug Averts. and Solicits (short)\n")
682: {
683: struct interface *ifp;
684: struct zebra_if *zi;
685: struct irdp_interface *irdp;
686: ifp = (struct interface *) vty->index;
687: if(!ifp) {
688: return CMD_WARNING;
689: }
690:
691: zi=ifp->info;
692: irdp=&zi->irdp;
693:
694: irdp->flags |= IF_DEBUG_MESSAGES;
695:
696: return CMD_SUCCESS;
697: }
698:
699: DEFUN (ip_irdp_debug_misc,
700: ip_irdp_debug_misc_cmd,
701: "ip irdp debug misc",
702: IP_STR
703: "ICMP Router discovery debug Averts. and Solicits (short)\n")
704: {
705: struct interface *ifp;
706: struct zebra_if *zi;
707: struct irdp_interface *irdp;
708: ifp = (struct interface *) vty->index;
709: if(!ifp) {
710: return CMD_WARNING;
711: }
712:
713: zi=ifp->info;
714: irdp=&zi->irdp;
715:
716: irdp->flags |= IF_DEBUG_MISC;
717:
718: return CMD_SUCCESS;
719: }
720:
721: DEFUN (ip_irdp_debug_packet,
722: ip_irdp_debug_packet_cmd,
723: "ip irdp debug packet",
724: IP_STR
725: "ICMP Router discovery debug Averts. and Solicits (short)\n")
726: {
727: struct interface *ifp;
728: struct zebra_if *zi;
729: struct irdp_interface *irdp;
730: ifp = (struct interface *) vty->index;
731: if(!ifp) {
732: return CMD_WARNING;
733: }
734:
735: zi=ifp->info;
736: irdp=&zi->irdp;
737:
738: irdp->flags |= IF_DEBUG_PACKET;
739:
740: return CMD_SUCCESS;
741: }
742:
743:
744: DEFUN (ip_irdp_debug_disable,
745: ip_irdp_debug_disable_cmd,
746: "ip irdp debug disable",
747: IP_STR
748: "ICMP Router discovery debug Averts. and Solicits (short)\n")
749: {
750: struct interface *ifp;
751: struct zebra_if *zi;
752: struct irdp_interface *irdp;
753: ifp = (struct interface *) vty->index;
754: if(!ifp) {
755: return CMD_WARNING;
756: }
757:
758: zi=ifp->info;
759: irdp=&zi->irdp;
760:
761: irdp->flags &= ~IF_DEBUG_PACKET;
762: irdp->flags &= ~IF_DEBUG_MESSAGES;
763: irdp->flags &= ~IF_DEBUG_MISC;
764:
765: return CMD_SUCCESS;
766: }
767:
768: void
769: irdp_init ()
770: {
771: install_element (INTERFACE_NODE, &ip_irdp_broadcast_cmd);
772: install_element (INTERFACE_NODE, &ip_irdp_multicast_cmd);
773: install_element (INTERFACE_NODE, &no_ip_irdp_cmd);
774: install_element (INTERFACE_NODE, &ip_irdp_shutdown_cmd);
775: install_element (INTERFACE_NODE, &no_ip_irdp_shutdown_cmd);
776: install_element (INTERFACE_NODE, &ip_irdp_holdtime_cmd);
777: install_element (INTERFACE_NODE, &ip_irdp_maxadvertinterval_cmd);
778: install_element (INTERFACE_NODE, &ip_irdp_minadvertinterval_cmd);
779: install_element (INTERFACE_NODE, &ip_irdp_preference_cmd);
780: install_element (INTERFACE_NODE, &ip_irdp_address_preference_cmd);
781: install_element (INTERFACE_NODE, &no_ip_irdp_address_preference_cmd);
782:
783: install_element (INTERFACE_NODE, &ip_irdp_debug_messages_cmd);
784: install_element (INTERFACE_NODE, &ip_irdp_debug_misc_cmd);
785: install_element (INTERFACE_NODE, &ip_irdp_debug_packet_cmd);
786: install_element (INTERFACE_NODE, &ip_irdp_debug_disable_cmd);
787: }
788:
789: #endif /* HAVE_IRDP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>