Annotation of embedaddon/quagga/zebra/irdp_interface.c, revision 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>