This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/3457
ippool: Extend pool to work with /64 prefixes
In IPv6 GPRS, we actually don't want to allocate an individual v6
address (like in IPv4), but we want to allocate a prefix. The
standard prefix lengh is 8 bytes, i.e. a /64 prefix. This patch
extends the pool to be able to work with such v6 prefixes.
Change-Id: I0cf700b6baf195a2e5fbea000531f801acaaa443
---
M ggsn/ggsn.c
M lib/ippool.c
2 files changed, 14 insertions(+), 7 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/openggsn refs/changes/57/3457/1
diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index 0629f9e..9b11884 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -241,7 +241,11 @@
dst.len = 4;
dst.v4.s_addr = iph->daddr;
} else if (iph->version == 6) {
- dst.len = 16;
+ /* Due to the fact that 3GPP requires an allocation of a
+ * /64 prefix to each MS, we must instruct
+ * ippool_getip() below to match only the leading /64
+ * prefix, i.e. the first 8 bytes of the address */
+ dst.len = 8;
dst.v6 = ip6h->ip6_dst;
} else {
LOGP(DGGSN, LOGL_NOTICE, "non-IPv packet received from tun\n");
diff --git a/lib/ippool.c b/lib/ippool.c
index 007dc50..683d2d8 100644
--- a/lib/ippool.c
+++ b/lib/ippool.c
@@ -96,11 +96,10 @@
return lookup((unsigned char *)&addr->s_addr, sizeof(addr->s_addr), 0);
}
-static unsigned long int ippool_hash6(struct in6_addr *addr)
+static unsigned long int ippool_hash6(struct in6_addr *addr, unsigned int len)
{
/* TODO: Review hash spread for IPv6 */
- return lookup((unsigned char *)addr->s6_addr, sizeof(addr->s6_addr),
- 0);
+ return lookup((unsigned char *)addr->s6_addr, len, 0);
}
unsigned long int ippool_hash(struct in46_addr *addr)
@@ -108,7 +107,7 @@
if (addr->len == 4)
return ippool_hash4(&addr->v4);
else
- return ippool_hash6(&addr->v6);
+ return ippool_hash6(&addr->v6, addr->len);
}
/* Get IP address and mask */
@@ -209,6 +208,10 @@
"Failed to parse dynamic pool");
return -1;
}
+ /* we want to work with /64 prefixes, i.e. allocate /64 prefixes rather
+ * than /128 (single IPv6 addresses) */
+ if (addr->len == sizeof(in6_addr))
+ addr->len = 64/8;
/* Set IPPOOL_NONETWORK if IPPOOL_NOGATEWAY is set */
if (flags & IPPOOL_NOGATEWAY) {
@@ -348,7 +351,7 @@
/* Find in hash table */
hash = ippool_hash(addr) & this->hashmask;
for (p = this->hash[hash]; p; p = p->nexthash) {
- if (in46a_equal(&p->addr, addr)) {
+ if (in46a_prefix_equal(&p->addr, addr)) {
if (member)
*member = p;
return 0;
@@ -421,7 +424,7 @@
/* Find in hash table */
hash = ippool_hash(addr) & this->hashmask;
for (p = this->hash[hash]; p; p = p->nexthash) {
- if (in46a_equal(&p->addr, addr)) {
+ if (in46a_prefix_equal(&p->addr, addr)) {
p2 = p;
break;
}
--
To view, visit https://gerrit.osmocom.org/3457
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0cf700b6baf195a2e5fbea000531f801acaaa443
Gerrit-PatchSet: 1
Gerrit-Project: openggsn
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>