mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-upf.git
synced 2025-11-03 13:33:31 +00:00
n-sessions [2/4]: generalize function args
Change some VTY DEFUN into generally callable functions. Prepare for N sessions commands. Related: SYS#6590 Change-Id: I112206049e704b7adad7072b1f7953f7ee4f18ca
This commit is contained in:
@@ -178,6 +178,10 @@ int peer_tx(struct pfcp_tool_peer *peer, struct osmo_pfcp_msg *m)
|
|||||||
else
|
else
|
||||||
copy_msg(&peer->last_req, m);
|
copy_msg(&peer->last_req, m);
|
||||||
rc = osmo_pfcp_endpoint_tx(g_pfcp_tool->ep, m);
|
rc = osmo_pfcp_endpoint_tx(g_pfcp_tool->ep, m);
|
||||||
|
if (rc) {
|
||||||
|
LOGP(DLPFCP, LOGL_ERROR, "Failed to transmit PFCP: %s\n", strerror(-rc));
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -402,9 +402,8 @@ enum pdr_id_fixed {
|
|||||||
PDR_ID_ACCESS = 2,
|
PDR_ID_ACCESS = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
int session_tunend_tx_est_req(struct vty *vty, const char **argv, int argc)
|
int session_tunend_tx_est_req(struct pfcp_tool_session *session, bool forw, osmo_pfcp_resp_cb resp_cb)
|
||||||
{
|
{
|
||||||
struct pfcp_tool_session *session = vty->index;
|
|
||||||
struct pfcp_tool_peer *peer = session->peer;
|
struct pfcp_tool_peer *peer = session->peer;
|
||||||
int rc;
|
int rc;
|
||||||
struct osmo_pfcp_msg *m;
|
struct osmo_pfcp_msg *m;
|
||||||
@@ -417,19 +416,19 @@ int session_tunend_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
OSMO_ASSERT(session->kind == UP_GTP_U_TUNEND);
|
OSMO_ASSERT(session->kind == UP_GTP_U_TUNEND);
|
||||||
|
|
||||||
if (!g_pfcp_tool->ep) {
|
if (!g_pfcp_tool->ep) {
|
||||||
vty_out(vty, "Endpoint not configured%s", VTY_NEWLINE);
|
LOGP(DLGLOBAL, LOGL_ERROR, "PFCP endpoint not configured\n");
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc > 0 && !strcmp("drop", argv[0]))
|
if (forw)
|
||||||
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_DROP, true);
|
|
||||||
else
|
|
||||||
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_FORW, true);
|
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_FORW, true);
|
||||||
|
else
|
||||||
|
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_DROP, true);
|
||||||
|
|
||||||
#define STR_TO_ADDR(DST, SRC) do { \
|
#define STR_TO_ADDR(DST, SRC) do { \
|
||||||
if (osmo_sockaddr_str_to_sockaddr(&SRC, &DST.u.sas)) { \
|
if (osmo_sockaddr_str_to_sockaddr(&SRC, &DST.u.sas)) { \
|
||||||
vty_out(vty, "Error in " #SRC ": " OSMO_SOCKADDR_STR_FMT "%s", \
|
LOGP(DLGLOBAL, LOGL_ERROR, "Error in " #SRC ": " OSMO_SOCKADDR_STR_FMT "\n", \
|
||||||
OSMO_SOCKADDR_STR_FMT_ARGS(&SRC), VTY_NEWLINE); \
|
OSMO_SOCKADDR_STR_FMT_ARGS(&SRC)); \
|
||||||
return CMD_WARNING; \
|
return CMD_WARNING; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
@@ -469,6 +468,10 @@ int session_tunend_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
osmo_pfcp_ip_addrs_set(&cp_f_seid.ip_addr, osmo_pfcp_endpoint_get_local_addr(g_pfcp_tool->ep));
|
osmo_pfcp_ip_addrs_set(&cp_f_seid.ip_addr, osmo_pfcp_endpoint_get_local_addr(g_pfcp_tool->ep));
|
||||||
|
|
||||||
m = osmo_pfcp_msg_alloc_tx_req(OTC_SELECT, &peer->remote_addr, OSMO_PFCP_MSGT_SESSION_EST_REQ);
|
m = osmo_pfcp_msg_alloc_tx_req(OTC_SELECT, &peer->remote_addr, OSMO_PFCP_MSGT_SESSION_EST_REQ);
|
||||||
|
|
||||||
|
m->ctx.resp_cb = resp_cb;
|
||||||
|
m->ctx.priv = session;
|
||||||
|
|
||||||
m->h.seid_present = true;
|
m->h.seid_present = true;
|
||||||
/* the UPF has yet to assign a SEID for itself, no matter what SEID we (the CPF) use for this session */
|
/* the UPF has yet to assign a SEID for itself, no matter what SEID we (the CPF) use for this session */
|
||||||
m->h.seid = 0;
|
m->h.seid = 0;
|
||||||
@@ -536,16 +539,13 @@ int session_tunend_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
};
|
};
|
||||||
|
|
||||||
rc = peer_tx(peer, m);
|
rc = peer_tx(peer, m);
|
||||||
if (rc) {
|
if (rc)
|
||||||
vty_out(vty, "Failed to transmit: %s%s", strerror(-rc), VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int session_tunmap_tx_est_req(struct vty *vty, const char **argv, int argc)
|
int session_tunmap_tx_est_req(struct pfcp_tool_session *session, bool forw, osmo_pfcp_resp_cb resp_cb)
|
||||||
{
|
{
|
||||||
struct pfcp_tool_session *session = vty->index;
|
|
||||||
struct pfcp_tool_peer *peer = session->peer;
|
struct pfcp_tool_peer *peer = session->peer;
|
||||||
int rc;
|
int rc;
|
||||||
struct osmo_pfcp_msg *m;
|
struct osmo_pfcp_msg *m;
|
||||||
@@ -561,14 +561,14 @@ int session_tunmap_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
struct osmo_pfcp_ie_apply_action aa = {};
|
struct osmo_pfcp_ie_apply_action aa = {};
|
||||||
|
|
||||||
if (!g_pfcp_tool->ep) {
|
if (!g_pfcp_tool->ep) {
|
||||||
vty_out(vty, "Endpoint not configured%s", VTY_NEWLINE);
|
LOGP(DLGLOBAL, LOGL_ERROR, "PFCP endpoint not configured\n");
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc > 0 && !strcmp("drop", argv[0]))
|
if (forw)
|
||||||
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_DROP, true);
|
|
||||||
else
|
|
||||||
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_FORW, true);
|
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_FORW, true);
|
||||||
|
else
|
||||||
|
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_DROP, true);
|
||||||
|
|
||||||
if (session->tunmap.access.local.teid == 0) {
|
if (session->tunmap.access.local.teid == 0) {
|
||||||
f_teid_access_local = (struct osmo_pfcp_ie_f_teid){
|
f_teid_access_local = (struct osmo_pfcp_ie_f_teid){
|
||||||
@@ -630,6 +630,10 @@ int session_tunmap_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
osmo_pfcp_ip_addrs_set(&cp_f_seid.ip_addr, osmo_pfcp_endpoint_get_local_addr(g_pfcp_tool->ep));
|
osmo_pfcp_ip_addrs_set(&cp_f_seid.ip_addr, osmo_pfcp_endpoint_get_local_addr(g_pfcp_tool->ep));
|
||||||
|
|
||||||
m = osmo_pfcp_msg_alloc_tx_req(OTC_SELECT, &peer->remote_addr, OSMO_PFCP_MSGT_SESSION_EST_REQ);
|
m = osmo_pfcp_msg_alloc_tx_req(OTC_SELECT, &peer->remote_addr, OSMO_PFCP_MSGT_SESSION_EST_REQ);
|
||||||
|
|
||||||
|
m->ctx.resp_cb = resp_cb;
|
||||||
|
m->ctx.priv = session;
|
||||||
|
|
||||||
m->h.seid_present = true;
|
m->h.seid_present = true;
|
||||||
m->h.seid = 0;
|
m->h.seid = 0;
|
||||||
/* GTP tunmap: remove header from both directions, and add header in both directions */
|
/* GTP tunmap: remove header from both directions, and add header in both directions */
|
||||||
@@ -696,10 +700,8 @@ int session_tunmap_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
};
|
};
|
||||||
|
|
||||||
rc = peer_tx(peer, m);
|
rc = peer_tx(peer, m);
|
||||||
if (rc) {
|
if (rc)
|
||||||
vty_out(vty, "Failed to transmit: %s%s", strerror(-rc), VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -710,24 +712,20 @@ DEFUN(session_tx_est_req, session_tx_est_req_cmd,
|
|||||||
"Set FAR to DROP = 1\n")
|
"Set FAR to DROP = 1\n")
|
||||||
{
|
{
|
||||||
struct pfcp_tool_session *session = vty->index;
|
struct pfcp_tool_session *session = vty->index;
|
||||||
|
bool forw = (argc == 0 || !strcmp("forw", argv[0]));
|
||||||
switch (session->kind) {
|
switch (session->kind) {
|
||||||
case UP_GTP_U_TUNEND:
|
case UP_GTP_U_TUNEND:
|
||||||
return session_tunend_tx_est_req(vty, argv, argc);
|
return session_tunend_tx_est_req(session, forw, NULL);
|
||||||
case UP_GTP_U_TUNMAP:
|
case UP_GTP_U_TUNMAP:
|
||||||
return session_tunmap_tx_est_req(vty, argv, argc);
|
return session_tunmap_tx_est_req(session, forw, NULL);
|
||||||
default:
|
default:
|
||||||
vty_out(vty, "unknown gtp action%s", VTY_NEWLINE);
|
vty_out(vty, "unknown gtp action%s", VTY_NEWLINE);
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN(session_tx_mod_req, session_tx_mod_req_cmd,
|
int session_tunmap_tx_mod_req(struct pfcp_tool_session *session, bool forw, osmo_pfcp_resp_cb resp_cb)
|
||||||
"tx session-mod-req far [(forw|drop)]",
|
|
||||||
TX_STR "Send a Session Modification Request\n"
|
|
||||||
"Set FAR to FORW = 1\n"
|
|
||||||
"Set FAR to DROP = 1\n")
|
|
||||||
{
|
{
|
||||||
struct pfcp_tool_session *session = vty->index;
|
|
||||||
struct pfcp_tool_peer *peer = session->peer;
|
struct pfcp_tool_peer *peer = session->peer;
|
||||||
int rc;
|
int rc;
|
||||||
struct osmo_pfcp_msg *m;
|
struct osmo_pfcp_msg *m;
|
||||||
@@ -735,14 +733,14 @@ DEFUN(session_tx_mod_req, session_tx_mod_req_cmd,
|
|||||||
struct osmo_pfcp_ie_f_seid cp_f_seid;
|
struct osmo_pfcp_ie_f_seid cp_f_seid;
|
||||||
|
|
||||||
if (!g_pfcp_tool->ep) {
|
if (!g_pfcp_tool->ep) {
|
||||||
vty_out(vty, "Endpoint not configured%s", VTY_NEWLINE);
|
LOGP(DLGLOBAL, LOGL_ERROR, "PFCP endpoint not configured\n");
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc > 0 && !strcmp("drop", argv[0]))
|
if (forw)
|
||||||
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_DROP, true);
|
|
||||||
else
|
|
||||||
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_FORW, true);
|
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_FORW, true);
|
||||||
|
else
|
||||||
|
osmo_pfcp_bits_set(aa.bits, OSMO_PFCP_APPLY_ACTION_DROP, true);
|
||||||
|
|
||||||
cp_f_seid = (struct osmo_pfcp_ie_f_seid){
|
cp_f_seid = (struct osmo_pfcp_ie_f_seid){
|
||||||
.seid = session->cp_seid,
|
.seid = session->cp_seid,
|
||||||
@@ -750,6 +748,10 @@ DEFUN(session_tx_mod_req, session_tx_mod_req_cmd,
|
|||||||
osmo_pfcp_ip_addrs_set(&cp_f_seid.ip_addr, osmo_pfcp_endpoint_get_local_addr(g_pfcp_tool->ep));
|
osmo_pfcp_ip_addrs_set(&cp_f_seid.ip_addr, osmo_pfcp_endpoint_get_local_addr(g_pfcp_tool->ep));
|
||||||
|
|
||||||
m = osmo_pfcp_msg_alloc_tx_req(OTC_SELECT, &peer->remote_addr, OSMO_PFCP_MSGT_SESSION_MOD_REQ);
|
m = osmo_pfcp_msg_alloc_tx_req(OTC_SELECT, &peer->remote_addr, OSMO_PFCP_MSGT_SESSION_MOD_REQ);
|
||||||
|
|
||||||
|
m->ctx.resp_cb = resp_cb;
|
||||||
|
m->ctx.priv = session;
|
||||||
|
|
||||||
m->h.seid_present = true;
|
m->h.seid_present = true;
|
||||||
m->h.seid = session->up_f_seid.seid;
|
m->h.seid = session->up_f_seid.seid;
|
||||||
m->ies.session_mod_req = (struct osmo_pfcp_msg_session_mod_req){
|
m->ies.session_mod_req = (struct osmo_pfcp_msg_session_mod_req){
|
||||||
@@ -771,13 +773,25 @@ DEFUN(session_tx_mod_req, session_tx_mod_req_cmd,
|
|||||||
};
|
};
|
||||||
|
|
||||||
rc = peer_tx(peer, m);
|
rc = peer_tx(peer, m);
|
||||||
if (rc) {
|
if (rc)
|
||||||
vty_out(vty, "Failed to transmit: %s%s", strerror(-rc), VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFUN(session_tx_mod_req, session_tx_mod_req_cmd,
|
||||||
|
"tx session-mod-req far [(forw|drop)]",
|
||||||
|
TX_STR "Send a Session Modification Request\n"
|
||||||
|
"Set FAR to FORW = 1\n"
|
||||||
|
"Set FAR to DROP = 1\n")
|
||||||
|
{
|
||||||
|
struct pfcp_tool_session *session = vty->index;
|
||||||
|
bool forw = (argc == 0 || !strcmp("forw", argv[0]));
|
||||||
|
int rc = session_tunmap_tx_mod_req(session, forw, NULL);
|
||||||
|
if (rc != CMD_SUCCESS)
|
||||||
|
vty_out(vty, "Failed to send Session Modification Request%s", VTY_NEWLINE);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
DEFUN(session_tx_del_req, session_tx_del_req_cmd,
|
DEFUN(session_tx_del_req, session_tx_del_req_cmd,
|
||||||
"tx session-del-req",
|
"tx session-del-req",
|
||||||
TX_STR "Send a Session Deletion Request\n")
|
TX_STR "Send a Session Deletion Request\n")
|
||||||
|
|||||||
Reference in New Issue
Block a user