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
STP_IN_stpm_create(int vlan_id,char * name)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
STP_IN_stpm_delete(int vlan_id)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
STP_IN_stpm_get_vlan_id_by_name(char * name,int * vlan_id)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
STP_IN_get_is_stpm_enabled(int vlan_id)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
STP_IN_stop_all(void)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
STP_IN_delete_all(void)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