pespin has uploaded this change for review.

View Change

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(-)

git pull ssh://gerrit.osmocom.org:29418/upf-benchmark refs/changes/21/39421/1
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);

To view, visit change 39421. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: upf-benchmark
Gerrit-Branch: master
Gerrit-Change-Id: Idc6e013d6c7de24889bc500625707c5b5cc1766b
Gerrit-Change-Number: 39421
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>