1*55fea89dSDan Cross /************************************************************************ 2*55fea89dSDan Cross * RSTP library - Rapid Spanning Tree (802.1t, 802.1w) 3*55fea89dSDan Cross * Copyright (C) 2001-2003 Optical Access 4*55fea89dSDan Cross * Author: Alex Rozin 5*55fea89dSDan Cross * 6*55fea89dSDan Cross * This file is part of RSTP library. 7*55fea89dSDan Cross * 8*55fea89dSDan Cross * RSTP library is free software; you can redistribute it and/or modify it 9*55fea89dSDan Cross * under the terms of the GNU Lesser General Public License as published by the 10*55fea89dSDan Cross * Free Software Foundation; version 2.1 11*55fea89dSDan Cross * 12*55fea89dSDan Cross * RSTP library is distributed in the hope that it will be useful, but 13*55fea89dSDan Cross * WITHOUT ANY WARRANTY; without even the implied warranty of 14*55fea89dSDan Cross * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 15*55fea89dSDan Cross * General Public License for more details. 16*55fea89dSDan Cross * 17*55fea89dSDan Cross * You should have received a copy of the GNU Lesser General Public License 18*55fea89dSDan Cross * along with RSTP library; see the file COPYING. If not, write to the Free 19*55fea89dSDan Cross * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20*55fea89dSDan Cross * 02111-1307, USA. 214eaa4710SRishi Srivatsavai **********************************************************************/ 224eaa4710SRishi Srivatsavai 234eaa4710SRishi Srivatsavai /* Generic (abstract state machine) state machine : 17.13, 17.14 */ 24*55fea89dSDan Cross 254eaa4710SRishi Srivatsavai #ifndef _STP_STATER_H__ 264eaa4710SRishi Srivatsavai #define _STP_STATER_H__ 274eaa4710SRishi Srivatsavai 284eaa4710SRishi Srivatsavai #define BEGIN 9999 /* distinct from any valid state */ 294eaa4710SRishi Srivatsavai 304eaa4710SRishi Srivatsavai #define STP_DBG 1 314eaa4710SRishi Srivatsavai 324eaa4710SRishi Srivatsavai typedef struct state_mach_t { 334eaa4710SRishi Srivatsavai struct state_mach_t* next; 344eaa4710SRishi Srivatsavai 354eaa4710SRishi Srivatsavai char* name; /* for debugging */ 364eaa4710SRishi Srivatsavai #ifdef STP_DBG 374eaa4710SRishi Srivatsavai char debug; /* 0- no dbg, 1 - port, 2 - stpm */ 384eaa4710SRishi Srivatsavai unsigned int ignoreHop2State; 394eaa4710SRishi Srivatsavai #endif 404eaa4710SRishi Srivatsavai 414eaa4710SRishi Srivatsavai Bool changeState; 424eaa4710SRishi Srivatsavai unsigned int State; 434eaa4710SRishi Srivatsavai 444eaa4710SRishi Srivatsavai void (* concreteEnterState) (struct state_mach_t * ); 454eaa4710SRishi Srivatsavai Bool (* concreteCheckCondition) (struct state_mach_t * ); 464eaa4710SRishi Srivatsavai char* (* concreteGetStatName) (int); 474eaa4710SRishi Srivatsavai union { 484eaa4710SRishi Srivatsavai struct stpm_t* stpm; 494eaa4710SRishi Srivatsavai struct port_t* port; 504eaa4710SRishi Srivatsavai void * owner; 514eaa4710SRishi Srivatsavai } owner; 524eaa4710SRishi Srivatsavai 534eaa4710SRishi Srivatsavai } STATE_MACH_T; 544eaa4710SRishi Srivatsavai 554eaa4710SRishi Srivatsavai #define STP_STATE_MACH_IN_LIST(WHAT) \ 564eaa4710SRishi Srivatsavai { \ 574eaa4710SRishi Srivatsavai STATE_MACH_T* abstr; \ 584eaa4710SRishi Srivatsavai \ 594eaa4710SRishi Srivatsavai abstr = STP_state_mach_create (STP_##WHAT##_enter_state, \ 604eaa4710SRishi Srivatsavai STP_##WHAT##_check_conditions, \ 614eaa4710SRishi Srivatsavai STP_##WHAT##_get_state_name, \ 624eaa4710SRishi Srivatsavai this, \ 634eaa4710SRishi Srivatsavai #WHAT); \ 644eaa4710SRishi Srivatsavai abstr->next = this->machines; \ 654eaa4710SRishi Srivatsavai this->machines = abstr; \ 664eaa4710SRishi Srivatsavai this->WHAT = abstr; \ 674eaa4710SRishi Srivatsavai } 684eaa4710SRishi Srivatsavai 694eaa4710SRishi Srivatsavai 704eaa4710SRishi Srivatsavai STATE_MACH_T * 714eaa4710SRishi Srivatsavai STP_state_mach_create (void (* concreteEnterState) (STATE_MACH_T*), 724eaa4710SRishi Srivatsavai Bool (* concreteCheckCondition) (STATE_MACH_T*), 734eaa4710SRishi Srivatsavai char * (* concreteGetStatName) (int), 744eaa4710SRishi Srivatsavai void* owner, char* name); 75*55fea89dSDan Cross 764eaa4710SRishi Srivatsavai void 774eaa4710SRishi Srivatsavai STP_state_mach_delete (STATE_MACH_T* this); 784eaa4710SRishi Srivatsavai 794eaa4710SRishi Srivatsavai Bool 804eaa4710SRishi Srivatsavai STP_check_condition (STATE_MACH_T* this); 814eaa4710SRishi Srivatsavai 824eaa4710SRishi Srivatsavai Bool 834eaa4710SRishi Srivatsavai STP_change_state (STATE_MACH_T* this); 844eaa4710SRishi Srivatsavai 854eaa4710SRishi Srivatsavai Bool 864eaa4710SRishi Srivatsavai STP_hop_2_state (STATE_MACH_T* this, unsigned int new_state); 874eaa4710SRishi Srivatsavai 884eaa4710SRishi Srivatsavai #endif /* _STP_STATER_H__ */ 894eaa4710SRishi Srivatsavai 90