blob: 67a6f3e699483affb31d2a88e0c2eb78df12a88c [file] [log] [blame]
jjakoa7cd2492003-04-11 09:40:12 +00001/*
2 * IP address pool functions.
3 * Copyright (C) 2003 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 *
10 * The initial developer of the original code is
11 * Jens Jakobsen <jj@openggsn.org>
12 *
13 * Contributor(s):
14 *
15 */
16
17#ifndef _IPPOOL_H
18#define _IPPOOL_H
19
20/* Assuming that the address space is fragmented we need a hash table
21 in order to return the addresses.
22
23 The list pool should provide for both IPv4 and IPv6 addresses.
24
25 When initialising a new address pool it should be possible to pass
26 a string of CIDR format networks: "10.0.0.0/24 10.15.0.0/20" would
27 translate to 256 addresses starting at 10.0.0.0 and 1024 addresses
28 starting at 10.15.0.0.
29
30 The above also applies to IPv6 which can be specified as described
31 in RFC2373.
32*/
33
jjakoa7cd2492003-04-11 09:40:12 +000034#define IPPOOL_NOIP6
35
36#define IPPOOL_NONETWORK 0x01
37#define IPPOOL_NOBROADCAST 0x02
jjako504ee452003-08-20 15:25:54 +000038#define IPPOOL_NOGATEWAY 0x04
jjakoa7cd2492003-04-11 09:40:12 +000039
jjako88c22162003-07-06 19:33:18 +000040#define IPPOOL_STATSIZE 0x10000
41
jjakoa7cd2492003-04-11 09:40:12 +000042struct ippoolm_t; /* Forward declaration */
43
44struct ippool_t {
45 int listsize; /* Total number of addresses */
jjako88c22162003-07-06 19:33:18 +000046 int allowdyn; /* Allow dynamic IP address allocation */
47 int allowstat; /* Allow static IP address allocation */
48 struct in_addr stataddr; /* Static address range network address */
49 struct in_addr statmask; /* Static address range network mask */
jjakoa7cd2492003-04-11 09:40:12 +000050 struct ippoolm_t *member; /* Listsize array of members */
51 int hashsize; /* Size of hash table */
52 int hashlog; /* Log2 size of hash table */
53 int hashmask; /* Bitmask for calculating hash */
54 struct ippoolm_t **hash; /* Hashsize array of pointer to member */
jjako88c22162003-07-06 19:33:18 +000055 struct ippoolm_t *firstdyn; /* Pointer to first free dynamic member */
56 struct ippoolm_t *lastdyn; /* Pointer to last free dyanmic member */
57 struct ippoolm_t *firststat; /* Pointer to first free static member */
58 struct ippoolm_t *laststat; /* Pointer to last free static member */
jjakoa7cd2492003-04-11 09:40:12 +000059};
60
61struct ippoolm_t {
62#ifndef IPPOOL_NOIP6
63 struct in6_addr addr; /* IP address of this member */
64#else
65 struct in_addr addr; /* IP address of this member */
66#endif
jjako88c22162003-07-06 19:33:18 +000067 int inuse; /* 0=available; 1= dynamic; 2 = static */
jjakoa7cd2492003-04-11 09:40:12 +000068 struct ippoolm_t *nexthash; /* Linked list part of hash table */
jjako88c22162003-07-06 19:33:18 +000069 struct ippoolm_t *prev, *next; /* Linked list of free dynamic or static */
jjakoa7cd2492003-04-11 09:40:12 +000070 void *peer; /* Pointer to peer protocol handler */
71};
72
jjako88c22162003-07-06 19:33:18 +000073/* The above structures require approximately 20+4 = 24 bytes for
jjakoa7cd2492003-04-11 09:40:12 +000074 each address (IPv4). For IPv6 the corresponding value is 32+4 = 36
75 bytes for each address. */
76
77/* Hash an IP address using code based on Bob Jenkins lookupa */
78extern unsigned long int ippool_hash4(struct in_addr *addr);
79
80/* Create new address pool */
jjako88c22162003-07-06 19:33:18 +000081extern int ippool_new(struct ippool_t **this, char *dyn, char *stat,
82 int allowdyn, int allowstat, int flags);
jjakoa7cd2492003-04-11 09:40:12 +000083
84/* Delete existing address pool */
85extern int ippool_free(struct ippool_t *this);
86
87/* Find an IP address in the pool */
88extern int ippool_getip(struct ippool_t *this, struct ippoolm_t **member,
89 struct in_addr *addr);
90
91/* Get an IP address. If addr = 0.0.0.0 get a dynamic IP address. Otherwise
92 check to see if the given address is available */
93extern int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
94 struct in_addr *addr);
95
96/* Return a previously allocated IP address */
jjako88c22162003-07-06 19:33:18 +000097extern int ippool_freeip(struct ippool_t *this, struct ippoolm_t *member);
jjakoa7cd2492003-04-11 09:40:12 +000098
99/* Get net and mask based on ascii string */
100extern int ippool_aton(struct in_addr *addr, struct in_addr *mask,
101 char *pool, int number);
102
103
104#ifndef IPPOOL_NOIP6
105extern unsigned long int ippool_hash6(struct in6_addr *addr);
106extern int ippool_getip6(struct ippool_t *this, struct in6_addr *addr);
107extern int ippool_returnip6(struct ippool_t *this, struct in6_addr *addr);
108#endif
109
110#endif /* !_IPPOOL_H */