stg.c (10789B)
1 /* Feature : Spanning Tree Group 2 * 3 * Usage : BCM.0> cint stg.c 4 * 5 * config : vlan_config.bcm 6 * 7 * Log file : stg_log.txt 8 * 9 * Test Topology : 10 * 11 * +------------------------------+ 12 * | | 13 * | | 14 * | | 15 * port1 | | port2 16 * +----------------+ SWITCH +-----------------+ 17 * | | 18 * | | 19 * | | port3 20 * | +-----------------+ 21 * | | 22 * +------------------------------+ 23 * 24 * Summary: 25 * ======== 26 * This cint example demonstrates Spanning tree group state management for 27 * physical ports using BCM APIs. This script also demonstrates how to set up 28 * default STG on the device. It displays the STGs present in the system with 29 * respect to ports and VLANs. 30 * 31 * Detailed steps done in the CINT script: 32 * ======================================= 33 * 1) Step1 - Test Setup (Done in test_setup()): 34 * ============================================= 35 * a) Select three ports port1, port2 and port3. 36 * 37 * 2) Step2 - Configuration (Done in config_stg()): 38 * ================================================ 39 * a) Creates two vlans 10 and 20 add port1, port2 and port3 as members. 40 * 41 * b) Create a new default STG and print it. 42 * 43 * c) Create another STG(25) and add vlan 10 and 20. 44 * 45 * d) Set STP state for vlan 10 for port1, port2, port3 as FORWARD. 46 * 47 * 3) Step3 - Verification (Done in verify()): 48 * =========================================== 49 * a) Execute "stg show" and display the VLAN_STG, EGR_VLAN_STG HW tables. 50 * 51 * b) Expected Result: 52 * =================== 53 * In VLAN_STG[25], field SP_TREE_PORT<portnum> is set to 3 (i.e FORWARD) 54 * In EGR_VLAN_STG[25], field SP_TREE_PORT<portnum> is set to 3 (i.e FORWARD) 55 * "stg show" displays all the STG ids and the corresponding port's STP state. 56 */ 57 /* Reset c interpreter*/ 58 cint_reset(); 59 bcm_port_t port1, port2, port3; 60 /* This function is written so that hardcoding of port 61 numbers in Cint scripts is removed. This function gives 62 required number of ports 63 */ 64 bcm_error_t portNumbersGet(int unit, int *port_list, int num_ports) 65 { 66 67 int i=0,port=0,rv=0; 68 bcm_port_config_t configP; 69 bcm_pbmp_t ports_pbmp; 70 71 rv = bcm_port_config_get(unit,&configP); 72 if(BCM_FAILURE(rv)) { 73 printf("\nError in retrieving port configuration: %s.\n",bcm_errmsg(rv)); 74 return rv; 75 } 76 77 ports_pbmp = configP.e; 78 for (i= 1; i < BCM_PBMP_PORT_MAX; i++) { 79 if (BCM_PBMP_MEMBER(&ports_pbmp,i)&& (port < num_ports)) { 80 port_list[port]=i; 81 port++; 82 } 83 } 84 85 if (( port == 0 ) || ( port != num_ports )) { 86 printf("portNumbersGet() failed \n"); 87 return -1; 88 } 89 90 return BCM_E_NONE; 91 92 } 93 /* Display the VLAN_STG, EGR_VLAN_STG HW tables. 94 * In VLAN_STG[25], field SP_TREE_PORT<portnum> is set to 3 (i.e FORWARD) 95 * In EGR_VLAN_STG[25], field SP_TREE_PORT<portnum> is set to 3 (i.e FORWARD) 96 * "stg show" displays all the STG ids and the corresponding port's STP state. 97 */ 98 99 void verify(int unit) 100 { 101 bshell(unit,"d chg VLAN_STG"); 102 bshell(unit,"d chg EGR_VLAN_STG"); 103 bshell(unit,"stg show"); 104 } 105 /* 106 * This functions gets the port numbers and sets up ports. 107 */ 108 bcm_error_t test_setup(int unit) 109 { 110 int port_list[3], i; 111 112 if (BCM_E_NONE != portNumbersGet(unit, port_list, 3)) { 113 printf("portNumbersGet() failed\n"); 114 return -1; 115 } 116 117 port1 = port_list[0]; 118 port2 = port_list[1]; 119 port3 = port_list[2]; 120 121 return BCM_E_NONE; 122 } 123 124 125 /* Add vlan to STG specified by id*/ 126 bcm_error_t stg_vlan_add(int unit, int vlan_id, bcm_stg_t stg_id) 127 { 128 bcm_error_t rv; 129 rv = bcm_stg_create_id(unit, stg_id); 130 if (BCM_FAILURE(rv)) { 131 printf("Error executing bcm_stg_default_get(): %s.\n", bcm_errmsg(rv)); 132 return rv; 133 } 134 135 rv = bcm_stg_vlan_add(unit, stg_id, vlan_id); 136 if (BCM_FAILURE(rv)) { 137 printf("Error executing bcm_stg_vlan_add(): %s.\n", bcm_errmsg(rv)); 138 return rv; 139 } 140 return BCM_E_NONE; 141 } 142 /* Setup new default vlan using existing port bitmap of current default vlan */ 143 bcm_error_t new_default_vlan_setup(int unit, int vid) 144 { 145 bcm_error_t rv; 146 bcm_pbmp_t pbmp; 147 bcm_pbmp_t upbmp; 148 bcm_vlan_t defVlan; 149 150 rv = bcm_vlan_default_get(unit, &defVlan); 151 if (BCM_FAILURE(rv)) { 152 printf("Error executing bcm_vlan_default_get(): %s.\n", bcm_errmsg(rv)); 153 return rv; 154 } 155 156 /* Get the port members for default VLAN */ 157 rv = bcm_vlan_port_get(unit,defVlan,pbmp,upbmp); 158 if (BCM_FAILURE(rv)) { 159 printf("Error executing bcm_stg_vlan_add(): %s.\n", bcm_errmsg(rv)); 160 return rv; 161 } 162 163 /* Create a vlan with all the valid port bitmap */ 164 rv = bcm_vlan_create(unit, vid); 165 if (BCM_FAILURE(rv)) { 166 printf("Error executing bcm_vlan_create(): %s.\n", bcm_errmsg(rv)); 167 return rv; 168 } 169 170 /* Add ports into VLAN bitmap*/ 171 rv = bcm_vlan_port_add(unit, vid, pbmp, upbmp); 172 if (BCM_FAILURE(rv)) { 173 printf("Error executing bcm_vlan_port_add(): %s.\n", bcm_errmsg(rv)); 174 return rv; 175 } 176 177 /* Make VLAN vid as a default vlan and delete older default vlan*/ 178 rv = bcm_vlan_default_set(unit,vid); 179 if (BCM_FAILURE(rv)) { 180 printf("Error executing bcm_vlan_default_set(): %s.\n", bcm_errmsg(rv)); 181 return rv; 182 } 183 184 rv = bcm_vlan_destroy(unit,defVlan); 185 if (BCM_FAILURE(rv)) { 186 printf("Error executing bcm_vlan_destroy(): %s.\n", bcm_errmsg(rv)); 187 return rv; 188 } 189 190 return BCM_E_NONE; 191 } 192 193 194 bcm_error_t config_stg(int unit) 195 { 196 bcm_error_t rv; 197 bcm_pbmp_t pbmp, ubmp; 198 int count; 199 bcm_stg_t stg,stgDefault = 2 , newStgId = 25; 200 int group_id = 2; 201 bcm_vlan_t defVlan, vlanId1=10, vlanId2=20, newDefaultVlan = 2; 202 /* Create the vlan with specific id if it is already present then error will be returned */ 203 rv = bcm_vlan_create(unit, vlanId1); 204 if (BCM_FAILURE(rv)) { 205 printf("Error executing bcm_vlan_create(): %s.\n", bcm_errmsg(rv)); 206 return rv; 207 } 208 209 BCM_PBMP_CLEAR(ubmp); 210 BCM_PBMP_CLEAR(pbmp); 211 BCM_PBMP_PORT_ADD(pbmp, port1); 212 BCM_PBMP_PORT_ADD(pbmp, port2); 213 BCM_PBMP_PORT_ADD(pbmp, port3); 214 215 rv = bcm_vlan_port_add(unit, vlanId1, pbmp, ubmp); 216 if (BCM_FAILURE(rv)) { 217 printf("Error executing bcm_vlan_port_add(): %s.\n", bcm_errmsg(rv)); 218 return rv; 219 } 220 221 /* Create the vlan with specific id if it is already present then error will be returned */ 222 rv = bcm_vlan_create(unit, vlanId2); 223 if (BCM_FAILURE(rv)) { 224 printf("Error executing bcm_vlan_create(): %s.\n", bcm_errmsg(rv)); 225 return rv; 226 } 227 228 BCM_PBMP_CLEAR(ubmp); 229 BCM_PBMP_CLEAR(pbmp); 230 BCM_PBMP_PORT_ADD(pbmp, port2); 231 BCM_PBMP_PORT_ADD(pbmp, port3); 232 233 rv = bcm_vlan_port_add(unit, vlanId2, pbmp, ubmp); 234 if (BCM_FAILURE(rv)) { 235 printf("Error executing bcm_vlan_port_add(): %s.\n", bcm_errmsg(rv)); 236 return rv; 237 } 238 239 240 rv = bcm_stg_count_get(unit,&count); 241 if (BCM_FAILURE(rv)) { 242 printf("Error executing bcm_stg_count_get(): %s.\n", bcm_errmsg(rv)); 243 return rv; 244 } 245 printf("\nThis device support %d Spanning tree groups \n", count); 246 247 rv = bcm_vlan_default_get(unit, &defVlan); 248 if (BCM_FAILURE(rv)) { 249 printf("Error executing bcm_vlan_default_get(): %s.\n", bcm_errmsg(rv)); 250 return rv; 251 } 252 253 rv = bcm_vlan_stg_get(unit, defVlan, &stg); 254 if (BCM_FAILURE(rv)) { 255 printf("Error executing bcm_vlan_stg_get(): %s.\n", bcm_errmsg(rv)); 256 return rv; 257 } 258 259 printf("\nSpanning tree group id:%d has VLAN id:%d\n", stg,defVlan); 260 rv = bcm_stg_default_get(unit, &stg); 261 if (BCM_FAILURE(rv)) { 262 printf("Error executing bcm_stg_default_get(): %s.\n", bcm_errmsg(rv)); 263 return rv; 264 } 265 266 printf("\nThis device has default STG with id:%d\n", stg); 267 rv = new_default_vlan_setup(unit, newDefaultVlan); 268 if (BCM_FAILURE(rv)) { 269 printf("Error executing new_default_vlan_setup(): %s.\n", bcm_errmsg(rv)); 270 return rv; 271 } 272 273 rv = stg_vlan_add(unit, newDefaultVlan, stgDefault); 274 if (BCM_FAILURE(rv)) { 275 printf("Error executing stg_vlan_add(): %s.\n", bcm_errmsg(rv)); 276 return rv; 277 } 278 279 rv = bcm_stg_default_set(unit, stgDefault); 280 if (BCM_FAILURE(rv)) { 281 printf("Error executing bcm_stg_default_set(): %s.\n", bcm_errmsg(rv)); 282 return rv; 283 } 284 285 rv = bcm_stg_destroy(unit, stg); 286 if (BCM_FAILURE(rv)) { 287 printf("Error executing bcm_stg_destroy(): %s.\n", bcm_errmsg(rv)); 288 return rv; 289 } 290 291 rv = bcm_stg_default_get(unit, &stg); 292 if (BCM_FAILURE(rv)) { 293 printf("Error executing bcm_stg_default_get(): %s.\n", bcm_errmsg(rv)); 294 return rv; 295 } 296 297 printf("\nNew default STG has id:%d\n", stg); 298 rv = bcm_stg_create_id(unit, newStgId); 299 if (BCM_FAILURE(rv)) { 300 printf("Error executing bcm_stg_create_id(): %s.\n", bcm_errmsg(rv)); 301 return rv; 302 } 303 304 /* Multiple vlans can be associated with same STG group */ 305 rv = bcm_stg_vlan_add(unit, newStgId, vlanId1); 306 if (BCM_FAILURE(rv)) { 307 printf("Error executing bcm_stg_vlan_add(): %s.\n", bcm_errmsg(rv)); 308 return rv; 309 } 310 311 rv = bcm_stg_vlan_add(unit, newStgId, vlanId2); 312 if (BCM_FAILURE(rv)) { 313 printf("Error executing bcm_stg_vlan_add(): %s.\n", bcm_errmsg(rv)); 314 return rv; 315 } 316 317 rv = bcm_vlan_stp_set(unit, vlanId1, port1, BCM_STG_STP_FORWARD); 318 if (BCM_FAILURE(rv)) { 319 printf("Error executing bcm_vlan_stp_set(): %s.\n", bcm_errmsg(rv)); 320 return rv; 321 } 322 323 rv = bcm_vlan_stp_set(unit, vlanId1, port2, BCM_STG_STP_FORWARD); 324 if (BCM_FAILURE(rv)) { 325 printf("Error executing bcm_vlan_stp_set(): %s.\n", bcm_errmsg(rv)); 326 return rv; 327 } 328 329 rv = bcm_vlan_stp_set(unit, vlanId1, port3, BCM_STG_STP_FORWARD); 330 if (BCM_FAILURE(rv)) { 331 printf("Error executing bcm_vlan_stp_set(): %s.\n", bcm_errmsg(rv)); 332 return rv; 333 } 334 335 return BCM_E_NONE; 336 } 337 338 /* 339 * This functions does the following 340 * a)test setup 341 * b)actual configuration (Done in config_stg()) 342 * c)demonstrates the functionality (Done in verify()). 343 */ 344 bcm_error_t execute() 345 { 346 bcm_error_t rv; 347 int unit =0; 348 349 bshell(unit, "config show; a ; version"); 350 351 if (BCM_FAILURE((rv = test_setup(unit)))) { 352 printf("test_setup() failed.\n"); 353 return -1; 354 } 355 printf("Completed test setup successfully.\n"); 356 357 if (BCM_FAILURE((rv = config_stg(unit)))) { 358 printf("config_stg() failed.\n"); 359 return -1; 360 } 361 printf("Completed configuration(i.e executing config_stg()) successfully.\n"); 362 363 verify(unit); 364 return BCM_E_NONE; 365 } 366 367 const char *auto_execute = (ARGC == 1) ? ARGV[0] : "YES"; 368 if (!sal_strcmp(auto_execute, "YES")) { 369 print execute(); 370 } 371