aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2022-06-17 13:30:12 +0200
committerNeels Hofmeyr <neels@hofmeyr.de>2022-06-17 13:34:14 +0200
commit3b8fc0d69421654f75347d4627728aeb95f03a99 (patch)
tree783052d9381ba7545bcf74faa619f6868efda133
parent2f102058ca8ac40ba4fef95d19d4c1a43c5e0fb6 (diff)
add osmo_pfcp_ie_f_seid_cmp
-rw-r--r--include/osmocom/pfcp/pfcp_ies_custom.h1
-rw-r--r--src/libosmo-pfcp/pfcp_ies_custom.c25
2 files changed, 26 insertions, 0 deletions
diff --git a/include/osmocom/pfcp/pfcp_ies_custom.h b/include/osmocom/pfcp/pfcp_ies_custom.h
index 08e62d1..f273a87 100644
--- a/include/osmocom/pfcp/pfcp_ies_custom.h
+++ b/include/osmocom/pfcp/pfcp_ies_custom.h
@@ -87,6 +87,7 @@ struct osmo_pfcp_ie_f_seid {
void osmo_pfcp_ie_f_seid_set(struct osmo_pfcp_ie_f_seid *f_seid, uint64_t seid,
const struct osmo_sockaddr *remote_addr);
+int osmo_pfcp_ie_f_seid_cmp(const struct osmo_pfcp_ie_f_seid *a, const struct osmo_pfcp_ie_f_seid *b);
/* 3GPP TS 29.244 8.3.2 */
struct osmo_pfcp_ie_f_teid {
diff --git a/src/libosmo-pfcp/pfcp_ies_custom.c b/src/libosmo-pfcp/pfcp_ies_custom.c
index 3b3769a..0175c6f 100644
--- a/src/libosmo-pfcp/pfcp_ies_custom.c
+++ b/src/libosmo-pfcp/pfcp_ies_custom.c
@@ -89,6 +89,31 @@ void osmo_pfcp_ie_f_seid_set(struct osmo_pfcp_ie_f_seid *f_seid, uint64_t seid,
osmo_pfcp_ip_addrs_set(&f_seid->ip_addr, remote_addr);
}
+int osmo_pfcp_ie_f_seid_cmp(const struct osmo_pfcp_ie_f_seid *a, const struct osmo_pfcp_ie_f_seid *b)
+{
+ int rc;
+ if (a == b)
+ return 0;
+ if (!a)
+ return -1;
+ if (!b)
+ return 1;
+ /* It suffices if one of the IP addresses match */
+ if (a->ip_addr.v4_present && b->ip_addr.v4_present)
+ rc = osmo_sockaddr_cmp(&a->ip_addr.v4, &b->ip_addr.v4);
+ else if (a->ip_addr.v6_present && b->ip_addr.v6_present)
+ rc = osmo_sockaddr_cmp(&a->ip_addr.v6, &b->ip_addr.v6);
+ else
+ rc = (a->ip_addr.v4_present ? -1 : 1);
+ if (rc)
+ return rc;
+ if (a->seid < b->seid)
+ return -1;
+ if (a->seid > b->seid)
+ return 1;
+ return 0;
+}
+
int osmo_pfcp_dec_cause(void *decoded_struct, void *decode_to, const struct osmo_gtlv_load *tlv)
{
enum osmo_pfcp_cause *cause = decode_to;