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
31int
32STP_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
58int
59STP_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
86int
87STP_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
106Bool
107STP_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
129int
130STP_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
147int
148STP_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