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 /* STP machine instance : bridge per VLAN: 17.17 */ 24*4eaa4710SRishi Srivatsavai /* The Clause 17.13 points: "NOTE:The operation of the Bridge as a whole can 25*4eaa4710SRishi Srivatsavai * be represented by the interaction between Bridge Ports specified, 26*4eaa4710SRishi Srivatsavai * and by parameters of the Bridge stored in �Port 0�. This removes the 27*4eaa4710SRishi Srivatsavai * need for any �per Bridge� specification elements, and helps ensure 28*4eaa4710SRishi Srivatsavai * the minimum dependencies between Bridge Ports. This in turn supports 29*4eaa4710SRishi Srivatsavai * the development of implementations that scale well with increasing 30*4eaa4710SRishi Srivatsavai * numbers of Bridge Ports. This shift of focus to �per Port operation� 31*4eaa4710SRishi Srivatsavai * for the RSTP is supported by underlying technical changes from the 32*4eaa4710SRishi Srivatsavai * Spanning Tree Algorithm and Protocol (Clause 8):" 33*4eaa4710SRishi Srivatsavai * Newetheless, it seems to me, the behaviour of of the bridge, its variables 34*4eaa4710SRishi Srivatsavai * and functions are so distinct from Port, that I decided to design Bridge 35*4eaa4710SRishi Srivatsavai * instance. I called this object 'stpm' from STP machine. I'd like to see 36*4eaa4710SRishi Srivatsavai * another procedural model, more corresponding to this note on Clause 17.13 */ 37*4eaa4710SRishi Srivatsavai 38*4eaa4710SRishi Srivatsavai #ifndef _STP_MACHINE_H__ 39*4eaa4710SRishi Srivatsavai #define _STP_MACHINE_H__ 40*4eaa4710SRishi Srivatsavai 41*4eaa4710SRishi Srivatsavai #include "port.h" 42*4eaa4710SRishi Srivatsavai #include "rolesel.h" 43*4eaa4710SRishi Srivatsavai 44*4eaa4710SRishi Srivatsavai #define TxHoldCount 3 /* 17.16.6, 17.28.2(Table 17-5) */ 45*4eaa4710SRishi Srivatsavai 46*4eaa4710SRishi Srivatsavai typedef enum {/* 17.12, 17.16.1 */ 47*4eaa4710SRishi Srivatsavai FORCE_STP_COMPAT = 0, 48*4eaa4710SRishi Srivatsavai NORMAL_RSTP = 2 49*4eaa4710SRishi Srivatsavai } PROTOCOL_VERSION_T; 50*4eaa4710SRishi Srivatsavai 51*4eaa4710SRishi Srivatsavai struct stpm_t { 52*4eaa4710SRishi Srivatsavai struct stpm_t* next; 53*4eaa4710SRishi Srivatsavai 54*4eaa4710SRishi Srivatsavai struct port_t* ports; 55*4eaa4710SRishi Srivatsavai 56*4eaa4710SRishi Srivatsavai /* The only "per bridge" state machine */ 57*4eaa4710SRishi Srivatsavai STATE_MACH_T* rolesel; /* the Port Role Selection State machione: 17.22 */ 58*4eaa4710SRishi Srivatsavai STATE_MACH_T* machines; 59*4eaa4710SRishi Srivatsavai 60*4eaa4710SRishi Srivatsavai /* variables */ 61*4eaa4710SRishi Srivatsavai PROTOCOL_VERSION_T ForceVersion; /* 17.12, 17.16.1 */ 62*4eaa4710SRishi Srivatsavai BRIDGE_ID BrId; /* 17.17.2 */ 63*4eaa4710SRishi Srivatsavai TIMEVALUES_T BrTimes; /* 17.17.4 */ 64*4eaa4710SRishi Srivatsavai PORT_ID rootPortId; /* 17.17.5 */ 65*4eaa4710SRishi Srivatsavai PRIO_VECTOR_T rootPrio; /* 17.17.6 */ 66*4eaa4710SRishi Srivatsavai TIMEVALUES_T rootTimes; /* 17.17.7 */ 67*4eaa4710SRishi Srivatsavai 68*4eaa4710SRishi Srivatsavai int vlan_id; /* let's say: tag */ 69*4eaa4710SRishi Srivatsavai char* name; /* name of the VLAN, maily for debugging */ 70*4eaa4710SRishi Srivatsavai UID_STP_MODE_T admin_state; /* STP_DISABLED or STP_ENABLED; type see in UiD */ 71*4eaa4710SRishi Srivatsavai 72*4eaa4710SRishi Srivatsavai unsigned long timeSince_Topo_Change; /* 14.8.1.1.3.b */ 73*4eaa4710SRishi Srivatsavai unsigned long Topo_Change_Count; /* 14.8.1.1.3.c */ 74*4eaa4710SRishi Srivatsavai unsigned char Topo_Change; /* 14.8.1.1.3.d */ 75*4eaa4710SRishi Srivatsavai }; 76*4eaa4710SRishi Srivatsavai 77*4eaa4710SRishi Srivatsavai #ifndef __STPM_T__ 78*4eaa4710SRishi Srivatsavai #define __STPM_T__ 79*4eaa4710SRishi Srivatsavai typedef struct stpm_t STPM_T; 80*4eaa4710SRishi Srivatsavai #endif 81*4eaa4710SRishi Srivatsavai 82*4eaa4710SRishi Srivatsavai /* Functions prototypes */ 83*4eaa4710SRishi Srivatsavai 84*4eaa4710SRishi Srivatsavai void 85*4eaa4710SRishi Srivatsavai STP_stpm_one_second (STPM_T* param); 86*4eaa4710SRishi Srivatsavai 87*4eaa4710SRishi Srivatsavai STPM_T* 88*4eaa4710SRishi Srivatsavai STP_stpm_create (int vlan_id, char* name); 89*4eaa4710SRishi Srivatsavai 90*4eaa4710SRishi Srivatsavai int 91*4eaa4710SRishi Srivatsavai STP_stpm_enable (STPM_T* this, UID_STP_MODE_T admin_state); 92*4eaa4710SRishi Srivatsavai 93*4eaa4710SRishi Srivatsavai void 94*4eaa4710SRishi Srivatsavai STP_stpm_delete (STPM_T* this); 95*4eaa4710SRishi Srivatsavai 96*4eaa4710SRishi Srivatsavai int 97*4eaa4710SRishi Srivatsavai STP_stpm_start (STPM_T* this); 98*4eaa4710SRishi Srivatsavai 99*4eaa4710SRishi Srivatsavai void 100*4eaa4710SRishi Srivatsavai STP_stpm_stop (STPM_T* this); 101*4eaa4710SRishi Srivatsavai 102*4eaa4710SRishi Srivatsavai int 103*4eaa4710SRishi Srivatsavai STP_stpm_update (STPM_T* this); 104*4eaa4710SRishi Srivatsavai 105*4eaa4710SRishi Srivatsavai BRIDGE_ID * 106*4eaa4710SRishi Srivatsavai STP_compute_bridge_id (STPM_T* this); 107*4eaa4710SRishi Srivatsavai 108*4eaa4710SRishi Srivatsavai STPM_T * 109*4eaa4710SRishi Srivatsavai STP_stpm_get_the_list (void); 110*4eaa4710SRishi Srivatsavai 111*4eaa4710SRishi Srivatsavai void 112*4eaa4710SRishi Srivatsavai STP_stpm_update_after_bridge_management (STPM_T* this); 113*4eaa4710SRishi Srivatsavai 114*4eaa4710SRishi Srivatsavai int 115*4eaa4710SRishi Srivatsavai STP_stpm_check_bridge_priority (STPM_T* this); 116*4eaa4710SRishi Srivatsavai 117*4eaa4710SRishi Srivatsavai const char* 118*4eaa4710SRishi Srivatsavai STP_stpm_get_port_name_by_id (STPM_T* this, PORT_ID port_id); 119*4eaa4710SRishi Srivatsavai 120*4eaa4710SRishi Srivatsavai STPM_T* stpapi_stpm_find (int vlan_id); 121*4eaa4710SRishi Srivatsavai 122*4eaa4710SRishi Srivatsavai int stp_in_stpm_enable (int vlan_id, char* name, 123*4eaa4710SRishi Srivatsavai UID_STP_MODE_T admin_state); 124*4eaa4710SRishi Srivatsavai void* stp_in_stpm_create (int vlan_id, char *name, int *err_code); 125*4eaa4710SRishi Srivatsavai 126*4eaa4710SRishi Srivatsavai #endif /* _STP_MACHINE_H__ */ 127