From 46d1b84c3f321fecc7c762acb19101623c7d392e Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Sat, 1 Apr 2023 23:52:26 +0200 Subject: [PATCH] add osmo_sockaddr_str_from_128() Change-Id: Id67f419ad41f614202912500c96d82b6ff873a6a --- include/osmocom/core/sockaddr_str.h | 1 + src/core/libosmocore.map | 1 + src/core/sockaddr_str.c | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/include/osmocom/core/sockaddr_str.h b/include/osmocom/core/sockaddr_str.h index f474fa03d..a9d3afbae 100644 --- a/include/osmocom/core/sockaddr_str.h +++ b/include/osmocom/core/sockaddr_str.h @@ -76,6 +76,7 @@ int osmo_sockaddr_str_from_in_addr(struct osmo_sockaddr_str *sockaddr_str, const int osmo_sockaddr_str_from_in6_addr(struct osmo_sockaddr_str *sockaddr_str, const struct in6_addr *addr, uint16_t port); int osmo_sockaddr_str_from_32(struct osmo_sockaddr_str *sockaddr_str, uint32_t ip, uint16_t port); int osmo_sockaddr_str_from_32h(struct osmo_sockaddr_str *sockaddr_str, uint32_t ip, uint16_t port); +int osmo_sockaddr_str_from_128(struct osmo_sockaddr_str *sockaddr_str, uint8_t *ip, uint16_t port); int osmo_sockaddr_str_from_sockaddr_in(struct osmo_sockaddr_str *sockaddr_str, const struct sockaddr_in *src); int osmo_sockaddr_str_from_sockaddr_in6(struct osmo_sockaddr_str *sockaddr_str, const struct sockaddr_in6 *src); int osmo_sockaddr_str_from_sockaddr(struct osmo_sockaddr_str *sockaddr_str, const struct sockaddr_storage *src); diff --git a/src/core/libosmocore.map b/src/core/libosmocore.map index 54b9a1249..ae44b5409 100644 --- a/src/core/libosmocore.map +++ b/src/core/libosmocore.map @@ -360,6 +360,7 @@ osmo_sockaddr_set_port; osmo_sockaddr_str_cmp; osmo_sockaddr_str_from_32; osmo_sockaddr_str_from_32h; +osmo_sockaddr_str_from_128; osmo_sockaddr_str_from_32n; osmo_sockaddr_str_from_in6_addr; osmo_sockaddr_str_from_in_addr; diff --git a/src/core/sockaddr_str.c b/src/core/sockaddr_str.c index 9f1e8972f..2d86b5575 100644 --- a/src/core/sockaddr_str.c +++ b/src/core/sockaddr_str.c @@ -299,6 +299,25 @@ int osmo_sockaddr_str_from_32h(struct osmo_sockaddr_str *sockaddr_str, uint32_t return osmo_sockaddr_str_from_32(sockaddr_str, osmo_ntohl(ip), port); } +/*! Convert IPv6 address from 128bit network-byte-order to osmo_sockaddr_str, and set port. + * \param[out] sockaddr_str The instance to copy to. + * \param[in] ip 128bit IPv6 address data. + * \param[in] port Port number. + * \return 0 on success, negative on error. + */ +int osmo_sockaddr_str_from_128(struct osmo_sockaddr_str *sockaddr_str, uint8_t *ip, uint16_t port) +{ + if (!sockaddr_str) + return -ENOSPC; + *sockaddr_str = (struct osmo_sockaddr_str){ + .af = AF_INET6, + .port = port, + }; + if (!inet_ntop(AF_INET6, ip, sockaddr_str->ip, sizeof(sockaddr_str->ip))) + return -ENOSPC; + return 0; +} + /*! DEPRECATED: the name suggests a conversion from network byte order, but actually converts from host byte order. Use * osmo_sockaddr_str_from_32 for network byte order and osmo_sockaddr_str_from_32h for host byte order. */ int osmo_sockaddr_str_from_32n(struct osmo_sockaddr_str *sockaddr_str, uint32_t ip, uint16_t port)