srsue/extnas: implement handling of RRCTL parameters

This commit is contained in:
Vadim Yanitskiy 2020-07-26 05:28:37 +07:00 committed by Vadim Yanitskiy
parent e2d5c2c21d
commit 53cc75fbef
4 changed files with 51 additions and 0 deletions

View File

@ -88,6 +88,7 @@ private:
void handle_rrctl_conn_establish(rrctl::proto::msg_disc disc, const uint8_t* msg, size_t len);
void handle_rrctl_conn_release(rrctl::proto::msg_disc disc, const uint8_t* msg, size_t len);
void handle_rrctl_data(rrctl::proto::msg_disc disc, const uint8_t* msg, size_t len);
void handle_rrctl_param(rrctl::proto::msg_disc disc, const uint8_t* msg, size_t len);
void rrctl_send_confirm(rrctl::proto::msg_type type);
void rrctl_send_error(rrctl::proto::msg_type type);

View File

@ -39,6 +39,7 @@ namespace proto {
RRCTL_CONN_ESTABLISH,
RRCTL_CONN_RELEASE,
RRCTL_PAGING,
RRCTL_PARAM,
};
enum msg_disc {
@ -94,10 +95,23 @@ namespace proto {
struct __mmec_m_tmsi ueid;
} __attribute__((packed));
enum msg_param_type {
RRCTL_PARAM_UEID = 0x00,
};
struct msg_param_req {
uint8_t type;
uint8_t len;
union {
struct __mmec_m_tmsi ueid;
} u;
} __attribute__((packed));
struct msg {
struct msg_hdr hdr;
union {
struct msg_data data;
struct msg_param_req param_req;
struct msg_paging_ind paging_ind;
struct msg_plmn_search_res plmn_search_res;
struct msg_plmn_select_req plmn_select_req;

View File

@ -80,6 +80,9 @@ void nas_ext::init(usim_interface_nas* usim_, rrc_interface_nas* rrc_, gw_interf
case rrctl::proto::RRCTL_DATA:
handle_rrctl_data(disc, payload, length);
break;
case rrctl::proto::RRCTL_PARAM:
handle_rrctl_param(disc, payload, length);
break;
case rrctl::proto::RRCTL_CONN_RELEASE:
default:
nas_log->warning("%s is not handled\n", desc.c_str());
@ -178,6 +181,36 @@ void nas_ext::handle_rrctl_data(rrctl::proto::msg_disc disc, const uint8_t* msg,
rrctl_send_confirm(rrctl::proto::RRCTL_DATA);
}
void nas_ext::handle_rrctl_param(rrctl::proto::msg_disc disc, const uint8_t* msg, size_t len)
{
const struct rrctl::proto::msg_param_req* param;
srslte::s_tmsi_t ue_identity;
param = reinterpret_cast<const struct rrctl::proto::msg_param_req*> (msg);
nas_log->warning("Rx PARAM.req (type=%02x, len=%u)\n", param->type, param->len);
if (param->len != (len - 2)) { /* XXX: type + length */
nas_log->info("Received malformed PARAM.req (len=%u)\n", param->len);
rrctl_send_error(rrctl::proto::RRCTL_PARAM);
return;
}
switch (param->type) {
case rrctl::proto::RRCTL_PARAM_UEID:
ue_identity.m_tmsi = ntohl(param->u.ueid.m_tmsi);
ue_identity.mmec = param->u.ueid.mmec;
nas_log->info("Setting UEID: mmec=%x m_tmsi=%x\n",
ue_identity.mmec, ue_identity.m_tmsi);
rrc->set_ue_identity(ue_identity);
rrctl_send_confirm(rrctl::proto::RRCTL_PARAM);
break;
default:
nas_log->warning("Unhandled PARAM.req type (0x%02x)\n", param->type);
rrctl_send_error(rrctl::proto::RRCTL_PARAM);
}
}
void nas_ext::get_metrics(nas_metrics_t* m)
{
nas_metrics_t metrics = {};

View File

@ -56,6 +56,9 @@ std::string msg_hdr_desc(proto::msg_type type, proto::msg_disc disc, uint16_t le
case RRCTL_PAGING:
desc += "Paging";
break;
case RRCTL_PARAM:
desc += "Parameter";
break;
default:
desc += "<UNKNOWN>";
}