xref: /illumos-gate/usr/src/lib/librstp/common/stpmgmt.c (revision 12fb9219923f41528f673d4f31667db2c3f103ff)
1 /************************************************************************
2  * RSTP library - Rapid Spanning Tree (802.1t, 802.1w)
3  * Copyright (C) 2001-2003 Optical Access
4  * Author: Alex Rozin
5  *
6  * This file is part of RSTP library.
7  *
8  * RSTP library is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU Lesser General Public License as published by the
10  * Free Software Foundation; version 2.1
11  *
12  * RSTP library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with RSTP library; see the file COPYING.  If not, write to the Free
19  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20  * 02111-1307, USA.
21  **********************************************************************/
22 
23 /* This file contains API from an operation system to the RSTP library */
24 
25 #include "base.h"
26 #include "stpm.h"
27 #include "stp_in.h" /* for bridge defaults */
28 #include "stp_to.h"
29 
30 
31 int
32 STP_IN_stpm_create (int vlan_id, char* name)
33 {
34   register STPM_T*  this;
35   int               err_code;
36   UID_STP_CFG_T		init_cfg;
37 
38   stp_trace ("STP_IN_stpm_create(%s)", name);
39 
40   init_cfg.field_mask = BR_CFG_ALL;
41   STP_OUT_get_init_stpm_cfg (vlan_id, &init_cfg);
42   init_cfg.field_mask = 0;
43 
44   RSTP_CRITICAL_PATH_START;
45   this = stp_in_stpm_create (vlan_id, name, &err_code);
46   if (this) {
47     this->BrId.prio = init_cfg.bridge_priority;
48     this->BrTimes.MaxAge = init_cfg.max_age;
49     this->BrTimes.HelloTime = init_cfg.hello_time;
50     this->BrTimes.ForwardDelay = init_cfg.forward_delay;
51     this->ForceVersion = (PROTOCOL_VERSION_T) init_cfg.force_version;
52   }
53 
54   RSTP_CRITICAL_PATH_END;
55   return err_code;
56 }
57 
58 int
59 STP_IN_stpm_delete (int vlan_id)
60 {
61   register STPM_T* this;
62   int iret = 0;
63 
64   RSTP_CRITICAL_PATH_START;
65   this = stpapi_stpm_find (vlan_id);
66 
67   if (! this) { /* it had not yet been created :( */
68     iret = STP_Vlan_Had_Not_Yet_Been_Created;
69   } else {
70 
71     if (STP_ENABLED == this->admin_state) {
72       if (0 != STP_stpm_enable (this, STP_DISABLED)) {/* can't disable :( */
73         iret = STP_Another_Error;
74       } else
75         STP_OUT_set_hardware_mode (vlan_id, STP_DISABLED);
76     }
77 
78     if (0 == iret) {
79       STP_stpm_delete (this);
80     }
81   }
82   RSTP_CRITICAL_PATH_END;
83   return iret;
84 }
85 
86 int
87 STP_IN_stpm_get_vlan_id_by_name (char* name, int* vlan_id)
88 {
89   register STPM_T* stpm;
90   int iret = STP_Cannot_Find_Vlan;
91 
92   RSTP_CRITICAL_PATH_START;
93   for (stpm = STP_stpm_get_the_list (); stpm; stpm = stpm->next) {
94     if (stpm->name && ! strcmp (stpm->name, name)) {
95       *vlan_id = stpm->vlan_id;
96       iret = 0;
97       break;
98     }
99   }
100   RSTP_CRITICAL_PATH_END;
101 
102   return iret;
103 }
104 
105 
106 Bool
107 STP_IN_get_is_stpm_enabled (int vlan_id)
108 {
109   STPM_T* this;
110   Bool iret = False;
111 
112   RSTP_CRITICAL_PATH_START;
113   this = stpapi_stpm_find (vlan_id);
114 
115   if (this) {
116     if (this->admin_state == STP_ENABLED) {
117       iret = True;
118     }
119 #ifdef notdef
120   } else {
121     ;   /* it had not yet been created :( */
122 #endif
123   }
124 
125   RSTP_CRITICAL_PATH_END;
126   return iret;
127 }
128 
129 int
130 STP_IN_stop_all (void)
131 {
132   register STPM_T* stpm;
133 
134   RSTP_CRITICAL_PATH_START;
135 
136   for (stpm = STP_stpm_get_the_list (); stpm; stpm = stpm->next) {
137     if (STP_DISABLED != stpm->admin_state) {
138       STP_OUT_set_hardware_mode (stpm->vlan_id, STP_DISABLED);
139       (void) STP_stpm_enable (stpm, STP_DISABLED);
140     }
141   }
142 
143   RSTP_CRITICAL_PATH_END;
144   return 0;
145 }
146 
147 int
148 STP_IN_delete_all (void)
149 {
150   register STPM_T* stpm;
151 
152   RSTP_CRITICAL_PATH_START;
153   for (stpm = STP_stpm_get_the_list (); stpm; stpm = stpm->next) {
154     (void) STP_stpm_enable (stpm, STP_DISABLED);
155     STP_stpm_delete (stpm);
156   }
157 
158   RSTP_CRITICAL_PATH_END;
159   return 0;
160 }
161 
162