aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Janosch Hofmeyr <nhofmeyr@sysmocom.de>2024-03-16 05:50:14 +0100
committerNeels Janosch Hofmeyr <nhofmeyr@sysmocom.de>2024-03-23 13:03:53 +0100
commita46a126fb1f3b4f1dfb6040f9a90886615972198 (patch)
tree0c6683bb704012d4c72d1f04fb4a698ecda99d27
parent5d2ee7e72c62db67ee3f70805e7d40f3c154209f (diff)
add osmo_pfcp_ip_addrs_get
This pattern shows up a lot when working with PFCP. Let's make it easier to handle IPv4 and v6 at the same time. Change-Id: I4338a83f26ef2443f90cf835621e73aed5eac521
-rw-r--r--include/osmocom/pfcp/pfcp_ies_custom.h6
-rw-r--r--src/libosmo-pfcp/pfcp_msg.c32
2 files changed, 38 insertions, 0 deletions
diff --git a/include/osmocom/pfcp/pfcp_ies_custom.h b/include/osmocom/pfcp/pfcp_ies_custom.h
index 0540bfe..84f862a 100644
--- a/include/osmocom/pfcp/pfcp_ies_custom.h
+++ b/include/osmocom/pfcp/pfcp_ies_custom.h
@@ -25,6 +25,7 @@
#pragma once
#include <osmocom/core/socket.h>
+#include <osmocom/core/sockaddr_str.h>
#include <osmocom/pfcp/pfcp_proto.h>
@@ -40,6 +41,11 @@ int osmo_pfcp_ip_addrs_set(struct osmo_pfcp_ip_addrs *dst, const struct osmo_soc
int osmo_pfcp_ip_addrs_to_str_buf(char *buf, size_t buflen, const struct osmo_pfcp_ip_addrs *addrs);
char *osmo_pfcp_ip_addrs_to_str_c(void *ctx, const struct osmo_pfcp_ip_addrs *addrs);
+int osmo_pfcp_ip_addrs_get(struct osmo_sockaddr *v4, struct osmo_sockaddr *v6,
+ struct osmo_pfcp_ip_addrs *src);
+int osmo_pfcp_ip_addrs_get_str(struct osmo_sockaddr_str *v4, struct osmo_sockaddr_str *v6,
+ struct osmo_pfcp_ip_addrs *src);
+
/* 3GPP TS 29.244 8.2.38, IETF RFC 1035 3.1 */
struct osmo_pfcp_ie_node_id {
enum osmo_pfcp_node_id_type type;
diff --git a/src/libosmo-pfcp/pfcp_msg.c b/src/libosmo-pfcp/pfcp_msg.c
index abcee18..66f6e59 100644
--- a/src/libosmo-pfcp/pfcp_msg.c
+++ b/src/libosmo-pfcp/pfcp_msg.c
@@ -514,6 +514,38 @@ int osmo_pfcp_ip_addrs_set(struct osmo_pfcp_ip_addrs *dst, const struct osmo_soc
}
}
+int osmo_pfcp_ip_addrs_get(struct osmo_sockaddr *v4, struct osmo_sockaddr *v6, struct osmo_pfcp_ip_addrs *src)
+{
+ if (v4) {
+ if (src->v4_present)
+ *v4 = src->v4;
+ else
+ *v4 = (struct osmo_sockaddr){ .u.sa.sa_family = AF_UNSPEC };
+ }
+ if (v6) {
+ if (src->v6_present)
+ *v6 = src->v6;
+ else
+ *v6 = (struct osmo_sockaddr){ .u.sa.sa_family = AF_UNSPEC };
+ }
+ return 0;
+}
+
+int osmo_pfcp_ip_addrs_get_str(struct osmo_sockaddr_str *v4, struct osmo_sockaddr_str *v6, struct osmo_pfcp_ip_addrs *src)
+{
+ if (v4) {
+ if (src->v4_present)
+ return osmo_sockaddr_str_from_sockaddr(v4, &src->v4.u.sas);
+ *v4 = (struct osmo_sockaddr_str){};
+ }
+ if (v6) {
+ if (src->v6_present)
+ return osmo_sockaddr_str_from_sockaddr(v6, &src->v6.u.sas);
+ *v6 = (struct osmo_sockaddr_str){};
+ }
+ return 0;
+}
+
/* If a osmo_fsm_inst placed in m->ctx deallocates before the osmo_pfcp_msg, call this function, to make sure to avoid
* use after free. Alternatively use m->ctx.*_use_count to make sure the FSM inst does not deallocate before the
* osmo_pfcp_msg is discarded from the resend queue. */