Annotation of embedaddon/quagga/ospfd/ospf_flood.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * OSPF Flooding -- RFC2328 Section 13.
        !             3:  * Copyright (C) 1999, 2000 Toshiaki Takada
        !             4:  *
        !             5:  * This file is part of GNU Zebra.
        !             6:  * 
        !             7:  * GNU Zebra is free software; you can redistribute it and/or modify
        !             8:  * it under the terms of the GNU General Public License as published
        !             9:  * by the Free Software Foundation; either version 2, or (at your
        !            10:  * option) any 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
        !            19:  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
        !            20:  * Boston, MA 02111-1307, USA.
        !            21:  */
        !            22: 
        !            23: #include <zebra.h>
        !            24: 
        !            25: #include "linklist.h"
        !            26: #include "prefix.h"
        !            27: #include "if.h"
        !            28: #include "command.h"
        !            29: #include "table.h"
        !            30: #include "thread.h"
        !            31: #include "memory.h"
        !            32: #include "log.h"
        !            33: #include "zclient.h"
        !            34: 
        !            35: #include "ospfd/ospfd.h"
        !            36: #include "ospfd/ospf_interface.h"
        !            37: #include "ospfd/ospf_ism.h"
        !            38: #include "ospfd/ospf_asbr.h"
        !            39: #include "ospfd/ospf_lsa.h"
        !            40: #include "ospfd/ospf_lsdb.h"
        !            41: #include "ospfd/ospf_neighbor.h"
        !            42: #include "ospfd/ospf_nsm.h"
        !            43: #include "ospfd/ospf_spf.h"
        !            44: #include "ospfd/ospf_flood.h"
        !            45: #include "ospfd/ospf_packet.h"
        !            46: #include "ospfd/ospf_abr.h"
        !            47: #include "ospfd/ospf_route.h"
        !            48: #include "ospfd/ospf_zebra.h"
        !            49: #include "ospfd/ospf_dump.h"
        !            50: 
        !            51: extern struct zclient *zclient;
        !            52: 
        !            53: /* Do the LSA acking specified in table 19, Section 13.5, row 2
        !            54:  * This get called from ospf_flood_out_interface. Declared inline 
        !            55:  * for speed. */
        !            56: static void
        !            57: ospf_flood_delayed_lsa_ack (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
        !            58: {
        !            59:   /* LSA is more recent than database copy, but was not
        !            60:      flooded back out receiving interface.  Delayed
        !            61:      acknowledgment sent. If interface is in Backup state
        !            62:      delayed acknowledgment sent only if advertisement
        !            63:      received from Designated Router, otherwise do nothing See
        !            64:      RFC 2328 Section 13.5 */
        !            65: 
        !            66:   /* Whether LSA is more recent or not, and whether this is in
        !            67:      response to the LSA being sent out recieving interface has been 
        !            68:      worked out previously */
        !            69: 
        !            70:   /* Deal with router as BDR */
        !            71:   if (inbr->oi->state == ISM_Backup && ! NBR_IS_DR (inbr))
        !            72:     return;
        !            73: 
        !            74:   /* Schedule a delayed LSA Ack to be sent */ 
        !            75:   listnode_add (inbr->oi->ls_ack, ospf_lsa_lock (lsa)); /* delayed LSA Ack */
        !            76: }
        !            77: 
        !            78: /* Check LSA is related to external info. */
        !            79: struct external_info *
        !            80: ospf_external_info_check (struct ospf_lsa *lsa)
        !            81: {
        !            82:   struct as_external_lsa *al;
        !            83:   struct prefix_ipv4 p;
        !            84:   struct route_node *rn;
        !            85:   int type;
        !            86: 
        !            87:   al = (struct as_external_lsa *) lsa->data;
        !            88: 
        !            89:   p.family = AF_INET;
        !            90:   p.prefix = lsa->data->id;
        !            91:   p.prefixlen = ip_masklen (al->mask);
        !            92: 
        !            93:   for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
        !            94:     {
        !            95:       int redist_type = is_prefix_default (&p) ? DEFAULT_ROUTE : type;
        !            96:       if (ospf_is_type_redistributed (redist_type))
        !            97:        if (EXTERNAL_INFO (type))
        !            98:          {
        !            99:            rn = route_node_lookup (EXTERNAL_INFO (type),
        !           100:                                    (struct prefix *) &p);
        !           101:            if (rn)
        !           102:              {
        !           103:                route_unlock_node (rn);
        !           104:                if (rn->info != NULL)
        !           105:                  return (struct external_info *) rn->info;
        !           106:              }
        !           107:          }
        !           108:     }
        !           109: 
        !           110:   return NULL;
        !           111: }
        !           112: 
        !           113: static void
        !           114: ospf_process_self_originated_lsa (struct ospf *ospf,
        !           115:                                  struct ospf_lsa *new, struct ospf_area *area)
        !           116: {
        !           117:   struct ospf_interface *oi;
        !           118:   struct external_info *ei;
        !           119:   struct listnode *node;
        !           120:   
        !           121:   if (IS_DEBUG_OSPF_EVENT)
        !           122:     zlog_debug ("LSA[Type%d:%s]: Process self-originated LSA seq 0x%x",
        !           123:               new->data->type, inet_ntoa (new->data->id), 
        !           124:               ntohl(new->data->ls_seqnum));
        !           125: 
        !           126:   /* If we're here, we installed a self-originated LSA that we received
        !           127:      from a neighbor, i.e. it's more recent.  We must see whether we want
        !           128:      to originate it.
        !           129:      If yes, we should use this LSA's sequence number and reoriginate
        !           130:      a new instance.
        !           131:      if not --- we must flush this LSA from the domain. */
        !           132:   switch (new->data->type)
        !           133:     {
        !           134:     case OSPF_ROUTER_LSA:
        !           135:       /* Originate a new instance and schedule flooding */
        !           136:       if (area->router_lsa_self)
        !           137:        area->router_lsa_self->data->ls_seqnum = new->data->ls_seqnum;
        !           138:       ospf_router_lsa_update_area (area);
        !           139:       return;
        !           140:     case OSPF_NETWORK_LSA:
        !           141: #ifdef HAVE_OPAQUE_LSA
        !           142:     case OSPF_OPAQUE_LINK_LSA:
        !           143: #endif /* HAVE_OPAQUE_LSA */
        !           144:       /* We must find the interface the LSA could belong to.
        !           145:         If the interface is no more a broadcast type or we are no more
        !           146:         the DR, we flush the LSA otherwise -- create the new instance and
        !           147:         schedule flooding. */
        !           148: 
        !           149:       /* Look through all interfaces, not just area, since interface
        !           150:         could be moved from one area to another. */
        !           151:       for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
        !           152:        /* These are sanity check. */
        !           153:         if (IPV4_ADDR_SAME (&oi->address->u.prefix4, &new->data->id))
        !           154:           {
        !           155:             if (oi->area != area ||
        !           156:                 oi->type != OSPF_IFTYPE_BROADCAST ||
        !           157:                 !IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi)))
        !           158:               {
        !           159:                 ospf_schedule_lsa_flush_area (area, new);
        !           160:                 return;
        !           161:               }
        !           162:             
        !           163: #ifdef HAVE_OPAQUE_LSA
        !           164:             if (new->data->type == OSPF_OPAQUE_LINK_LSA)
        !           165:               {
        !           166:                 ospf_opaque_lsa_refresh (new);
        !           167:                 return;
        !           168:               }
        !           169: #endif /* HAVE_OPAQUE_LSA */
        !           170: 
        !           171:             if (oi->network_lsa_self)
        !           172:              oi->network_lsa_self->data->ls_seqnum = new->data->ls_seqnum;
        !           173:             /* Schedule network-LSA origination. */
        !           174:             ospf_network_lsa_update (oi);
        !           175:             return;
        !           176:           }
        !           177:       break;
        !           178:     case OSPF_SUMMARY_LSA:
        !           179:     case OSPF_ASBR_SUMMARY_LSA:
        !           180:       ospf_schedule_abr_task (ospf);
        !           181:       break;
        !           182:     case OSPF_AS_EXTERNAL_LSA :
        !           183:     case OSPF_AS_NSSA_LSA:
        !           184:        if ( (new->data->type == OSPF_AS_EXTERNAL_LSA)
        !           185:              && CHECK_FLAG (new->flags, OSPF_LSA_LOCAL_XLT))
        !           186:          {
        !           187:            ospf_translated_nssa_refresh (ospf, NULL, new);
        !           188:            return;
        !           189:          }
        !           190:       ei = ospf_external_info_check (new);
        !           191:       if (ei)
        !           192:         ospf_external_lsa_refresh (ospf, new, ei, LSA_REFRESH_FORCE);
        !           193:       else
        !           194:         ospf_lsa_flush_as (ospf, new);
        !           195:       break;
        !           196: #ifdef HAVE_OPAQUE_LSA
        !           197:     case OSPF_OPAQUE_AREA_LSA:
        !           198:       ospf_opaque_lsa_refresh (new);
        !           199:       break;
        !           200:     case OSPF_OPAQUE_AS_LSA:
        !           201:       ospf_opaque_lsa_refresh (new); /* Reconsideration may needed. *//* XXX */
        !           202:       break;
        !           203: #endif /* HAVE_OPAQUE_LSA */
        !           204:     default:
        !           205:       break;
        !           206:     }
        !           207: }
        !           208: 
        !           209: /* OSPF LSA flooding -- RFC2328 Section 13.(5). */
        !           210: 
        !           211: /* Now Updated for NSSA operation, as follows:
        !           212: 
        !           213: 
        !           214:        Type-5's have no change.  Blocked to STUB or NSSA.
        !           215: 
        !           216:        Type-7's can be received, and if a DR
        !           217:        they will also flood the local NSSA Area as Type-7's
        !           218: 
        !           219:        If a Self-Originated LSA (now an ASBR), 
        !           220:        The LSDB will be updated as Type-5's, (for continual re-fresh)
        !           221: 
        !           222:            If an NSSA-IR it is installed/flooded as Type-7, P-bit on.
        !           223:            if an NSSA-ABR it is installed/flooded as Type-7, P-bit off.
        !           224: 
        !           225:        Later, during the ABR TASK, if the ABR is the Elected NSSA
        !           226:        translator, then All Type-7s (with P-bit ON) are Translated to
        !           227:        Type-5's and flooded to all non-NSSA/STUB areas.
        !           228: 
        !           229:        During ASE Calculations, 
        !           230:            non-ABRs calculate external routes from Type-7's
        !           231:            ABRs calculate external routes from Type-5's and non-self Type-7s
        !           232: */
        !           233: int
        !           234: ospf_flood (struct ospf *ospf, struct ospf_neighbor *nbr,
        !           235:            struct ospf_lsa *current, struct ospf_lsa *new)
        !           236: {
        !           237:   struct ospf_interface *oi;
        !           238:   int lsa_ack_flag;
        !           239: 
        !           240:   /* Type-7 LSA's will be flooded throughout their native NSSA area,
        !           241:      but will also be flooded as Type-5's into ABR capable links.  */
        !           242: 
        !           243:   if (IS_DEBUG_OSPF_EVENT)
        !           244:     zlog_debug ("LSA[Flooding]: start, NBR %s (%s), cur(%p), New-LSA[%s]",
        !           245:                inet_ntoa (nbr->router_id),
        !           246:                LOOKUP (ospf_nsm_state_msg, nbr->state),
        !           247:                current,
        !           248:                dump_lsa_key (new));
        !           249: 
        !           250:   lsa_ack_flag = 0;
        !           251:   oi = nbr->oi;
        !           252: 
        !           253:   /* If there is already a database copy, and if the
        !           254:      database copy was received via flooding and installed less
        !           255:      than MinLSArrival seconds ago, discard the new LSA
        !           256:      (without acknowledging it). */
        !           257:   if (current != NULL)         /* -- endo. */
        !           258:     {
        !           259:       if (IS_LSA_SELF (current)
        !           260:       && (ntohs (current->data->ls_age)    == 0
        !           261:       &&  ntohl (current->data->ls_seqnum) == OSPF_INITIAL_SEQUENCE_NUMBER))
        !           262:         {
        !           263:           if (IS_DEBUG_OSPF_EVENT)
        !           264:            zlog_debug ("LSA[Flooding]: Got a self-originated LSA, "
        !           265:                       "while local one is initial instance.");
        !           266:           ; /* Accept this LSA for quick LSDB resynchronization. */
        !           267:         }
        !           268:       else if (tv_cmp (tv_sub (recent_relative_time (), current->tv_recv),
        !           269:                       int2tv (OSPF_MIN_LS_ARRIVAL)) < 0)
        !           270:         {
        !           271:           if (IS_DEBUG_OSPF_EVENT)
        !           272:            zlog_debug ("LSA[Flooding]: LSA is received recently.");
        !           273:           return -1;
        !           274:         }
        !           275:     }
        !           276: 
        !           277:   /* Flood the new LSA out some subset of the router's interfaces.
        !           278:      In some cases (e.g., the state of the receiving interface is
        !           279:      DR and the LSA was received from a router other than the
        !           280:      Backup DR) the LSA will be flooded back out the receiving
        !           281:      interface. */
        !           282:   lsa_ack_flag = ospf_flood_through (ospf, nbr, new);
        !           283: 
        !           284: #ifdef HAVE_OPAQUE_LSA
        !           285:   /* Remove the current database copy from all neighbors' Link state
        !           286:      retransmission lists.  AS_EXTERNAL and AS_EXTERNAL_OPAQUE does
        !           287:                                         ^^^^^^^^^^^^^^^^^^^^^^^
        !           288:      not have area ID.
        !           289:      All other (even NSSA's) do have area ID.  */
        !           290: #else /* HAVE_OPAQUE_LSA */
        !           291:   /* Remove the current database copy from all neighbors' Link state
        !           292:      retransmission lists.  Only AS_EXTERNAL does not have area ID.
        !           293:      All other (even NSSA's) do have area ID.  */
        !           294: #endif /* HAVE_OPAQUE_LSA */
        !           295:   if (current)
        !           296:     {
        !           297:       switch (current->data->type)
        !           298:         {
        !           299:         case OSPF_AS_EXTERNAL_LSA:
        !           300: #ifdef HAVE_OPAQUE_LSA
        !           301:         case OSPF_OPAQUE_AS_LSA:
        !           302: #endif /* HAVE_OPAQUE_LSA */
        !           303:           ospf_ls_retransmit_delete_nbr_as (ospf, current);
        !           304:           break;
        !           305:         default:
        !           306:           ospf_ls_retransmit_delete_nbr_area (nbr->oi->area, current);
        !           307:           break;
        !           308:         }
        !           309:     }
        !           310: 
        !           311:   /* Do some internal house keeping that is needed here */
        !           312:   SET_FLAG (new->flags, OSPF_LSA_RECEIVED);
        !           313:   ospf_lsa_is_self_originated (ospf, new); /* Let it set the flag */
        !           314: 
        !           315:   /* Install the new LSA in the link state database
        !           316:      (replacing the current database copy).  This may cause the
        !           317:      routing table calculation to be scheduled.  In addition,
        !           318:      timestamp the new LSA with the current time.  The flooding
        !           319:      procedure cannot overwrite the newly installed LSA until
        !           320:      MinLSArrival seconds have elapsed. */  
        !           321: 
        !           322:   if (! (new = ospf_lsa_install (ospf, nbr->oi, new)))
        !           323:     return 0; /* unknown LSA type */
        !           324: 
        !           325:   /* Acknowledge the receipt of the LSA by sending a Link State
        !           326:      Acknowledgment packet back out the receiving interface. */
        !           327:   if (lsa_ack_flag)
        !           328:     ospf_flood_delayed_lsa_ack (nbr, new);     
        !           329: 
        !           330:   /* If this new LSA indicates that it was originated by the
        !           331:      receiving router itself, the router must take special action,
        !           332:      either updating the LSA or in some cases flushing it from
        !           333:      the routing domain. */
        !           334:   if (ospf_lsa_is_self_originated (ospf, new))
        !           335:     ospf_process_self_originated_lsa (ospf, new, oi->area);
        !           336:   else
        !           337:     /* Update statistics value for OSPF-MIB. */
        !           338:     ospf->rx_lsa_count++;
        !           339: 
        !           340:   return 0;
        !           341: }
        !           342: 
        !           343: /* OSPF LSA flooding -- RFC2328 Section 13.3. */
        !           344: static int
        !           345: ospf_flood_through_interface (struct ospf_interface *oi,
        !           346:                              struct ospf_neighbor *inbr,
        !           347:                              struct ospf_lsa *lsa)
        !           348: {
        !           349:   struct ospf_neighbor *onbr;
        !           350:   struct route_node *rn;
        !           351:   int retx_flag;
        !           352: 
        !           353:   if (IS_DEBUG_OSPF_EVENT)
        !           354:     zlog_debug ("ospf_flood_through_interface(): "
        !           355:               "considering int %s, INBR(%s), LSA[%s]",
        !           356:               IF_NAME (oi), inbr ? inet_ntoa (inbr->router_id) : "NULL",
        !           357:                dump_lsa_key (lsa));
        !           358: 
        !           359:   if (!ospf_if_is_enable (oi))
        !           360:     return 0;
        !           361: 
        !           362:   /* Remember if new LSA is aded to a retransmit list. */
        !           363:   retx_flag = 0;
        !           364: 
        !           365:   /* Each of the neighbors attached to this interface are examined,
        !           366:      to determine whether they must receive the new LSA.  The following
        !           367:      steps are executed for each neighbor: */
        !           368:   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
        !           369:     {
        !           370:       struct ospf_lsa *ls_req;
        !           371:  
        !           372:       if (rn->info == NULL)
        !           373:        continue;
        !           374: 
        !           375:       onbr = rn->info;
        !           376:       if (IS_DEBUG_OSPF_EVENT)
        !           377:        zlog_debug ("ospf_flood_through_interface(): considering nbr %s (%s)",
        !           378:                   inet_ntoa (onbr->router_id),
        !           379:                    LOOKUP (ospf_nsm_state_msg, onbr->state));
        !           380: 
        !           381:       /* If the neighbor is in a lesser state than Exchange, it
        !           382:         does not participate in flooding, and the next neighbor
        !           383:         should be examined. */
        !           384:       if (onbr->state < NSM_Exchange)
        !           385:        continue;
        !           386: 
        !           387:       /* If the adjacency is not yet full (neighbor state is
        !           388:         Exchange or Loading), examine the Link state request
        !           389:         list associated with this adjacency.  If there is an
        !           390:         instance of the new LSA on the list, it indicates that
        !           391:         the neighboring router has an instance of the LSA
        !           392:         already.  Compare the new LSA to the neighbor's copy: */
        !           393:       if (onbr->state < NSM_Full)
        !           394:        {
        !           395:          if (IS_DEBUG_OSPF_EVENT)
        !           396:            zlog_debug ("ospf_flood_through_interface(): nbr adj is not Full");
        !           397:          ls_req = ospf_ls_request_lookup (onbr, lsa);
        !           398:          if (ls_req != NULL)
        !           399:            {
        !           400:              int ret;
        !           401: 
        !           402:              ret = ospf_lsa_more_recent (ls_req, lsa);
        !           403:              /* The new LSA is less recent. */
        !           404:              if (ret > 0)
        !           405:                continue;
        !           406:              /* The two copies are the same instance, then delete
        !           407:                 the LSA from the Link state request list. */
        !           408:              else if (ret == 0)
        !           409:                {
        !           410:                  ospf_ls_request_delete (onbr, ls_req);
        !           411:                  ospf_check_nbr_loading (onbr);
        !           412:                  continue;
        !           413:                }
        !           414:              /* The new LSA is more recent.  Delete the LSA
        !           415:                 from the Link state request list. */
        !           416:              else
        !           417:                {
        !           418:                  ospf_ls_request_delete (onbr, ls_req);
        !           419:                  ospf_check_nbr_loading (onbr);
        !           420:                }
        !           421:            }
        !           422:        }
        !           423: 
        !           424: #ifdef HAVE_OPAQUE_LSA
        !           425:       if (IS_OPAQUE_LSA (lsa->data->type))
        !           426:         {
        !           427:           if (! CHECK_FLAG (onbr->options, OSPF_OPTION_O))
        !           428:             {
        !           429:               if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
        !           430:                 zlog_debug ("Skip this neighbor: Not Opaque-capable.");
        !           431:               continue;
        !           432:             }
        !           433: 
        !           434:           if (IS_OPAQUE_LSA_ORIGINATION_BLOCKED (oi->ospf->opaque)
        !           435:           &&  IS_LSA_SELF (lsa)
        !           436:           &&  onbr->state == NSM_Full)
        !           437:             {
        !           438:               /* Small attempt to reduce unnecessary retransmission. */
        !           439:               if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
        !           440:                 zlog_debug ("Skip this neighbor: Initial flushing done.");
        !           441:               continue;
        !           442:             }
        !           443:         }
        !           444: #endif /* HAVE_OPAQUE_LSA */
        !           445: 
        !           446:       /* If the new LSA was received from this neighbor,
        !           447:         examine the next neighbor. */
        !           448: #ifdef ORIGINAL_CODING
        !           449:       if (inbr)
        !           450:        if (IPV4_ADDR_SAME (&inbr->router_id, &onbr->router_id))
        !           451:          continue;
        !           452: #else /* ORIGINAL_CODING */
        !           453:       if (inbr)
        !           454:         {
        !           455:           /*
        !           456:            * Triggered by LSUpd message parser "ospf_ls_upd ()".
        !           457:            * E.g., all LSAs handling here is received via network.
        !           458:            */
        !           459:           if (IPV4_ADDR_SAME (&inbr->router_id, &onbr->router_id))
        !           460:             {
        !           461:               if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
        !           462:                 zlog_debug ("Skip this neighbor: inbr == onbr");
        !           463:               continue;
        !           464:             }
        !           465:         }
        !           466:       else
        !           467:         {
        !           468:           /*
        !           469:            * Triggered by MaxAge remover, so far.
        !           470:            * NULL "inbr" means flooding starts from this node.
        !           471:            */
        !           472:           if (IPV4_ADDR_SAME (&lsa->data->adv_router, &onbr->router_id))
        !           473:             {
        !           474:               if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
        !           475:                 zlog_debug ("Skip this neighbor: lsah->adv_router == onbr");
        !           476:               continue;
        !           477:             }
        !           478:         }
        !           479: #endif /* ORIGINAL_CODING */
        !           480: 
        !           481:       /* Add the new LSA to the Link state retransmission list
        !           482:         for the adjacency. The LSA will be retransmitted
        !           483:         at intervals until an acknowledgment is seen from
        !           484:         the neighbor. */
        !           485:       ospf_ls_retransmit_add (onbr, lsa);
        !           486:       retx_flag = 1;
        !           487:     }
        !           488: 
        !           489:   /* If in the previous step, the LSA was NOT added to any of
        !           490:      the Link state retransmission lists, there is no need to
        !           491:      flood the LSA out the interface. */
        !           492:   if (retx_flag == 0) 
        !           493:     {
        !           494:       return (inbr && inbr->oi == oi);
        !           495:     }
        !           496: 
        !           497:   /* if we've received the lsa on this interface we need to perform
        !           498:      additional checking */
        !           499:   if (inbr && (inbr->oi == oi))
        !           500:     {
        !           501:       /* If the new LSA was received on this interface, and it was
        !           502:         received from either the Designated Router or the Backup
        !           503:         Designated Router, chances are that all the neighbors have
        !           504:         received the LSA already. */
        !           505:       if (NBR_IS_DR (inbr) || NBR_IS_BDR (inbr))
        !           506:        {
        !           507:          if (IS_DEBUG_OSPF_NSSA)
        !           508:            zlog_debug ("ospf_flood_through_interface(): "
        !           509:                       "DR/BDR NOT SEND to int %s", IF_NAME (oi));
        !           510:          return 1;
        !           511:        }
        !           512:          
        !           513:       /* If the new LSA was received on this interface, and the
        !           514:         interface state is Backup, examine the next interface.  The
        !           515:         Designated Router will do the flooding on this interface.
        !           516:         However, if the Designated Router fails the router will
        !           517:         end up retransmitting the updates. */
        !           518: 
        !           519:       if (oi->state == ISM_Backup)
        !           520:        {
        !           521:          if (IS_DEBUG_OSPF_NSSA)
        !           522:            zlog_debug ("ospf_flood_through_interface(): "
        !           523:                       "ISM_Backup NOT SEND to int %s", IF_NAME (oi));
        !           524:          return 1;
        !           525:        }
        !           526:     }
        !           527: 
        !           528:   /* The LSA must be flooded out the interface. Send a Link State
        !           529:      Update packet (including the new LSA as contents) out the
        !           530:      interface.  The LSA's LS age must be incremented by InfTransDelay
        !           531:      (which    must be > 0) when it is copied into the outgoing Link
        !           532:      State Update packet (until the LS age field reaches the maximum
        !           533:      value of MaxAge). */
        !           534:   /* XXX HASSO: Is this IS_DEBUG_OSPF_NSSA really correct? */
        !           535:   if (IS_DEBUG_OSPF_NSSA)
        !           536:     zlog_debug ("ospf_flood_through_interface(): "
        !           537:               "DR/BDR sending upd to int %s", IF_NAME (oi));
        !           538: 
        !           539:   /*  RFC2328  Section 13.3
        !           540:       On non-broadcast networks, separate      Link State Update
        !           541:       packets must be sent, as unicasts, to each adjacent      neighbor
        !           542:       (i.e., those in state Exchange or greater).       The destination
        !           543:       IP addresses for these packets are the neighbors' IP
        !           544:       addresses.   */
        !           545:   if (oi->type == OSPF_IFTYPE_NBMA)
        !           546:     {
        !           547:       struct route_node *rn;
        !           548:       struct ospf_neighbor *nbr;
        !           549: 
        !           550:       for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
        !           551:         if ((nbr = rn->info) != NULL)
        !           552:          if (nbr != oi->nbr_self && nbr->state >= NSM_Exchange)
        !           553:            ospf_ls_upd_send_lsa (nbr, lsa, OSPF_SEND_PACKET_DIRECT);
        !           554:     }
        !           555:   else
        !           556:     ospf_ls_upd_send_lsa (oi->nbr_self, lsa, OSPF_SEND_PACKET_INDIRECT);
        !           557: 
        !           558:   return 0;
        !           559: }
        !           560: 
        !           561: int
        !           562: ospf_flood_through_area (struct ospf_area *area,
        !           563:                         struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
        !           564: {
        !           565:   struct listnode *node, *nnode;
        !           566:   struct ospf_interface *oi;
        !           567:   int lsa_ack_flag = 0;
        !           568: 
        !           569:   /* All other types are specific to a single area (Area A).  The
        !           570:      eligible interfaces are all those interfaces attaching to the
        !           571:      Area A.  If Area A is the backbone, this includes all the virtual
        !           572:      links.  */
        !           573:   for (ALL_LIST_ELEMENTS (area->oiflist, node, nnode, oi))
        !           574:     {
        !           575:       if (area->area_id.s_addr != OSPF_AREA_BACKBONE &&
        !           576:          oi->type ==  OSPF_IFTYPE_VIRTUALLINK) 
        !           577:        continue;
        !           578: 
        !           579: #ifdef HAVE_OPAQUE_LSA
        !           580:       if ((lsa->data->type == OSPF_OPAQUE_LINK_LSA) && (lsa->oi != oi))
        !           581:         {
        !           582:           /*
        !           583:            * Link local scoped Opaque-LSA should only be flooded
        !           584:            * for the link on which the LSA has received.
        !           585:            */
        !           586:           if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
        !           587:             zlog_debug ("Type-9 Opaque-LSA: lsa->oi(%p) != oi(%p)", lsa->oi, oi);
        !           588:           continue;
        !           589:         }
        !           590: #endif /* HAVE_OPAQUE_LSA */
        !           591: 
        !           592:       if (ospf_flood_through_interface (oi, inbr, lsa))
        !           593:        lsa_ack_flag = 1;
        !           594:     }
        !           595: 
        !           596:   return (lsa_ack_flag);
        !           597: }
        !           598: 
        !           599: int
        !           600: ospf_flood_through_as (struct ospf *ospf, struct ospf_neighbor *inbr,
        !           601:                       struct ospf_lsa *lsa)
        !           602: {
        !           603:   struct listnode *node;
        !           604:   struct ospf_area *area;
        !           605:   int lsa_ack_flag;
        !           606: 
        !           607:   lsa_ack_flag = 0;
        !           608: 
        !           609:   /* The incoming LSA is type 5 or type 7  (AS-EXTERNAL or AS-NSSA )
        !           610: 
        !           611:     Divert the Type-5 LSA's to all non-NSSA/STUB areas
        !           612: 
        !           613:     Divert the Type-7 LSA's to all NSSA areas
        !           614: 
        !           615:      AS-external-LSAs are flooded throughout the entire AS, with the
        !           616:      exception of stub areas (see Section 3.6).  The eligible
        !           617:      interfaces are all the router's interfaces, excluding virtual
        !           618:      links and those interfaces attaching to stub areas.  */
        !           619: 
        !           620:   if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT)) /* Translated from 7  */
        !           621:     if (IS_DEBUG_OSPF_NSSA)
        !           622:       zlog_debug ("Flood/AS: NSSA TRANSLATED LSA");
        !           623: 
        !           624:   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
        !           625:     {
        !           626:       int continue_flag = 0;
        !           627:       struct listnode *if_node;
        !           628:       struct ospf_interface *oi;
        !           629: 
        !           630:       switch (area->external_routing)
        !           631:        {
        !           632:          /* Don't send AS externals into stub areas.  Various types
        !           633:              of support for partial stub areas can be implemented
        !           634:              here.  NSSA's will receive Type-7's that have areas
        !           635:              matching the originl LSA. */
        !           636:        case OSPF_AREA_NSSA:    /* Sending Type 5 or 7 into NSSA area */
        !           637:          /* Type-7, flood NSSA area */
        !           638:           if (lsa->data->type == OSPF_AS_NSSA_LSA
        !           639:              && area == lsa->area)
        !           640:            /* We will send it. */
        !           641:            continue_flag = 0;
        !           642:           else
        !           643:            continue_flag = 1;  /* Skip this NSSA area for Type-5's et al */
        !           644:           break;
        !           645: 
        !           646:        case OSPF_AREA_TYPE_MAX:
        !           647:        case OSPF_AREA_STUB:
        !           648:          continue_flag = 1;    /* Skip this area. */
        !           649:          break;
        !           650: 
        !           651:        case OSPF_AREA_DEFAULT:
        !           652:        default:
        !           653:          /* No Type-7 into normal area */
        !           654:           if (lsa->data->type == OSPF_AS_NSSA_LSA) 
        !           655:            continue_flag = 1; /* skip Type-7 */
        !           656:           else
        !           657:            continue_flag = 0;  /* Do this area. */
        !           658:          break;
        !           659:        }
        !           660:       
        !           661:       /* Do continue for above switch.  Saves a big if then mess */
        !           662:       if (continue_flag) 
        !           663:        continue; /* main for-loop */
        !           664:       
        !           665:       /* send to every interface in this area */
        !           666: 
        !           667:       for (ALL_LIST_ELEMENTS_RO (area->oiflist, if_node, oi))
        !           668:        {
        !           669:          /* Skip virtual links */
        !           670:          if (oi->type !=  OSPF_IFTYPE_VIRTUALLINK)
        !           671:            if (ospf_flood_through_interface (oi, inbr, lsa)) /* lsa */
        !           672:              lsa_ack_flag = 1;
        !           673:        }
        !           674:     } /* main area for-loop */
        !           675:   
        !           676:   return (lsa_ack_flag);
        !           677: }
        !           678: 
        !           679: int
        !           680: ospf_flood_through (struct ospf *ospf,
        !           681:                    struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
        !           682: {
        !           683:   int lsa_ack_flag = 0;
        !           684:   
        !           685:   /* Type-7 LSA's for NSSA are flooded throughout the AS here, and
        !           686:      upon return are updated in the LSDB for Type-7's.  Later,
        !           687:      re-fresh will re-send them (and also, if ABR, packet code will
        !           688:      translate to Type-5's)
        !           689:   
        !           690:      As usual, Type-5 LSA's (if not DISCARDED because we are STUB or
        !           691:      NSSA) are flooded throughout the AS, and are updated in the
        !           692:      global table.  */
        !           693: #ifdef ORIGINAL_CODING
        !           694:   switch (lsa->data->type)
        !           695:     {
        !           696:     case OSPF_ROUTER_LSA:
        !           697:     case OSPF_NETWORK_LSA:
        !           698:     case OSPF_SUMMARY_LSA:
        !           699:     case OSPF_ASBR_SUMMARY_LSA:
        !           700: #ifdef HAVE_OPAQUE_LSA
        !           701:     case OSPF_OPAQUE_LINK_LSA: /* ospf_flood_through_interface ? */
        !           702:     case OSPF_OPAQUE_AREA_LSA:
        !           703: #endif /* HAVE_OPAQUE_LSA */
        !           704:       lsa_ack_flag = ospf_flood_through_area (inbr->oi->area, inbr, lsa);
        !           705:       break;
        !           706:     case OSPF_AS_EXTERNAL_LSA: /* Type-5 */
        !           707: #ifdef HAVE_OPAQUE_LSA
        !           708:     case OSPF_OPAQUE_AS_LSA:
        !           709: #endif /* HAVE_OPAQUE_LSA */
        !           710:       lsa_ack_flag = ospf_flood_through_as (ospf, inbr, lsa);
        !           711:       break;
        !           712:       /* Type-7 Only received within NSSA, then flooded */
        !           713:     case OSPF_AS_NSSA_LSA:
        !           714:       /* Any P-bit was installed with the Type-7. */
        !           715:       lsa_ack_flag = ospf_flood_through_area (inbr->oi->area, inbr, lsa);
        !           716: 
        !           717:       if (IS_DEBUG_OSPF_NSSA)
        !           718:        zlog_debug ("ospf_flood_through: LOCAL NSSA FLOOD of Type-7.");
        !           719:       break;
        !           720:     default:
        !           721:       break;
        !           722:     }
        !           723: #else /* ORIGINAL_CODING */
        !           724:   /*
        !           725:    * At the common sub-sub-function "ospf_flood_through_interface()",
        !           726:    * a parameter "inbr" will be used to distinguish the called context
        !           727:    * whether the given LSA was received from the neighbor, or the
        !           728:    * flooding for the LSA starts from this node (e.g. the LSA was self-
        !           729:    * originated, or the LSA is going to be flushed from routing domain).
        !           730:    *
        !           731:    * So, for consistency reasons, this function "ospf_flood_through()"
        !           732:    * should also allow the usage that the given "inbr" parameter to be
        !           733:    * NULL. If we do so, corresponding AREA parameter should be referred
        !           734:    * by "lsa->area", instead of "inbr->oi->area".
        !           735:    */
        !           736:   switch (lsa->data->type)
        !           737:     {
        !           738:     case OSPF_AS_EXTERNAL_LSA: /* Type-5 */
        !           739: #ifdef HAVE_OPAQUE_LSA
        !           740:     case OSPF_OPAQUE_AS_LSA:
        !           741: #endif /* HAVE_OPAQUE_LSA */
        !           742:       lsa_ack_flag = ospf_flood_through_as (ospf, inbr, lsa);
        !           743:       break;
        !           744:       /* Type-7 Only received within NSSA, then flooded */
        !           745:     case OSPF_AS_NSSA_LSA:
        !           746:       /* Any P-bit was installed with the Type-7. */
        !           747: 
        !           748:       if (IS_DEBUG_OSPF_NSSA)
        !           749:        zlog_debug ("ospf_flood_through: LOCAL NSSA FLOOD of Type-7.");
        !           750:       /* Fallthrough */
        !           751:     default:
        !           752:       lsa_ack_flag = ospf_flood_through_area (lsa->area, inbr, lsa);
        !           753:       break;
        !           754:     }
        !           755: #endif /* ORIGINAL_CODING */
        !           756:   
        !           757:   return (lsa_ack_flag);
        !           758: }
        !           759: 
        !           760: 
        !           761: 
        !           762: /* Management functions for neighbor's Link State Request list. */
        !           763: void
        !           764: ospf_ls_request_add (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
        !           765: {
        !           766:   /*
        !           767:    * We cannot make use of the newly introduced callback function
        !           768:    * "lsdb->new_lsa_hook" to replace debug output below, just because
        !           769:    * it seems no simple and smart way to pass neighbor information to
        !           770:    * the common function "ospf_lsdb_add()" -- endo.
        !           771:    */
        !           772:   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
        !           773:       zlog_debug ("RqstL(%lu)++, NBR(%s), LSA[%s]",
        !           774:                   ospf_ls_request_count (nbr),
        !           775:                   inet_ntoa (nbr->router_id), dump_lsa_key (lsa));
        !           776: 
        !           777:   ospf_lsdb_add (&nbr->ls_req, lsa);
        !           778: }
        !           779: 
        !           780: unsigned long
        !           781: ospf_ls_request_count (struct ospf_neighbor *nbr)
        !           782: {
        !           783:   return ospf_lsdb_count_all (&nbr->ls_req);
        !           784: }
        !           785: 
        !           786: int
        !           787: ospf_ls_request_isempty (struct ospf_neighbor *nbr)
        !           788: {
        !           789:   return ospf_lsdb_isempty (&nbr->ls_req);
        !           790: }
        !           791: 
        !           792: /* Remove LSA from neighbor's ls-request list. */
        !           793: void
        !           794: ospf_ls_request_delete (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
        !           795: {
        !           796:   if (nbr->ls_req_last == lsa)
        !           797:     {
        !           798:       ospf_lsa_unlock (&nbr->ls_req_last);
        !           799:       nbr->ls_req_last = NULL;
        !           800:     }
        !           801: 
        !           802:   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))       /* -- endo. */
        !           803:       zlog_debug ("RqstL(%lu)--, NBR(%s), LSA[%s]",
        !           804:                   ospf_ls_request_count (nbr),
        !           805:                   inet_ntoa (nbr->router_id), dump_lsa_key (lsa));
        !           806: 
        !           807:   ospf_lsdb_delete (&nbr->ls_req, lsa);
        !           808: }
        !           809: 
        !           810: /* Remove all LSA from neighbor's ls-requenst list. */
        !           811: void
        !           812: ospf_ls_request_delete_all (struct ospf_neighbor *nbr)
        !           813: {
        !           814:   ospf_lsa_unlock (&nbr->ls_req_last);
        !           815:   nbr->ls_req_last = NULL;
        !           816:   ospf_lsdb_delete_all (&nbr->ls_req);
        !           817: }
        !           818: 
        !           819: /* Lookup LSA from neighbor's ls-request list. */
        !           820: struct ospf_lsa *
        !           821: ospf_ls_request_lookup (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
        !           822: {
        !           823:   return ospf_lsdb_lookup (&nbr->ls_req, lsa);
        !           824: }
        !           825: 
        !           826: struct ospf_lsa *
        !           827: ospf_ls_request_new (struct lsa_header *lsah)
        !           828: {
        !           829:   struct ospf_lsa *new;
        !           830: 
        !           831:   new = ospf_lsa_new ();
        !           832:   new->data = ospf_lsa_data_new (OSPF_LSA_HEADER_SIZE);
        !           833:   memcpy (new->data, lsah, OSPF_LSA_HEADER_SIZE);
        !           834: 
        !           835:   return new;
        !           836: }
        !           837: 
        !           838: 
        !           839: /* Management functions for neighbor's ls-retransmit list. */
        !           840: unsigned long
        !           841: ospf_ls_retransmit_count (struct ospf_neighbor *nbr)
        !           842: {
        !           843:   return ospf_lsdb_count_all (&nbr->ls_rxmt);
        !           844: }
        !           845: 
        !           846: unsigned long
        !           847: ospf_ls_retransmit_count_self (struct ospf_neighbor *nbr, int lsa_type)
        !           848: {
        !           849:   return ospf_lsdb_count_self (&nbr->ls_rxmt, lsa_type);
        !           850: }
        !           851: 
        !           852: int
        !           853: ospf_ls_retransmit_isempty (struct ospf_neighbor *nbr)
        !           854: {
        !           855:   return ospf_lsdb_isempty (&nbr->ls_rxmt);
        !           856: }
        !           857: 
        !           858: /* Add LSA to be retransmitted to neighbor's ls-retransmit list. */
        !           859: void
        !           860: ospf_ls_retransmit_add (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
        !           861: {
        !           862:   struct ospf_lsa *old;
        !           863: 
        !           864:   old = ospf_ls_retransmit_lookup (nbr, lsa);
        !           865: 
        !           866:   if (ospf_lsa_more_recent (old, lsa) < 0)
        !           867:     {
        !           868:       if (old)
        !           869:        {
        !           870:          old->retransmit_counter--;
        !           871:          ospf_lsdb_delete (&nbr->ls_rxmt, old);
        !           872:        }
        !           873:       lsa->retransmit_counter++;
        !           874:       /*
        !           875:        * We cannot make use of the newly introduced callback function
        !           876:        * "lsdb->new_lsa_hook" to replace debug output below, just because
        !           877:        * it seems no simple and smart way to pass neighbor information to
        !           878:        * the common function "ospf_lsdb_add()" -- endo.
        !           879:        */
        !           880:       if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
        !           881:          zlog_debug ("RXmtL(%lu)++, NBR(%s), LSA[%s]",
        !           882:                      ospf_ls_retransmit_count (nbr),
        !           883:                     inet_ntoa (nbr->router_id), dump_lsa_key (lsa));
        !           884:       ospf_lsdb_add (&nbr->ls_rxmt, lsa);
        !           885:     }
        !           886: }
        !           887: 
        !           888: /* Remove LSA from neibghbor's ls-retransmit list. */
        !           889: void
        !           890: ospf_ls_retransmit_delete (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
        !           891: {
        !           892:   if (ospf_ls_retransmit_lookup (nbr, lsa))
        !           893:     {
        !           894:       lsa->retransmit_counter--;  
        !           895:       if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))           /* -- endo. */
        !           896:          zlog_debug ("RXmtL(%lu)--, NBR(%s), LSA[%s]",
        !           897:                      ospf_ls_retransmit_count (nbr),
        !           898:                     inet_ntoa (nbr->router_id), dump_lsa_key (lsa));
        !           899:       ospf_lsdb_delete (&nbr->ls_rxmt, lsa);
        !           900:     }
        !           901: }
        !           902: 
        !           903: /* Clear neighbor's ls-retransmit list. */
        !           904: void
        !           905: ospf_ls_retransmit_clear (struct ospf_neighbor *nbr)
        !           906: {
        !           907:   struct ospf_lsdb *lsdb;
        !           908:   int i;
        !           909: 
        !           910:   lsdb = &nbr->ls_rxmt;
        !           911: 
        !           912:   for (i = OSPF_MIN_LSA; i < OSPF_MAX_LSA; i++)
        !           913:     {
        !           914:       struct route_table *table = lsdb->type[i].db;
        !           915:       struct route_node *rn;
        !           916:       struct ospf_lsa *lsa;
        !           917: 
        !           918:       for (rn = route_top (table); rn; rn = route_next (rn))
        !           919:        if ((lsa = rn->info) != NULL)
        !           920:          ospf_ls_retransmit_delete (nbr, lsa);
        !           921:     }
        !           922: 
        !           923:   ospf_lsa_unlock (&nbr->ls_req_last);
        !           924:   nbr->ls_req_last = NULL;
        !           925: }
        !           926: 
        !           927: /* Lookup LSA from neighbor's ls-retransmit list. */
        !           928: struct ospf_lsa *
        !           929: ospf_ls_retransmit_lookup (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
        !           930: {
        !           931:   return ospf_lsdb_lookup (&nbr->ls_rxmt, lsa);
        !           932: }
        !           933: 
        !           934: static void
        !           935: ospf_ls_retransmit_delete_nbr_if (struct ospf_interface *oi,
        !           936:                                  struct ospf_lsa *lsa)
        !           937: {
        !           938:   struct route_node *rn;
        !           939:   struct ospf_neighbor *nbr;
        !           940:   struct ospf_lsa *lsr;
        !           941: 
        !           942:   if (ospf_if_is_enable (oi))
        !           943:     for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
        !           944:       /* If LSA find in LS-retransmit list, then remove it. */
        !           945:       if ((nbr = rn->info) != NULL)
        !           946:        {
        !           947:          lsr = ospf_ls_retransmit_lookup (nbr, lsa);
        !           948:             
        !           949:          /* If LSA find in ls-retransmit list, remove it. */
        !           950:          if (lsr != NULL && lsr->data->ls_seqnum == lsa->data->ls_seqnum)
        !           951:            ospf_ls_retransmit_delete (nbr, lsr);
        !           952:        }
        !           953: }
        !           954: 
        !           955: void
        !           956: ospf_ls_retransmit_delete_nbr_area (struct ospf_area *area,
        !           957:                                    struct ospf_lsa *lsa)
        !           958: {
        !           959:   struct listnode *node, *nnode;
        !           960:   struct ospf_interface *oi;
        !           961: 
        !           962:   for (ALL_LIST_ELEMENTS (area->oiflist, node, nnode, oi))
        !           963:     ospf_ls_retransmit_delete_nbr_if (oi, lsa);
        !           964: }
        !           965: 
        !           966: void
        !           967: ospf_ls_retransmit_delete_nbr_as (struct ospf *ospf, struct ospf_lsa *lsa)
        !           968: {
        !           969:   struct listnode *node, *nnode;
        !           970:   struct ospf_interface *oi;
        !           971: 
        !           972:   for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
        !           973:     ospf_ls_retransmit_delete_nbr_if (oi, lsa);
        !           974: }
        !           975: 
        !           976: 
        !           977: /* Sets ls_age to MaxAge and floods throu the area. 
        !           978:    When we implement ASE routing, there will be anothe function
        !           979:    flushing an LSA from the whole domain. */
        !           980: void
        !           981: ospf_lsa_flush_area (struct ospf_lsa *lsa, struct ospf_area *area)
        !           982: {
        !           983:   lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
        !           984:   ospf_flood_through_area (area, NULL, lsa);
        !           985:   ospf_lsa_maxage (area->ospf, lsa);
        !           986: }
        !           987: 
        !           988: void
        !           989: ospf_lsa_flush_as (struct ospf *ospf, struct ospf_lsa *lsa)
        !           990: {
        !           991:   lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
        !           992:   ospf_flood_through_as (ospf, NULL, lsa);
        !           993:   ospf_lsa_maxage (ospf, lsa);
        !           994: }
        !           995: 
        !           996: void
        !           997: ospf_lsa_flush (struct ospf *ospf, struct ospf_lsa *lsa)
        !           998: {
        !           999:   lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
        !          1000:   
        !          1001:   switch (lsa->data->type)
        !          1002:     {
        !          1003:       case OSPF_ROUTER_LSA:
        !          1004:       case OSPF_NETWORK_LSA:
        !          1005:       case OSPF_SUMMARY_LSA:
        !          1006:       case OSPF_ASBR_SUMMARY_LSA:
        !          1007:       case OSPF_AS_NSSA_LSA:
        !          1008: #ifdef HAVE_OPAQUE_LSA
        !          1009:       case OSPF_OPAQUE_LINK_LSA:
        !          1010:       case OSPF_OPAQUE_AREA_LSA:
        !          1011: #endif /* HAVE_OPAQUE_LSA */
        !          1012:         ospf_lsa_flush_area (lsa, lsa->area);
        !          1013:         break;
        !          1014:       case OSPF_AS_EXTERNAL_LSA:
        !          1015: #ifdef HAVE_OPAQUE_LSA
        !          1016:       case OSPF_OPAQUE_AS_LSA:
        !          1017: #endif /* HAVE_OPAQUE_LSA */
        !          1018:         ospf_lsa_flush_as (ospf, lsa);
        !          1019:         break;
        !          1020:       default:
        !          1021:         zlog_info ("%s: Unknown LSA type %u", __func__, lsa->data->type);
        !          1022:         break;
        !          1023:     }
        !          1024: }

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