2 * IP address pool functions.
3 * Copyright (C) 2003, 2004 Mondru AB.
5 * The contents of this file may be used under the terms of the GNU
6 * General Public License Version 2, provided that the above copyright
7 * notice and this permission notice is included in all copies or
8 * substantial portions of the software.
15 #include "../lib/in46_addr.h"
16 #include "../gtp/gtp.h"
18 /* Assuming that the address space is fragmented we need a hash table
19 in order to return the addresses.
21 The list pool should provide for both IPv4 and IPv6 addresses.
23 When initialising a new address pool it should be possible to pass
24 a string of CIDR format networks: "10.0.0.0/24 10.15.0.0/20" would
25 translate to 256 addresses starting at 10.0.0.0 and 1024 addresses
26 starting at 10.15.0.0.
28 The above also applies to IPv6 which can be specified as described
32 #define IPPOOL_NONETWORK 0x01
33 #define IPPOOL_NOBROADCAST 0x02
34 #define IPPOOL_NOGATEWAY 0x04
36 #define IPPOOL_STATSIZE 0x10000
38 struct ippoolm_t
; /* Forward declaration */
41 unsigned int listsize
; /* Total number of addresses */
42 int allowdyn
; /* Allow dynamic IP address allocation */
43 int allowstat
; /* Allow static IP address allocation */
44 struct in46_addr stataddr
; /* Static address range network address */
45 size_t stataddrprefixlen
; /* IPv6 prefix length of stataddr */
46 struct ippoolm_t
*member
; /* Listsize array of members */
47 unsigned int hashsize
; /* Size of hash table */
48 int hashlog
; /* Log2 size of hash table */
49 int hashmask
; /* Bitmask for calculating hash */
50 struct ippoolm_t
**hash
; /* Hashsize array of pointer to member */
51 struct ippoolm_t
*firstdyn
; /* Pointer to first free dynamic member */
52 struct ippoolm_t
*lastdyn
; /* Pointer to last free dynamic member */
53 struct ippoolm_t
*firststat
; /* Pointer to first free static member */
54 struct ippoolm_t
*laststat
; /* Pointer to last free static member */
58 struct in46_addr addr
; /* IP address of this member */
59 struct ippool_t
*pool
; /* Pool to which we belong */
60 int inuse
; /* 0=available; 1= dynamic; 2 = static */
61 struct ippoolm_t
*nexthash
; /* Linked list part of hash table */
62 struct ippoolm_t
*prev
, *next
; /* Linked list of free dynamic or static */
63 void *peer
; /* Pointer to peer protocol handler */
66 /* The above structures require approximately 20+4 = 24 bytes for
67 each address (IPv4). For IPv6 the corresponding value is 32+4 = 36
68 bytes for each address. */
70 /* Hash an IP address using code based on Bob Jenkins lookupa */
71 extern unsigned long int ippool_hash(struct in46_addr
*addr
);
73 /* Create new address pool */
74 extern int ippool_new(struct ippool_t
**this, const struct in46_prefix
*dyn
,
75 const struct in46_prefix
*stat
, int flags
);
77 /* Delete existing address pool */
78 extern int ippool_free(struct ippool_t
*this);
80 /* Find an IP address in the pool */
81 extern int ippool_getip(struct ippool_t
*this, struct ippoolm_t
**member
,
82 struct in46_addr
*addr
);
84 /* Get an IP address. If addr = 0.0.0.0 get a dynamic IP address. Otherwise
85 check to see if the given address is available */
86 extern int ippool_newip(struct ippool_t
*this, struct ippoolm_t
**member
,
87 struct in46_addr
*addr
, int statip
);
89 /* Return a previously allocated IP address */
90 extern int ippool_freeip(struct ippool_t
*this, struct ippoolm_t
*member
);
92 /* Get net and mask based on ascii string */
93 int ippool_aton(struct in46_addr
*addr
, size_t *prefixlen
, const char *pool
, int number
);
95 /* Increase IPv4/IPv6 address by 1 */
96 extern void in46a_inc(struct in46_addr
*addr
);
98 #endif /* !_IPPOOL_H */