s.topology_change_count);
printf(" topology change %s\n",
BOOL_STR(s.topology_change));
+ printf(" topology change port %s\n",
+ s.topology_change_port);
+ printf(" last topology change port %s\n",
+ s.last_topology_change_port);
break;
case PARAM_ENABLED:
printf("%s\n", BOOL_STR(s.enabled));
printf(" time since topology change %u\n", s.time_since_topology_change);
printf(" topology change count %u\n", s.topology_change_count);
printf(" topology change %s\n", BOOL_STR(s.topology_change));
+ printf(" topology change port %s\n", s.topology_change_port);
+ printf(" last topology change port %s\n", s.last_topology_change_port);
return 0;
}
BOOL_STR(s.network_port));
printf("BA inconsistent %s\n",
BOOL_STR(s.ba_inconsistent));
+ printf(" Num TX BPDU %-23u ", s.num_tx_bpdu);
+ printf("Num TX TCN %u\n", s.num_tx_tcn);
+ printf(" Num RX BPDU %-23u ", s.num_rx_bpdu);
+ printf("Num RX TCN %u\n", s.num_rx_tcn);
+ printf(" Num Transition FWD %-23u ", s.num_trans_fwd);
+ printf("Num Transition BLK %u\n", s.num_trans_blk);
}
else
{
tree->time_since_topology_change = 0;
tree->topology_change_count = 0;
tree->topology_change = false; /* since all tcWhile are initialized to 0 */
+ strncpy(tree->topology_change_port, "None", IFNAMSIZ);
+ strncpy(tree->last_topology_change_port, "None", IFNAMSIZ);
/* The following are initialized in BEGIN state:
* - rootPortId, rootPriority, rootTimes: in Port Role Selection SM
assign(prt->rapidAgeingWhile, 0u);
assign(prt->brAssuRcvdInfoWhile, 0u);
prt->BaInconsistent = false;
+ prt->num_rx_bpdu = 0;
+ prt->num_rx_tcn = 0;
+ prt->num_tx_bpdu = 0;
+ prt->num_tx_tcn = 0;
+ prt->num_trans_fwd = 0;
+ prt->num_trans_blk = 0;
/* The following are initialized in BEGIN state:
* - mdelayWhile. mcheck, sendRSTP: in Port Protocol Migration SM
prt->portEnabled = true;
prt->BpduGuardError = false;
prt->BaInconsistent = false;
+ prt->num_rx_bpdu = 0;
+ prt->num_rx_tcn = 0;
+ prt->num_tx_bpdu = 0;
+ prt->num_tx_tcn = 0;
changed = true;
/* When port is enabled, initialize bridge assurance timer,
* so that enough time is given before port is put in
int mstis_size;
bridge_t *br = prt->bridge;
+ ++(prt->num_rx_bpdu);
+ if(bpdu->flags & (1 << offsetTc))
+ ++(prt->num_rx_tcn);
+ if(bpdu->bpduType == bpduTypeTCN)
+ ++(prt->num_rx_tcn);
+
if(prt->BpduGuardPort)
{
prt->BpduGuardError = true;
goto bpdu_validation_failed;
/* Valid Config BPDU */
bpdu->protocolVersion = protoSTP;
- LOG_PRTNAME(br, prt, "received Config BPDU");
+ LOG_PRTNAME(br, prt, "received Config BPDU%s",
+ (bpdu->flags & (1 << offsetTc)) ? ", tcFlag" : ""
+ );
break;
case bpduTypeRST:
if(protoRSTP == bpdu->protocolVersion)
goto bpdu_validation_failed;
/* Valid RST BPDU */
/* bpdu->protocolVersion = protoRSTP; */
- LOG_PRTNAME(br, prt, "received RST BPDU");
+ LOG_PRTNAME(br, prt, "received RST BPDU%s",
+ (bpdu->flags & (1 << offsetTc)) ? ", tcFlag" : ""
+ );
break;
}
if(protoMSTP > bpdu->protocolVersion)
bpdu->protocolVersion = protoMSTP;
prt->rcvdBpduNumOfMstis = mstis_size
/ sizeof(msti_configuration_message_t);
- LOG_PRTNAME(br, prt, "received MST BPDU with %d MSTIs",
- prt->rcvdBpduNumOfMstis);
+ LOG_PRTNAME(br, prt, "received MST BPDU%s with %d MSTIs",
+ (bpdu->flags & (1 << offsetTc)) ? ", tcFlag" : "",
+ prt->rcvdBpduNumOfMstis
+ );
break;
default:
goto bpdu_validation_failed;
cist->time_since_topology_change);
assign(status->topology_change_count, cist->topology_change_count);
status->topology_change = cist->topology_change;
+ strncpy(status->topology_change_port, cist->topology_change_port,
+ IFNAMSIZ);
+ strncpy(status->last_topology_change_port, cist->last_topology_change_port,
+ IFNAMSIZ);
assign(status->designated_root, cist->rootPriority.RootID);
assign(status->root_path_cost,
__be32_to_cpu(cist->rootPriority.ExtRootPathCost));
tree->time_since_topology_change);
assign(status->topology_change_count, tree->topology_change_count);
status->topology_change = tree->topology_change;
+ strncpy(status->topology_change_port, tree->topology_change_port,
+ IFNAMSIZ);
+ strncpy(status->last_topology_change_port, tree->last_topology_change_port,
+ IFNAMSIZ);
assign(status->regional_root, tree->rootPriority.RRootID);
assign(status->internal_path_cost,
__be32_to_cpu(tree->rootPriority.IntRootPathCost));
status->bpdu_guard_error = prt->BpduGuardError;
status->network_port = prt->NetworkPort;
status->ba_inconsistent = prt->BaInconsistent;
+ status->num_rx_bpdu = prt->num_rx_bpdu;
+ status->num_rx_tcn = prt->num_rx_tcn;
+ status->num_tx_bpdu = prt->num_tx_bpdu;
+ status->num_tx_tcn = prt->num_tx_tcn;
+ status->num_trans_fwd = prt->num_trans_fwd;
+ status->num_trans_blk = prt->num_trans_blk;
}
/* 12.8.2.2 Read MSTI Port Parameters */
* If hint_SetToYes == false, some tcWhile in this tree has just became zero,
* so we should check all other tcWhile's in this tree.
*/
-static void set_TopologyChange(tree_t *tree, bool hint_SetToYes)
+static void set_TopologyChange(tree_t *tree, bool hint_SetToYes, port_t *port)
{
per_tree_port_t *ptp;
bool prev_tc_not_set = !tree->topology_change;
tree->time_since_topology_change = 0;
if(prev_tc_not_set)
++(tree->topology_change_count);
+ strncpy(tree->topology_change_port, tree->last_topology_change_port,
+ IFNAMSIZ);
+ strncpy(tree->last_topology_change_port, port->sysdeps.name, IFNAMSIZ);
return;
}
per_tree_port_t *cist = GET_CIST_PTP_FROM_PORT(prt);
ptp->tcWhile = cist->portTimes.Hello_Time + 1;
- set_TopologyChange(tree, true);
+ set_TopologyChange(tree, true, prt);
if(0 == ptp->MSTID)
prt->newInfo = true;
times_t *times = &tree->rootTimes;
ptp->tcWhile = times->Max_Age + times->Forward_Delay;
- set_TopologyChange(tree, true);
+ set_TopologyChange(tree, true, prt);
}
/* 13.26.6 rcvInfo */
if(ptp->tcWhile)
{
if(0 == --(ptp->tcWhile))
- set_TopologyChange(ptp->tree, false);
+ set_TopologyChange(ptp->tree, false, prt);
}
if(ptp->rcvdInfoWhile)
--(ptp->rcvdInfoWhile);
set_fdbFlush(ptp);
assign(ptp->tcWhile, 0u);
- set_TopologyChange(ptp->tree, false);
+ set_TopologyChange(ptp->tree, false, ptp->port);
if(0 == ptp->MSTID) /* CIST */
ptp->port->tcAck = false;
ptp->TCSM_state = TCSM_ACKNOWLEDGED;
assign(ptp->tcWhile, 0u);
- set_TopologyChange(ptp->tree, false);
+ set_TopologyChange(ptp->tree, false, ptp->port);
ptp->port->rcvdTcAck = false;
TCSM_run(ptp, false /* actual run */);
unsigned int time_since_topology_change;
unsigned int topology_change_count;
bool topology_change;
+ char topology_change_port[IFNAMSIZ];
+ char last_topology_change_port[IFNAMSIZ];
/* State machines */
PRSSM_states_t PRSSM_state;
bool deleted;
sysdep_if_data_t sysdeps;
+ unsigned int num_rx_bpdu;
+ unsigned int num_rx_tcn;
+ unsigned int num_tx_bpdu;
+ unsigned int num_tx_tcn;
+ unsigned int num_trans_fwd;
+ unsigned int num_trans_blk;
} port_t;
typedef struct
unsigned int time_since_topology_change;
unsigned int topology_change_count;
bool topology_change;
+ char topology_change_port[IFNAMSIZ];
+ char last_topology_change_port[IFNAMSIZ];
bridge_identifier_t designated_root;
unsigned int root_path_cost;
port_identifier_t root_port_id;
unsigned int time_since_topology_change;
unsigned int topology_change_count;
bool topology_change;
+ char topology_change_port[IFNAMSIZ];
+ char last_topology_change_port[IFNAMSIZ];
bridge_identifier_t regional_root;
unsigned int internal_path_cost;
port_identifier_t root_port_id;
bool bpdu_guard_error;
bool network_port;
bool ba_inconsistent;
+ unsigned int num_rx_bpdu;
+ unsigned int num_rx_tcn;
+ unsigned int num_tx_bpdu;
+ unsigned int num_tx_tcn;
+ unsigned int num_trans_fwd;
+ unsigned int num_trans_blk;
} CIST_PortStatus;
void MSTP_IN_get_cist_port_status(port_t *prt, CIST_PortStatus *status);