xref: /illumos-gate/usr/src/lib/librstp/common/stpm.h (revision 55fea89d)
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