1*4eaa4710SRishi Srivatsavai /************************************************************************ 2*4eaa4710SRishi Srivatsavai * RSTP library - Rapid Spanning Tree (802.1t, 802.1w) 3*4eaa4710SRishi Srivatsavai * Copyright (C) 2001-2003 Optical Access 4*4eaa4710SRishi Srivatsavai * Author: Alex Rozin 5*4eaa4710SRishi Srivatsavai * 6*4eaa4710SRishi Srivatsavai * This file is part of RSTP library. 7*4eaa4710SRishi Srivatsavai * 8*4eaa4710SRishi Srivatsavai * RSTP library is free software; you can redistribute it and/or modify it 9*4eaa4710SRishi Srivatsavai * under the terms of the GNU Lesser General Public License as published by the 10*4eaa4710SRishi Srivatsavai * Free Software Foundation; version 2.1 11*4eaa4710SRishi Srivatsavai * 12*4eaa4710SRishi Srivatsavai * RSTP library is distributed in the hope that it will be useful, but 13*4eaa4710SRishi Srivatsavai * WITHOUT ANY WARRANTY; without even the implied warranty of 14*4eaa4710SRishi Srivatsavai * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 15*4eaa4710SRishi Srivatsavai * General Public License for more details. 16*4eaa4710SRishi Srivatsavai * 17*4eaa4710SRishi Srivatsavai * You should have received a copy of the GNU Lesser General Public License 18*4eaa4710SRishi Srivatsavai * along with RSTP library; see the file COPYING. If not, write to the Free 19*4eaa4710SRishi Srivatsavai * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20*4eaa4710SRishi Srivatsavai * 02111-1307, USA. 21*4eaa4710SRishi Srivatsavai **********************************************************************/ 22*4eaa4710SRishi Srivatsavai 23*4eaa4710SRishi Srivatsavai /* Generic (abstract state machine) state machine : 17.13, 17.14 */ 24*4eaa4710SRishi Srivatsavai 25*4eaa4710SRishi Srivatsavai #ifndef _STP_STATER_H__ 26*4eaa4710SRishi Srivatsavai #define _STP_STATER_H__ 27*4eaa4710SRishi Srivatsavai 28*4eaa4710SRishi Srivatsavai #define BEGIN 9999 /* distinct from any valid state */ 29*4eaa4710SRishi Srivatsavai 30*4eaa4710SRishi Srivatsavai #define STP_DBG 1 31*4eaa4710SRishi Srivatsavai 32*4eaa4710SRishi Srivatsavai typedef struct state_mach_t { 33*4eaa4710SRishi Srivatsavai struct state_mach_t* next; 34*4eaa4710SRishi Srivatsavai 35*4eaa4710SRishi Srivatsavai char* name; /* for debugging */ 36*4eaa4710SRishi Srivatsavai #ifdef STP_DBG 37*4eaa4710SRishi Srivatsavai char debug; /* 0- no dbg, 1 - port, 2 - stpm */ 38*4eaa4710SRishi Srivatsavai unsigned int ignoreHop2State; 39*4eaa4710SRishi Srivatsavai #endif 40*4eaa4710SRishi Srivatsavai 41*4eaa4710SRishi Srivatsavai Bool changeState; 42*4eaa4710SRishi Srivatsavai unsigned int State; 43*4eaa4710SRishi Srivatsavai 44*4eaa4710SRishi Srivatsavai void (* concreteEnterState) (struct state_mach_t * ); 45*4eaa4710SRishi Srivatsavai Bool (* concreteCheckCondition) (struct state_mach_t * ); 46*4eaa4710SRishi Srivatsavai char* (* concreteGetStatName) (int); 47*4eaa4710SRishi Srivatsavai union { 48*4eaa4710SRishi Srivatsavai struct stpm_t* stpm; 49*4eaa4710SRishi Srivatsavai struct port_t* port; 50*4eaa4710SRishi Srivatsavai void * owner; 51*4eaa4710SRishi Srivatsavai } owner; 52*4eaa4710SRishi Srivatsavai 53*4eaa4710SRishi Srivatsavai } STATE_MACH_T; 54*4eaa4710SRishi Srivatsavai 55*4eaa4710SRishi Srivatsavai #define STP_STATE_MACH_IN_LIST(WHAT) \ 56*4eaa4710SRishi Srivatsavai { \ 57*4eaa4710SRishi Srivatsavai STATE_MACH_T* abstr; \ 58*4eaa4710SRishi Srivatsavai \ 59*4eaa4710SRishi Srivatsavai abstr = STP_state_mach_create (STP_##WHAT##_enter_state, \ 60*4eaa4710SRishi Srivatsavai STP_##WHAT##_check_conditions, \ 61*4eaa4710SRishi Srivatsavai STP_##WHAT##_get_state_name, \ 62*4eaa4710SRishi Srivatsavai this, \ 63*4eaa4710SRishi Srivatsavai #WHAT); \ 64*4eaa4710SRishi Srivatsavai abstr->next = this->machines; \ 65*4eaa4710SRishi Srivatsavai this->machines = abstr; \ 66*4eaa4710SRishi Srivatsavai this->WHAT = abstr; \ 67*4eaa4710SRishi Srivatsavai } 68*4eaa4710SRishi Srivatsavai 69*4eaa4710SRishi Srivatsavai 70*4eaa4710SRishi Srivatsavai STATE_MACH_T * 71*4eaa4710SRishi Srivatsavai STP_state_mach_create (void (* concreteEnterState) (STATE_MACH_T*), 72*4eaa4710SRishi Srivatsavai Bool (* concreteCheckCondition) (STATE_MACH_T*), 73*4eaa4710SRishi Srivatsavai char * (* concreteGetStatName) (int), 74*4eaa4710SRishi Srivatsavai void* owner, char* name); 75*4eaa4710SRishi Srivatsavai 76*4eaa4710SRishi Srivatsavai void 77*4eaa4710SRishi Srivatsavai STP_state_mach_delete (STATE_MACH_T* this); 78*4eaa4710SRishi Srivatsavai 79*4eaa4710SRishi Srivatsavai Bool 80*4eaa4710SRishi Srivatsavai STP_check_condition (STATE_MACH_T* this); 81*4eaa4710SRishi Srivatsavai 82*4eaa4710SRishi Srivatsavai Bool 83*4eaa4710SRishi Srivatsavai STP_change_state (STATE_MACH_T* this); 84*4eaa4710SRishi Srivatsavai 85*4eaa4710SRishi Srivatsavai Bool 86*4eaa4710SRishi Srivatsavai STP_hop_2_state (STATE_MACH_T* this, unsigned int new_state); 87*4eaa4710SRishi Srivatsavai 88*4eaa4710SRishi Srivatsavai #endif /* _STP_STATER_H__ */ 89*4eaa4710SRishi Srivatsavai 90