diff options
-rw-r--r-- | ggsn/ggsn.c | 23 | ||||
-rw-r--r-- | lib/in46_addr.c | 48 | ||||
-rw-r--r-- | lib/in46_addr.h | 3 | ||||
-rw-r--r-- | lib/ippool.c | 35 | ||||
-rw-r--r-- | lib/ippool.h | 4 | ||||
-rw-r--r-- | lib/tun.c | 48 | ||||
-rw-r--r-- | lib/tun.h | 11 | ||||
-rw-r--r-- | tests/lib/ippool_test.c | 40 | ||||
-rw-r--r-- | tests/lib/ippool_test.err | 2 | ||||
-rw-r--r-- | tests/lib/ippool_test.ok | 264 |
10 files changed, 438 insertions, 40 deletions
diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c index 67d040f..9cfe085 100644 --- a/ggsn/ggsn.c +++ b/ggsn/ggsn.c @@ -149,6 +149,10 @@ int apn_stop(struct apn_ctx *apn, bool force) /* actually start the APN with its current config */ int apn_start(struct apn_ctx *apn) { + int ipv4_blacklist_size = 0, ipv6_blacklist_size = 0; + struct in46_prefix ipv4_tun_ip, ipv6_tun_ip, ipv6_tun_linklocal_ip; + int ippool_flags = IPPOOL_NONETWORK | IPPOOL_NOBROADCAST; + if (apn->started) return 0; @@ -201,12 +205,13 @@ int apn_start(struct apn_ctx *apn) } if (apn->cfg.apn_type_mask & (APN_TYPE_IPv6|APN_TYPE_IPv4v6)) { - if (tun_ipv6_linklocal_get(apn->tun.tun, &apn->v6_lladdr) < 0) { + if (tun_ipv6_local_get(apn->tun.tun, &ipv6_tun_linklocal_ip, IPV6_TYPE_LINK) < 0) { LOGPAPN(LOGL_ERROR, apn, "Cannot obtain IPv6 link-local address of " "interface: %s\n", strerror(errno)); apn_stop(apn, false); return -1; } + apn->v6_lladdr = ipv6_tun_linklocal_ip.addr.v6; } /* set back-pointer from TUN device to APN */ @@ -229,8 +234,14 @@ int apn_start(struct apn_ctx *apn) if (apn->v4.cfg.dynamic_prefix.addr.len) { LOGPAPN(LOGL_INFO, apn, "Creating IPv4 pool %s\n", in46p_ntoa(&apn->v4.cfg.dynamic_prefix)); + if(tun_ipv4_local_get(apn->tun.tun, &ipv4_tun_ip) == 0) { + ipv4_blacklist_size = 1; + LOGPAPN(LOGL_INFO, apn, "Blacklist IPv4 tun IP %s\n", + in46p_ntoa(&ipv4_tun_ip)); + } if (ippool_new(&apn->v4.pool, &apn->v4.cfg.dynamic_prefix, - &apn->v4.cfg.static_prefix, 0)) { + &apn->v4.cfg.static_prefix, ippool_flags, + &ipv4_tun_ip, ipv4_blacklist_size)) { LOGPAPN(LOGL_ERROR, apn, "Failed to create IPv4 pool\n"); apn_stop(apn, false); return -1; @@ -241,8 +252,14 @@ int apn_start(struct apn_ctx *apn) if (apn->v6.cfg.dynamic_prefix.addr.len) { LOGPAPN(LOGL_INFO, apn, "Creating IPv6 pool %s\n", in46p_ntoa(&apn->v6.cfg.dynamic_prefix)); + if(tun_ipv6_local_get(apn->tun.tun, &ipv6_tun_ip, IPV6_TYPE_GLOBAL) == 0) { + ipv6_blacklist_size = 1; + LOGPAPN(LOGL_INFO, apn, "Blacklist IPv6 tun IP %s\n", + in46p_ntoa(&ipv6_tun_ip)); + } if (ippool_new(&apn->v6.pool, &apn->v6.cfg.dynamic_prefix, - &apn->v6.cfg.static_prefix, 0)) { + &apn->v6.cfg.static_prefix, ippool_flags, + &ipv6_tun_ip, ipv6_blacklist_size)) { LOGPAPN(LOGL_ERROR, apn, "Failed to create IPv6 pool\n"); apn_stop(apn, false); return -1; diff --git a/lib/in46_addr.c b/lib/in46_addr.c index 068499c..7901be9 100644 --- a/lib/in46_addr.c +++ b/lib/in46_addr.c @@ -195,6 +195,54 @@ int in46a_within_mask(const struct in46_addr *addr, const struct in46_addr *net, } } +unsigned int netmask_ipv4_prefixlen(const struct in_addr *netmask) +{ + struct in_addr tmp = *netmask; + int prefix = 0; + + while (tmp.s_addr & 0x01) { + prefix++; + tmp.s_addr = tmp.s_addr >> 1; + } + return prefix; +} + +unsigned int netmask_ipv6_prefixlen(const struct in6_addr *netmask) +{ + struct in6_addr tmp = *netmask; + int prefix = 0; + + #if defined(__linux__) + #define ADDRFIELD(i) s6_addr32[i] + #else + #define ADDRFIELD(i) __u6_addr.__u6_addr32[i] + #endif + + for (int i = 0; i < 4; i++) { + while (tmp.ADDRFIELD(i) & 0x01) { + prefix++; + tmp.ADDRFIELD(i) = tmp.ADDRFIELD(i) >> 1; + } + } + + #undef ADDRFIELD + + return prefix; +} + +unsigned int in46a_prefixlen(const struct in46_addr *netmask) +{ + switch (netmask->len) { + case 4: + return netmask_ipv4_prefixlen(&netmask->v4); + case 16: + return netmask_ipv6_prefixlen(&netmask->v6); + default: + OSMO_ASSERT(0); + return 0; + } +} + /*! Convert given PDP End User Address to in46_addr * \returns 0 on success; negative on error */ int in46a_to_eua(const struct in46_addr *src, struct ul66_t *eua) diff --git a/lib/in46_addr.h b/lib/in46_addr.h index ce2df14..109a933 100644 --- a/lib/in46_addr.h +++ b/lib/in46_addr.h @@ -27,6 +27,9 @@ extern const char *in46p_ntoa(const struct in46_prefix *in46p); extern int in46a_equal(const struct in46_addr *a, const struct in46_addr *b); extern int in46a_prefix_equal(const struct in46_addr *a, const struct in46_addr *b); extern int in46a_within_mask(const struct in46_addr *addr, const struct in46_addr *net, size_t prefixlen); +extern unsigned int netmask_ipv4_prefixlen(const struct in_addr *netmask); +extern unsigned int netmask_ipv6_prefixlen(const struct in6_addr *netmask); +extern unsigned int in46a_prefixlen(const struct in46_addr *netmask); int in46a_to_eua(const struct in46_addr *src, struct ul66_t *eua); int in46a_from_eua(const struct ul66_t *eua, struct in46_addr *dst); diff --git a/lib/ippool.c b/lib/ippool.c index 03323e2..f1b4223 100644 --- a/lib/ippool.c +++ b/lib/ippool.c @@ -184,9 +184,18 @@ void in46a_inc(struct in46_addr *addr) } } +static bool addr_in_prefix_list(struct in46_addr *addr, struct in46_prefix *list, size_t list_size) +{ + for (int i = 0; i < list_size; i++) { + if(in46a_prefix_equal(addr, &list[i].addr)) + return true; + } + return false; +} + /* Create new address pool */ int ippool_new(struct ippool_t **this, const struct in46_prefix *dyn, const struct in46_prefix *stat, - int flags) + int flags, struct in46_prefix *blacklist, size_t blacklist_size) { /* Parse only first instance of pool for now */ @@ -210,18 +219,16 @@ int ippool_new(struct ippool_t **this, const struct in46_prefix *dyn, const stru if (addr.len == sizeof(struct in6_addr)) addr.len = 64/8; - /* Set IPPOOL_NONETWORK if IPPOOL_NOGATEWAY is set */ - if (flags & IPPOOL_NOGATEWAY) { - flags |= IPPOOL_NONETWORK; - } - dynsize = (1 << (addr.len*8 - addrprefixlen)); 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--; + /* Exclude included blacklist addresses from pool */ + for (int i = 0; i < blacklist_size; i++) { + if (in46a_within_mask(&blacklist[i].addr, &addr, addrprefixlen)) + dynsize--; + } } if (!stat || stat->addr.len == 0) { @@ -278,13 +285,17 @@ int ippool_new(struct ippool_t **this, const struct in46_prefix *dyn, const stru (*this)->firstdyn = NULL; (*this)->lastdyn = NULL; - if (flags & IPPOOL_NOGATEWAY) { - in46a_inc(&addr); - in46a_inc(&addr); - } else if (flags & IPPOOL_NONETWORK) { + if (flags & IPPOOL_NONETWORK) { in46a_inc(&addr); } for (i = 0; i < dynsize; i++) { + if (addr_in_prefix_list(&addr, blacklist, blacklist_size)) { + SYS_ERR(DIP, LOGL_DEBUG, 0, + "addr blacklisted from pool: %s", in46a_ntoa(&addr)); + in46a_inc(&addr); + i--; + continue; + } (*this)->member[i].addr = addr; in46a_inc(&addr); diff --git a/lib/ippool.h b/lib/ippool.h index 56beb4e..efb274b 100644 --- a/lib/ippool.h +++ b/lib/ippool.h @@ -31,7 +31,6 @@ #define IPPOOL_NONETWORK 0x01 #define IPPOOL_NOBROADCAST 0x02 -#define IPPOOL_NOGATEWAY 0x04 #define IPPOOL_STATSIZE 0x10000 @@ -72,7 +71,8 @@ extern unsigned long int ippool_hash(struct in46_addr *addr); /* Create new address pool */ extern int ippool_new(struct ippool_t **this, const struct in46_prefix *dyn, - const struct in46_prefix *stat, int flags); + const struct in46_prefix *stat, int flags, + struct in46_prefix *blacklist, size_t blacklist_size); /* Delete existing address pool */ extern int ippool_free(struct ippool_t *this); @@ -751,8 +751,40 @@ int tun_runscript(struct tun_t *tun, char *script) #include <ifaddrs.h> -/* obtain the link-local address of the tun device */ -int tun_ipv6_linklocal_get(const struct tun_t *tun, struct in6_addr *ia) +/* Obtain the local address of the tun device */ +int tun_ipv4_local_get(const struct tun_t *tun, struct in46_prefix *prefix) +{ + struct ifaddrs *ifaddr, *ifa; + + if (getifaddrs(&ifaddr) == -1) { + return -1; + } + + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + struct sockaddr_in *sin4 = (struct sockaddr_in *) ifa->ifa_addr; + struct sockaddr_in *netmask4 = (struct sockaddr_in *) ifa->ifa_netmask; + if (ifa->ifa_addr == NULL) + continue; + + if (ifa->ifa_addr->sa_family != AF_INET) + continue; + + if (strcmp(ifa->ifa_name, tun->devname)) + continue; + + prefix->addr.len = sizeof(sin4->sin_addr); + prefix->addr.v4 = sin4->sin_addr; + prefix->prefixlen = netmask_ipv4_prefixlen(&netmask4->sin_addr); + freeifaddrs(ifaddr); + return 0; + } + freeifaddrs(ifaddr); + return -1; +} + +/* Obtain the local address of the tun device. + Type of IPv6 address can be specified with "flags = IPV6_TYPE_LINK | IPV6_TYPE_GLOBAL" */ +int tun_ipv6_local_get(const struct tun_t *tun, struct in46_prefix *prefix, int flags) { struct ifaddrs *ifaddr, *ifa; static const uint8_t ll_prefix[] = { 0xfe,0x80, 0,0, 0,0, 0,0 }; @@ -763,6 +795,7 @@ int tun_ipv6_linklocal_get(const struct tun_t *tun, struct in6_addr *ia) for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) ifa->ifa_addr; + struct sockaddr_in6 *netmask6 = (struct sockaddr_in6 *) ifa->ifa_netmask; if (ifa->ifa_addr == NULL) continue; @@ -772,10 +805,17 @@ int tun_ipv6_linklocal_get(const struct tun_t *tun, struct in6_addr *ia) if (strcmp(ifa->ifa_name, tun->devname)) continue; - if (memcmp(sin6->sin6_addr.s6_addr, ll_prefix, sizeof(ll_prefix))) + if (!(flags & IPV6_TYPE_LINK) && + !memcmp(sin6->sin6_addr.s6_addr, ll_prefix, sizeof(ll_prefix))) + continue; + + if (!(flags & IPV6_TYPE_GLOBAL) && + memcmp(sin6->sin6_addr.s6_addr, ll_prefix, sizeof(ll_prefix))) continue; - *ia = sin6->sin6_addr; + prefix->addr.len = sizeof(sin6->sin6_addr); + prefix->addr.v6 = sin6->sin6_addr; + prefix->prefixlen = netmask_ipv6_prefixlen(&netmask6->sin6_addr); freeifaddrs(ifaddr); return 0; } @@ -23,6 +23,14 @@ #define TUN_NLBUFSIZE 1024 #include "config.h" + +/* ipv6 ip type flags for tun_ipv6_local_get() */ +enum { + IPV6_TYPE_LINK = 1, + IPV6_TYPE_GLOBAL = 2, +}; + + #ifndef HAVE_IPHDR struct iphdr { @@ -85,6 +93,7 @@ extern int tun_set_cb_ind(struct tun_t *this, extern int tun_runscript(struct tun_t *tun, char *script); -int tun_ipv6_linklocal_get(const struct tun_t *tun, struct in6_addr *ia); +int tun_ipv4_local_get(const struct tun_t *tun, struct in46_prefix *prefix); +int tun_ipv6_local_get(const struct tun_t *tun, struct in46_prefix *prefix, int flags); #endif /* !_TUN_H */ diff --git a/tests/lib/ippool_test.c b/tests/lib/ippool_test.c index 1d0c3a2..04306ef 100644 --- a/tests/lib/ippool_test.c +++ b/tests/lib/ippool_test.c @@ -13,36 +13,46 @@ #include "../../lib/syserr.h" -static struct ippool_t *create_pool(const char *prefix_str, unsigned int flags) +static struct ippool_t *create_pool(const char *prefix_str, unsigned int flags, char **blacklist, size_t blacklist_size) { + struct in46_prefix *blacklist_pfx; struct ippool_t *pool; struct in46_prefix pfx; size_t t; int rc; + blacklist_pfx = calloc(blacklist_size, sizeof(struct in46_prefix)); + for (int i = 0; i < blacklist_size; i++) { + rc = ippool_aton(&blacklist_pfx[i].addr, &t, blacklist[i], 0); + OSMO_ASSERT(rc == 0); + pfx.prefixlen = t; + } + /* dynamic-only v4 */ - rc = ippool_aton(&pfx.addr, &t, prefix_str, flags); + rc = ippool_aton(&pfx.addr, &t, prefix_str, 0); OSMO_ASSERT(rc == 0); pfx.prefixlen = t; - rc = ippool_new(&pool, &pfx, NULL, flags); + rc = ippool_new(&pool, &pfx, NULL, flags, blacklist_pfx, blacklist_size); OSMO_ASSERT(rc == 0); //ippool_printaddr(pool); + free(blacklist_pfx); + return pool; } -static int test_pool_size(const char *pfx, unsigned int flags, unsigned int expected_size) +static void test_pool_size(const char *pfx, unsigned int flags, char **blacklist, size_t blacklist_size, unsigned int expected_size) { struct ippool_t *pool; struct ippoolm_t *member; struct in46_addr addr; int i, rc, n; - printf("testing pool for prefix %s, flags=0x%x, expected_size=%u\n", pfx, flags, expected_size); - pool = create_pool(pfx, flags); + printf("testing pool for prefix %s, flags=0x%x, blacklist_size=%lu, expected_size=%u\n", pfx, flags, blacklist_size, expected_size); + pool = create_pool(pfx, flags, blacklist, blacklist_size); OSMO_ASSERT(pool->listsize == expected_size); memset(&addr, 0, sizeof(addr)); @@ -88,24 +98,28 @@ static int test_pool_size(const char *pfx, unsigned int flags, unsigned int expe ippool_free(pool); } -static int test_pool_sizes(void) +static void test_pool_sizes(void) { - struct ippool_t *pool; /* 256 addresses [0..255] */ - test_pool_size("192.168.23.0/24", 0, 256); + test_pool_size("192.168.23.0/24", 0, NULL, 0, 256); /* 255 addresses [1..255] */ - test_pool_size("192.168.23.0/24", IPPOOL_NONETWORK, 255); + test_pool_size("192.168.23.0/24", IPPOOL_NONETWORK, NULL, 0, 255); /* 254 addresses [1..254] */ - test_pool_size("192.168.23.0/24", IPPOOL_NONETWORK | IPPOOL_NOBROADCAST, 254); + test_pool_size("192.168.23.0/24", IPPOOL_NONETWORK | IPPOOL_NOBROADCAST, NULL, 0, 254); /* 65534 addresses [0.1..255.254] */ - test_pool_size("192.168.0.0/16", IPPOOL_NONETWORK | IPPOOL_NOBROADCAST, 65534); + test_pool_size("192.168.0.0/16", IPPOOL_NONETWORK | IPPOOL_NOBROADCAST, NULL, 0, 65534); /* 256 prefixes of /64 each */ - test_pool_size("2001:DB8::/56", 0, 256); + test_pool_size("2001:DB8::/56", 0, NULL, 0, 256); + + /* 253 addresses [1..254] & exclude 192.168.23.1/24 */ + char *blacklist[] = {"176.16.222.10/24", "192.168.23.1/24", "192.168.38.2/24"}; + test_pool_size("192.168.23.0/24", IPPOOL_NONETWORK | IPPOOL_NOBROADCAST, blacklist, 3, 253); + } int main(int argc, char **argv) diff --git a/tests/lib/ippool_test.err b/tests/lib/ippool_test.err index 7dc5371..b11c12a 100644 --- a/tests/lib/ippool_test.err +++ b/tests/lib/ippool_test.err @@ -8,3 +8,5 @@ No more IP addresses available No more IP addresses available No more IP addresses available No more IP addresses available +No more IP addresses available +No more IP addresses available diff --git a/tests/lib/ippool_test.ok b/tests/lib/ippool_test.ok index a0eeb4b..263494e 100644 --- a/tests/lib/ippool_test.ok +++ b/tests/lib/ippool_test.ok @@ -1,4 +1,4 @@ -testing pool for prefix 192.168.23.0/24, flags=0x0, expected_size=256 +testing pool for prefix 192.168.23.0/24, flags=0x0, blacklist_size=0, expected_size=256 allocated address 192.168.23.0 allocated address 192.168.23.1 allocated address 192.168.23.2 @@ -255,7 +255,7 @@ allocated address 192.168.23.252 allocated address 192.168.23.253 allocated address 192.168.23.254 allocated address 192.168.23.255 -testing pool for prefix 192.168.23.0/24, flags=0x1, expected_size=255 +testing pool for prefix 192.168.23.0/24, flags=0x1, blacklist_size=0, expected_size=255 allocated address 192.168.23.1 allocated address 192.168.23.2 allocated address 192.168.23.3 @@ -511,7 +511,7 @@ allocated address 192.168.23.252 allocated address 192.168.23.253 allocated address 192.168.23.254 allocated address 192.168.23.255 -testing pool for prefix 192.168.23.0/24, flags=0x3, expected_size=254 +testing pool for prefix 192.168.23.0/24, flags=0x3, blacklist_size=0, expected_size=254 allocated address 192.168.23.1 allocated address 192.168.23.2 allocated address 192.168.23.3 @@ -766,7 +766,7 @@ allocated address 192.168.23.251 allocated address 192.168.23.252 allocated address 192.168.23.253 allocated address 192.168.23.254 -testing pool for prefix 192.168.0.0/16, flags=0x3, expected_size=65534 +testing pool for prefix 192.168.0.0/16, flags=0x3, blacklist_size=0, expected_size=65534 allocated address 192.168.0.1 allocated address 192.168.0.2 allocated address 192.168.0.3 @@ -66301,7 +66301,7 @@ allocated address 192.168.255.251 allocated address 192.168.255.252 allocated address 192.168.255.253 allocated address 192.168.255.254 -testing pool for prefix 2001:DB8::/56, flags=0x0, expected_size=256 +testing pool for prefix 2001:DB8::/56, flags=0x0, blacklist_size=0, expected_size=256 allocated address 2001:db8:: allocated address 2001:db8:0:1:: allocated address 2001:db8:0:2:: @@ -66558,3 +66558,257 @@ allocated address 2001:db8:0:fc:: allocated address 2001:db8:0:fd:: allocated address 2001:db8:0:fe:: allocated address 2001:db8:0:ff:: +testing pool for prefix 192.168.23.0/24, flags=0x3, blacklist_size=3, expected_size=253 +allocated address 192.168.23.2 +allocated address 192.168.23.3 +allocated address 192.168.23.4 +allocated address 192.168.23.5 +allocated address 192.168.23.6 +allocated address 192.168.23.7 +allocated address 192.168.23.8 +allocated address 192.168.23.9 +allocated address 192.168.23.10 +allocated address 192.168.23.11 +allocated address 192.168.23.12 +allocated address 192.168.23.13 +allocated address 192.168.23.14 +allocated address 192.168.23.15 +allocated address 192.168.23.16 +allocated address 192.168.23.17 +allocated address 192.168.23.18 +allocated address 192.168.23.19 +allocated address 192.168.23.20 +allocated address 192.168.23.21 +allocated address 192.168.23.22 +allocated address 192.168.23.23 +allocated address 192.168.23.24 +allocated address 192.168.23.25 +allocated address 192.168.23.26 +allocated address 192.168.23.27 +allocated address 192.168.23.28 +allocated address 192.168.23.29 +allocated address 192.168.23.30 +allocated address 192.168.23.31 +allocated address 192.168.23.32 +allocated address 192.168.23.33 +allocated address 192.168.23.34 +allocated address 192.168.23.35 +allocated address 192.168.23.36 +allocated address 192.168.23.37 +allocated address 192.168.23.38 +allocated address 192.168.23.39 +allocated address 192.168.23.40 +allocated address 192.168.23.41 +allocated address 192.168.23.42 +allocated address 192.168.23.43 +allocated address 192.168.23.44 +allocated address 192.168.23.45 +allocated address 192.168.23.46 +allocated address 192.168.23.47 +allocated address 192.168.23.48 +allocated address 192.168.23.49 +allocated address 192.168.23.50 +allocated address 192.168.23.51 +allocated address 192.168.23.52 +allocated address 192.168.23.53 +allocated address 192.168.23.54 +allocated address 192.168.23.55 +allocated address 192.168.23.56 +allocated address 192.168.23.57 +allocated address 192.168.23.58 +allocated address 192.168.23.59 +allocated address 192.168.23.60 +allocated address 192.168.23.61 +allocated address 192.168.23.62 +allocated address 192.168.23.63 +allocated address 192.168.23.64 +allocated address 192.168.23.65 +allocated address 192.168.23.66 +allocated address 192.168.23.67 +allocated address 192.168.23.68 +allocated address 192.168.23.69 +allocated address 192.168.23.70 +allocated address 192.168.23.71 +allocated address 192.168.23.72 +allocated address 192.168.23.73 +allocated address 192.168.23.74 +allocated address 192.168.23.75 +allocated address 192.168.23.76 +allocated address 192.168.23.77 +allocated address 192.168.23.78 +allocated address 192.168.23.79 +allocated address 192.168.23.80 +allocated address 192.168.23.81 +allocated address 192.168.23.82 +allocated address 192.168.23.83 +allocated address 192.168.23.84 +allocated address 192.168.23.85 +allocated address 192.168.23.86 +allocated address 192.168.23.87 +allocated address 192.168.23.88 +allocated address 192.168.23.89 +allocated address 192.168.23.90 +allocated address 192.168.23.91 +allocated address 192.168.23.92 +allocated address 192.168.23.93 +allocated address 192.168.23.94 +allocated address 192.168.23.95 +allocated address 192.168.23.96 +allocated address 192.168.23.97 +allocated address 192.168.23.98 +allocated address 192.168.23.99 +allocated address 192.168.23.100 +allocated address 192.168.23.101 +allocated address 192.168.23.102 +allocated address 192.168.23.103 +allocated address 192.168.23.104 +allocated address 192.168.23.105 +allocated address 192.168.23.106 +allocated address 192.168.23.107 +allocated address 192.168.23.108 +allocated address 192.168.23.109 +allocated address 192.168.23.110 +allocated address 192.168.23.111 +allocated address 192.168.23.112 +allocated address 192.168.23.113 +allocated address 192.168.23.114 +allocated address 192.168.23.115 +allocated address 192.168.23.116 +allocated address 192.168.23.117 +allocated address 192.168.23.118 +allocated address 192.168.23.119 +allocated address 192.168.23.120 +allocated address 192.168.23.121 +allocated address 192.168.23.122 +allocated address 192.168.23.123 +allocated address 192.168.23.124 +allocated address 192.168.23.125 +allocated address 192.168.23.126 +allocated address 192.168.23.127 +allocated address 192.168.23.128 +allocated address 192.168.23.129 +allocated address 192.168.23.130 +allocated address 192.168.23.131 +allocated address 192.168.23.132 +allocated address 192.168.23.133 +allocated address 192.168.23.134 +allocated address 192.168.23.135 +allocated address 192.168.23.136 +allocated address 192.168.23.137 +allocated address 192.168.23.138 +allocated address 192.168.23.139 +allocated address 192.168.23.140 +allocated address 192.168.23.141 +allocated address 192.168.23.142 +allocated address 192.168.23.143 +allocated address 192.168.23.144 +allocated address 192.168.23.145 +allocated address 192.168.23.146 +allocated address 192.168.23.147 +allocated address 192.168.23.148 +allocated address 192.168.23.149 +allocated address 192.168.23.150 +allocated address 192.168.23.151 +allocated address 192.168.23.152 +allocated address 192.168.23.153 +allocated address 192.168.23.154 +allocated address 192.168.23.155 +allocated address 192.168.23.156 +allocated address 192.168.23.157 +allocated address 192.168.23.158 +allocated address 192.168.23.159 +allocated address 192.168.23.160 +allocated address 192.168.23.161 +allocated address 192.168.23.162 +allocated address 192.168.23.163 +allocated address 192.168.23.164 +allocated address 192.168.23.165 +allocated address 192.168.23.166 +allocated address 192.168.23.167 +allocated address 192.168.23.168 +allocated address 192.168.23.169 +allocated address 192.168.23.170 +allocated address 192.168.23.171 +allocated address 192.168.23.172 +allocated address 192.168.23.173 +allocated address 192.168.23.174 +allocated address 192.168.23.175 +allocated address 192.168.23.176 +allocated address 192.168.23.177 +allocated address 192.168.23.178 +allocated address 192.168.23.179 +allocated address 192.168.23.180 +allocated address 192.168.23.181 +allocated address 192.168.23.182 +allocated address 192.168.23.183 +allocated address 192.168.23.184 +allocated address 192.168.23.185 +allocated address 192.168.23.186 +allocated address 192.168.23.187 +allocated address 192.168.23.188 +allocated address 192.168.23.189 +allocated address 192.168.23.190 +allocated address 192.168.23.191 +allocated address 192.168.23.192 +allocated address 192.168.23.193 +allocated address 192.168.23.194 +allocated address 192.168.23.195 +allocated address 192.168.23.196 +allocated address 192.168.23.197 +allocated address 192.168.23.198 +allocated address 192.168.23.199 +allocated address 192.168.23.200 +allocated address 192.168.23.201 +allocated address 192.168.23.202 +allocated address 192.168.23.203 +allocated address 192.168.23.204 +allocated address 192.168.23.205 +allocated address 192.168.23.206 +allocated address 192.168.23.207 +allocated address 192.168.23.208 +allocated address 192.168.23.209 +allocated address 192.168.23.210 +allocated address 192.168.23.211 +allocated address 192.168.23.212 +allocated address 192.168.23.213 +allocated address 192.168.23.214 +allocated address 192.168.23.215 +allocated address 192.168.23.216 +allocated address 192.168.23.217 +allocated address 192.168.23.218 +allocated address 192.168.23.219 +allocated address 192.168.23.220 +allocated address 192.168.23.221 +allocated address 192.168.23.222 +allocated address 192.168.23.223 +allocated address 192.168.23.224 +allocated address 192.168.23.225 +allocated address 192.168.23.226 +allocated address 192.168.23.227 +allocated address 192.168.23.228 +allocated address 192.168.23.229 +allocated address 192.168.23.230 +allocated address 192.168.23.231 +allocated address 192.168.23.232 +allocated address 192.168.23.233 +allocated address 192.168.23.234 +allocated address 192.168.23.235 +allocated address 192.168.23.236 +allocated address 192.168.23.237 +allocated address 192.168.23.238 +allocated address 192.168.23.239 +allocated address 192.168.23.240 +allocated address 192.168.23.241 +allocated address 192.168.23.242 +allocated address 192.168.23.243 +allocated address 192.168.23.244 +allocated address 192.168.23.245 +allocated address 192.168.23.246 +allocated address 192.168.23.247 +allocated address 192.168.23.248 +allocated address 192.168.23.249 +allocated address 192.168.23.250 +allocated address 192.168.23.251 +allocated address 192.168.23.252 +allocated address 192.168.23.253 +allocated address 192.168.23.254 |