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