Annotation of embedaddon/quagga/ripngd/ripng_route.c, revision 1.1.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>