diff options
author | jjako <jjako> | 2003-08-20 15:25:54 +0000 |
---|---|---|
committer | jjako <jjako> | 2003-08-20 15:25:54 +0000 |
commit | 504ee45408d042d3cdc24b2a0fa85d008cc1d9a9 (patch) | |
tree | e174c7c6bd7a732af262e6aef57cda1ba6d290ed /ggsn | |
parent | 0a120b211f62effb103222c2d134e2ac9767f195 (diff) |
ippool update to allow for gateway address
Diffstat (limited to 'ggsn')
-rw-r--r-- | ggsn/ippool.c | 24 | ||||
-rw-r--r-- | ggsn/ippool.h | 1 |
2 files changed, 13 insertions, 12 deletions
diff --git a/ggsn/ippool.c b/ggsn/ippool.c index 99842c5..331306f 100644 --- a/ggsn/ippool.c +++ b/ggsn/ippool.c @@ -185,16 +185,7 @@ int ippool_aton(struct in_addr *addr, struct in_addr *mask, &m1, &m2, &m3, &m4); switch (c) { case 4: - if (a1 == 0 && a2 == 0 && a3 == 0 && a4 == 0) /* Full Internet */ - mask->s_addr = 0x00000000; - else if (a2 == 0 && a3 == 0 && a4 == 0) /* class A */ - mask->s_addr = htonl(0xff000000); - else if (a3 == 0 && a4 == 0) /* class B */ - mask->s_addr = htonl(0xffff0000); - else if (a4 == 0) /* class C */ - mask->s_addr = htonl(0xffffff00); - else - mask->s_addr = 0xffffffff; + mask->s_addr = 0xffffffff; break; case 5: if (m1 < 0 || m1 > 32) { @@ -245,11 +236,18 @@ int ippool_new(struct ippool_t **this, char *dyn, char *stat, else { if (ippool_aton(&addr, &mask, dyn, 0)) return -1; /* Failed to parse dynamic pool */ + + /* Set IPPOOL_NONETWORK if IPPOOL_NOGATEWAY is set */ + if (flags & IPPOOL_NOGATEWAY) { + flags |= IPPOOL_NONETWORK; + } m = ntohl(mask.s_addr); dynsize = ((~m)+1); if (flags & IPPOOL_NONETWORK) /* Exclude network address from pool */ dynsize--; + if (flags & IPPOOL_NOGATEWAY) /* Exclude gateway address from pool */ + dynsize--; if (flags & IPPOOL_NOBROADCAST) /* Exclude broadcast address from pool */ dynsize--; } @@ -306,11 +304,13 @@ int ippool_new(struct ippool_t **this, char *dyn, char *stat, (*this)->lastdyn = NULL; for (i = 0; i<dynsize; i++) { - if (flags & IPPOOL_NONETWORK) + if (flags & IPPOOL_NOGATEWAY) + (*this)->member[i].addr.s_addr = htonl(ntohl(addr.s_addr) + i + 2); + else if (flags & IPPOOL_NONETWORK) (*this)->member[i].addr.s_addr = htonl(ntohl(addr.s_addr) + i + 1); else (*this)->member[i].addr.s_addr = htonl(ntohl(addr.s_addr) + i); - + (*this)->member[i].inuse = 0; /* Insert into list of unused */ diff --git a/ggsn/ippool.h b/ggsn/ippool.h index 1630a63..67a6f3e 100644 --- a/ggsn/ippool.h +++ b/ggsn/ippool.h @@ -35,6 +35,7 @@ #define IPPOOL_NONETWORK 0x01 #define IPPOOL_NOBROADCAST 0x02 +#define IPPOOL_NOGATEWAY 0x04 #define IPPOOL_STATSIZE 0x10000 |