RIM: Refactor Rx path to decode stack in proper order

Previous implementation of the Rx path was first checking the APP ID
before checking the lower layer (container type), which was confusing
because the information is then not verified in ascending order in the
protocol stack.

Let's instead, first, pass the pdu to the correct container type
handler, and only once there, let each container type handler verify the
available applications.

Change-Id: Ibe017c1a6e789f45d74c4a5f5f4608298c8c9f91
This commit is contained in:
Pau Espin 2021-05-06 19:48:05 +02:00
parent c48d27b57b
commit c43570c351
1 changed files with 47 additions and 63 deletions

View File

@ -136,34 +136,6 @@ static void format_response_pdu_err(struct bssgp_ran_information_pdu *resp_pdu,
resp_pdu->rim_cont_iei = BSSGP_IE_RI_ERROR_RIM_COINTAINER;
}
/* Check if the application ID in the request PDU is actually BSSGP_RAN_INF_APP_ID_NACC */
static const enum bssgp_ran_inf_app_id *get_app_id(const struct bssgp_ran_information_pdu *pdu)
{
switch (pdu->rim_cont_iei) {
case BSSGP_IE_RI_REQ_RIM_CONTAINER:
return &pdu->decoded.req_rim_cont.app_id;
case BSSGP_IE_RI_RIM_CONTAINER:
return &pdu->decoded.rim_cont.app_id;
case BSSGP_IE_RI_APP_ERROR_RIM_CONT:
return &pdu->decoded.app_err_rim_cont.app_id;
case BSSGP_IE_RI_ACK_RIM_CONTAINER:
return &pdu->decoded.ack_rim_cont.app_id;
case BSSGP_IE_RI_ERROR_RIM_COINTAINER:
return &pdu->decoded.err_rim_cont.app_id;
default:
return NULL;
}
}
/* Check if the application ID in the request PDU is of a certain type */
static bool match_app_id(const struct bssgp_ran_information_pdu *pdu, enum bssgp_ran_inf_app_id exp_app_id)
{
const enum bssgp_ran_inf_app_id *app_id = get_app_id(pdu);
if (app_id && *app_id == exp_app_id)
return true;
return false;
}
static int handle_ran_info_response_nacc(const struct bssgp_ran_inf_app_cont_nacc *nacc, struct gprs_rlcmac_bts *bts)
{
struct si_cache_value val;
@ -197,11 +169,56 @@ static int handle_ran_info_response_nacc(const struct bssgp_ran_inf_app_cont_nac
return 0;
}
static int handle_ran_info_request(const struct bssgp_ran_information_pdu *pdu,
struct gprs_rlcmac_bts *bts, uint16_t nsei)
{
const struct bssgp_ran_inf_req_rim_cont *ri_req = &pdu->decoded.req_rim_cont;
const struct bssgp_ran_inf_req_app_cont_nacc *nacc_req;
struct bssgp_ran_information_pdu resp_pdu;
int rc;
/* Check if we support the application ID */
if (ri_req->app_id != BSSGP_RAN_INF_APP_ID_NACC) {
LOGPRIM(nsei, LOGL_ERROR,
"Rx RAN-INFO-REQ for cell %s with unknown/wrong application ID %s -- reject.\n",
osmo_cgi_ps_name(&bts->cgi_ps), bssgp_ran_inf_app_id_str(ri_req->app_id));
format_response_pdu_err(&resp_pdu, pdu);
rc = -ENOTSUP;
goto tx_ret;
}
nacc_req = &ri_req->u.app_cont_nacc;
rc = osmo_cgi_ps_cmp(&bts->cgi_ps, &nacc_req->reprt_cell);
if (rc != 0) {
LOGPRIM(nsei, LOGL_ERROR, "reporting cell in RIM application container %s "
"does not match destination cell in RIM routing info %s -- rejected.\n",
osmo_cgi_ps_name(&nacc_req->reprt_cell),
osmo_cgi_ps_name2(&bts->cgi_ps));
format_response_pdu_err(&resp_pdu, pdu);
} else {
LOGPRIM(nsei, LOGL_INFO, "Responding to RAN INFORMATION REQUEST %s ...\n",
osmo_cgi_ps_name(&nacc_req->reprt_cell));
format_response_pdu(&resp_pdu, pdu, bts);
}
tx_ret:
bssgp_tx_rim(&resp_pdu, nsei);
return rc;
}
static int handle_ran_info_response(const struct bssgp_ran_information_pdu *pdu, struct gprs_rlcmac_bts *bts)
{
const struct bssgp_ran_inf_rim_cont *ran_info = &pdu->decoded.rim_cont;
char ri_src_str[64];
/* Check if we support the application ID */
if (ran_info->app_id != BSSGP_RAN_INF_APP_ID_NACC) {
LOGP(DRIM, LOGL_ERROR,
"Rx RAN-INFO for cell %s with unknown/wrong application ID %s received -- reject.\n",
osmo_cgi_ps_name(&bts->cgi_ps), bssgp_ran_inf_app_id_str(ran_info->app_id));
return -1;
}
if (ran_info->app_err) {
LOGP(DRIM, LOGL_ERROR,
"%s Rx RAN-INFO with an app error! cause: %s\n",
@ -210,16 +227,7 @@ static int handle_ran_info_response(const struct bssgp_ran_information_pdu *pdu,
return -1;
}
switch (pdu->decoded.rim_cont.app_id) {
case BSSGP_RAN_INF_APP_ID_NACC:
handle_ran_info_response_nacc(&ran_info->u.app_cont_nacc, bts);
break;
default:
LOGP(DRIM, LOGL_ERROR, "%s Rx RAN-INFO with unknown/wrong application ID %s received\n",
bssgp_rim_ri_name_buf(ri_src_str, sizeof(ri_src_str), &pdu->routing_info_src),
bssgp_ran_inf_app_id_str(pdu->decoded.rim_cont.app_id));
return -1;
}
return 0;
}
@ -231,7 +239,6 @@ int handle_rim(struct osmo_bssgp_prim *bp)
struct bssgp_ran_information_pdu resp_pdu;
struct osmo_cell_global_id_ps dst_addr;
struct gprs_rlcmac_bts *bts;
int rc;
OSMO_ASSERT (bp->oph.sap == SAP_BSSGP_RIM);
@ -265,33 +272,10 @@ int handle_rim(struct osmo_bssgp_prim *bp)
return 0;
}
/* Check if the RIM container inside the incoming RIM PDU has the correct
* application ID */
if (!match_app_id(pdu, BSSGP_RAN_INF_APP_ID_NACC)) {
LOGPRIM(nsei, LOGL_ERROR,
"RIM PDU for cell %s with unknown/wrong application ID received -- reject.\n",
osmo_cgi_ps_name(&dst_addr));
format_response_pdu_err(&resp_pdu, pdu);
return 0;
}
/* Handle incoming RIM container */
switch (pdu->rim_cont_iei) {
case BSSGP_IE_RI_REQ_RIM_CONTAINER:
rc = osmo_cgi_ps_cmp(&dst_addr, &pdu->decoded.req_rim_cont.u.app_cont_nacc.reprt_cell);
if (rc != 0) {
LOGPRIM(nsei, LOGL_ERROR, "reporting cell in RIM application container %s "
"does not match destination cell in RIM routing info %s -- rejected.\n",
osmo_cgi_ps_name(&pdu->decoded.req_rim_cont.u.app_cont_nacc.reprt_cell),
osmo_cgi_ps_name2(&dst_addr));
format_response_pdu_err(&resp_pdu, pdu);
} else {
LOGPRIM(nsei, LOGL_INFO, "Responding to RAN INFORMATION REQUEST %s ...\n",
osmo_cgi_ps_name(&pdu->decoded.req_rim_cont.u.app_cont_nacc.reprt_cell));
format_response_pdu(&resp_pdu, pdu, bts);
}
bssgp_tx_rim(&resp_pdu, nsei);
break;
return handle_ran_info_request(pdu, bts, nsei);
case BSSGP_IE_RI_RIM_CONTAINER:
return handle_ran_info_response(pdu, bts);
case BSSGP_IE_RI_APP_ERROR_RIM_CONT: