]> git.ipfire.org Git - people/ms/mstpd.git/commitdiff
Ensure port role selection occurs when some port was deleted
authordv1tas <dv1tas@fbe50366-0c72-4402-a84b-5d246361dba7>
Mon, 3 Jun 2013 08:44:00 +0000 (08:44 +0000)
committerdv1tas <dv1tas@fbe50366-0c72-4402-a84b-5d246361dba7>
Mon, 3 Jun 2013 08:44:00 +0000 (08:44 +0000)
Reported-by: Satish Ashok <sashok@cumulusnetworks.com>
Signed-off-by: Vitalii Demianets <dvitasgs@gmail.com>
Reviewed-by: Satish Ashok <sashok@cumulusnetworks.com>
git-svn-id: svn://svn.code.sf.net/p/mstpd/code/trunk@41 fbe50366-0c72-4402-a84b-5d246361dba7

bridge_track.c
main.c
mstp.c
mstp.h

index 33eb6f0115e78513c77bcbbfd6a8f17c20824a10..80a27b937ccb0aa6caecbe47eaff5b2988fb72b2 100644 (file)
@@ -123,7 +123,6 @@ static port_t * find_if(bridge_t * br, int if_index)
 
 static inline void delete_if(port_t * ifc)
 {
-    list_del(&ifc->br_list);
     MSTP_IN_delete_port(ifc);
     free(ifc);
 }
diff --git a/main.c b/main.c
index 7af48a2a1993366d7cf33e3d2e74b731ee93ae6a..57ff7ba28b1dd38de4a527a129c201d2a8a02a67 100644 (file)
--- a/main.c
+++ b/main.c
@@ -255,11 +255,9 @@ error_exit:
 
     printout_mesh(br);
 
-    list_del(&prt[1]->br_list);
     MSTP_IN_delete_port(prt[1]);
     if(!MSTP_IN_delete_msti(br, 0xE12))
         goto error_exit;
-    list_del(&prt[3]->br_list);
     MSTP_IN_delete_port(prt[3]);
     if(!MSTP_IN_delete_msti(br, 0x005))
         goto error_exit;
diff --git a/mstp.c b/mstp.c
index cc2c8c0d5bd01a1d11440e8bd1fc26f8b4d93ce2..c5bd3caa8b842d4df90dbd9c6fb67e9fcd3b3c2c 100644 (file)
--- a/mstp.c
+++ b/mstp.c
@@ -244,6 +244,7 @@ bool MSTP_IN_port_create_and_add_tail(port_t *prt, __u16 portno)
     prt->AdminEdgePort = false; /* 13.25 */
     prt->AutoEdge = true;       /* 13.25 */
     assign(prt->rapidAgeingWhile, 0u);
+    prt->deleted = false;
 
     /* The following are initialized in BEGIN state:
      * - mdelayWhile. mcheck, sendRSTP: in Port Protocol Migration SM
@@ -287,6 +288,7 @@ void MSTP_IN_delete_port(port_t *prt)
     per_tree_port_t *ptp, *nxt;
     bridge_t *br = prt->bridge;
 
+    prt->deleted = true;
     if(prt->portEnabled)
     {
         prt->portEnabled = false;
@@ -300,6 +302,7 @@ void MSTP_IN_delete_port(port_t *prt)
         free(ptp);
     }
 
+    list_del(&prt->br_list);
     br_state_machines_run(br);
 }
 
@@ -319,7 +322,6 @@ void MSTP_IN_delete_bridge(bridge_t *br)
 
     list_for_each_entry_safe(prt, nxt_prt, &br->ports, br_list)
     {
-        list_del(&prt->br_list);
         MSTP_IN_delete_port(prt);
         free(prt);
     }
@@ -447,7 +449,10 @@ void MSTP_IN_one_second(bridge_t *br)
         if(prt->rapidAgeingWhile)
         {
             if((--(prt->rapidAgeingWhile)) == 0)
-                MSTP_OUT_set_ageing_time(prt, br->Ageing_Time);
+            {
+                if(!prt->deleted)
+                    MSTP_OUT_set_ageing_time(prt, br->Ageing_Time);
+            }
         }
     }
 
@@ -1921,7 +1926,7 @@ static void set_fdbFlush(per_tree_port_t *ptp)
 {
     port_t *prt = ptp->port;
 
-    if(prt->operEdge)
+    if(prt->operEdge || prt->deleted)
     {
         ptp->fdbFlush = false;
         return;
@@ -2109,6 +2114,9 @@ static void txConfig(port_t *prt)
     bpdu_t b;
     per_tree_port_t *cist = GET_CIST_PTP_FROM_PORT(prt);
 
+    if(prt->deleted)
+        return;
+
     b.protocolIdentifier = 0;
     b.protocolVersion = protoSTP;
     b.bpduType = bpduTypeConfig;
@@ -2166,6 +2174,9 @@ static void txMstp(port_t *prt)
     per_tree_port_t *ptp;
     msti_configuration_message_t *msti_msg;
 
+    if(prt->deleted)
+        return;
+
     b.protocolIdentifier = 0;
     b.bpduType = bpduTypeRST;
     /* Standard says "{tcWhile, agree, proposing, role} ... for the Port".
@@ -2261,6 +2272,9 @@ static void txTcn(port_t *prt)
 {
     bpdu_t b;
 
+    if(prt->deleted)
+        return;
+
     b.protocolIdentifier = 0;
     b.protocolVersion = protoSTP;
     b.bpduType = bpduTypeTCN;
@@ -4287,7 +4301,10 @@ static void PSTSM_to_DISCARDING(per_tree_port_t *ptp, bool begin)
     disableForwarding();
     */
     if(BR_STATE_BLOCKING != ptp->state)
-        MSTP_OUT_set_state(ptp, BR_STATE_BLOCKING);
+    {
+        if(!ptp->port->deleted)
+            MSTP_OUT_set_state(ptp, BR_STATE_BLOCKING);
+    }
     ptp->learning = false;
     ptp->forwarding = false;
 
@@ -4301,7 +4318,10 @@ static void PSTSM_to_LEARNING(per_tree_port_t *ptp)
 
     /* enableLearning(); */
     if(BR_STATE_LEARNING != ptp->state)
-        MSTP_OUT_set_state(ptp, BR_STATE_LEARNING);
+    {
+        if(!ptp->port->deleted)
+            MSTP_OUT_set_state(ptp, BR_STATE_LEARNING);
+    }
     ptp->learning = true;
 
     PSTSM_run(ptp, false /* actual run */);
@@ -4313,7 +4333,10 @@ static void PSTSM_to_FORWARDING(per_tree_port_t *ptp)
 
     /* enableForwarding(); */
     if(BR_STATE_FORWARDING != ptp->state)
-        MSTP_OUT_set_state(ptp, BR_STATE_FORWARDING);
+    {
+        if(!ptp->port->deleted)
+            MSTP_OUT_set_state(ptp, BR_STATE_FORWARDING);
+    }
     ptp->forwarding = true;
 
     /* No need to run, no one condition will be met
diff --git a/mstp.h b/mstp.h
index a0692671bd8be3b64b40841dea11b03f6c01e7dc..36de4bc7d6ff50e3b28b0b30909e33525a07b305 100644 (file)
--- a/mstp.h
+++ b/mstp.h
@@ -485,6 +485,8 @@ typedef struct
     bpdu_t rcvdBpduData;
     int rcvdBpduNumOfMstis;
 
+    bool deleted;
+
     sysdep_if_data_t sysdeps;
 } port_t;