update git URLs (git -> https; gitea)
[openggsn.git] / lib / ippool.h
blobfbac66d2ef89af750d71020918b43fc6d863ba3d
1 /*
2 * IP address pool functions.
3 * Copyright (C) 2003, 2004 Mondru AB.
4 *
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.
9 *
12 #ifndef _IPPOOL_H
13 #define _IPPOOL_H
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
29 in RFC2373.
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 */
40 struct ippool_t {
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 */
57 struct ippoolm_t {
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 */