blob: 153df006e5b102e4ff2de25778d32300a59c776e [file] [log] [blame]
Harald Welted12eab92017-08-02 19:49:47 +02001#pragma once
2#include <stdint.h>
3#include <netinet/in.h>
4
Harald Weltea0d281d2017-08-02 21:48:16 +02005#include "../gtp/pdp.h"
6
Harald Welted12eab92017-08-02 19:49:47 +02007/* a simple wrapper around an in6_addr to also contain the length of the address,
8 * thereby implicitly indicating the address family of the address */
9struct in46_addr {
10 uint8_t len;
11 union {
12 struct in_addr v4;
13 struct in6_addr v6;
14 };
15};
16
Harald Welte7fc86942017-08-12 12:55:48 +020017struct in46_prefix {
18 struct in46_addr addr;
19 uint8_t prefixlen;
20};
21
Harald Welted12eab92017-08-02 19:49:47 +020022extern int in46a_to_af(const struct in46_addr *in);
23extern int in46a_to_sas(struct sockaddr_storage *out, const struct in46_addr *in);
24extern const char *in46a_ntop(const struct in46_addr *in, char *dst, socklen_t dst_size);
Harald Welteb62983d2017-08-12 12:46:17 +020025extern const char *in46a_ntoa(const struct in46_addr *in46);
Harald Welte7fc86942017-08-12 12:55:48 +020026extern const char *in46p_ntoa(const struct in46_prefix *in46p);
Harald Welted12eab92017-08-02 19:49:47 +020027extern int in46a_equal(const struct in46_addr *a, const struct in46_addr *b);
Harald Welte365f8fa2017-08-08 18:09:36 +020028extern int in46a_prefix_equal(const struct in46_addr *a, const struct in46_addr *b);
Harald Welted12eab92017-08-02 19:49:47 +020029extern int in46a_within_mask(const struct in46_addr *addr, const struct in46_addr *net, size_t prefixlen);
Pau Espin Pedrol2e7b9ff2017-10-16 14:27:32 +020030unsigned int in46a_netmasklen(const struct in46_addr *netmask);
Harald Weltea0d281d2017-08-02 21:48:16 +020031
Pau Espin Pedrol2d6a69e2017-12-06 19:26:25 +010032int in46a_to_eua(const struct in46_addr *src, unsigned int size, struct ul66_t *eua);
Harald Weltea0d281d2017-08-02 21:48:16 +020033int in46a_from_eua(const struct ul66_t *eua, struct in46_addr *dst);
Pau Espin Pedrol60ee0db2019-08-20 11:43:25 +020034
35static inline bool in46a_is_v6(const struct in46_addr *addr) {
36 return addr->len == 8 || addr->len == 16;
37}
38
39static inline bool in46a_is_v4(const struct in46_addr *addr) {
40 return addr->len == sizeof(struct in_addr);
41}