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