mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-upf.git
synced 2025-11-03 21:43:34 +00:00
osmo_pfcp_tool: make usable again
Some things in osmo-upf and libosmo-pfcp have changed without accounting
for that in osmo-pfcp-tool. (This tool is not that important, forgive me
for submitting various changes in one patch.)
Properly represent all of {access,core} x {local,remote} GTP F-TEIDs in
the internal osmo-pfcp-tool state.
Adjust and clarify osmo-pfcp-tool script commands.
Adjust the osmo-pfcp-tool scripts in contrib so that they work again.
Change-Id: I22cfaa4aedd465c81de85e673b9960eaf99c426b
This commit is contained in:
@@ -23,5 +23,3 @@ pfcp
|
|||||||
local-addr 127.0.0.11
|
local-addr 127.0.0.11
|
||||||
tunend
|
tunend
|
||||||
dev create apn11 127.0.0.11
|
dev create apn11 127.0.0.11
|
||||||
tunmap
|
|
||||||
table-name osmo-upf-11
|
|
||||||
|
|||||||
@@ -21,7 +21,5 @@ ctrl
|
|||||||
timer pfcp x24 5000
|
timer pfcp x24 5000
|
||||||
pfcp
|
pfcp
|
||||||
local-addr 127.0.0.12
|
local-addr 127.0.0.12
|
||||||
tunend
|
|
||||||
dev create apn12 127.0.0.12
|
|
||||||
tunmap
|
tunmap
|
||||||
table-name osmo-upf-12
|
table-name osmo-upf-12
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
timer pfcp x23 0
|
timer pfcp x23 0
|
||||||
pfcp-peer 127.0.0.1
|
pfcp-peer 127.0.0.1
|
||||||
session tunend
|
session tunend
|
||||||
|
ue ip 127.127.127.127
|
||||||
|
gtp access remote f-teid 127.0.0.127 127
|
||||||
tx session-est-req
|
tx session-est-req
|
||||||
|
|||||||
@@ -3,12 +3,14 @@ pfcp-peer 127.0.0.1
|
|||||||
tx assoc-setup-req
|
tx assoc-setup-req
|
||||||
sleep 1
|
sleep 1
|
||||||
session
|
session
|
||||||
|
ue ip 127.127.127.127
|
||||||
|
gtp access remote f-teid 127.0.0.127 127
|
||||||
tx session-est-req drop
|
tx session-est-req drop
|
||||||
sleep 3
|
sleep 3
|
||||||
tx session-mod-req forw
|
tx session-mod-req far forw
|
||||||
sleep 5
|
sleep 5
|
||||||
tx session-mod-req drop
|
tx session-mod-req far drop
|
||||||
sleep 3
|
sleep 3
|
||||||
tx session-mod-req forw
|
tx session-mod-req far forw
|
||||||
sleep 3
|
sleep 3
|
||||||
tx session-del-req
|
tx session-del-req
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# ACCESS HOP CORE
|
# ACCESS UPF tunmap UPF tunend (CORE)
|
||||||
# session 23 = tunmap session 42 = encaps/decaps
|
# session 23 = tunmap session 42 = encaps/decaps
|
||||||
# GTP 127.0.0.13 127.0.0.12 127.0.0.11
|
# GTP 127.0.0.13 127.0.0.12 127.0.0.11
|
||||||
# TEID l:23 r:123 <---> r:23 l:123 | l:142 r:42 <---> r:142 l:42 | 192.168.100.42
|
# TEID l:23 r:123 <---> r:23 l:123 | l:142 r:42 <---> r:142 l:42 | 192.168.100.42
|
||||||
@@ -13,8 +13,8 @@ pfcp-peer 127.0.0.11
|
|||||||
sleep 1
|
sleep 1
|
||||||
session tunend 42
|
session tunend 42
|
||||||
ue ip 192.168.100.42
|
ue ip 192.168.100.42
|
||||||
gtp access ip 127.0.0.12
|
gtp access local f-teid 127.0.0.11 42
|
||||||
gtp access teid local 42 remote 142
|
gtp access remote f-teid 127.0.0.12 142
|
||||||
tx session-est-req
|
tx session-est-req
|
||||||
sleep 1
|
sleep 1
|
||||||
|
|
||||||
@@ -22,9 +22,9 @@ pfcp-peer 127.0.0.12
|
|||||||
tx assoc-setup-req
|
tx assoc-setup-req
|
||||||
sleep 1
|
sleep 1
|
||||||
session tunmap 23
|
session tunmap 23
|
||||||
gtp core ip 127.0.0.11
|
gtp core remote f-teid 127.0.0.11 42
|
||||||
gtp core teid local 142 remote 42
|
gtp core local f-teid 127.0.0.12 142
|
||||||
gtp access ip 127.0.0.13
|
gtp access local f-teid 127.0.0.12 123
|
||||||
gtp access teid local 123 remote 23
|
gtp access remote f-teid 127.0.0.13 23
|
||||||
tx session-est-req
|
tx session-est-req
|
||||||
sleep 1
|
sleep 1
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ pfcp-peer 127.0.0.1
|
|||||||
tx assoc-setup-req
|
tx assoc-setup-req
|
||||||
sleep 1
|
sleep 1
|
||||||
session tunend
|
session tunend
|
||||||
|
ue ip 127.127.127.127
|
||||||
|
gtp access local f-teid choose
|
||||||
|
gtp access remote f-teid 127.0.0.12 142
|
||||||
tx session-est-req forw
|
tx session-est-req forw
|
||||||
sleep 5
|
sleep 5
|
||||||
tx session-del-req
|
tx session-del-req
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ pfcp-peer 127.0.0.1
|
|||||||
tx assoc-setup-req
|
tx assoc-setup-req
|
||||||
sleep 1
|
sleep 1
|
||||||
session tunmap
|
session tunmap
|
||||||
|
gtp core remote f-teid 127.0.0.11 42
|
||||||
|
gtp core local f-teid choose
|
||||||
|
gtp access local f-teid choose
|
||||||
|
gtp access remote f-teid 127.0.0.13 23
|
||||||
tx session-est-req
|
tx session-est-req
|
||||||
sleep 5
|
sleep 5
|
||||||
tx session-del-req
|
tx session-del-req
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ struct pfcp_tool_session *pfcp_tool_session_find(struct pfcp_tool_peer *peer, ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct pfcp_tool_session *pfcp_tool_session_find_or_create(struct pfcp_tool_peer *peer, uint64_t cp_seid,
|
struct pfcp_tool_session *pfcp_tool_session_find_or_create(struct pfcp_tool_peer *peer, uint64_t cp_seid,
|
||||||
enum up_gtp_action_kind gtp_action)
|
enum up_gtp_action_kind kind)
|
||||||
{
|
{
|
||||||
struct pfcp_tool_session *session = pfcp_tool_session_find(peer, cp_seid);
|
struct pfcp_tool_session *session = pfcp_tool_session_find(peer, cp_seid);
|
||||||
if (session)
|
if (session)
|
||||||
@@ -95,7 +95,7 @@ struct pfcp_tool_session *pfcp_tool_session_find_or_create(struct pfcp_tool_peer
|
|||||||
*session = (struct pfcp_tool_session){
|
*session = (struct pfcp_tool_session){
|
||||||
.peer = peer,
|
.peer = peer,
|
||||||
.cp_seid = cp_seid,
|
.cp_seid = cp_seid,
|
||||||
.gtp_action = gtp_action,
|
.kind = kind,
|
||||||
};
|
};
|
||||||
llist_add(&session->entry, &peer->sessions);
|
llist_add(&session->entry, &peer->sessions);
|
||||||
return session;
|
return session;
|
||||||
|
|||||||
@@ -51,30 +51,43 @@ struct pfcp_tool_peer {
|
|||||||
struct llist_head sessions;
|
struct llist_head sessions;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pfcp_tool_teid_pair {
|
struct pfcp_tool_gtp_tun_ep {
|
||||||
uint32_t local;
|
struct osmo_sockaddr_str addr;
|
||||||
uint32_t remote;
|
uint32_t teid;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pfcp_tool_gtp_tun {
|
||||||
|
struct pfcp_tool_gtp_tun_ep local;
|
||||||
|
struct pfcp_tool_gtp_tun_ep remote;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pfcp_tool_tunend_desc {
|
||||||
|
struct pfcp_tool_gtp_tun access;
|
||||||
|
struct {
|
||||||
|
struct osmo_sockaddr_str ue_local_addr;
|
||||||
|
} core;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pfcp_tool_tunmap_desc {
|
||||||
|
struct pfcp_tool_gtp_tun access;
|
||||||
|
struct pfcp_tool_gtp_tun core;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pfcp_tool_session {
|
struct pfcp_tool_session {
|
||||||
struct llist_head entry;
|
struct llist_head entry;
|
||||||
|
|
||||||
enum up_gtp_action_kind gtp_action;
|
|
||||||
|
|
||||||
struct pfcp_tool_peer *peer;
|
struct pfcp_tool_peer *peer;
|
||||||
uint64_t cp_seid;
|
uint64_t cp_seid;
|
||||||
struct osmo_pfcp_ie_f_seid up_f_seid;
|
struct osmo_pfcp_ie_f_seid up_f_seid;
|
||||||
|
|
||||||
struct {
|
enum up_gtp_action_kind kind;
|
||||||
struct pfcp_tool_teid_pair teid;
|
union {
|
||||||
struct osmo_sockaddr_str gtp_ip;
|
/* En-/De-capsulate GTP: add/remove a GTP header and forward the GTP payload from/to plain IP. */
|
||||||
} access;
|
struct pfcp_tool_tunend_desc tunend;
|
||||||
|
|
||||||
struct {
|
/* Tunnel-map GTP: translate from one TEID to another and forward */
|
||||||
struct pfcp_tool_teid_pair teid;
|
struct pfcp_tool_tunmap_desc tunmap;
|
||||||
struct osmo_sockaddr_str gtp_ip;
|
};
|
||||||
struct osmo_sockaddr_str ue_addr;
|
|
||||||
} core;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct g_pfcp_tool {
|
struct g_pfcp_tool {
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ DEFUN(peer_retrans_req, peer_retrans_req_cmd,
|
|||||||
else
|
else
|
||||||
*m = peer->last_resp;
|
*m = peer->last_resp;
|
||||||
|
|
||||||
OSMO_LOG_PFCP_MSG(m, LOGL_DEBUG, "retrans %s\n", argv[0]);
|
OSMO_LOG_PFCP_MSG(m, LOGL_INFO, "retrans %s\n", argv[0]);
|
||||||
|
|
||||||
rc = osmo_pfcp_endpoint_tx_data(g_pfcp_tool->ep, m);
|
rc = osmo_pfcp_endpoint_tx_data(g_pfcp_tool->ep, m);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
@@ -261,15 +261,15 @@ DEFUN(session, session_cmd,
|
|||||||
{
|
{
|
||||||
struct pfcp_tool_peer *peer = vty->index;
|
struct pfcp_tool_peer *peer = vty->index;
|
||||||
struct pfcp_tool_session *session;
|
struct pfcp_tool_session *session;
|
||||||
enum up_gtp_action_kind gtp_action = UP_GTP_U_TUNEND;
|
enum up_gtp_action_kind kind = UP_GTP_U_TUNEND;
|
||||||
|
|
||||||
if (argc > 0 && !strcmp(argv[0], "tunmap"))
|
if (argc > 0 && !strcmp(argv[0], "tunmap"))
|
||||||
gtp_action = UP_GTP_U_TUNMAP;
|
kind = UP_GTP_U_TUNMAP;
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
session = pfcp_tool_session_find_or_create(peer, atoll(argv[1]), gtp_action);
|
session = pfcp_tool_session_find_or_create(peer, atoll(argv[1]), kind);
|
||||||
else
|
else
|
||||||
session = pfcp_tool_session_find_or_create(peer, peer_new_seid(peer), gtp_action);
|
session = pfcp_tool_session_find_or_create(peer, peer_new_seid(peer), kind);
|
||||||
|
|
||||||
vty->index = session;
|
vty->index = session;
|
||||||
vty->node = SESSION_NODE;
|
vty->node = SESSION_NODE;
|
||||||
@@ -288,54 +288,112 @@ DEFUN(s_ue, s_ue_cmd,
|
|||||||
"IP address assigned to the UE\n")
|
"IP address assigned to the UE\n")
|
||||||
{
|
{
|
||||||
struct pfcp_tool_session *session = vty->index;
|
struct pfcp_tool_session *session = vty->index;
|
||||||
if (osmo_sockaddr_str_from_str2(&session->core.ue_addr, argv[0])) {
|
|
||||||
|
if (session->kind != UP_GTP_U_TUNEND) {
|
||||||
|
vty_out(vty, "%% Error: 'ue ip' makes no sense in a 'tunmap' session%s", VTY_NEWLINE);
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
if (osmo_sockaddr_str_from_str2(&session->tunend.core.ue_local_addr, argv[0])) {
|
||||||
vty_out(vty, "Error setting UE IP address%s", VTY_NEWLINE);
|
vty_out(vty, "Error setting UE IP address%s", VTY_NEWLINE);
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN(s_teid, s_teid_cmd,
|
#define GTP_ACCESS_CORE_STRS \
|
||||||
"gtp (access|core) teid local <0-4294967295> remote <0-4294967295>",
|
"Setup GTP\n" \
|
||||||
"Setup TEID used in GTP\n"
|
"Setup GTP towards ACCESS (towards the radio network and the actual UE)\n" \
|
||||||
"Set the TEIDs towards the ACCESS network (towards the radio network and the actual UE)\n"
|
"Setup GTP towards CORE (towards the internet)\n"
|
||||||
"Set the TEIDs towards the CORE network (towards the internet)\n"
|
#define GTP_LOCAL_STR "Setup GTP on the local side (UPF's local GTP endpoint)\n"
|
||||||
"Local TEID, which the UPF expects to see in incoming GTP packets\n"
|
#define GTP_REMOTE_STR "Setup GTP on the remote side (UPF's remote GTP peer)\n"
|
||||||
"Local TEID, when 0 tell the UPF to choose (PFCP: FAR F-TEID: CHOOSE=1)\n"
|
#define F_TEID_STR "Set the fully-qualified TEID, i.e. GTP IP address and TEID\n"
|
||||||
"Remote TEID, which the UPF sends out in GTP packets\n"
|
|
||||||
"Remote TEID, which the GTP peer has assigned for itself\n")
|
DEFUN(s_f_teid, s_f_teid_cmd,
|
||||||
|
"gtp (access|core) (local|remote) f-teid A.B.C.D <0-4294967295>",
|
||||||
|
GTP_ACCESS_CORE_STRS
|
||||||
|
GTP_LOCAL_STR GTP_REMOTE_STR
|
||||||
|
F_TEID_STR
|
||||||
|
"GTP peer IP address\n"
|
||||||
|
"GTP TEID\n")
|
||||||
{
|
{
|
||||||
struct pfcp_tool_session *session = vty->index;
|
struct pfcp_tool_session *session = vty->index;
|
||||||
struct pfcp_tool_teid_pair *dst;
|
const char *tun_side = argv[0];
|
||||||
if (!strcmp(argv[0], "access"))
|
const char *local_remote = argv[1];
|
||||||
dst = &session->access.teid;
|
const char *addr_str = argv[2];
|
||||||
else
|
const char *teid_str = argv[3];
|
||||||
dst = &session->core.teid;
|
struct pfcp_tool_gtp_tun_ep *dst;
|
||||||
*dst = (struct pfcp_tool_teid_pair){
|
|
||||||
.local = atoi(argv[1]),
|
switch (session->kind) {
|
||||||
.remote = atoi(argv[2]),
|
case UP_GTP_U_TUNEND:
|
||||||
};
|
if (!strcmp(tun_side, "access")) {
|
||||||
|
if (!strcmp(local_remote, "local"))
|
||||||
|
dst = &session->tunend.access.local;
|
||||||
|
else
|
||||||
|
dst = &session->tunend.access.remote;
|
||||||
|
} else {
|
||||||
|
vty_out(vty, "%% Error: 'gtp core (local|remote) f-teid': 'tunend' only has GTP on"
|
||||||
|
" the 'access' side%s", VTY_NEWLINE);
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UP_GTP_U_TUNMAP:
|
||||||
|
if (!strcmp(tun_side, "access")) {
|
||||||
|
if (!strcmp(local_remote, "local"))
|
||||||
|
dst = &session->tunmap.access.local;
|
||||||
|
else
|
||||||
|
dst = &session->tunmap.access.remote;
|
||||||
|
} else {
|
||||||
|
if (!strcmp(local_remote, "local"))
|
||||||
|
dst = &session->tunmap.core.local;
|
||||||
|
else
|
||||||
|
dst = &session->tunmap.core.remote;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
OSMO_ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (osmo_sockaddr_str_from_str2(&dst->addr, addr_str)) {
|
||||||
|
vty_out(vty, "Error setting GTP IP address from %s%s",
|
||||||
|
osmo_quote_cstr_c(OTC_SELECT, addr_str, -1), VTY_NEWLINE);
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
dst->teid = atoi(teid_str);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN(s_gtp, s_gtp_cmd,
|
DEFUN(s_f_teid_choose, s_f_teid_choose_cmd,
|
||||||
"gtp (access|core) ip A.B.C.D",
|
"gtp (access|core) local f-teid choose",
|
||||||
"Setup GTP peer\n"
|
GTP_ACCESS_CORE_STRS
|
||||||
"Set the GTP peer towards the ACCESS network (towards the radio network and the actual UE)\n"
|
GTP_LOCAL_STR
|
||||||
"Set the GTP peer towards the CORE network (towards the internet)\n"
|
F_TEID_STR
|
||||||
"Set the GTP peer IP address, where to send GTP packets to / receive GTP packets from\n"
|
"Send F-TEID with CHOOSE=1, i.e. the UPF shall return the local F-TEID in a PFCP Created PDR IE\n")
|
||||||
"GTP peer IP address\n")
|
|
||||||
{
|
{
|
||||||
struct pfcp_tool_session *session = vty->index;
|
struct pfcp_tool_session *session = vty->index;
|
||||||
struct osmo_sockaddr_str *dst;
|
const char *tun_side = argv[0];
|
||||||
if (!strcmp(argv[0], "access"))
|
struct pfcp_tool_gtp_tun_ep *dst;
|
||||||
dst = &session->access.gtp_ip;
|
|
||||||
else
|
switch (session->kind) {
|
||||||
dst = &session->core.gtp_ip;
|
case UP_GTP_U_TUNEND:
|
||||||
if (osmo_sockaddr_str_from_str2(dst, argv[1])) {
|
if (!strcmp(tun_side, "access")) {
|
||||||
vty_out(vty, "Error setting GTP IP address%s", VTY_NEWLINE);
|
dst = &session->tunend.access.local;
|
||||||
return CMD_WARNING;
|
} else {
|
||||||
|
vty_out(vty, "%% Error: 'gtp core local choose': 'tunend' only has GTP on"
|
||||||
|
" the 'access' side%s", VTY_NEWLINE);
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UP_GTP_U_TUNMAP:
|
||||||
|
if (!strcmp(tun_side, "access"))
|
||||||
|
dst = &session->tunmap.access.local;
|
||||||
|
else
|
||||||
|
dst = &session->tunmap.core.local;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
OSMO_ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*dst = (struct pfcp_tool_gtp_tun_ep){};
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,6 +409,8 @@ int session_tunend_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
struct osmo_sockaddr ue_addr;
|
struct osmo_sockaddr ue_addr;
|
||||||
struct osmo_pfcp_ie_f_seid cp_f_seid;
|
struct osmo_pfcp_ie_f_seid cp_f_seid;
|
||||||
|
|
||||||
|
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);
|
vty_out(vty, "Endpoint not configured%s", VTY_NEWLINE);
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
@@ -361,12 +421,17 @@ int session_tunend_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
else
|
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);
|
||||||
|
|
||||||
if (osmo_sockaddr_str_to_sockaddr(&session->core.ue_addr, &ue_addr.u.sas)) {
|
#define STR_TO_ADDR(DST, SRC) do { \
|
||||||
vty_out(vty, "Error in UE IP%s", VTY_NEWLINE);
|
if (osmo_sockaddr_str_to_sockaddr(&SRC, &DST.u.sas)) { \
|
||||||
return CMD_WARNING;
|
vty_out(vty, "Error in " #SRC ": " OSMO_SOCKADDR_STR_FMT "%s", \
|
||||||
}
|
OSMO_SOCKADDR_STR_FMT_ARGS(&SRC), VTY_NEWLINE); \
|
||||||
|
return CMD_WARNING; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
if (session->access.teid.local == 0) {
|
STR_TO_ADDR(ue_addr, session->tunend.core.ue_local_addr);
|
||||||
|
|
||||||
|
if (session->tunend.access.local.teid == 0) {
|
||||||
f_teid_access_local = (struct osmo_pfcp_ie_f_teid){
|
f_teid_access_local = (struct osmo_pfcp_ie_f_teid){
|
||||||
.choose_flag = true,
|
.choose_flag = true,
|
||||||
.choose = {
|
.choose = {
|
||||||
@@ -376,29 +441,22 @@ int session_tunend_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
} else {
|
} else {
|
||||||
f_teid_access_local = (struct osmo_pfcp_ie_f_teid){
|
f_teid_access_local = (struct osmo_pfcp_ie_f_teid){
|
||||||
.fixed = {
|
.fixed = {
|
||||||
.teid = session->access.teid.local,
|
.teid = session->tunend.access.local.teid,
|
||||||
.ip_addr = {
|
.ip_addr = {
|
||||||
.v4_present = true,
|
.v4_present = true,
|
||||||
.v4 = osmo_pfcp_endpoint_get_cfg(g_pfcp_tool->ep)->local_addr,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
if (osmo_sockaddr_str_to_sockaddr(&session->access.gtp_ip, &f_teid_access_local.fixed.ip_addr.v4.u.sas)) {
|
STR_TO_ADDR(f_teid_access_local.fixed.ip_addr.v4, session->tunend.access.local.addr);
|
||||||
vty_out(vty, "Error in GTP IP towards Access%s", VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ohc_access = (struct osmo_pfcp_ie_outer_header_creation){
|
ohc_access = (struct osmo_pfcp_ie_outer_header_creation){
|
||||||
.teid_present = true,
|
.teid_present = true,
|
||||||
.teid = session->access.teid.remote,
|
.teid = session->tunend.access.remote.teid,
|
||||||
.ip_addr.v4_present = true,
|
.ip_addr.v4_present = true,
|
||||||
};
|
};
|
||||||
osmo_pfcp_bits_set(ohc_access.desc_bits, OSMO_PFCP_OUTER_HEADER_CREATION_GTP_U_UDP_IPV4, true);
|
osmo_pfcp_bits_set(ohc_access.desc_bits, OSMO_PFCP_OUTER_HEADER_CREATION_GTP_U_UDP_IPV4, true);
|
||||||
if (osmo_sockaddr_str_to_sockaddr(&session->access.gtp_ip, &ohc_access.ip_addr.v4.u.sas)) {
|
STR_TO_ADDR(ohc_access.ip_addr.v4, session->tunend.access.remote.addr);
|
||||||
vty_out(vty, "Error in GTP IP towards Access%s", VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
||||||
@@ -507,7 +565,7 @@ int session_tunmap_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
else
|
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);
|
||||||
|
|
||||||
if (session->access.teid.local == 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){
|
||||||
.choose_flag = true,
|
.choose_flag = true,
|
||||||
.choose = {
|
.choose = {
|
||||||
@@ -517,31 +575,25 @@ int session_tunmap_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
} else {
|
} else {
|
||||||
f_teid_access_local = (struct osmo_pfcp_ie_f_teid){
|
f_teid_access_local = (struct osmo_pfcp_ie_f_teid){
|
||||||
.fixed = {
|
.fixed = {
|
||||||
.teid = session->access.teid.local,
|
.teid = session->tunmap.access.local.teid,
|
||||||
.ip_addr = {
|
.ip_addr = {
|
||||||
.v4_present = true,
|
.v4_present = true,
|
||||||
.v4 = osmo_pfcp_endpoint_get_cfg(g_pfcp_tool->ep)->local_addr,
|
.v4 = osmo_pfcp_endpoint_get_cfg(g_pfcp_tool->ep)->local_addr,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
if (osmo_sockaddr_str_to_sockaddr(&session->access.gtp_ip, &f_teid_access_local.fixed.ip_addr.v4.u.sas)) {
|
STR_TO_ADDR(f_teid_access_local.fixed.ip_addr.v4, session->tunmap.access.local.addr);
|
||||||
vty_out(vty, "Error in GTP IP towards Access%s", VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ohc_access = (struct osmo_pfcp_ie_outer_header_creation){
|
ohc_access = (struct osmo_pfcp_ie_outer_header_creation){
|
||||||
.teid_present = true,
|
.teid_present = true,
|
||||||
.teid = session->access.teid.remote,
|
.teid = session->tunmap.access.remote.teid,
|
||||||
.ip_addr.v4_present = true,
|
.ip_addr.v4_present = true,
|
||||||
};
|
};
|
||||||
osmo_pfcp_bits_set(ohc_access.desc_bits, OSMO_PFCP_OUTER_HEADER_CREATION_GTP_U_UDP_IPV4, true);
|
osmo_pfcp_bits_set(ohc_access.desc_bits, OSMO_PFCP_OUTER_HEADER_CREATION_GTP_U_UDP_IPV4, true);
|
||||||
if (osmo_sockaddr_str_to_sockaddr(&session->access.gtp_ip, &ohc_access.ip_addr.v4.u.sas)) {
|
STR_TO_ADDR(ohc_access.ip_addr.v4, session->tunmap.access.remote.addr);
|
||||||
vty_out(vty, "Error in GTP IP towards Access%s", VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (session->core.teid.local == 0) {
|
if (session->tunmap.core.local.teid == 0) {
|
||||||
f_teid_core_local = (struct osmo_pfcp_ie_f_teid){
|
f_teid_core_local = (struct osmo_pfcp_ie_f_teid){
|
||||||
.choose_flag = true,
|
.choose_flag = true,
|
||||||
.choose = {
|
.choose = {
|
||||||
@@ -551,28 +603,21 @@ int session_tunmap_tx_est_req(struct vty *vty, const char **argv, int argc)
|
|||||||
} else {
|
} else {
|
||||||
f_teid_core_local = (struct osmo_pfcp_ie_f_teid){
|
f_teid_core_local = (struct osmo_pfcp_ie_f_teid){
|
||||||
.fixed = {
|
.fixed = {
|
||||||
.teid = session->core.teid.local,
|
.teid = session->tunmap.core.local.teid,
|
||||||
.ip_addr = {
|
.ip_addr = {
|
||||||
.v4_present = true,
|
.v4_present = true,
|
||||||
.v4 = osmo_pfcp_endpoint_get_cfg(g_pfcp_tool->ep)->local_addr,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
if (osmo_sockaddr_str_to_sockaddr(&session->core.gtp_ip, &f_teid_core_local.fixed.ip_addr.v4.u.sas)) {
|
STR_TO_ADDR(f_teid_core_local.fixed.ip_addr.v4, session->tunmap.core.local.addr);
|
||||||
vty_out(vty, "Error in GTP IP towards Core%s", VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ohc_core = (struct osmo_pfcp_ie_outer_header_creation){
|
ohc_core = (struct osmo_pfcp_ie_outer_header_creation){
|
||||||
.teid_present = true,
|
.teid_present = true,
|
||||||
.teid = session->core.teid.remote,
|
.teid = session->tunmap.core.remote.teid,
|
||||||
.ip_addr.v4_present = true,
|
.ip_addr.v4_present = true,
|
||||||
};
|
};
|
||||||
osmo_pfcp_bits_set(ohc_core.desc_bits, OSMO_PFCP_OUTER_HEADER_CREATION_GTP_U_UDP_IPV4, true);
|
osmo_pfcp_bits_set(ohc_core.desc_bits, OSMO_PFCP_OUTER_HEADER_CREATION_GTP_U_UDP_IPV4, true);
|
||||||
if (osmo_sockaddr_str_to_sockaddr(&session->core.gtp_ip, &ohc_core.ip_addr.v4.u.sas)) {
|
STR_TO_ADDR(ohc_core.ip_addr.v4, session->tunmap.core.remote.addr);
|
||||||
vty_out(vty, "Error in GTP IP towards Core%s", VTY_NEWLINE);
|
|
||||||
return CMD_WARNING;
|
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
||||||
@@ -660,7 +705,7 @@ 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;
|
||||||
switch (session->gtp_action) {
|
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(vty, argv, argc);
|
||||||
case UP_GTP_U_TUNMAP:
|
case UP_GTP_U_TUNMAP:
|
||||||
@@ -790,6 +835,6 @@ void pfcp_tool_vty_init_cmds()
|
|||||||
install_element(SESSION_NODE, &session_tx_mod_req_cmd);
|
install_element(SESSION_NODE, &session_tx_mod_req_cmd);
|
||||||
install_element(SESSION_NODE, &session_tx_del_req_cmd);
|
install_element(SESSION_NODE, &session_tx_del_req_cmd);
|
||||||
install_element(SESSION_NODE, &s_ue_cmd);
|
install_element(SESSION_NODE, &s_ue_cmd);
|
||||||
install_element(SESSION_NODE, &s_gtp_cmd);
|
install_element(SESSION_NODE, &s_f_teid_cmd);
|
||||||
install_element(SESSION_NODE, &s_teid_cmd);
|
install_element(SESSION_NODE, &s_f_teid_choose_cmd);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user