pespin has submitted this change. ( https://gerrit.osmocom.org/c/upf-benchmark/+/39421?usp=email )
Change subject: osmo-upf-load-gen: Add vty cmd to skip binding local GTPU ports ......................................................................
osmo-upf-load-gen: Add vty cmd to skip binding local GTPU ports
This is useful when osmo-upf-load-gen is used only to generate the PFCP sessions acting solely as SMF.
Change-Id: Idc6e013d6c7de24889bc500625707c5b5cc1766b --- M include/osmocom/upfloadgen/pfcp_tool.h M src/osmo-upf-load-gen/pfcp_tool.c M src/osmo-upf-load-gen/pfcp_tool_vty.c 3 files changed, 33 insertions(+), 16 deletions(-)
Approvals: dexter: Looks good to me, but someone else must approve Jenkins Builder: Verified pespin: Looks good to me, approved osmith: Looks good to me, but someone else must approve
diff --git a/include/osmocom/upfloadgen/pfcp_tool.h b/include/osmocom/upfloadgen/pfcp_tool.h index 2c50490..e13c1aa 100644 --- a/include/osmocom/upfloadgen/pfcp_tool.h +++ b/include/osmocom/upfloadgen/pfcp_tool.h @@ -136,6 +136,8 @@ /* list of struct udp_port */ struct llist_head gtp_local_addrs; struct udp_port *gtp_local_addrs_next; + /* Whether to create and bind sockets for addresses above: */ + bool do_local_gtpu_bind;
/* list of struct udp_port */ struct llist_head gtp_core_addrs; @@ -183,7 +185,7 @@ uint32_t pfcp_tool_new_teid(void); int pfcp_tool_next_ue_addr(struct osmo_sockaddr *dst);
-struct udp_port *pfcp_tool_have_local_udp_port_by_str(const struct osmo_sockaddr_str *addr, uint16_t fallback_port); +struct udp_port *pfcp_tool_have_local_udp_port_by_str(const struct osmo_sockaddr_str *addr, uint16_t fallback_port, bool do_bind); struct udp_port *pfcp_tool_have_core_udp_port_by_str(const struct osmo_sockaddr_str *addr, uint16_t fallback_port);
void pfcp_tool_gtp_flood_start(void); diff --git a/src/osmo-upf-load-gen/pfcp_tool.c b/src/osmo-upf-load-gen/pfcp_tool.c index ba4ce6b..b634822 100644 --- a/src/osmo-upf-load-gen/pfcp_tool.c +++ b/src/osmo-upf-load-gen/pfcp_tool.c @@ -21,6 +21,7 @@ * */
+#include <stdbool.h> #include <errno.h> #include <netinet/in.h>
@@ -50,15 +51,18 @@ .local_port = OSMO_PFCP_PORT, }, .next_teid_state = 23, - .gtp.flood = { - .cfg = { - .num_rx_workers = 1, - .num_tx_workers = 1, - .queue_size = 4096, - .slew_us = 0, + .gtp = { + .do_local_gtpu_bind = true, + .flood = { + .cfg = { + .num_rx_workers = 1, + .num_tx_workers = 1, + .queue_size = 4096, + .slew_us = 0, + }, + .flows_per_session = 1, + .packets_per_flow = 0, }, - .flows_per_session = 1, - .packets_per_flow = 0, }, };
@@ -253,12 +257,12 @@ return pfcp_tool_have_udp_port_by_osa(list, &osa, fallback_port); }
-struct udp_port *pfcp_tool_have_local_udp_port_by_osa(const struct osmo_sockaddr *osa, uint16_t fallback_port) +static struct udp_port *pfcp_tool_have_local_udp_port_by_osa(const struct osmo_sockaddr *osa, uint16_t fallback_port, bool do_bind) { struct udp_port *port = pfcp_tool_have_udp_port_by_osa(&g_pfcp_tool->gtp.gtp_local_addrs, osa, fallback_port);
/* already bound? */ - if (port->ofd.fd >= 0) + if (!do_bind || port->ofd.fd >= 0) return port;
/* create and bind socket */ @@ -290,15 +294,15 @@ return port; }
-struct udp_port *pfcp_tool_have_local_udp_port_by_str(const struct osmo_sockaddr_str *addr, uint16_t fallback_port) +struct udp_port *pfcp_tool_have_local_udp_port_by_str(const struct osmo_sockaddr_str *addr, uint16_t fallback_port, bool do_bind) { struct osmo_sockaddr osa; if (osmo_sockaddr_str_to_osa(addr, &osa)) return NULL; - return pfcp_tool_have_local_udp_port_by_osa(&osa, fallback_port); + return pfcp_tool_have_local_udp_port_by_osa(&osa, fallback_port, do_bind); }
-struct udp_port *pfcp_tool_have_core_udp_port_by_osa(const struct osmo_sockaddr *osa, uint16_t fallback_port) +static struct udp_port *pfcp_tool_have_core_udp_port_by_osa(const struct osmo_sockaddr *osa, uint16_t fallback_port) { return pfcp_tool_have_udp_port_by_osa(&g_pfcp_tool->gtp.gtp_core_addrs, osa, fallback_port); } @@ -336,7 +340,7 @@ * of view: so the GTP port of osmo-upf-load-gen is 'remote'. * Here we are setting up a port to emit GTP from osmo-upf-load-gen, the same port is called 'gtp_local'. */ - cfg.gtp_local = pfcp_tool_have_local_udp_port_by_str(&tun_access->remote.addr, 2152); + cfg.gtp_local = pfcp_tool_have_local_udp_port_by_str(&tun_access->remote.addr, 2152, true); if (!cfg.gtp_local) { LOGP(DLGLOBAL, LOGL_ERROR, "Cannot set up GTP flow for session, failed to setup local GTP port\n"); return false; diff --git a/src/osmo-upf-load-gen/pfcp_tool_vty.c b/src/osmo-upf-load-gen/pfcp_tool_vty.c index 8f488c7..5af9dfe 100644 --- a/src/osmo-upf-load-gen/pfcp_tool_vty.c +++ b/src/osmo-upf-load-gen/pfcp_tool_vty.c @@ -186,6 +186,16 @@ #define GTP_IP_STR "Add a GTP IP address\n" #define IP_ADDR_STR "IP address, 1.2.3.4 or 1:2:3:4::1\n"
+DEFUN(c_no_gtp_local_bind, no_gtp_local_bind_cmd, + "no gtp local bind", + NO_STR GTP_STR + "Add a local GTP port, to emit GTP1U traffic from\n" + "Create and bind sockets with desigend IP address\n") +{ + g_pfcp_tool->gtp.do_local_gtpu_bind = false; + return CMD_SUCCESS; +} + DEFUN(c_gtp_local, c_gtp_local_cmd, "gtp local IP_ADDR [<1-65535>]", GTP_STR @@ -206,7 +216,7 @@ if (osmo_sockaddr_str_from_str(&addr_str, ip_str, port_nr)) goto invalid_ip; vty_out(vty, "local GTP port: " OSMO_SOCKADDR_STR_FMT "%s", OSMO_SOCKADDR_STR_FMT_ARGS_NOT_NULL(&addr_str), VTY_NEWLINE); - p = pfcp_tool_have_local_udp_port_by_str(&addr_str, port_nr); + p = pfcp_tool_have_local_udp_port_by_str(&addr_str, port_nr, g_pfcp_tool->gtp.do_local_gtpu_bind); if (!p) goto invalid_ip; return CMD_SUCCESS; @@ -1481,6 +1491,7 @@ install_element(SESSION_NODE, &s_f_teid_cmd); install_element(SESSION_NODE, &s_f_teid_choose_cmd);
+ install_ve_and_config(&no_gtp_local_bind_cmd); install_ve_and_config(&c_gtp_local_cmd); install_ve_and_config(&c_gtp_core_cmd); install_ve_and_config(&c_ue_ip_range_cmd);