dedicated bearer done

This commit is contained in:
Sukchan Lee 2017-09-06 15:38:24 +09:00
parent 886ef5a747
commit 46ce8e0c93
6 changed files with 35 additions and 4 deletions

View File

@ -137,6 +137,8 @@ status_t esm_build_activate_dedicated_bearer_context(
linked_eps_bearer_identity;
nas_eps_quality_of_service_t *eps_qos =
&activate_dedicated_eps_bearer_context_request->eps_qos;
nas_traffic_flow_template_t *tft =
&activate_dedicated_eps_bearer_context_request->tft;
d_assert(bearer, return CORE_ERROR, "Null param");
mme_ue = bearer->mme_ue;
@ -159,6 +161,12 @@ status_t esm_build_activate_dedicated_bearer_context(
bearer->qos.mbr.downlink, bearer->qos.mbr.uplink,
bearer->qos.gbr.downlink, bearer->qos.gbr.uplink);
tft->length = bearer->tft_len;
d_assert(tft->length, return CORE_ERROR, "No TFT Len");
d_assert(bearer->tft, return CORE_ERROR, "Null param");
memcpy(tft->buffer, bearer->tft, tft->length);
core_free(bearer->tft);
d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK &&
*pkbuf,,);

View File

@ -1600,6 +1600,9 @@ status_t mme_bearer_remove(mme_bearer_t *bearer)
event_set_param1(&e, (c_uintptr_t)bearer->index);
fsm_final(&bearer->sm, &e);
fsm_clear(&bearer->sm);
if (bearer->tft)
core_free(bearer->tft);
list_remove(&bearer->sess->bearer_list, bearer);
index_free(&mme_bearer_pool, bearer);

View File

@ -305,6 +305,8 @@ typedef struct _mme_bearer_t {
c_uint32_t sgw_s1u_addr;
qos_t qos;
c_uint8_t *tft;
c_uint8_t tft_len;
/* Related Context */
mme_ue_t *mme_ue;

View File

@ -247,6 +247,11 @@ void mme_s11_handle_create_bearer_request(
d_error("No QoS");
return;
}
if (req->bearer_contexts.tft.presence == 0)
{
d_error("No TFT");
return;
}
sess = mme_sess_find_by_ebi(mme_ue, req->linked_eps_bearer_id.u8);
d_assert(sess, return,
@ -275,6 +280,12 @@ void mme_s11_handle_create_bearer_request(
bearer->qos.gbr.downlink = bearer_qos.dl_gbr;
bearer->qos.gbr.uplink = bearer_qos.ul_gbr;
/* Bearer TFT */
bearer->tft_len = req->bearer_contexts.tft.len;
d_assert(bearer->tft_len, return, "No TFT Len");
bearer->tft = core_calloc(1, bearer->tft_len);
memcpy(bearer->tft, req->bearer_contexts.tft.data, bearer->tft_len);
if (FSM_CHECK(&mme_ue->sm, emm_state_attached))
{
enb_ue_t *enb_ue = NULL;

View File

@ -79,7 +79,11 @@ status_t pgw_compile_packet_filter(pgw_rule_t *pgw_rule, c_int8_t *description)
{
uint32_t *a = ((ipfw_insn_u32 *)cmd)->d;
pgw_rule->ipv4.local.addr = a[0];
pgw_rule->ipv4.local.mask = a[1];
if (cmd->opcode == O_IP_SRC_MASK)
pgw_rule->ipv4.local.mask = a[1];
else
pgw_rule->ipv4.local.mask = 0xffffffff;
break;
}
case O_IP_DST:
@ -87,7 +91,10 @@ status_t pgw_compile_packet_filter(pgw_rule_t *pgw_rule, c_int8_t *description)
{
uint32_t *a = ((ipfw_insn_u32 *)cmd)->d;
pgw_rule->ipv4.remote.addr = a[0];
pgw_rule->ipv4.remote.mask = a[1];
if (cmd->opcode == O_IP_SRC_MASK)
pgw_rule->ipv4.remote.mask = a[1];
else
pgw_rule->ipv4.remote.mask = 0xffffffff;
break;
}
case O_IP_SRCPORT:

View File

@ -282,14 +282,14 @@ status_t pgw_s5c_build_create_bearer_request(
if (pf->rule.port.remote.low == pf->rule.port.remote.high)
{
tft.pf[i].component[j].type =
GTP_PACKET_FILTER_SINGLE_LOCAL_PORT_TYPE;
GTP_PACKET_FILTER_SINGLE_REMOTE_PORT_TYPE;
tft.pf[i].component[j].port.low = pf->rule.port.remote.low;
j++; len += 3;
}
else
{
tft.pf[i].component[j].type =
GTP_PACKET_FILTER_LOCAL_PORT_RANGE_TYPE;
GTP_PACKET_FILTER_REMOTE_PORT_RANGE_TYPE;
tft.pf[i].component[j].port.low = pf->rule.port.remote.low;
tft.pf[i].component[j].port.high = pf->rule.port.remote.high;
j++; len += 5;