BSSGP_Emulation: Fix inbound BVC-RESET

We cannot handle this in as_ptp_allstate(), as the respective clauses
are never hit:  In as_ptp_unblocked() we broadcast all BSSGP messages
without a TLLI, "hiding" the BVC-RESET handling.

Change-Id: Ie3e7a997554e6af42ae7e7294829b6f8d2447d60
This commit is contained in:
Harald Welte 2020-11-25 17:11:08 +01:00
parent 239aa50e8c
commit ab50cc295b
1 changed files with 24 additions and 17 deletions

View File

@ -994,6 +994,8 @@ private altstep as_ptp_blocked() runs on BSSGP_BVC_CT {
f_ptp_change_state(BVC_S_UNBLOCKED);
}
[] as_ptp_handle_inbound_reset();
[] g_T2.timeout {
/* BVC-RESET-ACK PDU was not received within T2: retransmit */
f_ptp_sendReset(g_last_reset_cause);
@ -1041,6 +1043,8 @@ private altstep as_ptp_unblocked() runs on BSSGP_BVC_CT {
f_ptp_sendBlock(g_last_block_cause);
}
[] as_ptp_handle_inbound_reset();
/* simply acknowledge all per-BVC Flow Control Messages */
[g_sgsn_role] BVC.receive(tr_ptp_BnsUdInd(tr_BVC_FC_BVC, g_cfg.bvci)) -> value udi {
var OCT1 tag := udi.bssgp.pDU_BSSGP_FLOW_CONTROL_BVC.tag.unstructured_Value;
@ -1148,6 +1152,26 @@ private altstep as_ptp_unblocked() runs on BSSGP_BVC_CT {
}
}
private altstep as_ptp_handle_inbound_reset() runs on BSSGP_BVC_CT {
var NsUnitdataIndication udi;
/* we are a SGSN: BSS/PCU-originated RESET must have a cell ID */
[g_sgsn_role] BVC.receive(tr_ptp_BnsUdInd(tr_BVC_RESET(?, g_cfg.bvci, g_cfg.cell_id), 0)) -> value udi {
log("Rx BVC-RESET from BVCI=", g_cfg.bvci);
/* Respond to RESET with correct BVCI but without CellID */
BVC.send(ts_ptp_BnsUdReq(ts_BVC_RESET_ACK(g_cfg.bvci, omit), 0, g_bvc_lsp));
/* FIXME: reset all state? What about clients? */
f_ptp_change_state(BVC_S_UNBLOCKED);
}
/* we are a BSS/PCU: SGSN-originated RESET must not have a cell ID */
[not g_sgsn_role] BVC.receive(tr_ptp_BnsUdInd(tr_BVC_RESET(?, g_cfg.bvci, omit), 0)) -> value udi {
log("Rx BVC-RESET from BVCI=", g_cfg.bvci);
/* Respond to RESET with correct BVCI with CellID */
BVC.send(ts_ptp_BnsUdReq(ts_BVC_RESET_ACK(g_cfg.bvci, g_cfg.cell_id), 0, g_bvc_lsp));
/* FIXME: reset all state? What about clients? */
f_ptp_change_state(BVC_S_UNBLOCKED);
}
}
/* Events permitted in all states */
private altstep as_ptp_allstate() runs on BSSGP_BVC_CT {
var NsUnitdataIndication udi;
@ -1171,23 +1195,6 @@ private altstep as_ptp_allstate() runs on BSSGP_BVC_CT {
}
}
/* we are a SGSN: BSS/PCU-originated RESET must have a cell ID */
[g_sgsn_role] BVC.receive(tr_ptp_BnsUdInd(tr_BVC_RESET(?, g_cfg.bvci, g_cfg.cell_id), 0)) -> value udi {
log("Rx BVC-RESET from BVCI=", g_cfg.bvci);
/* Respond to RESET with correct BVCI but without CellID */
BVC.send(ts_ptp_BnsUdReq(ts_BVC_RESET_ACK(g_cfg.bvci, omit), 0, g_bvc_lsp));
/* FIXME: reset all state? What about clients? */
f_ptp_change_state(BVC_S_UNBLOCKED);
}
/* we are a BSS/PCU: SGSN-originated RESET must not have a cell ID */
[not g_sgsn_role] BVC.receive(tr_ptp_BnsUdInd(tr_BVC_RESET(?, g_cfg.bvci, omit), 0)) -> value udi {
log("Rx BVC-RESET from BVCI=", g_cfg.bvci);
/* Respond to RESET with correct BVCI with CellID */
BVC.send(ts_ptp_BnsUdReq(ts_BVC_RESET_ACK(g_cfg.bvci, g_cfg.cell_id), 0, g_bvc_lsp));
/* FIXME: reset all state? What about clients? */
f_ptp_change_state(BVC_S_UNBLOCKED);
}
/* Ignore those for now */
[] BVC.receive(ASP_Event:?) { }
[] BVC.receive(BssgpStatusIndication:?) { }