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