Annotation of embedaddon/quagga/ripngd/ripng_route.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * RIPng routes function.
        !             3:  * Copyright (C) 1998 Kunihiro Ishiguro
        !             4:  *
        !             5:  * This file is part of GNU Zebra.
        !             6:  *
        !             7:  * GNU Zebra is free software; you can redistribute it and/or modify it
        !             8:  * under the terms of the GNU General Public License as published by the
        !             9:  * Free Software Foundation; either version 2, or (at your option) any
        !            10:  * later version.
        !            11:  *
        !            12:  * GNU Zebra is distributed in the hope that it will be useful, but
        !            13:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            15:  * General Public License for more details.
        !            16:  *
        !            17:  * You should have received a copy of the GNU General Public License
        !            18:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
        !            19:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
        !            20:  * 02111-1307, USA.  
        !            21:  */
        !            22: 
        !            23: #include <zebra.h>
        !            24: 
        !            25: #include "prefix.h"
        !            26: #include "table.h"
        !            27: #include "memory.h"
        !            28: #include "if.h"
        !            29: #include "vty.h"
        !            30: 
        !            31: #include "ripngd/ripngd.h"
        !            32: #include "ripngd/ripng_route.h"
        !            33: 
        !            34: static struct ripng_aggregate *
        !            35: ripng_aggregate_new ()
        !            36: {
        !            37:   struct ripng_aggregate *new;
        !            38: 
        !            39:   new = XCALLOC (MTYPE_RIPNG_AGGREGATE, sizeof (struct ripng_aggregate));
        !            40:   return new;
        !            41: }
        !            42: 
        !            43: static void
        !            44: ripng_aggregate_free (struct ripng_aggregate *aggregate)
        !            45: {
        !            46:   XFREE (MTYPE_RIPNG_AGGREGATE, aggregate);
        !            47: }
        !            48: 
        !            49: /* Aggregate count increment check. */
        !            50: void
        !            51: ripng_aggregate_increment (struct route_node *child, struct ripng_info *rinfo)
        !            52: {
        !            53:   struct route_node *np;
        !            54:   struct ripng_aggregate *aggregate;
        !            55: 
        !            56:   for (np = child; np; np = np->parent)
        !            57:     if ((aggregate = np->aggregate) != NULL)
        !            58:       {
        !            59:        aggregate->count++;
        !            60:        rinfo->suppress++;
        !            61:       }
        !            62: }
        !            63: 
        !            64: /* Aggregate count decrement check. */
        !            65: void
        !            66: ripng_aggregate_decrement (struct route_node *child, struct ripng_info *rinfo)
        !            67: {
        !            68:   struct route_node *np;
        !            69:   struct ripng_aggregate *aggregate;
        !            70: 
        !            71:   for (np = child; np; np = np->parent)
        !            72:     if ((aggregate = np->aggregate) != NULL)
        !            73:       {
        !            74:        aggregate->count--;
        !            75:        rinfo->suppress--;
        !            76:       }
        !            77: }
        !            78: 
        !            79: /* RIPng routes treatment. */
        !            80: int
        !            81: ripng_aggregate_add (struct prefix *p)
        !            82: {
        !            83:   struct route_node *top;
        !            84:   struct route_node *rp;
        !            85:   struct ripng_info *rinfo;
        !            86:   struct ripng_aggregate *aggregate;
        !            87:   struct ripng_aggregate *sub;
        !            88: 
        !            89:   /* Get top node for aggregation. */
        !            90:   top = route_node_get (ripng->table, p);
        !            91: 
        !            92:   /* Allocate new aggregate. */
        !            93:   aggregate = ripng_aggregate_new ();
        !            94:   aggregate->metric = 1;
        !            95: 
        !            96:   top->aggregate = aggregate;
        !            97: 
        !            98:   /* Suppress routes match to the aggregate. */
        !            99:   for (rp = route_lock_node (top); rp; rp = route_next_until (rp, top))
        !           100:     {
        !           101:       /* Suppress normal route. */
        !           102:       if ((rinfo = rp->info) != NULL)
        !           103:        {
        !           104:          aggregate->count++;
        !           105:          rinfo->suppress++;
        !           106:        }
        !           107:       /* Suppress aggregate route.  This may not need. */
        !           108:       if (rp != top && (sub = rp->aggregate) != NULL)
        !           109:        {
        !           110:          aggregate->count++;
        !           111:          sub->suppress++;
        !           112:        }
        !           113:     }
        !           114: 
        !           115:   return 0;
        !           116: }
        !           117: 
        !           118: /* Delete RIPng static route. */
        !           119: int
        !           120: ripng_aggregate_delete (struct prefix *p)
        !           121: {
        !           122:   struct route_node *top;
        !           123:   struct route_node *rp;
        !           124:   struct ripng_info *rinfo;
        !           125:   struct ripng_aggregate *aggregate;
        !           126:   struct ripng_aggregate *sub;
        !           127: 
        !           128:   /* Get top node for aggregation. */
        !           129:   top = route_node_get (ripng->table, p);
        !           130: 
        !           131:   /* Allocate new aggregate. */
        !           132:   aggregate = top->aggregate;
        !           133: 
        !           134:   /* Suppress routes match to the aggregate. */
        !           135:   for (rp = route_lock_node (top); rp; rp = route_next_until (rp, top))
        !           136:     {
        !           137:       /* Suppress normal route. */
        !           138:       if ((rinfo = rp->info) != NULL)
        !           139:        {
        !           140:          aggregate->count--;
        !           141:          rinfo->suppress--;
        !           142:        }
        !           143: 
        !           144:       if (rp != top && (sub = rp->aggregate) != NULL)
        !           145:        {
        !           146:          aggregate->count--;
        !           147:          sub->suppress--;
        !           148:        }
        !           149:     }
        !           150: 
        !           151:   top->aggregate = NULL;
        !           152:   ripng_aggregate_free (aggregate);
        !           153: 
        !           154:   route_unlock_node (top);
        !           155:   route_unlock_node (top);
        !           156: 
        !           157:   return 0;
        !           158: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>