File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / isisd / isis_events.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:11 2012 UTC (12 years, 5 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_20_1, v0_99_20, HEAD
quagga

    1: /*
    2:  * IS-IS Rout(e)ing protocol - isis_events.h   
    3:  *
    4:  * Copyright (C) 2001,2002   Sampo Saaristo
    5:  *                           Tampere University of Technology      
    6:  *                           Institute of Communications Engineering
    7:  *
    8:  * This program is free software; you can redistribute it and/or modify it 
    9:  * under the terms of the GNU General Public Licenseas published by the Free 
   10:  * Software Foundation; either version 2 of the License, or (at your option) 
   11:  * any later version.
   12:  *
   13:  * This program is distributed in the hope that it will be useful,but WITHOUT 
   14:  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
   15:  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
   16:  * more details.
   17: 
   18:  * You should have received a copy of the GNU General Public License along 
   19:  * with this program; if not, write to the Free Software Foundation, Inc., 
   20:  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
   21:  */
   22: #include <zebra.h>
   23: 
   24: #include "log.h"
   25: #include "memory.h"
   26: #include "if.h"
   27: #include "linklist.h"
   28: #include "command.h"
   29: #include "thread.h"
   30: #include "hash.h"
   31: #include "prefix.h"
   32: #include "stream.h"
   33: 
   34: #include "isisd/dict.h"
   35: #include "isisd/include-netbsd/iso.h"
   36: #include "isisd/isis_constants.h"
   37: #include "isisd/isis_common.h"
   38: #include "isisd/isis_circuit.h"
   39: #include "isisd/isis_tlv.h"
   40: #include "isisd/isis_lsp.h"
   41: #include "isisd/isis_pdu.h"
   42: #include "isisd/isis_network.h"
   43: #include "isisd/isis_misc.h"
   44: #include "isisd/isis_constants.h"
   45: #include "isisd/isis_adjacency.h"
   46: #include "isisd/isis_dr.h"
   47: #include "isisd/isis_flags.h"
   48: #include "isisd/isisd.h"
   49: #include "isisd/isis_csm.h"
   50: #include "isisd/isis_events.h"
   51: #include "isisd/isis_spf.h"
   52: 
   53: extern struct thread_master *master;
   54: extern struct isis *isis;
   55: 
   56: /* debug isis-spf spf-events 
   57:  4w4d: ISIS-Spf (tlt): L2 SPF needed, new adjacency, from 0x609229F4
   58:  4w4d: ISIS-Spf (tlt): L2, 0000.0000.0042.01-00 TLV contents changed, code 0x2
   59:  4w4d: ISIS-Spf (tlt): L2, new LSP 0 DEAD.BEEF.0043.00-00
   60:  4w5d: ISIS-Spf (tlt): L1 SPF needed, periodic SPF, from 0x6091C844
   61:  4w5d: ISIS-Spf (tlt): L2 SPF needed, periodic SPF, from 0x6091C844
   62: */
   63: 
   64: void
   65: isis_event_circuit_state_change (struct isis_circuit *circuit, int up)
   66: {
   67:   struct isis_area *area;
   68: 
   69:   area = circuit->area;
   70:   assert (area);
   71:   area->circuit_state_changes++;
   72: 
   73:   if (isis->debugs & DEBUG_EVENTS)
   74:     zlog_debug ("ISIS-Evt (%s) circuit %s", circuit->area->area_tag,
   75: 	       up ? "up" : "down");
   76: 
   77:   /*
   78:    * Regenerate LSPs this affects
   79:    */
   80:   lsp_regenerate_schedule (area);
   81: 
   82:   return;
   83: }
   84: 
   85: void
   86: isis_event_system_type_change (struct isis_area *area, int newtype)
   87: {
   88:   struct listnode *node;
   89:   struct isis_circuit *circuit;
   90: 
   91:   if (isis->debugs & DEBUG_EVENTS)
   92:     zlog_debug ("ISIS-Evt (%s) system type change %s -> %s", area->area_tag,
   93: 	       circuit_t2string (area->is_type), circuit_t2string (newtype));
   94: 
   95:   if (area->is_type == newtype)
   96:     return;			/* No change */
   97: 
   98:   switch (area->is_type)
   99:     {
  100:     case IS_LEVEL_1:
  101:       if (area->lspdb[1] == NULL)
  102: 	area->lspdb[1] = lsp_db_init ();
  103:       lsp_l2_generate (area);
  104:       break;
  105:     case IS_LEVEL_1_AND_2:
  106:       if (newtype == IS_LEVEL_1)
  107: 	{
  108: 	  lsp_db_destroy (area->lspdb[1]);
  109: 	}
  110:       else
  111: 	{
  112: 	  lsp_db_destroy (area->lspdb[0]);
  113: 	}
  114:       break;
  115:     case IS_LEVEL_2:
  116:       if (area->lspdb[0] == NULL)
  117: 	area->lspdb[0] = lsp_db_init ();
  118:       lsp_l1_generate (area);
  119:       break;
  120:     default:
  121:       break;
  122:     }
  123: 
  124:   area->is_type = newtype;
  125:   for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit))
  126:     isis_event_circuit_type_change (circuit, newtype);
  127: 
  128:   spftree_area_init (area);
  129:   lsp_regenerate_schedule (area);
  130: 
  131:   return;
  132: }
  133: 
  134: void
  135: isis_event_area_addr_change (struct isis_area *area)
  136: {
  137: 
  138: }
  139: 
  140: static void
  141: circuit_commence_level (struct isis_circuit *circuit, int level)
  142: {
  143:   if (level == 1)
  144:     {
  145:       THREAD_TIMER_ON (master, circuit->t_send_psnp[0], send_l1_psnp, circuit,
  146: 		       isis_jitter (circuit->psnp_interval[0], PSNP_JITTER));
  147: 
  148:       if (circuit->circ_type == CIRCUIT_T_BROADCAST)
  149: 	{
  150: 	  THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1,
  151: 			   circuit, 2 * circuit->hello_interval[1]);
  152: 
  153: 	  THREAD_TIMER_ON (master, circuit->u.bc.t_send_lan_hello[0],
  154: 			   send_lan_l1_hello, circuit,
  155: 			   isis_jitter (circuit->hello_interval[0],
  156: 					IIH_JITTER));
  157: 
  158: 	  circuit->u.bc.lan_neighs[0] = list_new ();
  159: 	}
  160:     }
  161:   else
  162:     {
  163:       THREAD_TIMER_ON (master, circuit->t_send_psnp[1], send_l2_psnp, circuit,
  164: 		       isis_jitter (circuit->psnp_interval[1], PSNP_JITTER));
  165: 
  166:       if (circuit->circ_type == CIRCUIT_T_BROADCAST)
  167: 	{
  168: 	  THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2,
  169: 			   circuit, 2 * circuit->hello_interval[1]);
  170: 
  171: 	  THREAD_TIMER_ON (master, circuit->u.bc.t_send_lan_hello[1],
  172: 			   send_lan_l2_hello, circuit,
  173: 			   isis_jitter (circuit->hello_interval[1],
  174: 					IIH_JITTER));
  175: 
  176: 	  circuit->u.bc.lan_neighs[1] = list_new ();
  177: 	}
  178:     }
  179: 
  180:   return;
  181: }
  182: 
  183: static void
  184: circuit_resign_level (struct isis_circuit *circuit, int level)
  185: {
  186:   int idx = level - 1;
  187: 
  188:   THREAD_TIMER_OFF (circuit->t_send_csnp[idx]);
  189:   THREAD_TIMER_OFF (circuit->t_send_psnp[idx]);
  190: 
  191:   if (circuit->circ_type == CIRCUIT_T_BROADCAST)
  192:     {
  193:       THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[idx]);
  194:       THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[idx]);
  195:       THREAD_TIMER_OFF (circuit->u.bc.t_refresh_pseudo_lsp[idx]);
  196:       circuit->u.bc.run_dr_elect[idx] = 0;
  197:     }
  198: 
  199:   return;
  200: }
  201: 
  202: void
  203: isis_event_circuit_type_change (struct isis_circuit *circuit, int newtype)
  204: {
  205: 
  206:   if (isis->debugs & DEBUG_EVENTS)
  207:     zlog_debug ("ISIS-Evt (%s) circuit type change %s -> %s",
  208: 	       circuit->area->area_tag,
  209: 	       circuit_t2string (circuit->circuit_is_type),
  210: 	       circuit_t2string (newtype));
  211: 
  212:   if (circuit->circuit_is_type == newtype)
  213:     return;			/* No change */
  214: 
  215:   if (!(newtype & circuit->area->is_type))
  216:     {
  217:       zlog_err ("ISIS-Evt (%s) circuit type change - invalid level %s because"
  218: 		" area is %s", circuit->area->area_tag,
  219: 		circuit_t2string (newtype),
  220: 		circuit_t2string (circuit->area->is_type));
  221:       return;
  222:     }
  223: 
  224:   switch (circuit->circuit_is_type)
  225:     {
  226:     case IS_LEVEL_1:
  227:       if (newtype == IS_LEVEL_2)
  228: 	circuit_resign_level (circuit, 1);
  229:       circuit_commence_level (circuit, 2);
  230:       break;
  231:     case IS_LEVEL_1_AND_2:
  232:       if (newtype == IS_LEVEL_1)
  233: 	circuit_resign_level (circuit, 2);
  234:       else
  235: 	circuit_resign_level (circuit, 1);
  236:       break;
  237:     case IS_LEVEL_2:
  238:       if (newtype == IS_LEVEL_1)
  239: 	circuit_resign_level (circuit, 2);
  240:       circuit_commence_level (circuit, 1);
  241:       break;
  242:     default:
  243:       break;
  244:     }
  245: 
  246:   circuit->circuit_is_type = newtype;
  247:   lsp_regenerate_schedule (circuit->area);
  248: 
  249:   return;
  250: }
  251: 
  252:  /* 04/18/2002 by Gwak. */
  253:  /**************************************************************************
  254:   *
  255:   * EVENTS for LSP generation
  256:   *
  257:   * 1) an Adajacency or Circuit Up/Down event
  258:   * 2) a chnage in Circuit metric
  259:   * 3) a change in Reachable Address metric
  260:   * 4) a change in manualAreaAddresses
  261:   * 5) a change in systemID
  262:   * 6) a change in DIS status
  263:   * 7) a chnage in the waiting status
  264:   *
  265:   * ***********************************************************************
  266:   *
  267:   * current support event
  268:   *
  269:   * 1) Adjacency Up/Down event
  270:   * 6) a change in DIS status
  271:   *
  272:   * ***********************************************************************/
  273: 
  274: void
  275: isis_event_adjacency_state_change (struct isis_adjacency *adj, int newstate)
  276: {
  277:   /* adjacency state change event. 
  278:    * - the only proto-type was supported */
  279: 
  280:   /* invalid arguments */
  281:   if (!adj || !adj->circuit || !adj->circuit->area)
  282:     return;
  283: 
  284:   if (isis->debugs & DEBUG_EVENTS)
  285:     zlog_debug ("ISIS-Evt (%s) Adjacency State change",
  286: 		adj->circuit->area->area_tag);
  287: 
  288:   /* LSP generation again */
  289:   lsp_regenerate_schedule (adj->circuit->area);
  290: 
  291:   return;
  292: }
  293: 
  294: /* events supporting code */
  295: 
  296: int
  297: isis_event_dis_status_change (struct thread *thread)
  298: {
  299:   struct isis_circuit *circuit;
  300: 
  301:   circuit = THREAD_ARG (thread);
  302: 
  303:   /* invalid arguments */
  304:   if (!circuit || !circuit->area)
  305:     return 0;
  306:   if (isis->debugs & DEBUG_EVENTS)
  307:     zlog_debug ("ISIS-Evt (%s) DIS status change", circuit->area->area_tag);
  308: 
  309:   /* LSP generation again */
  310:   lsp_regenerate_schedule (circuit->area);
  311: 
  312:   return 0;
  313: }
  314: 
  315: void
  316: isis_event_auth_failure (char *area_tag, const char *error_string, u_char *sysid)
  317: {
  318:   if (isis->debugs & DEBUG_EVENTS)
  319:     zlog_debug ("ISIS-Evt (%s) Authentication failure %s from %s",
  320: 		area_tag, error_string, sysid_print (sysid));
  321: 
  322:   return;
  323: }

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