Skip to content

Commit b033d97

Browse files
adding pfcp session-set-delete message
1 parent 53d75e7 commit b033d97

File tree

17 files changed

+218
-0
lines changed

17 files changed

+218
-0
lines changed

lib/pfcp/build.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,63 @@ ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_response(uint8_t type,
235235
return ogs_pfcp_build_msg(&pfcp_message);
236236
}
237237

238+
ogs_pkbuf_t *ogs_pfcp_cp_build_session_set_deletion_request(uint8_t type)
239+
{
240+
ogs_pfcp_message_t pfcp_message;
241+
ogs_pfcp_session_set_deletion_request_t *req = NULL;
242+
243+
ogs_pfcp_node_id_t node_id;
244+
int node_id_len = 0, rv;
245+
246+
ogs_debug("Session Set Deletion Request");
247+
248+
req = &pfcp_message.pfcp_session_set_deletion_request;
249+
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
250+
251+
rv = ogs_pfcp_sockaddr_to_node_id(
252+
ogs_pfcp_self()->pfcp_addr, ogs_pfcp_self()->pfcp_addr6,
253+
ogs_app()->parameter.prefer_ipv4,
254+
&node_id, &node_id_len);
255+
ogs_expect_or_return_val(rv == OGS_OK, NULL);
256+
req->node_id.presence = 1;
257+
req->node_id.data = &node_id;
258+
req->node_id.len = node_id_len;
259+
260+
pfcp_message.h.type = type;
261+
return ogs_pfcp_build_msg(&pfcp_message);
262+
}
263+
264+
ogs_pkbuf_t *ogs_pfcp_up_build_session_set_deletion_response(uint8_t type, uint8_t cause)
265+
{
266+
ogs_pfcp_message_t pfcp_message;
267+
ogs_pfcp_session_set_deletion_response_t *rsp = NULL;
268+
269+
ogs_pfcp_node_id_t node_id;
270+
int node_id_len = 0, rv;
271+
272+
ogs_debug("Session Set Deletion Response");
273+
274+
rsp = &pfcp_message.pfcp_session_set_deletion_response;
275+
memset(&pfcp_message, 0, sizeof(ogs_pfcp_message_t));
276+
277+
// node id
278+
rv = ogs_pfcp_sockaddr_to_node_id(
279+
ogs_pfcp_self()->pfcp_addr, ogs_pfcp_self()->pfcp_addr6,
280+
ogs_app()->parameter.prefer_ipv4,
281+
&node_id, &node_id_len);
282+
ogs_expect_or_return_val(rv == OGS_OK, NULL);
283+
rsp->node_id.presence = 1;
284+
rsp->node_id.data = &node_id;
285+
rsp->node_id.len = node_id_len;
286+
287+
// cause
288+
rsp->cause.presence = 1;
289+
rsp->cause.u8 = cause;
290+
291+
pfcp_message.h.type = type;
292+
return ogs_pfcp_build_msg(&pfcp_message);
293+
}
294+
238295
static struct {
239296
ogs_pfcp_f_teid_t f_teid;
240297
char dnn[OGS_MAX_DNN_LEN+1];

lib/pfcp/build.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_request(uint8_t type);
3535
ogs_pkbuf_t *ogs_pfcp_up_build_association_setup_response(uint8_t type,
3636
uint8_t cause);
3737

38+
ogs_pkbuf_t *ogs_pfcp_cp_build_session_set_deletion_request(uint8_t type);
39+
ogs_pkbuf_t *ogs_pfcp_up_build_session_set_deletion_response(uint8_t type,
40+
uint8_t cause);
41+
3842
void ogs_pfcp_pdrbuf_init(void);
3943
void ogs_pfcp_pdrbuf_clear(void);
4044

lib/pfcp/path.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,60 @@ int ogs_pfcp_cp_send_association_setup_response(ogs_pfcp_xact_t *xact,
235235
return rv;
236236
}
237237

238+
int ogs_pfcp_cp_send_session_set_deletion_request(ogs_pfcp_node_t *node,
239+
void (*cb)(ogs_pfcp_xact_t *xact, void *data))
240+
{
241+
int rv;
242+
ogs_pkbuf_t *pkbuf = NULL;
243+
ogs_pfcp_header_t h;
244+
ogs_pfcp_xact_t *xact = NULL;
245+
246+
ogs_assert(node);
247+
248+
memset(&h, 0, sizeof(ogs_pfcp_header_t));
249+
h.type = OGS_PFCP_SESSION_SET_DELETION_REQUEST_TYPE;
250+
h.seid = 0;
251+
252+
xact = ogs_pfcp_xact_local_create(node, cb, node);
253+
ogs_expect_or_return_val(xact, OGS_ERROR);
254+
255+
pkbuf = ogs_pfcp_cp_build_session_set_deletion_request(h.type);
256+
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
257+
258+
rv = ogs_pfcp_xact_update_tx(xact, &h, pkbuf);
259+
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
260+
261+
rv = ogs_pfcp_xact_commit(xact);
262+
ogs_expect(rv == OGS_OK);
263+
264+
return rv;
265+
}
266+
267+
int ogs_pfcp_up_send_session_set_deletion_response(ogs_pfcp_xact_t *xact,
268+
uint8_t cause)
269+
{
270+
int rv;
271+
ogs_pkbuf_t *pkbuf = NULL;
272+
ogs_pfcp_header_t h;
273+
274+
ogs_assert(xact);
275+
276+
memset(&h, 0, sizeof(ogs_pfcp_header_t));
277+
h.type = OGS_PFCP_SESSION_SET_DELETION_RESPONSE_TYPE;
278+
h.seid = 0;
279+
280+
pkbuf = ogs_pfcp_up_build_session_set_deletion_response(h.type, cause);
281+
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
282+
283+
rv = ogs_pfcp_xact_update_tx(xact, &h, pkbuf);
284+
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
285+
286+
rv = ogs_pfcp_xact_commit(xact);
287+
ogs_expect(rv == OGS_OK);
288+
289+
return rv;
290+
}
291+
238292
int ogs_pfcp_up_send_association_setup_request(ogs_pfcp_node_t *node,
239293
void (*cb)(ogs_pfcp_xact_t *xact, void *data))
240294
{

lib/pfcp/path.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ int ogs_pfcp_cp_send_association_setup_request(ogs_pfcp_node_t *node,
7373
int ogs_pfcp_cp_send_association_setup_response(ogs_pfcp_xact_t *xact,
7474
uint8_t cause);
7575

76+
int ogs_pfcp_cp_send_session_set_deletion_request(ogs_pfcp_node_t *node,
77+
void (*cb)(ogs_pfcp_xact_t *xact, void *data));
78+
int ogs_pfcp_up_send_session_set_deletion_response(ogs_pfcp_xact_t *xact,
79+
uint8_t cause);
80+
7681
int ogs_pfcp_up_send_association_setup_request(ogs_pfcp_node_t *node,
7782
void (*cb)(ogs_pfcp_xact_t *xact, void *data));
7883
int ogs_pfcp_up_send_association_setup_response(ogs_pfcp_xact_t *xact,

lib/pfcp/xact.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,7 @@ static ogs_pfcp_xact_stage_t ogs_pfcp_xact_get_stage(uint8_t type, uint32_t xid)
728728
case OGS_PFCP_SESSION_ESTABLISHMENT_REQUEST_TYPE:
729729
case OGS_PFCP_SESSION_MODIFICATION_REQUEST_TYPE:
730730
case OGS_PFCP_SESSION_DELETION_REQUEST_TYPE:
731+
case OGS_PFCP_SESSION_SET_DELETION_REQUEST_TYPE:
731732
case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE:
732733
stage = PFCP_XACT_INITIAL_STAGE;
733734
break;
@@ -739,6 +740,7 @@ static ogs_pfcp_xact_stage_t ogs_pfcp_xact_get_stage(uint8_t type, uint32_t xid)
739740
case OGS_PFCP_SESSION_ESTABLISHMENT_RESPONSE_TYPE:
740741
case OGS_PFCP_SESSION_MODIFICATION_RESPONSE_TYPE:
741742
case OGS_PFCP_SESSION_DELETION_RESPONSE_TYPE:
743+
case OGS_PFCP_SESSION_SET_DELETION_RESPONSE_TYPE:
742744
case OGS_PFCP_SESSION_REPORT_RESPONSE_TYPE:
743745
stage = PFCP_XACT_FINAL_STAGE;
744746
break;

src/sgwc/pfcp-sm.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,11 @@ void sgwc_pfcp_state_associated(ogs_fsm_t *s, sgwc_event_t *e)
239239
&message->pfcp_session_deletion_response);
240240
break;
241241

242+
case OGS_PFCP_SESSION_SET_DELETION_RESPONSE_TYPE:
243+
sgwc_sxa_handle_session_set_deletion_response(
244+
xact, &message->pfcp_session_set_deletion_response);
245+
break;
246+
242247
case OGS_PFCP_SESSION_REPORT_REQUEST_TYPE:
243248
if (!message->h.seid_presence) ogs_error("No SEID");
244249

src/sgwc/sxa-handler.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,6 +1311,20 @@ void sgwc_sxa_handle_session_deletion_response(
13111311
sgwc_sess_remove(sess);
13121312
}
13131313

1314+
void sgwc_sxa_handle_session_set_deletion_response(
1315+
ogs_pfcp_xact_t *pfcp_xact,
1316+
ogs_pfcp_session_set_deletion_response_t *pfcp_rsp)
1317+
{
1318+
ogs_debug("Session Set Deletion Response");
1319+
1320+
ogs_assert(pfcp_xact);
1321+
ogs_assert(pfcp_rsp);
1322+
1323+
ogs_pfcp_xact_commit(pfcp_xact);
1324+
1325+
return;
1326+
}
1327+
13141328
void sgwc_sxa_handle_session_report_request(
13151329
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
13161330
ogs_pfcp_session_report_request_t *pfcp_req)

src/sgwc/sxa-handler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ void sgwc_sxa_handle_session_deletion_response(
3838
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
3939
ogs_gtp2_message_t *gtp_message,
4040
ogs_pfcp_session_deletion_response_t *pfcp_rsp);
41+
void sgwc_sxa_handle_session_set_deletion_response(
42+
ogs_pfcp_xact_t *pfcp_xact,
43+
ogs_pfcp_session_set_deletion_response_t *pfcp_rsp);
4144
void sgwc_sxa_handle_session_report_request(
4245
sgwc_sess_t *sess, ogs_pfcp_xact_t *pfcp_xact,
4346
ogs_pfcp_session_report_request_t *pfcp_req);

src/sgwu/pfcp-sm.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ void sgwu_pfcp_state_associated(ogs_fsm_t *s, sgwu_event_t *e)
225225
sgwu_sxa_handle_session_report_response(
226226
sess, xact, &message->pfcp_session_report_response);
227227
break;
228+
case OGS_PFCP_SESSION_SET_DELETION_REQUEST_TYPE:
229+
sgwu_sxa_handle_session_set_deletion_request(
230+
node, xact, &message->pfcp_session_set_deletion_request);
231+
break;
228232
default:
229233
ogs_error("Not implemented PFCP message type[%d]",
230234
message->h.type);

src/sgwu/sxa-handler.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,26 @@ void sgwu_sxa_handle_session_deletion_request(
410410
sgwu_sess_remove(sess);
411411
}
412412

413+
void sgwu_sxa_handle_session_set_deletion_request(
414+
ogs_pfcp_node_t *node, ogs_pfcp_xact_t *xact,
415+
ogs_pfcp_session_set_deletion_request_t *req)
416+
{
417+
sgwu_sess_t *sess = NULL, *next = NULL;;
418+
ogs_assert(node);
419+
ogs_assert(xact);
420+
ogs_assert(req);
421+
422+
ogs_debug("Session Set Deletion Request");
423+
424+
ogs_list_for_each_safe(&sgwu_self()->sess_list, next, sess) {
425+
if (sess->pfcp_node == node) {
426+
sgwu_sess_remove(sess);
427+
}
428+
}
429+
430+
ogs_pfcp_up_send_session_set_deletion_response(xact, OGS_PFCP_CAUSE_REQUEST_ACCEPTED);
431+
}
432+
413433
void sgwu_sxa_handle_session_report_response(
414434
sgwu_sess_t *sess, ogs_pfcp_xact_t *xact,
415435
ogs_pfcp_session_report_response_t *rsp)

0 commit comments

Comments
 (0)