neels has submitted this change. (
https://gerrit.osmocom.org/c/osmo-upf/+/28755 )
Change subject: apply refactoring of osmo_pfcp_endpoint API
......................................................................
apply refactoring of osmo_pfcp_endpoint API
libosmo-pfcp If80c35c6a942bf9593781b5a6bc28ba37323ce5e changes the
osmo_pfcp_endpoint API, apply the necessary changes here.
Related: SYS#5599
Depends: If80c35c6a942bf9593781b5a6bc28ba37323ce5e (libosmo-pfcp)
Change-Id: I01deb3f347435c9fa1c49e9a0c5ef70742444ad4
---
M src/osmo-pfcp-tool/osmo_pfcp_tool_main.c
M src/osmo-pfcp-tool/pfcp_tool_vty.c
M src/osmo-upf/up_endpoint.c
M src/osmo-upf/up_peer.c
M src/osmo-upf/up_session.c
5 files changed, 44 insertions(+), 35 deletions(-)
Approvals:
neels: Looks good to me, approved
Jenkins Builder: Verified
diff --git a/src/osmo-pfcp-tool/osmo_pfcp_tool_main.c
b/src/osmo-pfcp-tool/osmo_pfcp_tool_main.c
index 9a4de1c..43c3b45 100644
--- a/src/osmo-pfcp-tool/osmo_pfcp_tool_main.c
+++ b/src/osmo-pfcp-tool/osmo_pfcp_tool_main.c
@@ -344,8 +344,7 @@
do {
if (pfcp_tool_mainloop())
break;
- } while (!llist_empty(&g_pfcp_tool->ep->sent_requests)
- || !llist_empty(&g_pfcp_tool->ep->sent_responses));
+ } while (osmo_pfcp_endpoint_retrans_queue_is_busy(g_pfcp_tool->ep));
printf("Done\n");
} else {
printf("Listening for commands on VTY...\n");
diff --git a/src/osmo-pfcp-tool/pfcp_tool_vty.c b/src/osmo-pfcp-tool/pfcp_tool_vty.c
index 8593217..4b402a3 100644
--- a/src/osmo-pfcp-tool/pfcp_tool_vty.c
+++ b/src/osmo-pfcp-tool/pfcp_tool_vty.c
@@ -48,7 +48,7 @@
{
if (g_pfcp_tool->ep != NULL) {
vty_out(vty, "Already listening on %s%s",
- osmo_sockaddr_to_str_c(OTC_SELECT, &g_pfcp_tool->ep->cfg.local_addr),
+ osmo_sockaddr_to_str_c(OTC_SELECT,
osmo_pfcp_endpoint_get_local_addr(g_pfcp_tool->ep)),
VTY_NEWLINE);
return CMD_WARNING;
}
@@ -63,38 +63,43 @@
"Bind local PFCP port and listen; see also 'local-addr'\n")
{
struct osmo_sockaddr_str local_addr;
+ struct osmo_pfcp_endpoint_cfg cfg;
int rc;
OSMO_ASSERT(g_pfcp_tool);
if (g_pfcp_tool->ep != NULL) {
vty_out(vty, "Already listening on %s%s",
- osmo_sockaddr_to_str_c(OTC_SELECT, &g_pfcp_tool->ep->cfg.local_addr),
+ osmo_sockaddr_to_str_c(OTC_SELECT,
osmo_pfcp_endpoint_get_local_addr(g_pfcp_tool->ep)),
VTY_NEWLINE);
return CMD_WARNING;
}
- g_pfcp_tool->ep = osmo_pfcp_endpoint_create(g_pfcp_tool, g_pfcp_tool);
- if (!g_pfcp_tool->ep) {
- vty_out(vty, "Failed to allocate PFCP endpoint.%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
- g_pfcp_tool->ep->rx_msg = pfcp_tool_rx_msg;
- g_pfcp_tool->ep->seq_nr_state = rand();
+ cfg = (struct osmo_pfcp_endpoint_cfg){
+ .rx_msg_cb = pfcp_tool_rx_msg,
+ };
/* Translate address string from VTY config to osmo_sockaddr: first read into
osmo_sockaddr_str, then write to
* osmo_sockaddr. */
osmo_sockaddr_str_from_str(&local_addr, g_pfcp_tool->vty_cfg.local_ip,
g_pfcp_tool->vty_cfg.local_port);
- osmo_sockaddr_str_to_sockaddr(&local_addr,
&g_pfcp_tool->ep->cfg.local_addr.u.sas);
+ osmo_sockaddr_str_to_sockaddr(&local_addr, &cfg.local_addr.u.sas);
- /* Store this address as the local PFCP Node Id */
- osmo_pfcp_ie_node_id_from_osmo_sockaddr(&g_pfcp_tool->ep->cfg.local_node_id,
&g_pfcp_tool->ep->cfg.local_addr);
+ /* Also use this address as the local PFCP Node Id */
+ osmo_pfcp_ie_node_id_from_osmo_sockaddr(&cfg.local_node_id, &cfg.local_addr);
+
+ g_pfcp_tool->ep = osmo_pfcp_endpoint_create(g_pfcp_tool, &cfg);
+ if (!g_pfcp_tool->ep) {
+ vty_out(vty, "Failed to allocate PFCP endpoint.%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ osmo_pfcp_endpoint_set_seq_nr_state(g_pfcp_tool->ep, rand());
rc = osmo_pfcp_endpoint_bind(g_pfcp_tool->ep);
if (rc) {
vty_out(vty, "Failed to bind PFCP endpoint on %s: %s%s\n",
- osmo_sockaddr_to_str_c(OTC_SELECT, &g_pfcp_tool->ep->cfg.local_addr),
strerror(rc),
- VTY_NEWLINE);
+ osmo_sockaddr_to_str_c(OTC_SELECT,
osmo_pfcp_endpoint_get_local_addr(g_pfcp_tool->ep)),
+ strerror(rc), VTY_NEWLINE);
return CMD_WARNING;
}
return CMD_SUCCESS;
@@ -194,7 +199,7 @@
}
m = osmo_pfcp_msg_alloc_tx_req(OTC_SELECT, &peer->remote_addr,
OSMO_PFCP_MSGT_ASSOC_SETUP_REQ);
- m->ies.assoc_setup_req.recovery_time_stamp =
g_pfcp_tool->ep->recovery_time_stamp;
+ m->ies.assoc_setup_req.recovery_time_stamp =
osmo_pfcp_endpoint_get_recovery_timestamp(g_pfcp_tool->ep);
m->ies.assoc_setup_req.cp_function_features_present = true;
osmo_pfcp_bits_set(m->ies.assoc_setup_req.cp_function_features.bits,
OSMO_PFCP_CP_FEAT_BUNDL, true);
@@ -367,7 +372,7 @@
.teid = session->access.teid.local,
.ip_addr = {
.v4_present = true,
- .v4 = g_pfcp_tool->ep->cfg.local_addr,
+ .v4 = osmo_pfcp_endpoint_get_cfg(g_pfcp_tool->ep)->local_addr,
},
},
};
@@ -391,7 +396,7 @@
cp_f_seid = (struct osmo_pfcp_ie_f_seid){
.seid = session->cp_seid,
};
- osmo_pfcp_ip_addrs_set(&cp_f_seid.ip_addr,
&g_pfcp_tool->ep->cfg.local_addr);
+ 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->h.seid_present = true;
@@ -508,7 +513,7 @@
.teid = session->access.teid.local,
.ip_addr = {
.v4_present = true,
- .v4 = g_pfcp_tool->ep->cfg.local_addr,
+ .v4 = osmo_pfcp_endpoint_get_cfg(g_pfcp_tool->ep)->local_addr,
},
},
};
@@ -542,7 +547,7 @@
.teid = session->core.teid.local,
.ip_addr = {
.v4_present = true,
- .v4 = g_pfcp_tool->ep->cfg.local_addr,
+ .v4 = osmo_pfcp_endpoint_get_cfg(g_pfcp_tool->ep)->local_addr,
},
},
};
@@ -565,7 +570,7 @@
cp_f_seid = (struct osmo_pfcp_ie_f_seid){
.seid = session->cp_seid,
};
- osmo_pfcp_ip_addrs_set(&cp_f_seid.ip_addr,
&g_pfcp_tool->ep->cfg.local_addr);
+ 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->h.seid_present = true;
@@ -685,7 +690,7 @@
cp_f_seid = (struct osmo_pfcp_ie_f_seid){
.seid = session->cp_seid,
};
- osmo_pfcp_ip_addrs_set(&cp_f_seid.ip_addr,
&g_pfcp_tool->ep->cfg.local_addr);
+ 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->h.seid_present = true;
diff --git a/src/osmo-upf/up_endpoint.c b/src/osmo-upf/up_endpoint.c
index ef3702a..f687f4c 100644
--- a/src/osmo-upf/up_endpoint.c
+++ b/src/osmo-upf/up_endpoint.c
@@ -30,7 +30,7 @@
static void up_endpoint_set_msg_ctx(struct osmo_pfcp_endpoint *ep, struct osmo_pfcp_msg
*m, struct osmo_pfcp_msg *req)
{
- struct up_endpoint *up_ep = ep->priv;
+ struct up_endpoint *up_ep = osmo_pfcp_endpoint_get_cfg(ep)->priv;
struct up_peer *peer;
/* If this is a response to an earlier request, just take the msg context from the
request message. */
@@ -188,7 +188,7 @@
static void up_endpoint_rx_cb(struct osmo_pfcp_endpoint *ep, struct osmo_pfcp_msg *m,
struct osmo_pfcp_msg *req)
{
- struct up_endpoint *up_ep = ep->priv;
+ struct up_endpoint *up_ep = osmo_pfcp_endpoint_get_priv(ep);
switch (m->h.message_type) {
case OSMO_PFCP_MSGT_PFD_MGMT_REQ:
@@ -230,17 +230,21 @@
struct up_endpoint *up_endpoint_init(void *ctx, const struct osmo_sockaddr *local_addr)
{
int rc;
+ struct osmo_pfcp_endpoint_cfg cfg;
struct up_endpoint *up_ep;
up_ep = talloc_zero(ctx, struct up_endpoint);
INIT_LLIST_HEAD(&up_ep->peers);
- up_ep->pfcp_ep = osmo_pfcp_endpoint_create(up_ep, up_ep);
- up_ep->pfcp_ep->cfg.local_addr = *local_addr;
+ cfg = (struct osmo_pfcp_endpoint_cfg){
+ .local_addr = *local_addr,
+ .set_msg_ctx_cb = up_endpoint_set_msg_ctx,
+ .rx_msg_cb = up_endpoint_rx_cb,
+ .priv = up_ep,
+ };
+ osmo_pfcp_ie_node_id_from_osmo_sockaddr(&cfg.local_node_id, local_addr);
- up_ep->pfcp_ep->set_msg_ctx = up_endpoint_set_msg_ctx;
- up_ep->pfcp_ep->rx_msg = up_endpoint_rx_cb;
-
- osmo_pfcp_ie_node_id_from_osmo_sockaddr(&up_ep->pfcp_ep->cfg.local_node_id,
local_addr);
+ up_ep->pfcp_ep = osmo_pfcp_endpoint_create(up_ep, &cfg);
+ OSMO_ASSERT(up_ep->pfcp_ep);
rc = osmo_pfcp_endpoint_bind(up_ep->pfcp_ep);
if (rc) {
diff --git a/src/osmo-upf/up_peer.c b/src/osmo-upf/up_peer.c
index 633e458..2c2eda1 100644
--- a/src/osmo-upf/up_peer.c
+++ b/src/osmo-upf/up_peer.c
@@ -211,11 +211,10 @@
resp->ies.assoc_setup_resp = (struct osmo_pfcp_msg_assoc_setup_resp) {
.cause = cause,
- .recovery_time_stamp = g_upf->pfcp.ep->pfcp_ep->recovery_time_stamp,
+ .recovery_time_stamp =
osmo_pfcp_endpoint_get_recovery_timestamp(g_upf->pfcp.ep->pfcp_ep),
.up_function_features_present = true,
.up_function_features = peer->local_up_features,
};
- resp->ies.assoc_setup_resp.recovery_time_stamp =
g_upf->pfcp.ep->pfcp_ep->recovery_time_stamp;
if (osmo_pfcp_endpoint_tx(peer->up_endpoint->pfcp_ep, resp)) {
OSMO_LOG_PFCP_MSG(resp, LOGL_ERROR, "Error sending response, cannot associate with
peer\n");
diff --git a/src/osmo-upf/up_session.c b/src/osmo-upf/up_session.c
index a2ea5e5..f35a6eb 100644
--- a/src/osmo-upf/up_session.c
+++ b/src/osmo-upf/up_session.c
@@ -141,7 +141,8 @@
}
LOGPFSML(session->fi, LOGL_INFO, "Allocated new local TEID 0x%x\n",
dst->fixed.teid);
- if (osmo_pfcp_ip_addrs_set(&dst->fixed.ip_addr,
&up_ep->pfcp_ep->cfg.local_addr)) {
+ if (osmo_pfcp_ip_addrs_set(&dst->fixed.ip_addr,
+ osmo_pfcp_endpoint_get_local_addr(up_ep->pfcp_ep))) {
LOGPFSML(session->fi, LOGL_ERROR, "Invalid local address in pfcp_endpoint
cfg\n");
return OSMO_PFCP_CAUSE_PFCP_ENTITY_IN_CONGESTION;
}
@@ -550,7 +551,8 @@
goto nack_response;
/* Success, send ACK */
- osmo_pfcp_ie_f_seid_set(&resp->up_f_seid, session->up_seid,
&peer->up_endpoint->pfcp_ep->cfg.local_addr);
+ osmo_pfcp_ie_f_seid_set(&resp->up_f_seid, session->up_seid,
+ osmo_pfcp_endpoint_get_local_addr(peer->up_endpoint->pfcp_ep));
resp->up_f_seid_present = true;
rc = osmo_pfcp_endpoint_tx(peer->up_endpoint->pfcp_ep, tx);
--
To view, visit
https://gerrit.osmocom.org/c/osmo-upf/+/28755
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-upf
Gerrit-Branch: master
Gerrit-Change-Id: I01deb3f347435c9fa1c49e9a0c5ef70742444ad4
Gerrit-Change-Number: 28755
Gerrit-PatchSet: 3
Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: neels <nhofmeyr(a)sysmocom.de>
Gerrit-MessageType: merged