diff --git a/lib/include/srslte/asn1/gtpc.h b/lib/include/srslte/asn1/gtpc.h index e670333bf..e216bcf12 100644 --- a/lib/include/srslte/asn1/gtpc.h +++ b/lib/include/srslte/asn1/gtpc.h @@ -74,6 +74,8 @@ typedef union gtpc_msg_choice { struct gtpc_create_session_request create_session_request; struct gtpc_create_session_response create_session_response; + struct gtpc_modify_bearer_request modify_bearer_request; + //struct gtpc_modify_bearer_response modify_bearer_response; } gtpc_msg_choice_t; /**************************************************************************** diff --git a/srsepc/hdr/spgw/spgw.h b/srsepc/hdr/spgw/spgw.h index a9c1b9ba3..2ea2278c8 100644 --- a/srsepc/hdr/spgw/spgw.h +++ b/srsepc/hdr/spgw/spgw.h @@ -53,14 +53,14 @@ typedef struct { } spgw_args_t; -typedef struct { +typedef struct spgw_tunnel_ctx { uint64_t imsi; in_addr_t ue_ipv4; struct srslte::gtpc_f_teid_ie up_ctrl_fteid; struct srslte::gtpc_f_teid_ie up_user_fteid; struct srslte::gtpc_f_teid_ie dw_ctrl_fteid; struct srslte::gtpc_f_teid_ie dw_user_fteid; -} spgw_ue_ctx; +} spgw_tunnel_ctx_t; class spgw: public thread @@ -73,6 +73,7 @@ public: void run_thread(); void handle_create_session_request(struct srslte::gtpc_create_session_request *cs_req, struct srslte::gtpc_pdu *cs_resp_pdu); + void handle_modify_bearer_request(struct srslte::gtpc_pdu *mb_req_pdu, struct srslte::gtpc_pdu *mb_resp_pdu); private: @@ -101,8 +102,8 @@ private: uint64_t m_next_ctrl_teid; uint64_t m_next_user_teid; - std::map m_teid_to_ue_ctx; //Map control TEID to ue_ctx. Usefull to get reply ctrl TEID - std::map m_ip_to_teid; //Map IP to User-plane TEID for downlink traffic + std::map m_teid_to_tunnel_ctx; //Map control TEID to tunnel ctx. Usefull to get reply ctrl TEID, UE IP, etc. + std::map m_ip_to_teid; //Map IP to User-plane TEID for downlink traffic /*Logs*/ srslte::log_filter *m_spgw_log; diff --git a/srsepc/src/mme/mme_gtpc.cc b/srsepc/src/mme/mme_gtpc.cc index 75b811835..8da689f32 100644 --- a/srsepc/src/mme/mme_gtpc.cc +++ b/srsepc/src/mme/mme_gtpc.cc @@ -176,7 +176,7 @@ mme_gtpc::send_modify_bearer_request(erab_ctx_t *erab_ctx) header->teid = sgw_ctrl_fteid->teid; header->type = srslte::GTPC_MSG_TYPE_MODIFY_BEARER_REQUEST; - srslte::gtpc_modify_bearer_request *mb_req = &mb_req_pdu.modify_bearer_request; + srslte::gtpc_modify_bearer_request *mb_req = &mb_req_pdu.choice.modify_bearer_request; mb_req->eps_bearer_context_to_modify.ebi = erab_ctx->erab_id; mb_req->eps_bearer_context_to_modify.s1_u_enb_f_teid.ipv4 = enb_fteid->ipv4; mb_req->eps_bearer_context_to_modify.s1_u_enb_f_teid.teid = enb_fteid->teid; diff --git a/srsepc/src/spgw/spgw.cc b/srsepc/src/spgw/spgw.cc index 2f47de745..5a9b7f6c6 100644 --- a/srsepc/src/spgw/spgw.cc +++ b/srsepc/src/spgw/spgw.cc @@ -323,11 +323,11 @@ spgw::handle_create_session_request(struct srslte::gtpc_create_session_request * in_addr_t ue_ip = get_new_ue_ipv4(); //Save the UE IP to User TEID map //TODO!!! - struct sgw_ue_ctx *ue_ctx = new sgw_ue_ctx; - sgw_ue_ctx->imsi = cs_req->imsi; - sgw_ue_ctx->ul_user_fteid.teid = spgw_uplink_user_teid; - sgw_ue_ctx->ul_ctrl_fteid = spgw_uplink_ctrl_teid; - sgw_ue_ctx->ue_ipv4 = ue_ip; + spgw_tunnel_ctx_t *tunnel_ctx = new spgw_tunnel_ctx_t; + tunnel_ctx->imsi = cs_req->imsi; + tunnel_ctx->up_user_fteid.teid = spgw_uplink_user_teid; + tunnel_ctx->up_ctrl_fteid.teid = spgw_uplink_ctrl_teid; + tunnel_ctx->ue_ipv4 = ue_ip; //Create session response message //Setup GTP-C header @@ -363,13 +363,28 @@ spgw::handle_modify_bearer_request(struct srslte::gtpc_pdu *mb_req_pdu, struct s { m_spgw_log->info("Received Modified Bearer Request\n"); - //Get control tunnel info from - //Setting up Modify bearer request PDU + //Get control tunnel info from mb_req PDU + uint32_t ctrl_teid = mb_req_pdu->header.teid; + std::map::iterator tunnel_it = m_teid_to_tunnel_ctx.find(ctrl_teid); + if(tunnel_it == m_teid_to_tunnel_ctx.end()) + { + m_spgw_log->warning("Could not find TEID %d to modify",ctrl_teid); + return; + } + spgw_tunnel_ctx_t *tunnel_ctx = tunnel_it->second; + + //Store user DW link TEID + srslte::gtpc_modify_bearer_request *mb_req = &mb_req_pdu->choice.modify_bearer_request; + tunnel_ctx->dw_user_fteid = mb_req->eps_bearer_context_to_modify.s1_u_enb_f_teid; + //Set up actual tunnel + //TODO!!! + + //Setting up Modify bearer response PDU //Header srslte::gtpc_header *header = &mb_req_pdu->header; header->piggyback = false; header->teid_present = true; - header->teid = ; // + header->teid = tunnel_ctx->dw_ctrl_fteid.teid; // header->type = srslte::GTPC_MSG_TYPE_MODIFY_BEARER_RESPONSE; //PDU