gbproxy: Improve STATUS handling from SGSN
STATUS with cause bvci blocked or unknown should not be forwarded Related: OS#4892 Change-Id: I0ab88634fe2eab5299ff4587fcef4177ce5b4831
This commit is contained in:
parent
c5dcebdf42
commit
885f430965
|
@ -1380,7 +1380,6 @@ static int gbprox_rx_sig_from_sgsn(struct gbproxy_nse *nse, struct msgb *msg, ui
|
||||||
uint16_t bvci;
|
uint16_t bvci;
|
||||||
char log_pfx[32];
|
char log_pfx[32];
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
int cause;
|
|
||||||
int i;
|
int i;
|
||||||
bool paging_bc = false;
|
bool paging_bc = false;
|
||||||
|
|
||||||
|
@ -1475,20 +1474,41 @@ static int gbprox_rx_sig_from_sgsn(struct gbproxy_nse *nse, struct msgb *msg, ui
|
||||||
rc = gbprox_rx_paging(nse, msg, pdut_name, &tp[0], ns_bvci, paging_bc);
|
rc = gbprox_rx_paging(nse, msg, pdut_name, &tp[0], ns_bvci, paging_bc);
|
||||||
break;
|
break;
|
||||||
case BSSGP_PDUT_STATUS:
|
case BSSGP_PDUT_STATUS:
|
||||||
/* Some exception has occurred */
|
{
|
||||||
cause = *TLVP_VAL(&tp[0], BSSGP_IE_CAUSE);
|
struct gbproxy_nse *nse_peer;
|
||||||
LOGPNSE(nse, LOGL_NOTICE, "Rx STATUS cause=0x%02x(%s) ", cause,
|
uint32_t tlli;
|
||||||
|
|
||||||
|
/* Check if the status needs to be terminated locally */
|
||||||
|
uint8_t cause = *TLVP_VAL(&tp[0], BSSGP_IE_CAUSE);
|
||||||
|
|
||||||
|
if (cause == BSSGP_CAUSE_UNKNOWN_BVCI || cause == BSSGP_CAUSE_BVCI_BLOCKED) {
|
||||||
|
/* Log and handle locally, BVCI should be present for these causes */
|
||||||
|
if (!TLVP_PRESENT(&tp[0], BSSGP_IE_BVCI)) {
|
||||||
|
LOGPNSE(nse, LOGL_ERROR, "Rx STATUS cause=0x%02x(%s), but BVCI is missing\n", cause,
|
||||||
|
bssgp_cause_str(cause));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
uint16_t ptp_bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));
|
||||||
|
LOGPNSE(nse, LOGL_ERROR, "Rx STATUS cause=0x%02x(%s) for PtP-BVC %05u\n", cause,
|
||||||
|
bssgp_cause_str(cause), ptp_bvci);
|
||||||
|
/* FIXME: Remove/block the other BSS/SGSN BVCs if present? */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGPNSE(nse, LOGL_NOTICE, "Rx STATUS cause=0x%02x(%s)\n", cause,
|
||||||
bssgp_cause_str(cause));
|
bssgp_cause_str(cause));
|
||||||
if (TLVP_PRES_LEN(&tp[0], BSSGP_IE_BVCI, 2)) {
|
|
||||||
bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));
|
if (gbproxy_tlli_from_status_pdu(msg, tp, &tlli, log_pfx) == 0) {
|
||||||
LOGPC(DGPRS, LOGL_NOTICE, "BVCI=%05u\n", bvci);
|
nse_peer = gbproxy_nse_by_tlli(cfg, tlli);
|
||||||
sgsn_bvc = gbproxy_bvc_by_bvci(nse, bvci);
|
if (nse_peer)
|
||||||
/* don't send STATUS in response to STATUS if !bvc */
|
return gbprox_relay2nse(msg, nse_peer, 0);
|
||||||
if (sgsn_bvc && sgsn_bvc->cell && sgsn_bvc->cell->bss_bvc)
|
}
|
||||||
rc = gbprox_relay2peer(msg, sgsn_bvc->cell->bss_bvc, ns_bvci);
|
|
||||||
} else
|
LOGPNSE(nse, LOGL_ERROR, "Unable to handle STATUS cause=0x%02x(%s)\n", cause,
|
||||||
LOGPC(DGPRS, LOGL_NOTICE, "\n");
|
bssgp_cause_str(cause));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
/* those only exist in the SGSN -> BSS direction */
|
/* those only exist in the SGSN -> BSS direction */
|
||||||
case BSSGP_PDUT_SUSPEND_ACK:
|
case BSSGP_PDUT_SUSPEND_ACK:
|
||||||
case BSSGP_PDUT_SUSPEND_NACK:
|
case BSSGP_PDUT_SUSPEND_NACK:
|
||||||
|
|
Loading…
Reference in New Issue