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 <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to