File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospfd / ospf_flood.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:22:29 2012 UTC (11 years, 9 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, HEAD
quagga

    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 -1; /* unknown LSA type or any other error condition */
  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>