From d39c813d902682a2ac47d2c41ea9c2e9035138e7 Mon Sep 17 00:00:00 2001 From: dv1tas Date: Mon, 3 Jun 2013 08:44:00 +0000 Subject: [PATCH] Ensure port role selection occurs when some port was deleted Reported-by: Satish Ashok Signed-off-by: Vitalii Demianets Reviewed-by: Satish Ashok git-svn-id: svn://svn.code.sf.net/p/mstpd/code/trunk@41 fbe50366-0c72-4402-a84b-5d246361dba7 --- bridge_track.c | 1 - main.c | 2 -- mstp.c | 35 +++++++++++++++++++++++++++++------ mstp.h | 2 ++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/bridge_track.c b/bridge_track.c index 33eb6f0..80a27b9 100644 --- a/bridge_track.c +++ b/bridge_track.c @@ -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 7af48a2..57ff7ba 100644 --- 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 cc2c8c0..c5bd3ca 100644 --- 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 a069267..36de4bc 100644 --- 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; -- 2.47.2