openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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