srsue/extnas: implement handling of RRCTL parameters
This commit is contained in:
parent
e2d5c2c21d
commit
53cc75fbef
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 = {};
|
||||
|
|
|
@ -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>";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue