-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathip4_deaggregate.c
64 lines (63 loc) · 1.68 KB
/
ip4_deaggregate.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "ip4.h"
#include <string.h>
#include <stdlib.h>
#include "alloc.h"
#include <stdio.h>
#include <unistd.h>
#define FULL_MASK 4294967295
int ip4_deaggregate2 (unsigned int hostmin, unsigned int hostmax, ip4_cidr_t **subnets,unsigned int *slen)
{
unsigned int step;
unsigned int mask = 0;
unsigned int i = 0;
unsigned int base = hostmin;
while (base <= hostmax) {
step = 32;
while ( (base | ( 1 << step)) != base) {
if ((base | (((~0) & FULL_MASK) >> (31-step))) > hostmax) break;
step++;
}
mask = 32 - step;
if (*slen == 0) {
*subnets = (ip4_cidr_t *)alloc(sizeof(ip4_cidr_t));
if (!*subnets) return -1;
(*subnets)[0].subnet = 0;
(*subnets)[0].mask = 0;
} else {
if (alloc_re(subnets, (*slen)*sizeof(ip4_cidr_t), ((*slen) + 1)*sizeof(ip4_cidr_t)) == 0) return -1;
}
(*subnets)[*slen].subnet = base;
(*subnets)[*slen].mask = mask;
base += 1 << step;
(*slen)++;
}
return 1;
}
int ip4_deaggregate (unsigned int hostmin, unsigned int hostmax, ip4_cidr_t **subnets,unsigned int *slen)
{
unsigned int step;
unsigned int mask = 0;
unsigned int i = 0;
unsigned int base = hostmin;
while (base <= hostmax) {
step = 0;
while ( (base | ( 1 << step)) != base) {
if ((base | (((~0) & FULL_MASK) >> (31-step))) > hostmax) break;
step++;
}
mask = 32 - step;
if (*slen == 0) {
*subnets = (ip4_cidr_t *)alloc(sizeof(ip4_cidr_t));
if (!*subnets) return -1;
(*subnets)[0].subnet = 0;
(*subnets)[0].mask = 0;
} else {
if (alloc_re(subnets, (*slen)*sizeof(ip4_cidr_t), ((*slen) + 1)*sizeof(ip4_cidr_t)) == 0) return -1;
}
(*subnets)[*slen].subnet = base;
(*subnets)[*slen].mask = mask;
base += 1 << step;
(*slen)++;
}
return 1;
}