fix assertion E_RABSetupListBearerSURes [#552]

This commit is contained in:
Sukchan Lee 2020-09-07 22:15:59 -04:00
parent 160490483a
commit a2f3914a05
1 changed files with 84 additions and 43 deletions

View File

@ -624,23 +624,33 @@ void s1ap_handle_initial_context_setup_failure(
} }
} }
ogs_debug(" IP[%s] ENB_ID[%d]", ogs_debug(" IP[%s] ENB_ID[%d]", OGS_ADDR(enb->addr, buf), enb->enb_id);
OGS_ADDR(enb->addr, buf), enb->enb_id);
ogs_assert(ENB_UE_S1AP_ID);
ogs_assert(Cause);
if (!ENB_UE_S1AP_ID) {
ogs_error("No ENB_UE_S1AP_ID");
s1ap_send_error_indication(enb,
NULL, ENB_UE_S1AP_ID,
S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error);
return;
}
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, *ENB_UE_S1AP_ID); enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, *ENB_UE_S1AP_ID);
if (enb_ue == NULL) { if (!enb_ue) {
ogs_warn("Initial context setup failure : " ogs_error("No eNB UE Context : ENB_UE_S1AP_ID[%lld]",
"cannot find eNB-UE-S1AP-ID[%d]", (int)*ENB_UE_S1AP_ID); (long long)*ENB_UE_S1AP_ID);
s1ap_send_error_indication(enb,
NULL, ENB_UE_S1AP_ID,
S1AP_Cause_PR_radioNetwork,
S1AP_CauseRadioNetwork_unknown_enb_ue_s1ap_id);
return; return;
} }
ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
ogs_debug(" Cause[Group:%d Cause:%d]",
Cause->present, (int)Cause->choice.radioNetwork); if (Cause) {
ogs_debug(" Cause[Group:%d Cause:%d]",
Cause->present, (int)Cause->choice.radioNetwork);
}
if (mme_ue) if (mme_ue)
CLEAR_SERVICE_INDICATOR(mme_ue); CLEAR_SERVICE_INDICATOR(mme_ue);
@ -821,53 +831,84 @@ void s1ap_handle_e_rab_setup_response(
} }
} }
ogs_debug(" IP[%s] ENB_ID[%d]", ogs_debug(" IP[%s] ENB_ID[%d]", OGS_ADDR(enb->addr, buf), enb->enb_id);
OGS_ADDR(enb->addr, buf), enb->enb_id);
ogs_assert(ENB_UE_S1AP_ID); if (!ENB_UE_S1AP_ID) {
ogs_error("No ENB_UE_S1AP_ID");
s1ap_send_error_indication(enb,
NULL, ENB_UE_S1AP_ID,
S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error);
return;
}
enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, *ENB_UE_S1AP_ID); enb_ue = enb_ue_find_by_enb_ue_s1ap_id(enb, *ENB_UE_S1AP_ID);
ogs_assert(enb_ue); if (!enb_ue) {
mme_ue = enb_ue->mme_ue; ogs_error("No eNB UE Context : ENB_UE_S1AP_ID[%lld]",
ogs_assert(mme_ue); (long long)*ENB_UE_S1AP_ID);
s1ap_send_error_indication(enb,
NULL, ENB_UE_S1AP_ID,
S1AP_Cause_PR_radioNetwork,
S1AP_CauseRadioNetwork_unknown_enb_ue_s1ap_id);
return;
}
ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
ogs_assert(E_RABSetupListBearerSURes); mme_ue = enb_ue->mme_ue;
for (i = 0; i < E_RABSetupListBearerSURes->list.count; i++) { ogs_assert(mme_ue);
S1AP_E_RABSetupItemBearerSUResIEs_t *ie2 = NULL;
S1AP_E_RABSetupItemBearerSURes_t *e_rab = NULL;
mme_bearer_t *bearer = NULL; if (E_RABSetupListBearerSURes) {
for (i = 0; i < E_RABSetupListBearerSURes->list.count; i++) {
S1AP_E_RABSetupItemBearerSUResIEs_t *ie2 = NULL;
S1AP_E_RABSetupItemBearerSURes_t *e_rab = NULL;
ie2 = (S1AP_E_RABSetupItemBearerSUResIEs_t *) mme_bearer_t *bearer = NULL;
E_RABSetupListBearerSURes->list.array[i];
ogs_assert(ie2);
e_rab = &ie2->value.choice.E_RABSetupItemBearerSURes; ie2 = (S1AP_E_RABSetupItemBearerSUResIEs_t *)
ogs_assert(e_rab); E_RABSetupListBearerSURes->list.array[i];
if (!ie2) {
ogs_error("No S1AP_E_RABSetupItemBearerSUResIEs_t");
s1ap_send_error_indication2(mme_ue,
S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error);
return;
}
bearer = mme_bearer_find_by_ue_ebi(mme_ue, e_rab->e_RAB_ID); e_rab = &ie2->value.choice.E_RABSetupItemBearerSURes;
ogs_assert(bearer); if (!e_rab) {
ogs_error("No E_RABSetupItemBearerSURes");
s1ap_send_error_indication2(mme_ue,
S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error);
return;
}
memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf, bearer = mme_bearer_find_by_ue_ebi(mme_ue, e_rab->e_RAB_ID);
sizeof(bearer->enb_s1u_teid)); if (!bearer) {
bearer->enb_s1u_teid = ntohl(bearer->enb_s1u_teid); ogs_error("Invalid e_RAB_ID[%lld]", (long long)e_rab->e_RAB_ID);
rv = ogs_asn_BIT_STRING_to_ip( s1ap_send_error_indication2(mme_ue,
&e_rab->transportLayerAddress, &bearer->enb_s1u_ip); S1AP_Cause_PR_radioNetwork,
ogs_assert(rv == OGS_OK); S1AP_CauseRadioNetwork_unknown_E_RAB_ID);
return;
}
ogs_debug(" EBI[%d]", bearer->ebi); memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf,
sizeof(bearer->enb_s1u_teid));
bearer->enb_s1u_teid = ntohl(bearer->enb_s1u_teid);
rv = ogs_asn_BIT_STRING_to_ip(
&e_rab->transportLayerAddress, &bearer->enb_s1u_ip);
ogs_assert(rv == OGS_OK);
if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) { ogs_debug(" EBI[%d]", bearer->ebi);
mme_bearer_t *linked_bearer = mme_linked_bearer(bearer);
ogs_assert(linked_bearer);
ogs_debug(" Linked-EBI[%d]", linked_bearer->ebi);
if (bearer->ebi == linked_bearer->ebi) { if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) {
mme_gtp_send_modify_bearer_request(bearer, 0); mme_bearer_t *linked_bearer = mme_linked_bearer(bearer);
} else { ogs_assert(linked_bearer);
mme_gtp_send_create_bearer_response(bearer); ogs_debug(" Linked-EBI[%d]", linked_bearer->ebi);
if (bearer->ebi == linked_bearer->ebi) {
mme_gtp_send_modify_bearer_request(bearer, 0);
} else {
mme_gtp_send_create_bearer_response(bearer);
}
} }
} }
} }