fix the PGW crash for UE initiated detach [#342]

This commit is contained in:
Sukchan Lee
2020-01-06 21:32:01 +09:00
parent 0891ee5b19
commit 3975f6e775
3 changed files with 89 additions and 36 deletions

View File

@@ -188,7 +188,7 @@ void pgw_s5c_handle_delete_session_request(
void pgw_s5c_handle_create_bearer_response(
pgw_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp_create_bearer_response_t *req)
ogs_gtp_create_bearer_response_t *rsp)
{
int rv;
ogs_gtp_f_teid_t *sgw_s5u_teid, *pgw_s5u_teid;
@@ -196,31 +196,50 @@ void pgw_s5c_handle_create_bearer_response(
pgw_bearer_t *bearer = NULL;
ogs_assert(xact);
ogs_assert(sess);
ogs_assert(req);
ogs_assert(rsp);
ogs_debug("[PGW] Create Bearer Response");
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
if (!sess) {
ogs_warn("No Context in TEID");
return;
}
ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]",
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
if (req->bearer_contexts.presence == 0) {
if (rsp->cause.presence) {
ogs_gtp_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
if (cause->value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
ogs_warn("GTP Failed [CAUSE:%d]", cause->value);
return;
}
}
if (rsp->bearer_contexts.presence == 0) {
ogs_error("No Bearer");
return;
}
if (req->bearer_contexts.eps_bearer_id.presence == 0) {
if (rsp->bearer_contexts.eps_bearer_id.presence == 0) {
ogs_error("No EPS Bearer ID");
return;
}
if (req->bearer_contexts.s5_s8_u_pgw_f_teid.presence == 0) {
if (rsp->bearer_contexts.s5_s8_u_pgw_f_teid.presence == 0) {
ogs_error("No PGW TEID");
return;
}
if (req->bearer_contexts.s5_s8_u_sgw_f_teid.presence == 0) {
if (rsp->bearer_contexts.s5_s8_u_sgw_f_teid.presence == 0) {
ogs_error("No SGW TEID");
return;
}
/* Correlate with PGW-S5U-TEID */
pgw_s5u_teid = req->bearer_contexts.s5_s8_u_pgw_f_teid.data;
pgw_s5u_teid = rsp->bearer_contexts.s5_s8_u_pgw_f_teid.data;
ogs_assert(pgw_s5u_teid);
/* Find the Bearer by PGW-S5U-TEID */
@@ -228,10 +247,10 @@ void pgw_s5c_handle_create_bearer_response(
ogs_assert(bearer);
/* Set EBI */
bearer->ebi = req->bearer_contexts.eps_bearer_id.u8;
bearer->ebi = rsp->bearer_contexts.eps_bearer_id.u8;
/* Data Plane(DL) : SGW-S5U */
sgw_s5u_teid = req->bearer_contexts.s5_s8_u_sgw_f_teid.data;
sgw_s5u_teid = rsp->bearer_contexts.s5_s8_u_sgw_f_teid.data;
bearer->sgw_s5u_teid = ntohl(sgw_s5u_teid->teid);
sgw = ogs_gtp_node_find_by_f_teid(&pgw_self()->sgw_s5u_list, sgw_s5u_teid);
if (!sgw) {
@@ -248,72 +267,101 @@ void pgw_s5c_handle_create_bearer_response(
/* Setup GTP Node */
OGS_SETUP_GTP_NODE(bearer, sgw);
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
ogs_debug("[PGW] Create Bearer Response : SGW[0x%x] --> PGW[0x%x]",
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
}
void pgw_s5c_handle_update_bearer_response(
pgw_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp_update_bearer_response_t *req)
ogs_gtp_update_bearer_response_t *rsp)
{
int rv;
ogs_assert(xact);
ogs_assert(sess);
ogs_assert(req);
ogs_assert(rsp);
ogs_debug("[PGW] Update Bearer Response");
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
if (!sess) {
ogs_warn("No Context in TEID");
return;
}
ogs_debug("[PGW] Update Bearer Request");
ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]",
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
if (req->bearer_contexts.presence == 0) {
if (rsp->cause.presence) {
ogs_gtp_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
if (cause->value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
ogs_warn("GTP Failed [CAUSE:%d]", cause->value);
return;
}
}
if (rsp->bearer_contexts.presence == 0) {
ogs_error("No Bearer");
return;
}
if (req->bearer_contexts.eps_bearer_id.presence == 0) {
if (rsp->bearer_contexts.eps_bearer_id.presence == 0) {
ogs_error("No EPS Bearer ID");
return;
}
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
ogs_debug("[PGW] Update Bearer Response : SGW[0x%x] --> PGW[0x%x]",
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
}
void pgw_s5c_handle_delete_bearer_response(
pgw_sess_t *sess, ogs_gtp_xact_t *xact,
ogs_gtp_delete_bearer_response_t *req)
ogs_gtp_delete_bearer_response_t *rsp)
{
int rv;
pgw_bearer_t *bearer = NULL;
ogs_assert(xact);
ogs_assert(sess);
ogs_assert(req);
ogs_assert(rsp);
ogs_debug("[PGW] Delete Bearer Response");
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
if (!sess) {
ogs_warn("No Context in TEID");
return;
}
ogs_debug("[PGW] Delete Bearer Request");
ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]",
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
if (req->bearer_contexts.presence == 0) {
if (rsp->cause.presence) {
ogs_gtp_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
if (cause->value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
ogs_warn("GTP Failed [CAUSE:%d]", cause->value);
return;
}
}
if (rsp->bearer_contexts.presence == 0) {
ogs_error("No Bearer");
return;
}
if (req->bearer_contexts.eps_bearer_id.presence == 0) {
if (rsp->bearer_contexts.eps_bearer_id.presence == 0) {
ogs_error("No EPS Bearer ID");
return;
}
bearer = pgw_bearer_find_by_ebi(
sess, req->bearer_contexts.eps_bearer_id.u8);
sess, rsp->bearer_contexts.eps_bearer_id.u8);
ogs_assert(bearer);
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
ogs_debug("[PGW] Delete Bearer Response : SGW[0x%x] --> PGW[0x%x]",
sess->sgw_s5c_teid, sess->pgw_s5c_teid);

View File

@@ -452,7 +452,7 @@ void sgw_s11_handle_create_bearer_response(ogs_gtp_xact_t *s11_xact,
ogs_assert(s5c_xact);
ogs_assert(message);
ogs_debug("[SGW] Cerate Bearer Reqeust");
ogs_debug("[SGW] Cerate Bearer Response");
if (!sgw_ue) {
sgw_sess_t *sess = NULL;
@@ -625,7 +625,7 @@ void sgw_s11_handle_update_bearer_response(ogs_gtp_xact_t *s11_xact,
ogs_assert(s5c_xact);
ogs_assert(message);
ogs_debug("[SGW] Update Bearer Reqeust");
ogs_debug("[SGW] Update Bearer Response");
if (!sgw_ue) {
sgw_sess_t *sess = NULL;
@@ -928,7 +928,7 @@ void sgw_s11_handle_lo_dldata_notification(sgw_bearer_t *bearer)
ogs_expect_or_return(pkbuf);
xact = ogs_gtp_xact_local_create(
sgw_ue->gnode, &message.h, pkbuf, timeout, sgw_ue);
sgw_ue->gnode, &message.h, pkbuf, NULL, sgw_ue);
ogs_expect_or_return(xact);
rv = ogs_gtp_xact_commit(xact);

View File

@@ -24,12 +24,17 @@
static void timeout(ogs_gtp_xact_t *xact, void *data)
{
sgw_ue_t *sgw_ue = data;
sgw_sess_t *sess = data;
sgw_ue_t *sgw_ue = NULL;
uint8_t type = 0;
ogs_assert(xact);
ogs_assert(sess);
sgw_ue = sess->sgw_ue;
ogs_assert(sgw_ue);
type = xact->seq[0].type;
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]",
sgw_ue->imsi_bcd, type);
}