laforge has submitted this change. (
https://gerrit.osmocom.org/c/osmo-hnbgw/+/36478?usp=email )
Change subject: HNBAP: Make sure to respond with correct "reject"
......................................................................
HNBAP: Make sure to respond with correct "reject"
If we receive a procedure (like UE-REGISTER) in a state
where it's not permitted (e.g. HNB not registered), we should
send a UE-REGISTER-REJ with proper cause value, rather than not
sending any response at all.
Change-Id: I300db368a3d1d2fb5967f69f2ed4ac90ecf85e75
---
M src/osmo-hnbgw/hnbgw_hnbap.c
1 file changed, 62 insertions(+), 46 deletions(-)
Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
diff --git a/src/osmo-hnbgw/hnbgw_hnbap.c b/src/osmo-hnbgw/hnbgw_hnbap.c
index 631c782..8615f91 100644
--- a/src/osmo-hnbgw/hnbgw_hnbap.c
+++ b/src/osmo-hnbgw/hnbgw_hnbap.c
@@ -571,6 +571,14 @@
HNBAP_TriggeringMessage_initiating_message);
}
+ if (!ctx->hnb_registered) {
+ /* UE registration requires prior HNB registration; reject with proper cause */
+ cause.present = HNBAP_Cause_PR_radioNetwork;
+ cause.choice.radioNetwork = HNBAP_CauseRadioNetwork_hNB_not_registered;
+ rc = hnbgw_tx_ue_register_rej(ctx, &ies.uE_Identity, &cause);
+ goto free_and_return_rc;
+ }
+
switch (ies.uE_Identity.present) {
case HNBAP_UE_Identity_PR_iMSI:
ranap_bcd_decode(imsi, sizeof(imsi), ies.uE_Identity.choice.iMSI.buf,
@@ -627,6 +635,7 @@
static int hnbgw_rx_ue_deregister(struct hnb_context *ctx, ANY_t *in)
{
HNBAP_UEDe_RegisterIEs_t ies;
+ HNBAP_Cause_t cause;
struct ue_context *ue;
int rc;
uint32_t ctxid;
@@ -637,11 +646,19 @@
ctxid = asn1bitstr_to_u24(&ies.context_ID);
- LOGHNB(ctx, DHNBAP, LOGL_DEBUG, "UE-DE-REGISTER context=%u cause=%s\n", ctxid,
hnbap_cause_str(&ies.cause));
-
- ue = ue_context_by_id(ctxid);
- if (ue)
- ue_context_free(ue);
+ if (!ctx->hnb_registered) {
+ LOGHNB(ctx, DHNBAP, LOGL_NOTICE, "UE-DE-REGISTER context=%u cause=%s not
permitted; HNB not registered\n",
+ ctxid, hnbap_cause_str(&ies.cause));
+ cause.present = HNBAP_Cause_PR_radioNetwork;
+ cause.choice.radioNetwork = HNBAP_CauseRadioNetwork_hNB_not_registered;
+ hnbgw_tx_error_ind(ctx, &cause, HNBAP_ProcedureCode_id_UEDe_Register,
+ HNBAP_Criticality_ignore, HNBAP_TriggeringMessage_initiating_message);
+ } else {
+ LOGHNB(ctx, DHNBAP, LOGL_DEBUG, "UE-DE-REGISTER context=%u cause=%s\n",
ctxid, hnbap_cause_str(&ies.cause));
+ ue = ue_context_by_id(ctxid);
+ if (ue)
+ ue_context_free(ue);
+ }
hnbap_free_uede_registeries(&ies);
return 0;
@@ -666,47 +683,32 @@
{
int rc = 0;
- if (!hnb->hnb_registered) {
- switch (imsg->procedureCode) {
- case HNBAP_ProcedureCode_id_HNBRegister: /* 8.2 */
- rc = hnbgw_rx_hnb_register_req(hnb, &imsg->value);
- break;
- case HNBAP_ProcedureCode_id_HNBDe_Register: /* 8.3 */
- rc = hnbgw_rx_hnb_deregister(hnb, &imsg->value);
- break;
- default:
- LOGHNB(hnb, DHNBAP, LOGL_NOTICE, "HNBAP Procedure %ld not permitted for
de-registered HNB\n",
- imsg->procedureCode);
- break;
- }
- } else {
- switch (imsg->procedureCode) {
- case HNBAP_ProcedureCode_id_HNBRegister: /* 8.2.4: Abnormal Condition, Accept. */
- rc = hnbgw_rx_hnb_register_req(hnb, &imsg->value);
- break;
- case HNBAP_ProcedureCode_id_HNBDe_Register: /* 8.3 */
- rc = hnbgw_rx_hnb_deregister(hnb, &imsg->value);
- break;
- case HNBAP_ProcedureCode_id_UERegister: /* 8.4 */
- rc = hnbgw_rx_ue_register_req(hnb, &imsg->value);
- break;
- case HNBAP_ProcedureCode_id_UEDe_Register: /* 8.5 */
- rc = hnbgw_rx_ue_deregister(hnb, &imsg->value);
- break;
- case HNBAP_ProcedureCode_id_ErrorIndication: /* 8.6 */
- rc = hnbgw_rx_err_ind(hnb, &imsg->value);
- break;
- case HNBAP_ProcedureCode_id_TNLUpdate: /* 8.9 */
- case HNBAP_ProcedureCode_id_HNBConfigTransfer: /* 8.10 */
- case HNBAP_ProcedureCode_id_RelocationComplete: /* 8.11 */
- case HNBAP_ProcedureCode_id_U_RNTIQuery: /* 8.12 */
- case HNBAP_ProcedureCode_id_privateMessage:
- LOGHNB(hnb, DHNBAP, LOGL_NOTICE, "Unimplemented HNBAP Procedure %ld\n",
imsg->procedureCode);
- break;
- default:
- LOGHNB(hnb, DHNBAP, LOGL_NOTICE, "Unknown HNBAP Procedure %ld\n",
imsg->procedureCode);
- break;
- }
+ switch (imsg->procedureCode) {
+ case HNBAP_ProcedureCode_id_HNBRegister: /* 8.2 */
+ rc = hnbgw_rx_hnb_register_req(hnb, &imsg->value);
+ break;
+ case HNBAP_ProcedureCode_id_HNBDe_Register: /* 8.3 */
+ rc = hnbgw_rx_hnb_deregister(hnb, &imsg->value);
+ break;
+ case HNBAP_ProcedureCode_id_UERegister: /* 8.4 */
+ rc = hnbgw_rx_ue_register_req(hnb, &imsg->value);
+ break;
+ case HNBAP_ProcedureCode_id_UEDe_Register: /* 8.5 */
+ rc = hnbgw_rx_ue_deregister(hnb, &imsg->value);
+ break;
+ case HNBAP_ProcedureCode_id_ErrorIndication: /* 8.6 */
+ rc = hnbgw_rx_err_ind(hnb, &imsg->value);
+ break;
+ case HNBAP_ProcedureCode_id_TNLUpdate: /* 8.9 */
+ case HNBAP_ProcedureCode_id_HNBConfigTransfer: /* 8.10 */
+ case HNBAP_ProcedureCode_id_RelocationComplete: /* 8.11 */
+ case HNBAP_ProcedureCode_id_U_RNTIQuery: /* 8.12 */
+ case HNBAP_ProcedureCode_id_privateMessage:
+ LOGHNB(hnb, DHNBAP, LOGL_NOTICE, "Unimplemented HNBAP Procedure %ld\n",
imsg->procedureCode);
+ break;
+ default:
+ LOGHNB(hnb, DHNBAP, LOGL_NOTICE, "Unknown HNBAP Procedure %ld\n",
imsg->procedureCode);
+ break;
}
return rc;
--
To view, visit
https://gerrit.osmocom.org/c/osmo-hnbgw/+/36478?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-hnbgw
Gerrit-Branch: master
Gerrit-Change-Id: I300db368a3d1d2fb5967f69f2ed4ac90ecf85e75
Gerrit-Change-Number: 36478
Gerrit-PatchSet: 3
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged