aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2019-08-20 11:43:25 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2019-08-28 11:13:32 +0200
commit60ee0dbfa479adfa2af10a8bf0f652a9a92d5c3b (patch)
tree082f6dc920f6fed72c6b0f2f4b4451610359e94f
parentd950134c530526f03ed908dcf5e02f88b3f1c9fc (diff)
Introduce in46a_is_v{4,6}() helpers
It's clearer having size-related checks in one place for a data structure in46_addr, instead of spread around the code. Change-Id: Idc94bf0c8c01bb5a30e36d3c284b99f66b972abb
-rw-r--r--ggsn/ggsn.c20
-rw-r--r--lib/in46_addr.h8
2 files changed, 16 insertions, 12 deletions
diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index d71855d..99eae75 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -482,19 +482,15 @@ struct pco_element {
* \returns The selected peer matching the given IP version. NULL if not present.
*/
static struct ippoolm_t *pdp_get_peer_ipv(struct pdp_t *pdp, bool is_ipv6) {
- uint8_t len1, len2, i;
-
- if (is_ipv6) {
- len1 = 8;
- len2 = 16;
- } else {
- len1 = sizeof(struct in_addr);
- len2 = len1;
- }
+ uint8_t i;
for (i = 0; i < 2; i++) {
struct ippoolm_t * ippool = pdp->peer[i];
- if (ippool && (ippool->addr.len == len1 || ippool->addr.len == len2))
+ if (!ippool)
+ continue;
+ if (is_ipv6 && in46a_is_v6(&ippool->addr))
+ return ippool;
+ else if (!is_ipv6 && in46a_is_v4(&ippool->addr))
return ippool;
}
return NULL;
@@ -798,7 +794,7 @@ int create_context_ind(struct pdp_t *pdp)
/* Allocate dynamic addresses from the pool */
for (i = 0; i < num_addr; i++) {
- if (addr[i].len == sizeof(struct in_addr)) {
+ if (in46a_is_v4(&addr[i])) {
/* does this APN actually have an IPv4 pool? */
if (!apn_supports_ipv4(apn))
goto err_wrong_af;
@@ -811,7 +807,7 @@ int create_context_ind(struct pdp_t *pdp)
addrv4 = member;
- } else if (addr[i].len == sizeof(struct in6_addr)) {
+ } else if (in46a_is_v6(&addr[i])) {
/* does this APN actually have an IPv6 pool? */
if (!apn_supports_ipv6(apn))
diff --git a/lib/in46_addr.h b/lib/in46_addr.h
index e4654cc..153df00 100644
--- a/lib/in46_addr.h
+++ b/lib/in46_addr.h
@@ -31,3 +31,11 @@ unsigned int in46a_netmasklen(const struct in46_addr *netmask);
int in46a_to_eua(const struct in46_addr *src, unsigned int size, struct ul66_t *eua);
int in46a_from_eua(const struct ul66_t *eua, struct in46_addr *dst);
+
+static inline bool in46a_is_v6(const struct in46_addr *addr) {
+ return addr->len == 8 || addr->len == 16;
+}
+
+static inline bool in46a_is_v4(const struct in46_addr *addr) {
+ return addr->len == sizeof(struct in_addr);
+}