irdp_interface.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:17k
源码类别:

网络

开发平台:

Unix_Linux

  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.  * This work includes work with the following copywrite:
  25.  *
  26.  * Copyright (C) 1997, 2000 Kunihiro Ishiguro
  27.  *
  28.  */
  29. /* 
  30.  * Thanks to Jens L邋s at Swedish University of Agricultural Sciences
  31.  * for reviewing and tests.
  32.  */
  33. #include <zebra.h>
  34. #ifdef HAVE_IRDP 
  35. #include "if.h"
  36. #include "vty.h"
  37. #include "sockunion.h"
  38. #include "prefix.h"
  39. #include "command.h"
  40. #include "memory.h"
  41. #include "stream.h"
  42. #include "ioctl.h"
  43. #include "connected.h"
  44. #include "log.h"
  45. #include "zclient.h"
  46. #include "thread.h"
  47. #include "zebra/interface.h"
  48. #include "zebra/rtadv.h"
  49. #include "zebra/rib.h"
  50. #include "zebra/zserv.h"
  51. #include "zebra/redistribute.h"
  52. #include "zebra/irdp.h"
  53. #include <netinet/ip_icmp.h>
  54. #include "if.h"
  55. #include "sockunion.h"
  56. #include "log.h"
  57. /* Master of threads. */
  58. extern struct thread_master *master;
  59. int in_cksum (void *ptr, int nbytes);
  60. extern int irdp_sock;
  61. int irdp_send_thread(struct thread *t_advert);
  62. char *inet_2a(u_int32_t a, char *b);
  63. void irdp_advert_off(struct interface *ifp);
  64. char b1[16], b2[16], b3[16], b4[16];  /* For inet_2a */
  65. struct prefix *irdp_get_prefix(struct interface *ifp)
  66. {
  67.   listnode node;
  68.   struct connected *ifc;
  69.   
  70.   if(ifp->connected) 
  71.     for (node = listhead (ifp->connected); node; nextnode (node)) {
  72.       ifc = getdata (node);
  73.       return ifc->address;
  74.     }
  75.   return NULL;
  76. }
  77. /* Join to the add/leave multicast group. */
  78. int if_group (struct interface *ifp, 
  79.   int sock, 
  80.   u_int32_t group, 
  81.   int add_leave)
  82. {
  83.   struct zebra_if *zi;
  84.   struct ip_mreq m;
  85.   struct prefix *p;
  86.   int ret;
  87.   zi = ifp->info;
  88.   bzero (&m, sizeof (m));
  89.   m.imr_multiaddr.s_addr = htonl (group);
  90.   p = irdp_get_prefix(ifp);
  91.   if(!p) {
  92.         zlog_warn ("IRDP: can't get address for %s", ifp->name);
  93. return 1;
  94.   }
  95.   m.imr_interface = p->u.prefix4;
  96.   ret = setsockopt (sock, IPPROTO_IP, add_leave,
  97.     (char *) &m, sizeof (struct ip_mreq));
  98.   if (ret < 0)
  99.     zlog_warn ("IRDP: %s can't setsockopt %s: %s",
  100.        add_leave == IP_ADD_MEMBERSHIP? "join group":"leave group", 
  101.                inet_2a(group, b1),
  102.                strerror (errno));
  103.   return ret;
  104. }
  105. int if_add_group (struct interface *ifp)
  106. {
  107.   struct zebra_if *zi= ifp->info;
  108.   struct irdp_interface *irdp = &zi->irdp;
  109.   int ret;
  110.   ret = if_group (ifp, irdp_sock, INADDR_ALLRTRS_GROUP, IP_ADD_MEMBERSHIP);
  111.   if (ret < 0) {
  112.     return ret;
  113.   }
  114.   if(irdp->flags & IF_DEBUG_MISC )
  115.     zlog_warn("IRDP: Adding group %s for %sn", 
  116.       inet_2a(htonl(INADDR_ALLRTRS_GROUP), b1),
  117.       ifp->name);
  118.   return 0;
  119. }
  120. int if_drop_group (struct interface *ifp)
  121. {
  122.   struct zebra_if *zi= ifp->info;
  123.   struct irdp_interface *irdp = &zi->irdp;
  124.   int ret;
  125.   ret = if_group (ifp, irdp_sock, INADDR_ALLRTRS_GROUP, IP_DROP_MEMBERSHIP);
  126.   if (ret < 0)
  127.     return ret;
  128.   if(irdp->flags & IF_DEBUG_MISC)
  129.     zlog_warn("IRDP: Leaving group %s for %sn", 
  130.       inet_2a(htonl(INADDR_ALLRTRS_GROUP), b1),
  131.       ifp->name);
  132.   return 0;
  133. }
  134. struct interface *get_iflist_ifp(int idx)
  135. {
  136.   listnode node;
  137.   struct interface *ifp;
  138.   for (node = listhead (iflist); node; nextnode (node)) {
  139.       ifp = getdata (node);
  140.       if(ifp->ifindex == idx) return ifp;
  141.     }
  142.   return NULL;
  143. }
  144. void
  145. if_set_defaults(struct interface *ifp)
  146. {
  147.   struct zebra_if *zi=ifp->info;
  148.   struct irdp_interface *irdp=&zi->irdp;
  149.   irdp->MaxAdvertInterval = IRDP_MAXADVERTINTERVAL;
  150.   irdp->MinAdvertInterval = IRDP_MINADVERTINTERVAL;
  151.   irdp->Preference = IRDP_PREFERENCE;
  152.   irdp->Lifetime = IRDP_LIFETIME;
  153. }
  154. struct Adv *Adv_new ()
  155. {
  156.   struct Adv *new;
  157.   new = XMALLOC (MTYPE_TMP, sizeof (struct Adv));
  158.   memset (new, 0, sizeof (struct Adv));
  159.   return new;
  160. }
  161. void Adv_free (struct Adv *adv)
  162. {
  163.   XFREE (MTYPE_TMP, adv);
  164. }
  165. void irdp_if_start(struct interface *ifp, int multicast, int set_defaults)
  166. {
  167.   struct zebra_if *zi= ifp->info;
  168.   struct irdp_interface *irdp = &zi->irdp;
  169.   listnode node;
  170.   u_int32_t timer, seed;
  171.   if (irdp->flags & IF_ACTIVE ) {
  172.     zlog_warn("IRDP: Interface is already active %sn", ifp->name);
  173.     return;
  174.   }
  175.   irdp->flags |= IF_ACTIVE;
  176.   if(!multicast) 
  177.     irdp->flags |= IF_BROADCAST;
  178.   if_add_update(ifp);
  179.   if (! (ifp->flags & IFF_UP)) {
  180.     zlog_warn("IRDP: Interface is down %sn", ifp->name);
  181.   }
  182.   /* Shall we cancel if_start if if_add_group fails? */
  183.   if( multicast) {
  184.     if_add_group(ifp);
  185.     
  186.     if (! (ifp->flags & (IFF_MULTICAST|IFF_ALLMULTI))) {
  187.       zlog_warn("IRDP: Interface not multicast enabled %sn", ifp->name);
  188.     }
  189.   }
  190.   if(set_defaults) 
  191.     if_set_defaults(ifp);
  192.   irdp->irdp_sent = 0;
  193.   /* The spec suggests this for randomness */
  194.   seed = 0;
  195.   if( ifp->connected) 
  196.   for (node = listhead (ifp->connected); node; nextnode (node)) 
  197.   {
  198.   struct connected *ifc = getdata (node);
  199.   seed = ifc->address->u.prefix4.s_addr;
  200.   }
  201.   
  202.   srandom(seed);
  203.   timer =  (random () % IRDP_DEFAULT_INTERVAL) + 1; 
  204.   irdp->AdvPrefList = list_new();
  205.   irdp->AdvPrefList->del =  (void *) Adv_free; /* Destructor */
  206.   /* And this for startup. Speed limit from 1991 :-). But it's OK*/
  207.   if(irdp->irdp_sent < MAX_INITIAL_ADVERTISEMENTS &&
  208.      timer > MAX_INITIAL_ADVERT_INTERVAL ) 
  209.   timer= MAX_INITIAL_ADVERT_INTERVAL;
  210.   
  211.   if(irdp->flags & IF_DEBUG_MISC)
  212.     zlog_warn("IRDP: Init timer for %s set to %un", 
  213.       ifp->name, 
  214.       timer);
  215.   irdp->t_advertise = thread_add_timer(master, 
  216.        irdp_send_thread, 
  217.        ifp, 
  218.        timer);
  219. }
  220. void irdp_if_stop(struct interface *ifp)
  221. {
  222.   struct zebra_if *zi=ifp->info;
  223.   struct irdp_interface *irdp=&zi->irdp;
  224.   
  225.   if (irdp == NULL) {
  226.     zlog_warn ("Interface %s structure is NULL", ifp->name);
  227.     return;
  228.   }
  229.   if (! (irdp->flags & IF_ACTIVE )) {
  230.     zlog_warn("Interface is not active %sn", ifp->name);
  231.     return;
  232.   }
  233.   if(! (irdp->flags & IF_BROADCAST)) 
  234.     if_drop_group(ifp);
  235.   irdp_advert_off(ifp);
  236.   list_delete(irdp->AdvPrefList);
  237.   irdp->AdvPrefList=NULL;
  238.   irdp->flags = 0;
  239. }
  240. void irdp_if_shutdown(struct interface *ifp)
  241. {
  242.   struct zebra_if *zi= ifp->info;
  243.   struct irdp_interface *irdp = &zi->irdp;
  244.   if (irdp->flags & IF_SHUTDOWN ) {
  245.     zlog_warn("IRDP: Interface is already shutdown %sn", ifp->name);
  246.     return;
  247.   }
  248.   irdp->flags |= IF_SHUTDOWN;
  249.   irdp->flags &= ~IF_ACTIVE;
  250.   if(! (irdp->flags & IF_BROADCAST)) 
  251.     if_drop_group(ifp);
  252.   
  253.   /* Tell the hosts we are out of service */
  254.   irdp_advert_off(ifp);
  255. }
  256. void irdp_if_no_shutdown(struct interface *ifp)
  257. {
  258.   struct zebra_if *zi= ifp->info;
  259.   struct irdp_interface *irdp = &zi->irdp;
  260.   if (! (irdp->flags & IF_SHUTDOWN )) {
  261.     zlog_warn("IRDP: Interface is not shutdown %sn", ifp->name);
  262.     return;
  263.   }
  264.   irdp->flags &= ~IF_SHUTDOWN;
  265.   irdp_if_start(ifp, irdp->flags & IF_BROADCAST? FALSE : TRUE, FALSE); 
  266. }
  267. /* Write configuration to user */
  268. void irdp_config_write (struct vty *vty, struct interface *ifp)
  269. {
  270.   struct zebra_if *zi=ifp->info;
  271.   struct irdp_interface *irdp=&zi->irdp;
  272.   struct Adv *adv;
  273.   listnode node;
  274.   if(irdp->flags & IF_ACTIVE || irdp->flags & IF_SHUTDOWN) {
  275.     if( irdp->flags & IF_SHUTDOWN) 
  276.       vty_out (vty, " ip irdp shutdown %s",  VTY_NEWLINE);
  277.     if( irdp->flags & IF_BROADCAST) 
  278.       vty_out (vty, " ip irdp broadcast%s",  VTY_NEWLINE);
  279.     else 
  280.       vty_out (vty, " ip irdp multicast%s",  VTY_NEWLINE);
  281.     vty_out (vty, " ip irdp preference %ld%s",  
  282.      irdp->Preference, VTY_NEWLINE);
  283.     for (node = listhead (irdp->AdvPrefList); node; nextnode (node)) {
  284.     adv = getdata (node);
  285.     vty_out (vty, " ip irdp address %s preference %d%s",
  286.      inet_2a(adv->ip.s_addr, b1),
  287.      adv->pref,
  288.      VTY_NEWLINE);
  289.     }
  290.     vty_out (vty, " ip irdp holdtime %d%s",  
  291.      irdp->Lifetime, VTY_NEWLINE);
  292.     vty_out (vty, " ip irdp minadvertinterval %ld%s",  
  293.      irdp->MinAdvertInterval, VTY_NEWLINE);
  294.     vty_out (vty, " ip irdp maxadvertinterval %ld%s",  
  295.      irdp->MaxAdvertInterval, VTY_NEWLINE);
  296.   }
  297. }
  298. DEFUN (ip_irdp_multicast,
  299.        ip_irdp_multicast_cmd,
  300.        "ip irdp multicast",
  301.        IP_STR
  302.        "ICMP Router discovery on this interface using multicastn")
  303. {
  304.   struct interface *ifp;
  305.   ifp = (struct interface *) vty->index;
  306.   if(!ifp) {
  307.   return CMD_WARNING;
  308.   }
  309.   irdp_if_start(ifp, TRUE, TRUE);
  310.   return CMD_SUCCESS;
  311. }
  312. DEFUN (ip_irdp_broadcast,
  313.        ip_irdp_broadcast_cmd,
  314.        "ip irdp broadcast",
  315.        IP_STR
  316.        "ICMP Router discovery on this interface using broadcastn")
  317. {
  318.   struct interface *ifp;
  319.   ifp = (struct interface *) vty->index;
  320.   if(!ifp) {
  321.   return CMD_WARNING;
  322.   }
  323.   irdp_if_start(ifp, FALSE, TRUE);
  324.   return CMD_SUCCESS;
  325. }
  326. DEFUN (ip_irdp_no,
  327.        ip_irdp_cmd_no,
  328.        "no ip irdp",
  329.        IP_STR
  330.        "Disable ICMP Router discovery on this interfacen")
  331. {
  332.   struct interface *ifp;
  333.   ifp = (struct interface *) vty->index;
  334.   if(!ifp) {
  335.   return CMD_WARNING;
  336.   }
  337.   irdp_if_stop(ifp);
  338.   return CMD_SUCCESS;
  339. }
  340. DEFUN (ip_irdp_shutdown,
  341.        ip_irdp_shutdown_cmd,
  342.        "ip irdp shutdown",
  343.        IP_STR
  344.        "ICMP Router discovery shutdown on this interfacen")
  345. {
  346.   struct interface *ifp;
  347.   ifp = (struct interface *) vty->index;
  348.   if(!ifp) {
  349.   return CMD_WARNING;
  350.   }
  351.   irdp_if_shutdown(ifp);
  352.   return CMD_SUCCESS;
  353. }
  354. DEFUN (ip_irdp_no_shutdown,
  355.        ip_irdp_no_shutdown_cmd,
  356.        "no ip irdp shutdown",
  357.        IP_STR
  358.        "ICMP Router discovery no shutdown on this interfacen")
  359. {
  360.   struct interface *ifp;
  361.   ifp = (struct interface *) vty->index;
  362.   if(!ifp) {
  363.   return CMD_WARNING;
  364.   }
  365.   irdp_if_no_shutdown(ifp);
  366.   return CMD_SUCCESS;
  367. }
  368. DEFUN (ip_irdp_holdtime,
  369.        ip_irdp_holdtime_cmd,
  370.        "ip irdp holdtime <0-9000>",
  371.        IP_STR
  372.        "ICMP Router discovery on this interfacen"
  373.        "Set holdtime valuen"
  374.        "Holdtime value in seconds. Default is 1800 secondsn")
  375. {
  376.   struct interface *ifp;
  377.   struct zebra_if *zi;
  378.   struct irdp_interface *irdp;
  379.   ifp = (struct interface *) vty->index;
  380.   if(!ifp) {
  381.   return CMD_WARNING;
  382.   }
  383.   zi=ifp->info;
  384.   irdp=&zi->irdp;
  385.   irdp->Lifetime = atoi(argv[0]);
  386.   return CMD_SUCCESS;
  387. }
  388. DEFUN (ip_irdp_minadvertinterval,
  389.        ip_irdp_minadvertinterval_cmd,
  390.        "ip irdp minadvertinterval <3-1800>",
  391.        IP_STR
  392.        "ICMP Router discovery on this interfacen"
  393.        "Set minimum time between advertisementn"
  394.        "Minimum advertisement interval in secondsn")
  395. {
  396.   struct interface *ifp;
  397.   struct zebra_if *zi;
  398.   struct irdp_interface *irdp;
  399.   ifp = (struct interface *) vty->index;
  400.   if(!ifp) {
  401.   return CMD_WARNING;
  402.   }
  403.   zi=ifp->info;
  404.   irdp=&zi->irdp;
  405.   if( atoi(argv[0]) <= irdp->MaxAdvertInterval) {
  406.       irdp->MinAdvertInterval = atoi(argv[0]);
  407.       return CMD_SUCCESS;
  408.   }
  409.   vty_out (vty, "ICMP warning maxadvertinterval is greater or equal than minadvertinterval%s", 
  410.      VTY_NEWLINE);
  411.   vty_out (vty, "Please correct!%s", 
  412.      VTY_NEWLINE);
  413.   return CMD_WARNING;
  414. }
  415. DEFUN (ip_irdp_maxadvertinterval,
  416.        ip_irdp_maxadvertinterval_cmd,
  417.        "ip irdp maxadvertinterval <4-1800>",
  418.        IP_STR
  419.        "ICMP Router discovery on this interfacen"
  420.        "Set maximum time between advertisementn"
  421.        "Maximum advertisement interval in secondsn")
  422. {
  423.   struct interface *ifp;
  424.   struct zebra_if *zi;
  425.   struct irdp_interface *irdp;
  426.   ifp = (struct interface *) vty->index;
  427.   if(!ifp) {
  428.   return CMD_WARNING;
  429.   }
  430.   zi=ifp->info;
  431.   irdp=&zi->irdp;
  432.   if( irdp->MinAdvertInterval <= atoi(argv[0]) ) {
  433.     irdp->MaxAdvertInterval = atoi(argv[0]);
  434.       return CMD_SUCCESS;
  435.   }
  436.   vty_out (vty, "ICMP warning maxadvertinterval is greater or equal than minadvertinterval%s", 
  437.      VTY_NEWLINE);
  438.   vty_out (vty, "Please correct!%s", 
  439.      VTY_NEWLINE);
  440.   return CMD_WARNING;
  441. }
  442. DEFUN (ip_irdp_preference,
  443.        ip_irdp_preference_cmd,
  444.        /* DEFUN needs to be fixed for negative ranages...
  445.   Be positive for now. :-)
  446.   "ip irdp preference <-2147483648-2147483647>",
  447. */
  448.        "ip irdp preference <0-2147483647>",
  449.        IP_STR
  450.        "ICMP Router discovery on this interfacen"
  451.        "Set default preference level for this interfacen"
  452.        "Preference leveln")
  453. {
  454.   struct interface *ifp;
  455.   struct zebra_if *zi;
  456.   struct irdp_interface *irdp;
  457.   ifp = (struct interface *) vty->index;
  458.   if(!ifp) {
  459.   return CMD_WARNING;
  460.   }
  461.   zi=ifp->info;
  462.   irdp=&zi->irdp;
  463.   irdp->Preference = atoi(argv[0]);
  464.   return CMD_SUCCESS;
  465. }
  466. DEFUN (ip_irdp_address_preference,
  467.        ip_irdp_address_preference_cmd,
  468.        "ip irdp address A.B.C.D preference <0-2147483647>",
  469.        IP_STR
  470.        "Alter ICMP Router discovery preference this interfacen"
  471.        "Specify IRDP non-default preference to advertisen"
  472.        "Set IRDP address for advertisen"
  473.        "Preference leveln")
  474. {
  475.   listnode node;
  476.   struct in_addr ip; 
  477.   int pref;
  478.   int ret;
  479.   struct interface *ifp;
  480.   struct zebra_if *zi;
  481.   struct irdp_interface *irdp;
  482.   struct Adv *adv;
  483.   ifp = (struct interface *) vty->index;
  484.   if(!ifp) {
  485.   return CMD_WARNING;
  486.   }
  487.   zi=ifp->info;
  488.   irdp=&zi->irdp;
  489.   ret = inet_aton(argv[0], &ip);
  490.   if(!ret) return CMD_WARNING;
  491.   pref = atoi(argv[1]);
  492.   for (node = listhead (irdp->AdvPrefList); node; nextnode (node)) {
  493.   adv = getdata (node);
  494.       if(adv->ip.s_addr == ip.s_addr) return CMD_SUCCESS;
  495.   }
  496.   adv = Adv_new();
  497.   adv->ip = ip;
  498.   adv->pref = pref;
  499.   listnode_add(irdp->AdvPrefList, adv);
  500.   return CMD_SUCCESS;
  501. }
  502. DEFUN (ip_irdp_address_preference_no,
  503.        ip_irdp_address_preference_cmd_no,
  504.        "no ip irdp address A.B.C.D preference <0-2147483647>",
  505.        IP_STR
  506.        "Alter ICMP Router discovery preference this interfacen"
  507.        "Removes IRDP non-default preferencen"
  508.        "Select IRDP addressn"
  509.        "Old preference leveln")
  510. {
  511.   listnode node;
  512.   struct in_addr ip; 
  513.   int pref;
  514.   int ret;
  515.   struct interface *ifp;
  516.   struct zebra_if *zi;
  517.   struct irdp_interface *irdp;
  518.   struct Adv *adv;
  519.   ifp = (struct interface *) vty->index;
  520.   if(!ifp) {
  521.   return CMD_WARNING;
  522.   }
  523.   zi=ifp->info;
  524.   irdp=&zi->irdp;
  525.   ret = inet_aton(argv[0], &ip);
  526.   if(!ret) return CMD_WARNING;
  527.   pref = atoi(argv[1]);
  528.   for (node = listhead (irdp->AdvPrefList); node; nextnode (node)) {
  529.   adv = getdata (node);
  530.   if(adv->ip.s_addr == ip.s_addr ) {
  531.   listnode_delete(irdp->AdvPrefList, adv);
  532.   break;
  533.   }
  534.   }
  535.   return CMD_SUCCESS;
  536. }
  537. DEFUN (ip_irdp_debug_messages,
  538.        ip_irdp_debug_messages_cmd,
  539.        "ip irdp debug messages",
  540.        IP_STR
  541.        "ICMP Router discovery debug Averts. and Solicits (short)n")
  542. {
  543.   struct interface *ifp;
  544.   struct zebra_if *zi;
  545.   struct irdp_interface *irdp;
  546.   ifp = (struct interface *) vty->index;
  547.   if(!ifp) {
  548.   return CMD_WARNING;
  549.   }
  550.   zi=ifp->info;
  551.   irdp=&zi->irdp;
  552.   irdp->flags |= IF_DEBUG_MESSAGES;
  553.   return CMD_SUCCESS;
  554. }
  555. DEFUN (ip_irdp_debug_misc,
  556.        ip_irdp_debug_misc_cmd,
  557.        "ip irdp debug misc",
  558.        IP_STR
  559.        "ICMP Router discovery debug Averts. and Solicits (short)n")
  560. {
  561.   struct interface *ifp;
  562.   struct zebra_if *zi;
  563.   struct irdp_interface *irdp;
  564.   ifp = (struct interface *) vty->index;
  565.   if(!ifp) {
  566.   return CMD_WARNING;
  567.   }
  568.   zi=ifp->info;
  569.   irdp=&zi->irdp;
  570.   irdp->flags |= IF_DEBUG_MISC;
  571.   return CMD_SUCCESS;
  572. }
  573. DEFUN (ip_irdp_debug_packet,
  574.        ip_irdp_debug_packet_cmd,
  575.        "ip irdp debug packet",
  576.        IP_STR
  577.        "ICMP Router discovery debug Averts. and Solicits (short)n")
  578. {
  579.   struct interface *ifp;
  580.   struct zebra_if *zi;
  581.   struct irdp_interface *irdp;
  582.   ifp = (struct interface *) vty->index;
  583.   if(!ifp) {
  584.   return CMD_WARNING;
  585.   }
  586.   zi=ifp->info;
  587.   irdp=&zi->irdp;
  588.   irdp->flags |= IF_DEBUG_PACKET;
  589.   return CMD_SUCCESS;
  590. }
  591. DEFUN (ip_irdp_debug_disable,
  592.        ip_irdp_debug_disable_cmd,
  593.        "ip irdp debug disable",
  594.        IP_STR
  595.        "ICMP Router discovery debug Averts. and Solicits (short)n")
  596. {
  597.   struct interface *ifp;
  598.   struct zebra_if *zi;
  599.   struct irdp_interface *irdp;
  600.   ifp = (struct interface *) vty->index;
  601.   if(!ifp) {
  602.   return CMD_WARNING;
  603.   }
  604.   zi=ifp->info;
  605.   irdp=&zi->irdp;
  606.   irdp->flags &= ~IF_DEBUG_PACKET;
  607.   irdp->flags &= ~IF_DEBUG_MESSAGES;
  608.   irdp->flags &= ~IF_DEBUG_MISC;
  609.   return CMD_SUCCESS;
  610. }
  611. void
  612. irdp_if_init ()
  613. {
  614.   install_element (INTERFACE_NODE, &ip_irdp_broadcast_cmd);
  615.   install_element (INTERFACE_NODE, &ip_irdp_multicast_cmd);
  616.   install_element (INTERFACE_NODE, &ip_irdp_cmd_no);
  617.   install_element (INTERFACE_NODE, &ip_irdp_shutdown_cmd);
  618.   install_element (INTERFACE_NODE, &ip_irdp_no_shutdown_cmd);
  619.   install_element (INTERFACE_NODE, &ip_irdp_holdtime_cmd);
  620.   install_element (INTERFACE_NODE, &ip_irdp_maxadvertinterval_cmd);
  621.   install_element (INTERFACE_NODE, &ip_irdp_minadvertinterval_cmd);
  622.   install_element (INTERFACE_NODE, &ip_irdp_preference_cmd);
  623.   install_element (INTERFACE_NODE, &ip_irdp_address_preference_cmd);
  624.   install_element (INTERFACE_NODE, &ip_irdp_address_preference_cmd_no);
  625.   install_element (INTERFACE_NODE, &ip_irdp_debug_messages_cmd);
  626.   install_element (INTERFACE_NODE, &ip_irdp_debug_misc_cmd);
  627.   install_element (INTERFACE_NODE, &ip_irdp_debug_packet_cmd);
  628.   install_element (INTERFACE_NODE, &ip_irdp_debug_disable_cmd);
  629. }
  630. #endif /* HAVE_IRDP */