Annotation of embedaddon/quagga/isisd/isis_events.c, revision 1.1

1.1     ! misho       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>