mirror of https://github.com/PentHertz/srsLTE.git
Adding delete session request.
This commit is contained in:
parent
c3f0753a93
commit
8c9704ef3c
|
@ -76,6 +76,8 @@ typedef union gtpc_msg_choice
|
||||||
struct gtpc_create_session_response create_session_response;
|
struct gtpc_create_session_response create_session_response;
|
||||||
struct gtpc_modify_bearer_request modify_bearer_request;
|
struct gtpc_modify_bearer_request modify_bearer_request;
|
||||||
struct gtpc_modify_bearer_response modify_bearer_response;
|
struct gtpc_modify_bearer_response modify_bearer_response;
|
||||||
|
struct gtpc_delete_session_request delete_session_request;
|
||||||
|
struct gtpc_delete_session_response delete_session_response;
|
||||||
} gtpc_msg_choice_t;
|
} gtpc_msg_choice_t;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|
|
@ -377,5 +377,38 @@ struct gtpc_modify_bearer_response
|
||||||
//ext
|
//ext
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* GTP-C v2 Delete Session Resquest
|
||||||
|
* Ref: 3GPP TS 29.274 v10.14.0 Table 7.2.9.1-1
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
struct gtpc_delete_session_request
|
||||||
|
{
|
||||||
|
struct gtpc_cause_ie cause;
|
||||||
|
//Linked EPS Bearer ID
|
||||||
|
//User Location Information
|
||||||
|
//Indication Flags
|
||||||
|
//Protocol Configuration Options
|
||||||
|
//Originating Node
|
||||||
|
//Private extension
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* GTP-C v2 Delete Session Response
|
||||||
|
* Ref: 3GPP TS 29.274 v10.14.0 Table 7.2.10.1-1
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
struct gtpc_delete_session_response
|
||||||
|
{
|
||||||
|
struct gtpc_cause_ie cause;
|
||||||
|
//Recovery
|
||||||
|
//Protocol Configuration Options
|
||||||
|
//Private extension
|
||||||
|
};
|
||||||
|
|
||||||
} //namespace
|
} //namespace
|
||||||
#endif //GTPC_V2_MSG_H
|
#endif //GTPC_V2_MSG_H
|
||||||
|
|
|
@ -52,6 +52,7 @@ public:
|
||||||
void handle_create_session_response(srslte::gtpc_pdu *cs_resp_pdu);
|
void handle_create_session_response(srslte::gtpc_pdu *cs_resp_pdu);
|
||||||
void send_modify_bearer_request(erab_ctx_t *bearer_ctx);
|
void send_modify_bearer_request(erab_ctx_t *bearer_ctx);
|
||||||
void handle_modify_bearer_response(srslte::gtpc_pdu *mb_resp_pdu);
|
void handle_modify_bearer_response(srslte::gtpc_pdu *mb_resp_pdu);
|
||||||
|
void send_delete_session_request(ue_ctx_t *ue_ctx);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,7 @@ public:
|
||||||
|
|
||||||
void handle_create_session_request(struct srslte::gtpc_create_session_request *cs_req, struct srslte::gtpc_pdu *cs_resp_pdu);
|
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);
|
void handle_modify_bearer_request(struct srslte::gtpc_pdu *mb_req_pdu, struct srslte::gtpc_pdu *mb_resp_pdu);
|
||||||
|
void handle_delete_session_request(struct srslte::gtpc_pdu *del_req_pdu, struct srslte::gtpc_pdu *del_resp_pdu);
|
||||||
|
|
||||||
void handle_sgi_pdu(srslte::byte_buffer_t *msg);
|
void handle_sgi_pdu(srslte::byte_buffer_t *msg);
|
||||||
void handle_s1u_pdu(srslte::byte_buffer_t *msg);
|
void handle_s1u_pdu(srslte::byte_buffer_t *msg);
|
||||||
|
|
|
@ -212,4 +212,38 @@ mme_gtpc::handle_modify_bearer_response(srslte::gtpc_pdu *mb_resp_pdu)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mme_gtpc::send_delete_session_request(ue_ctx_t *ue_ctx)
|
||||||
|
{
|
||||||
|
m_mme_gtpc_log->info("Sending GTP-C Delete Session Request request\n");
|
||||||
|
srslte::gtpc_pdu del_req_pdu;
|
||||||
|
srslte::gtpc_f_teid_ie *sgw_ctrl_fteid;
|
||||||
|
|
||||||
|
//FIXME the UE control TEID sould be stored in the UE ctxt, not in the E-RAB ctxt
|
||||||
|
//Maybe a mme_s1ap_id to ctrl teid map as well?
|
||||||
|
|
||||||
|
for(int i = 0; i<MAX_ERABS_PER_UE; i++)
|
||||||
|
{
|
||||||
|
if(ue_ctx->erabs_ctx[i].state != ERAB_DEACTIVATED)
|
||||||
|
{
|
||||||
|
sgw_ctrl_fteid = &ue_ctx->erabs_ctx[i].sgw_ctrl_fteid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
srslte::gtpc_header *header = &del_req_pdu.header;
|
||||||
|
header->teid_present = true;
|
||||||
|
header->teid = sgw_ctrl_fteid->teid;
|
||||||
|
header->type = srslte::GTPC_MSG_TYPE_DELETE_SESSION_REQUEST;
|
||||||
|
|
||||||
|
srslte::gtpc_delete_session_request *del_req = &del_req_pdu.choice.delete_session_request;
|
||||||
|
del_req->cause.cause_value = srslte::GTPC_CAUSE_VALUE_ISR_DEACTIVATION;
|
||||||
|
m_mme_gtpc_log->info("GTP-C Delete Session Request -- S-GW Control TEID %d\n", sgw_ctrl_fteid->teid );
|
||||||
|
|
||||||
|
srslte::gtpc_pdu del_resp_pdu;
|
||||||
|
m_spgw->handle_delete_session_request(&del_req_pdu, &del_resp_pdu);
|
||||||
|
|
||||||
|
//TODO Handle delete session response
|
||||||
|
return;
|
||||||
|
}
|
||||||
} //namespace srsepc
|
} //namespace srsepc
|
||||||
|
|
|
@ -517,7 +517,20 @@ s1ap::handle_ue_context_release_request(LIBLTE_S1AP_MESSAGE_UECONTEXTRELEASEREQU
|
||||||
ue_set->second.erase(mme_ue_s1ap_id);
|
ue_set->second.erase(mme_ue_s1ap_id);
|
||||||
|
|
||||||
//Delete any context at the SPGW
|
//Delete any context at the SPGW
|
||||||
//m_spgw->delete_session_request(ue_ctx->imsi);
|
bool active = false;
|
||||||
|
for(int i=0;i<MAX_ERABS_PER_UE;i++)
|
||||||
|
{
|
||||||
|
if(ue_ctx->second->erabs_ctx[i].state != ERAB_DEACTIVATED)
|
||||||
|
{
|
||||||
|
active = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(active == true)
|
||||||
|
{
|
||||||
|
//There are active E-RABs, send delete session request
|
||||||
|
m_mme_gtpc->send_delete_session_request(ue_ctx->second);
|
||||||
|
}
|
||||||
|
|
||||||
//Delete UE context
|
//Delete UE context
|
||||||
delete ue_ctx->second;
|
delete ue_ctx->second;
|
||||||
|
|
|
@ -375,7 +375,7 @@ spgw::handle_sgi_pdu(srslte::byte_buffer_t *msg)
|
||||||
int n = sendto(m_s1u,msg->msg,msg->N_bytes,0,(struct sockaddr*) &enb_addr,sizeof(enb_addr));
|
int n = sendto(m_s1u,msg->msg,msg->N_bytes,0,(struct sockaddr*) &enb_addr,sizeof(enb_addr));
|
||||||
if(n<0)
|
if(n<0)
|
||||||
{
|
{
|
||||||
m_spgw_log->console("Error sending packet to eNB\n");
|
m_spgw_log->error("Error sending packet to eNB\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//m_spgw_log->console("Sent packet to %s:%d. Bytes=%d\n",inet_ntoa(enb_addr.sin_addr), GTPU_RX_PORT,n);
|
//m_spgw_log->console("Sent packet to %s:%d. Bytes=%d\n",inet_ntoa(enb_addr.sin_addr), GTPU_RX_PORT,n);
|
||||||
|
@ -437,7 +437,8 @@ spgw::handle_create_session_request(struct srslte::gtpc_create_session_request *
|
||||||
in_addr_t ue_ip = get_new_ue_ipv4();
|
in_addr_t ue_ip = get_new_ue_ipv4();
|
||||||
|
|
||||||
uint8_t default_bearer_id = 5;
|
uint8_t default_bearer_id = 5;
|
||||||
//Save the UE IP to User TEID map //TODO!!!
|
|
||||||
|
//Save the UE IP to User TEID map
|
||||||
spgw_tunnel_ctx_t *tunnel_ctx = new spgw_tunnel_ctx_t;
|
spgw_tunnel_ctx_t *tunnel_ctx = new spgw_tunnel_ctx_t;
|
||||||
tunnel_ctx->imsi = cs_req->imsi;
|
tunnel_ctx->imsi = cs_req->imsi;
|
||||||
tunnel_ctx->ebi = default_bearer_id;
|
tunnel_ctx->ebi = default_bearer_id;
|
||||||
|
@ -449,6 +450,7 @@ spgw::handle_create_session_request(struct srslte::gtpc_create_session_request *
|
||||||
tunnel_ctx->up_ctrl_fteid.teid = spgw_uplink_ctrl_teid;
|
tunnel_ctx->up_ctrl_fteid.teid = spgw_uplink_ctrl_teid;
|
||||||
tunnel_ctx->ue_ipv4 = ue_ip;
|
tunnel_ctx->ue_ipv4 = ue_ip;
|
||||||
m_teid_to_tunnel_ctx.insert(std::pair<uint32_t,spgw_tunnel_ctx_t*>(spgw_uplink_ctrl_teid,tunnel_ctx));
|
m_teid_to_tunnel_ctx.insert(std::pair<uint32_t,spgw_tunnel_ctx_t*>(spgw_uplink_ctrl_teid,tunnel_ctx));
|
||||||
|
|
||||||
//Create session response message
|
//Create session response message
|
||||||
//Setup GTP-C header
|
//Setup GTP-C header
|
||||||
header->piggyback = false;
|
header->piggyback = false;
|
||||||
|
@ -479,13 +481,9 @@ spgw::handle_create_session_request(struct srslte::gtpc_create_session_request *
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void
|
|
||||||
spgw::delete_session_request(uint64_t imsi)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
spgw::handle_modify_bearer_request(struct srslte::gtpc_pdu *mb_req_pdu, struct srslte::gtpc_pdu *mb_resp_pdu)
|
spgw::handle_modify_bearer_request(struct srslte::gtpc_pdu *mb_req_pdu, struct srslte::gtpc_pdu *mb_resp_pdu)
|
||||||
{
|
{
|
||||||
|
@ -541,4 +539,32 @@ spgw::handle_modify_bearer_request(struct srslte::gtpc_pdu *mb_req_pdu, struct s
|
||||||
printf("%d %d\n",mb_resp->eps_bearer_context_modified.ebi, tunnel_ctx->ebi);
|
printf("%d %d\n",mb_resp->eps_bearer_context_modified.ebi, tunnel_ctx->ebi);
|
||||||
mb_resp->eps_bearer_context_modified.cause.cause_value = srslte::GTPC_CAUSE_VALUE_REQUEST_ACCEPTED;
|
mb_resp->eps_bearer_context_modified.cause.cause_value = srslte::GTPC_CAUSE_VALUE_REQUEST_ACCEPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
spgw::handle_delete_session_request(struct srslte::gtpc_pdu *del_req_pdu, struct srslte::gtpc_pdu *del_resp_pdu)
|
||||||
|
{
|
||||||
|
//Find tunel ctxt
|
||||||
|
uint32_t ctrl_teid = del_req_pdu->header.teid;
|
||||||
|
std::map<uint32_t,spgw_tunnel_ctx_t*>::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 delete\n",ctrl_teid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
spgw_tunnel_ctx_t *tunnel_ctx = tunnel_it->second;
|
||||||
|
in_addr_t ue_ipv4 = tunnel_ctx->ue_ipv4;
|
||||||
|
|
||||||
|
//Delete data tunnel
|
||||||
|
pthread_mutex_lock(&m_mutex);
|
||||||
|
std::map<in_addr_t,srslte::gtpc_f_teid_ie>::iterator data_it = m_ip_to_teid.find(tunnel_ctx->ue_ipv4);
|
||||||
|
if(data_it != m_ip_to_teid.end())
|
||||||
|
{
|
||||||
|
m_ip_to_teid.erase(data_it);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&m_mutex);
|
||||||
|
|
||||||
|
delete tunnel_ctx;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
} //namespace srsepc
|
} //namespace srsepc
|
||||||
|
|
Loading…
Reference in New Issue