xref: /onnv-gate/usr/src/lib/librstp/common/rolesel.c (revision 10491:8893b747ecdf)
1*10491SRishi.Srivatsavai@Sun.COM /************************************************************************
2*10491SRishi.Srivatsavai@Sun.COM  * RSTP library - Rapid Spanning Tree (802.1t, 802.1w)
3*10491SRishi.Srivatsavai@Sun.COM  * Copyright (C) 2001-2003 Optical Access
4*10491SRishi.Srivatsavai@Sun.COM  * Author: Alex Rozin
5*10491SRishi.Srivatsavai@Sun.COM  *
6*10491SRishi.Srivatsavai@Sun.COM  * This file is part of RSTP library.
7*10491SRishi.Srivatsavai@Sun.COM  *
8*10491SRishi.Srivatsavai@Sun.COM  * RSTP library is free software; you can redistribute it and/or modify it
9*10491SRishi.Srivatsavai@Sun.COM  * under the terms of the GNU Lesser General Public License as published by the
10*10491SRishi.Srivatsavai@Sun.COM  * Free Software Foundation; version 2.1
11*10491SRishi.Srivatsavai@Sun.COM  *
12*10491SRishi.Srivatsavai@Sun.COM  * RSTP library is distributed in the hope that it will be useful, but
13*10491SRishi.Srivatsavai@Sun.COM  * WITHOUT ANY WARRANTY; without even the implied warranty of
14*10491SRishi.Srivatsavai@Sun.COM  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
15*10491SRishi.Srivatsavai@Sun.COM  * General Public License for more details.
16*10491SRishi.Srivatsavai@Sun.COM  *
17*10491SRishi.Srivatsavai@Sun.COM  * You should have received a copy of the GNU Lesser General Public License
18*10491SRishi.Srivatsavai@Sun.COM  * along with RSTP library; see the file COPYING.  If not, write to the Free
19*10491SRishi.Srivatsavai@Sun.COM  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20*10491SRishi.Srivatsavai@Sun.COM  * 02111-1307, USA.
21*10491SRishi.Srivatsavai@Sun.COM  **********************************************************************/
22*10491SRishi.Srivatsavai@Sun.COM 
23*10491SRishi.Srivatsavai@Sun.COM /* Port Role Selection state machine : 17.22 */
24*10491SRishi.Srivatsavai@Sun.COM 
25*10491SRishi.Srivatsavai@Sun.COM #include "base.h"
26*10491SRishi.Srivatsavai@Sun.COM #include "stpm.h"
27*10491SRishi.Srivatsavai@Sun.COM #include "stp_vectors.h"
28*10491SRishi.Srivatsavai@Sun.COM 
29*10491SRishi.Srivatsavai@Sun.COM #define STATES { \
30*10491SRishi.Srivatsavai@Sun.COM   CHOOSE(INIT_BRIDGE),      \
31*10491SRishi.Srivatsavai@Sun.COM   CHOOSE(ROLE_SELECTION)   \
32*10491SRishi.Srivatsavai@Sun.COM }
33*10491SRishi.Srivatsavai@Sun.COM 
34*10491SRishi.Srivatsavai@Sun.COM #define GET_STATE_NAME STP_rolesel_get_state_name
35*10491SRishi.Srivatsavai@Sun.COM #include "choose.h"
36*10491SRishi.Srivatsavai@Sun.COM 
37*10491SRishi.Srivatsavai@Sun.COM #if 0
38*10491SRishi.Srivatsavai@Sun.COM void stp_dbg_break_point (PORT_T * port, STPM_T* stpm)
39*10491SRishi.Srivatsavai@Sun.COM {
40*10491SRishi.Srivatsavai@Sun.COM }
41*10491SRishi.Srivatsavai@Sun.COM #endif
42*10491SRishi.Srivatsavai@Sun.COM 
43*10491SRishi.Srivatsavai@Sun.COM static Bool
_is_backup_port(PORT_T * port,STPM_T * this)44*10491SRishi.Srivatsavai@Sun.COM _is_backup_port (PORT_T* port, STPM_T* this)
45*10491SRishi.Srivatsavai@Sun.COM {
46*10491SRishi.Srivatsavai@Sun.COM   if (!STP_VECT_compare_bridge_id
47*10491SRishi.Srivatsavai@Sun.COM       (&port->portPrio.design_bridge, &this->BrId)) {
48*10491SRishi.Srivatsavai@Sun.COM #if 0 /* def STP_DBG */
49*10491SRishi.Srivatsavai@Sun.COM     if (port->info->debug) {
50*10491SRishi.Srivatsavai@Sun.COM       STP_VECT_br_id_print ("portPrio.design_bridge",
51*10491SRishi.Srivatsavai@Sun.COM                             &port->portPrio.design_bridge, True);
52*10491SRishi.Srivatsavai@Sun.COM       STP_VECT_br_id_print ("            this->BrId",
53*10491SRishi.Srivatsavai@Sun.COM                             &this->BrId, True);
54*10491SRishi.Srivatsavai@Sun.COM     }
55*10491SRishi.Srivatsavai@Sun.COM     stp_dbg_break_point (port, this);
56*10491SRishi.Srivatsavai@Sun.COM #endif
57*10491SRishi.Srivatsavai@Sun.COM     return True;
58*10491SRishi.Srivatsavai@Sun.COM   } else {
59*10491SRishi.Srivatsavai@Sun.COM     return False;
60*10491SRishi.Srivatsavai@Sun.COM   }
61*10491SRishi.Srivatsavai@Sun.COM }
62*10491SRishi.Srivatsavai@Sun.COM 
63*10491SRishi.Srivatsavai@Sun.COM /* ARGSUSED */
64*10491SRishi.Srivatsavai@Sun.COM static void
setRoleSelected(char * reason,STPM_T * stpm,PORT_T * port,PORT_ROLE_T newRole)65*10491SRishi.Srivatsavai@Sun.COM setRoleSelected (char* reason, STPM_T* stpm, PORT_T* port,
66*10491SRishi.Srivatsavai@Sun.COM                 PORT_ROLE_T newRole)
67*10491SRishi.Srivatsavai@Sun.COM {
68*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
69*10491SRishi.Srivatsavai@Sun.COM   char* new_role_name;
70*10491SRishi.Srivatsavai@Sun.COM #endif
71*10491SRishi.Srivatsavai@Sun.COM 
72*10491SRishi.Srivatsavai@Sun.COM   port->selectedRole = newRole;
73*10491SRishi.Srivatsavai@Sun.COM 
74*10491SRishi.Srivatsavai@Sun.COM   if (newRole == port->role)
75*10491SRishi.Srivatsavai@Sun.COM     return;
76*10491SRishi.Srivatsavai@Sun.COM 
77*10491SRishi.Srivatsavai@Sun.COM   switch (newRole) {
78*10491SRishi.Srivatsavai@Sun.COM     case DisabledPort:
79*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
80*10491SRishi.Srivatsavai@Sun.COM       new_role_name = "Disabled";
81*10491SRishi.Srivatsavai@Sun.COM #endif
82*10491SRishi.Srivatsavai@Sun.COM       break;
83*10491SRishi.Srivatsavai@Sun.COM     case AlternatePort:
84*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
85*10491SRishi.Srivatsavai@Sun.COM       new_role_name = "Alternate";
86*10491SRishi.Srivatsavai@Sun.COM #endif
87*10491SRishi.Srivatsavai@Sun.COM       break;
88*10491SRishi.Srivatsavai@Sun.COM     case BackupPort:
89*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
90*10491SRishi.Srivatsavai@Sun.COM       new_role_name = "Backup";
91*10491SRishi.Srivatsavai@Sun.COM #endif
92*10491SRishi.Srivatsavai@Sun.COM       break;
93*10491SRishi.Srivatsavai@Sun.COM     case RootPort:
94*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
95*10491SRishi.Srivatsavai@Sun.COM       new_role_name = "Root";
96*10491SRishi.Srivatsavai@Sun.COM #endif
97*10491SRishi.Srivatsavai@Sun.COM       break;
98*10491SRishi.Srivatsavai@Sun.COM     case DesignatedPort:
99*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
100*10491SRishi.Srivatsavai@Sun.COM       new_role_name = "Designated";
101*10491SRishi.Srivatsavai@Sun.COM #endif
102*10491SRishi.Srivatsavai@Sun.COM       break;
103*10491SRishi.Srivatsavai@Sun.COM     case NonStpPort:
104*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
105*10491SRishi.Srivatsavai@Sun.COM       new_role_name = "NonStp";
106*10491SRishi.Srivatsavai@Sun.COM #endif
107*10491SRishi.Srivatsavai@Sun.COM       port->role = newRole;
108*10491SRishi.Srivatsavai@Sun.COM       break;
109*10491SRishi.Srivatsavai@Sun.COM     default:
110*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
111*10491SRishi.Srivatsavai@Sun.COM       stp_trace ("%s-%s:port %s => Unknown (%d ?)",
112*10491SRishi.Srivatsavai@Sun.COM                  reason, stpm->name, port->port_name, (int) newRole);
113*10491SRishi.Srivatsavai@Sun.COM #else
114*10491SRishi.Srivatsavai@Sun.COM       abort();
115*10491SRishi.Srivatsavai@Sun.COM #endif
116*10491SRishi.Srivatsavai@Sun.COM       return;
117*10491SRishi.Srivatsavai@Sun.COM   }
118*10491SRishi.Srivatsavai@Sun.COM 
119*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
120*10491SRishi.Srivatsavai@Sun.COM   if (port->roletrns->debug)
121*10491SRishi.Srivatsavai@Sun.COM     stp_trace ("%s(%s-%s) => %s",
122*10491SRishi.Srivatsavai@Sun.COM                reason, stpm->name, port->port_name, new_role_name);
123*10491SRishi.Srivatsavai@Sun.COM #endif
124*10491SRishi.Srivatsavai@Sun.COM }
125*10491SRishi.Srivatsavai@Sun.COM 
126*10491SRishi.Srivatsavai@Sun.COM static void
updtRoleDisableBridge(STPM_T * this)127*10491SRishi.Srivatsavai@Sun.COM updtRoleDisableBridge (STPM_T* this)
128*10491SRishi.Srivatsavai@Sun.COM {               /* 17.10.20 */
129*10491SRishi.Srivatsavai@Sun.COM   register PORT_T *port;
130*10491SRishi.Srivatsavai@Sun.COM 
131*10491SRishi.Srivatsavai@Sun.COM   for (port = this->ports; port; port = port->next) {
132*10491SRishi.Srivatsavai@Sun.COM     port->selectedRole = DisabledPort;
133*10491SRishi.Srivatsavai@Sun.COM   }
134*10491SRishi.Srivatsavai@Sun.COM }
135*10491SRishi.Srivatsavai@Sun.COM 
136*10491SRishi.Srivatsavai@Sun.COM static void
clearReselectBridge(STPM_T * this)137*10491SRishi.Srivatsavai@Sun.COM clearReselectBridge (STPM_T* this)
138*10491SRishi.Srivatsavai@Sun.COM {               /* 17.19.1 */
139*10491SRishi.Srivatsavai@Sun.COM   register PORT_T *port;
140*10491SRishi.Srivatsavai@Sun.COM 
141*10491SRishi.Srivatsavai@Sun.COM   for (port = this->ports; port; port = port->next) {
142*10491SRishi.Srivatsavai@Sun.COM     port->reselect = False;
143*10491SRishi.Srivatsavai@Sun.COM   }
144*10491SRishi.Srivatsavai@Sun.COM }
145*10491SRishi.Srivatsavai@Sun.COM 
146*10491SRishi.Srivatsavai@Sun.COM static void
updtRootPrio(STATE_MACH_T * this)147*10491SRishi.Srivatsavai@Sun.COM updtRootPrio (STATE_MACH_T* this)
148*10491SRishi.Srivatsavai@Sun.COM {
149*10491SRishi.Srivatsavai@Sun.COM   PRIO_VECTOR_T rootPathPrio;   /* 17.4.2.2 */
150*10491SRishi.Srivatsavai@Sun.COM   register PORT_T *port;
151*10491SRishi.Srivatsavai@Sun.COM   register STPM_T *stpm;
152*10491SRishi.Srivatsavai@Sun.COM   register unsigned int dm;
153*10491SRishi.Srivatsavai@Sun.COM 
154*10491SRishi.Srivatsavai@Sun.COM   stpm = this->owner.stpm;
155*10491SRishi.Srivatsavai@Sun.COM 
156*10491SRishi.Srivatsavai@Sun.COM   for (port = stpm->ports; port; port = port->next) {
157*10491SRishi.Srivatsavai@Sun.COM     if (port->admin_non_stp) {
158*10491SRishi.Srivatsavai@Sun.COM       continue;
159*10491SRishi.Srivatsavai@Sun.COM     }
160*10491SRishi.Srivatsavai@Sun.COM 
161*10491SRishi.Srivatsavai@Sun.COM     if (Disabled == port->infoIs)
162*10491SRishi.Srivatsavai@Sun.COM       continue;
163*10491SRishi.Srivatsavai@Sun.COM     if (Aged == port->infoIs)
164*10491SRishi.Srivatsavai@Sun.COM       continue;
165*10491SRishi.Srivatsavai@Sun.COM     if (Mine == port->infoIs) {
166*10491SRishi.Srivatsavai@Sun.COM #if 0 /* def STP_DBG */
167*10491SRishi.Srivatsavai@Sun.COM       stp_dbg_break_point (port); /* for debugger break point */
168*10491SRishi.Srivatsavai@Sun.COM #endif
169*10491SRishi.Srivatsavai@Sun.COM       continue;
170*10491SRishi.Srivatsavai@Sun.COM     }
171*10491SRishi.Srivatsavai@Sun.COM 
172*10491SRishi.Srivatsavai@Sun.COM     STP_VECT_copy (&rootPathPrio, &port->portPrio);
173*10491SRishi.Srivatsavai@Sun.COM     rootPathPrio.root_path_cost += port->operPCost;
174*10491SRishi.Srivatsavai@Sun.COM 
175*10491SRishi.Srivatsavai@Sun.COM     if (STP_VECT_compare_vector (&rootPathPrio, &stpm->rootPrio) < 0) {
176*10491SRishi.Srivatsavai@Sun.COM       STP_VECT_copy (&stpm->rootPrio, &rootPathPrio);
177*10491SRishi.Srivatsavai@Sun.COM       STP_copy_times (&stpm->rootTimes, &port->portTimes);
178*10491SRishi.Srivatsavai@Sun.COM       dm = (8 +  stpm->rootTimes.MaxAge) / 16;
179*10491SRishi.Srivatsavai@Sun.COM       if (!dm)
180*10491SRishi.Srivatsavai@Sun.COM         dm = 1;
181*10491SRishi.Srivatsavai@Sun.COM       stpm->rootTimes.MessageAge += dm;
182*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
183*10491SRishi.Srivatsavai@Sun.COM       if (port->roletrns->debug)
184*10491SRishi.Srivatsavai@Sun.COM           stp_trace ("updtRootPrio: dm=%d rootTimes.MessageAge=%d on port %s",
185*10491SRishi.Srivatsavai@Sun.COM                  (int) dm, (int) stpm->rootTimes.MessageAge,
186*10491SRishi.Srivatsavai@Sun.COM                  port->port_name);
187*10491SRishi.Srivatsavai@Sun.COM #endif
188*10491SRishi.Srivatsavai@Sun.COM     }
189*10491SRishi.Srivatsavai@Sun.COM   }
190*10491SRishi.Srivatsavai@Sun.COM }
191*10491SRishi.Srivatsavai@Sun.COM 
192*10491SRishi.Srivatsavai@Sun.COM static void
updtRolesBridge(STATE_MACH_T * this)193*10491SRishi.Srivatsavai@Sun.COM updtRolesBridge (STATE_MACH_T* this)
194*10491SRishi.Srivatsavai@Sun.COM {               /* 17.19.21 */
195*10491SRishi.Srivatsavai@Sun.COM   register PORT_T* port;
196*10491SRishi.Srivatsavai@Sun.COM   register STPM_T* stpm;
197*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
198*10491SRishi.Srivatsavai@Sun.COM   PORT_ID old_root_port; /* for tracing of root port changing */
199*10491SRishi.Srivatsavai@Sun.COM #endif
200*10491SRishi.Srivatsavai@Sun.COM 
201*10491SRishi.Srivatsavai@Sun.COM   stpm = this->owner.stpm;
202*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
203*10491SRishi.Srivatsavai@Sun.COM   old_root_port = stpm->rootPortId;
204*10491SRishi.Srivatsavai@Sun.COM #endif
205*10491SRishi.Srivatsavai@Sun.COM 
206*10491SRishi.Srivatsavai@Sun.COM   STP_VECT_create (&stpm->rootPrio, &stpm->BrId, 0, &stpm->BrId, 0, 0);
207*10491SRishi.Srivatsavai@Sun.COM   STP_copy_times (&stpm->rootTimes, &stpm->BrTimes);
208*10491SRishi.Srivatsavai@Sun.COM   stpm->rootPortId = 0;
209*10491SRishi.Srivatsavai@Sun.COM 
210*10491SRishi.Srivatsavai@Sun.COM   updtRootPrio (this);
211*10491SRishi.Srivatsavai@Sun.COM 
212*10491SRishi.Srivatsavai@Sun.COM   for (port = stpm->ports; port; port = port->next) {
213*10491SRishi.Srivatsavai@Sun.COM     if (port->admin_non_stp) {
214*10491SRishi.Srivatsavai@Sun.COM       continue;
215*10491SRishi.Srivatsavai@Sun.COM     }
216*10491SRishi.Srivatsavai@Sun.COM     STP_VECT_create (&port->designPrio,
217*10491SRishi.Srivatsavai@Sun.COM              &stpm->rootPrio.root_bridge,
218*10491SRishi.Srivatsavai@Sun.COM              stpm->rootPrio.root_path_cost,
219*10491SRishi.Srivatsavai@Sun.COM              &stpm->BrId, port->port_id, port->port_id);
220*10491SRishi.Srivatsavai@Sun.COM     STP_copy_times (&port->designTimes, &stpm->rootTimes);
221*10491SRishi.Srivatsavai@Sun.COM 
222*10491SRishi.Srivatsavai@Sun.COM #if 0
223*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
224*10491SRishi.Srivatsavai@Sun.COM     if (port->roletrns->debug) {
225*10491SRishi.Srivatsavai@Sun.COM       STP_VECT_br_id_print ("ch:designPrio.design_bridge",
226*10491SRishi.Srivatsavai@Sun.COM                             &port->designPrio.design_bridge, True);
227*10491SRishi.Srivatsavai@Sun.COM     }
228*10491SRishi.Srivatsavai@Sun.COM #endif
229*10491SRishi.Srivatsavai@Sun.COM #endif
230*10491SRishi.Srivatsavai@Sun.COM   }
231*10491SRishi.Srivatsavai@Sun.COM 
232*10491SRishi.Srivatsavai@Sun.COM   stpm->rootPortId = stpm->rootPrio.bridge_port;
233*10491SRishi.Srivatsavai@Sun.COM 
234*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
235*10491SRishi.Srivatsavai@Sun.COM   if (old_root_port != stpm->rootPortId) {
236*10491SRishi.Srivatsavai@Sun.COM     if (! stpm->rootPortId) {
237*10491SRishi.Srivatsavai@Sun.COM       stp_trace ("bridge %s became root", stpm->name);
238*10491SRishi.Srivatsavai@Sun.COM     } else {
239*10491SRishi.Srivatsavai@Sun.COM       stp_trace ("bridge %s new root port: %s",
240*10491SRishi.Srivatsavai@Sun.COM         stpm->name,
241*10491SRishi.Srivatsavai@Sun.COM         STP_stpm_get_port_name_by_id (stpm, stpm->rootPortId));
242*10491SRishi.Srivatsavai@Sun.COM     }
243*10491SRishi.Srivatsavai@Sun.COM   }
244*10491SRishi.Srivatsavai@Sun.COM #endif
245*10491SRishi.Srivatsavai@Sun.COM 
246*10491SRishi.Srivatsavai@Sun.COM   for (port = stpm->ports; port; port = port->next) {
247*10491SRishi.Srivatsavai@Sun.COM     if (port->admin_non_stp) {
248*10491SRishi.Srivatsavai@Sun.COM       setRoleSelected ("Non", stpm, port, NonStpPort);
249*10491SRishi.Srivatsavai@Sun.COM       port->forward = port->learn = True;
250*10491SRishi.Srivatsavai@Sun.COM       continue;
251*10491SRishi.Srivatsavai@Sun.COM     }
252*10491SRishi.Srivatsavai@Sun.COM 
253*10491SRishi.Srivatsavai@Sun.COM     switch (port->infoIs) {
254*10491SRishi.Srivatsavai@Sun.COM       case Disabled:
255*10491SRishi.Srivatsavai@Sun.COM         setRoleSelected ("Dis", stpm, port, DisabledPort);
256*10491SRishi.Srivatsavai@Sun.COM         break;
257*10491SRishi.Srivatsavai@Sun.COM       case Aged:
258*10491SRishi.Srivatsavai@Sun.COM         setRoleSelected ("Age", stpm, port, DesignatedPort);
259*10491SRishi.Srivatsavai@Sun.COM         port->updtInfo = True;
260*10491SRishi.Srivatsavai@Sun.COM         break;
261*10491SRishi.Srivatsavai@Sun.COM       case Mine:
262*10491SRishi.Srivatsavai@Sun.COM         setRoleSelected ("Mine", stpm, port, DesignatedPort);
263*10491SRishi.Srivatsavai@Sun.COM         if (0 != STP_VECT_compare_vector (&port->portPrio,
264*10491SRishi.Srivatsavai@Sun.COM                       &port->designPrio) ||
265*10491SRishi.Srivatsavai@Sun.COM             0 != STP_compare_times (&port->portTimes,
266*10491SRishi.Srivatsavai@Sun.COM                   &port->designTimes)) {
267*10491SRishi.Srivatsavai@Sun.COM             port->updtInfo = True;
268*10491SRishi.Srivatsavai@Sun.COM         }
269*10491SRishi.Srivatsavai@Sun.COM         break;
270*10491SRishi.Srivatsavai@Sun.COM       case Received:
271*10491SRishi.Srivatsavai@Sun.COM         if (stpm->rootPortId == port->port_id) {
272*10491SRishi.Srivatsavai@Sun.COM           setRoleSelected ("Rec", stpm, port, RootPort);
273*10491SRishi.Srivatsavai@Sun.COM         } else if (STP_VECT_compare_vector (&port->designPrio, &port->portPrio) < 0) {
274*10491SRishi.Srivatsavai@Sun.COM           /* Note: this important piece has been inserted after
275*10491SRishi.Srivatsavai@Sun.COM            * discussion with Mick Sieman and reading 802.1y Z1 */
276*10491SRishi.Srivatsavai@Sun.COM           setRoleSelected ("Rec", stpm, port, DesignatedPort);
277*10491SRishi.Srivatsavai@Sun.COM           port->updtInfo = True;
278*10491SRishi.Srivatsavai@Sun.COM           break;
279*10491SRishi.Srivatsavai@Sun.COM         } else {
280*10491SRishi.Srivatsavai@Sun.COM           if (_is_backup_port (port, stpm)) {
281*10491SRishi.Srivatsavai@Sun.COM             setRoleSelected ("rec", stpm, port, BackupPort);
282*10491SRishi.Srivatsavai@Sun.COM           } else {
283*10491SRishi.Srivatsavai@Sun.COM             setRoleSelected ("rec", stpm, port, AlternatePort);
284*10491SRishi.Srivatsavai@Sun.COM           }
285*10491SRishi.Srivatsavai@Sun.COM         }
286*10491SRishi.Srivatsavai@Sun.COM         port->updtInfo = False;
287*10491SRishi.Srivatsavai@Sun.COM         break;
288*10491SRishi.Srivatsavai@Sun.COM       default:
289*10491SRishi.Srivatsavai@Sun.COM         stp_trace ("undef infoIs=%d", (int) port->infoIs);
290*10491SRishi.Srivatsavai@Sun.COM         break;
291*10491SRishi.Srivatsavai@Sun.COM     }
292*10491SRishi.Srivatsavai@Sun.COM   }
293*10491SRishi.Srivatsavai@Sun.COM 
294*10491SRishi.Srivatsavai@Sun.COM }
295*10491SRishi.Srivatsavai@Sun.COM 
296*10491SRishi.Srivatsavai@Sun.COM 
297*10491SRishi.Srivatsavai@Sun.COM static Bool
setSelectedBridge(STPM_T * this)298*10491SRishi.Srivatsavai@Sun.COM setSelectedBridge (STPM_T* this)
299*10491SRishi.Srivatsavai@Sun.COM {
300*10491SRishi.Srivatsavai@Sun.COM   register PORT_T* port;
301*10491SRishi.Srivatsavai@Sun.COM 
302*10491SRishi.Srivatsavai@Sun.COM   for (port = this->ports; port; port = port->next) {
303*10491SRishi.Srivatsavai@Sun.COM     if (port->reselect) {
304*10491SRishi.Srivatsavai@Sun.COM #ifdef STP_DBG
305*10491SRishi.Srivatsavai@Sun.COM       stp_trace ("setSelectedBridge: TRUE=reselect on port %s", port->port_name);
306*10491SRishi.Srivatsavai@Sun.COM #endif
307*10491SRishi.Srivatsavai@Sun.COM       return False;
308*10491SRishi.Srivatsavai@Sun.COM     }
309*10491SRishi.Srivatsavai@Sun.COM   }
310*10491SRishi.Srivatsavai@Sun.COM 
311*10491SRishi.Srivatsavai@Sun.COM   for (port = this->ports; port; port = port->next) {
312*10491SRishi.Srivatsavai@Sun.COM     port->selected = True;
313*10491SRishi.Srivatsavai@Sun.COM   }
314*10491SRishi.Srivatsavai@Sun.COM 
315*10491SRishi.Srivatsavai@Sun.COM   return True;
316*10491SRishi.Srivatsavai@Sun.COM }
317*10491SRishi.Srivatsavai@Sun.COM 
318*10491SRishi.Srivatsavai@Sun.COM void
STP_rolesel_enter_state(STATE_MACH_T * this)319*10491SRishi.Srivatsavai@Sun.COM STP_rolesel_enter_state (STATE_MACH_T* this)
320*10491SRishi.Srivatsavai@Sun.COM {
321*10491SRishi.Srivatsavai@Sun.COM   STPM_T* stpm;
322*10491SRishi.Srivatsavai@Sun.COM 
323*10491SRishi.Srivatsavai@Sun.COM   stpm = this->owner.stpm;
324*10491SRishi.Srivatsavai@Sun.COM 
325*10491SRishi.Srivatsavai@Sun.COM   switch (this->State) {
326*10491SRishi.Srivatsavai@Sun.COM     case BEGIN:
327*10491SRishi.Srivatsavai@Sun.COM     case INIT_BRIDGE:
328*10491SRishi.Srivatsavai@Sun.COM       updtRoleDisableBridge (stpm);
329*10491SRishi.Srivatsavai@Sun.COM       break;
330*10491SRishi.Srivatsavai@Sun.COM     case ROLE_SELECTION:
331*10491SRishi.Srivatsavai@Sun.COM       clearReselectBridge (stpm);
332*10491SRishi.Srivatsavai@Sun.COM       updtRolesBridge (this);
333*10491SRishi.Srivatsavai@Sun.COM       (void) setSelectedBridge (stpm);
334*10491SRishi.Srivatsavai@Sun.COM       break;
335*10491SRishi.Srivatsavai@Sun.COM   }
336*10491SRishi.Srivatsavai@Sun.COM }
337*10491SRishi.Srivatsavai@Sun.COM 
338*10491SRishi.Srivatsavai@Sun.COM Bool
STP_rolesel_check_conditions(STATE_MACH_T * s)339*10491SRishi.Srivatsavai@Sun.COM STP_rolesel_check_conditions (STATE_MACH_T* s)
340*10491SRishi.Srivatsavai@Sun.COM {
341*10491SRishi.Srivatsavai@Sun.COM   STPM_T* stpm;
342*10491SRishi.Srivatsavai@Sun.COM   register PORT_T* port;
343*10491SRishi.Srivatsavai@Sun.COM 
344*10491SRishi.Srivatsavai@Sun.COM   /*
345*10491SRishi.Srivatsavai@Sun.COM    * This doesn't look right.  Why should we hop state twice in a single check
346*10491SRishi.Srivatsavai@Sun.COM    * condition call?  It means we can never perform the enter-state action for
347*10491SRishi.Srivatsavai@Sun.COM    * INIT_BRIDGE.
348*10491SRishi.Srivatsavai@Sun.COM    */
349*10491SRishi.Srivatsavai@Sun.COM #ifdef carlsonj_removed
350*10491SRishi.Srivatsavai@Sun.COM   if (BEGIN == s->State) {
351*10491SRishi.Srivatsavai@Sun.COM     (void) STP_hop_2_state (s, INIT_BRIDGE);
352*10491SRishi.Srivatsavai@Sun.COM   }
353*10491SRishi.Srivatsavai@Sun.COM #endif
354*10491SRishi.Srivatsavai@Sun.COM 
355*10491SRishi.Srivatsavai@Sun.COM   switch (s->State) {
356*10491SRishi.Srivatsavai@Sun.COM     case BEGIN:
357*10491SRishi.Srivatsavai@Sun.COM       return STP_hop_2_state (s, INIT_BRIDGE);
358*10491SRishi.Srivatsavai@Sun.COM     case INIT_BRIDGE:
359*10491SRishi.Srivatsavai@Sun.COM       return STP_hop_2_state (s, ROLE_SELECTION);
360*10491SRishi.Srivatsavai@Sun.COM     case ROLE_SELECTION:
361*10491SRishi.Srivatsavai@Sun.COM       stpm = s->owner.stpm;
362*10491SRishi.Srivatsavai@Sun.COM       for (port = stpm->ports; port; port = port->next) {
363*10491SRishi.Srivatsavai@Sun.COM         if (port->reselect) {
364*10491SRishi.Srivatsavai@Sun.COM           /* stp_trace ("reselect on port %s", port->port_name); */
365*10491SRishi.Srivatsavai@Sun.COM           return STP_hop_2_state (s, ROLE_SELECTION);
366*10491SRishi.Srivatsavai@Sun.COM         }
367*10491SRishi.Srivatsavai@Sun.COM       }
368*10491SRishi.Srivatsavai@Sun.COM       break;
369*10491SRishi.Srivatsavai@Sun.COM   }
370*10491SRishi.Srivatsavai@Sun.COM 
371*10491SRishi.Srivatsavai@Sun.COM   return False;
372*10491SRishi.Srivatsavai@Sun.COM }
373*10491SRishi.Srivatsavai@Sun.COM 
374*10491SRishi.Srivatsavai@Sun.COM void
STP_rolesel_update_stpm(STPM_T * this)375*10491SRishi.Srivatsavai@Sun.COM STP_rolesel_update_stpm (STPM_T* this)
376*10491SRishi.Srivatsavai@Sun.COM {
377*10491SRishi.Srivatsavai@Sun.COM   register PORT_T* port;
378*10491SRishi.Srivatsavai@Sun.COM   PRIO_VECTOR_T rootPathPrio;   /* 17.4.2.2 */
379*10491SRishi.Srivatsavai@Sun.COM 
380*10491SRishi.Srivatsavai@Sun.COM   stp_trace ("%s", "??? STP_rolesel_update_stpm ???");
381*10491SRishi.Srivatsavai@Sun.COM   STP_VECT_create (&rootPathPrio, &this->BrId, 0, &this->BrId, 0, 0);
382*10491SRishi.Srivatsavai@Sun.COM 
383*10491SRishi.Srivatsavai@Sun.COM   if (!this->rootPortId ||
384*10491SRishi.Srivatsavai@Sun.COM       STP_VECT_compare_vector (&rootPathPrio, &this->rootPrio) < 0) {
385*10491SRishi.Srivatsavai@Sun.COM     STP_VECT_copy (&this->rootPrio, &rootPathPrio);
386*10491SRishi.Srivatsavai@Sun.COM   }
387*10491SRishi.Srivatsavai@Sun.COM 
388*10491SRishi.Srivatsavai@Sun.COM   for (port = this->ports; port; port = port->next) {
389*10491SRishi.Srivatsavai@Sun.COM     STP_VECT_create (&port->designPrio,
390*10491SRishi.Srivatsavai@Sun.COM              &this->rootPrio.root_bridge,
391*10491SRishi.Srivatsavai@Sun.COM              this->rootPrio.root_path_cost,
392*10491SRishi.Srivatsavai@Sun.COM              &this->BrId, port->port_id, port->port_id);
393*10491SRishi.Srivatsavai@Sun.COM     if (Received != port->infoIs || this->rootPortId == port->port_id) {
394*10491SRishi.Srivatsavai@Sun.COM       STP_VECT_copy (&port->portPrio, &port->designPrio);
395*10491SRishi.Srivatsavai@Sun.COM     }
396*10491SRishi.Srivatsavai@Sun.COM     port->reselect = True;
397*10491SRishi.Srivatsavai@Sun.COM     port->selected = False;
398*10491SRishi.Srivatsavai@Sun.COM   }
399*10491SRishi.Srivatsavai@Sun.COM }
400*10491SRishi.Srivatsavai@Sun.COM 
401