blob: ddaa2dea05e7dc28500002d6fcb3e1663b698090 [file] [log] [blame]
jjakoa7cd2492003-04-11 09:40:12 +00001/*
2 * IP address pool functions.
jjakoc3213962004-09-09 20:23:50 +00003 * Copyright (C) 2003, 2004 Mondru AB.
jjakoa7cd2492003-04-11 09:40:12 +00004 *
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 *
jjakoa7cd2492003-04-11 09:40:12 +000010 */
11
12#ifndef _IPPOOL_H
13#define _IPPOOL_H
14
15/* Assuming that the address space is fragmented we need a hash table
16 in order to return the addresses.
17
18 The list pool should provide for both IPv4 and IPv6 addresses.
19
20 When initialising a new address pool it should be possible to pass
21 a string of CIDR format networks: "10.0.0.0/24 10.15.0.0/20" would
22 translate to 256 addresses starting at 10.0.0.0 and 1024 addresses
23 starting at 10.15.0.0.
24
25 The above also applies to IPv6 which can be specified as described
26 in RFC2373.
27*/
28
jjakoa7cd2492003-04-11 09:40:12 +000029#define IPPOOL_NOIP6
30
31#define IPPOOL_NONETWORK 0x01
32#define IPPOOL_NOBROADCAST 0x02
jjako504ee452003-08-20 15:25:54 +000033#define IPPOOL_NOGATEWAY 0x04
jjakoa7cd2492003-04-11 09:40:12 +000034
jjako88c22162003-07-06 19:33:18 +000035#define IPPOOL_STATSIZE 0x10000
36
jjakoa7cd2492003-04-11 09:40:12 +000037struct ippoolm_t; /* Forward declaration */
38
39struct ippool_t {
40 int listsize; /* Total number of addresses */
jjako88c22162003-07-06 19:33:18 +000041 int allowdyn; /* Allow dynamic IP address allocation */
42 int allowstat; /* Allow static IP address allocation */
43 struct in_addr stataddr; /* Static address range network address */
44 struct in_addr statmask; /* Static address range network mask */
jjakoa7cd2492003-04-11 09:40:12 +000045 struct ippoolm_t *member; /* Listsize array of members */
46 int hashsize; /* Size of hash table */
47 int hashlog; /* Log2 size of hash table */
48 int hashmask; /* Bitmask for calculating hash */
49 struct ippoolm_t **hash; /* Hashsize array of pointer to member */
jjako88c22162003-07-06 19:33:18 +000050 struct ippoolm_t *firstdyn; /* Pointer to first free dynamic member */
51 struct ippoolm_t *lastdyn; /* Pointer to last free dyanmic member */
52 struct ippoolm_t *firststat; /* Pointer to first free static member */
53 struct ippoolm_t *laststat; /* Pointer to last free static member */
jjakoa7cd2492003-04-11 09:40:12 +000054};
55
56struct ippoolm_t {
57#ifndef IPPOOL_NOIP6
58 struct in6_addr addr; /* IP address of this member */
59#else
60 struct in_addr addr; /* IP address of this member */
61#endif
jjako88c22162003-07-06 19:33:18 +000062 int inuse; /* 0=available; 1= dynamic; 2 = static */
jjakoa7cd2492003-04-11 09:40:12 +000063 struct ippoolm_t *nexthash; /* Linked list part of hash table */
jjako88c22162003-07-06 19:33:18 +000064 struct ippoolm_t *prev, *next; /* Linked list of free dynamic or static */
jjakoa7cd2492003-04-11 09:40:12 +000065 void *peer; /* Pointer to peer protocol handler */
66};
67
jjako88c22162003-07-06 19:33:18 +000068/* The above structures require approximately 20+4 = 24 bytes for
jjakoa7cd2492003-04-11 09:40:12 +000069 each address (IPv4). For IPv6 the corresponding value is 32+4 = 36
70 bytes for each address. */
71
72/* Hash an IP address using code based on Bob Jenkins lookupa */
73extern unsigned long int ippool_hash4(struct in_addr *addr);
74
75/* Create new address pool */
jjako88c22162003-07-06 19:33:18 +000076extern int ippool_new(struct ippool_t **this, char *dyn, char *stat,
77 int allowdyn, int allowstat, int flags);
jjakoa7cd2492003-04-11 09:40:12 +000078
79/* Delete existing address pool */
80extern int ippool_free(struct ippool_t *this);
81
82/* Find an IP address in the pool */
83extern int ippool_getip(struct ippool_t *this, struct ippoolm_t **member,
84 struct in_addr *addr);
85
86/* Get an IP address. If addr = 0.0.0.0 get a dynamic IP address. Otherwise
87 check to see if the given address is available */
88extern int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
89 struct in_addr *addr);
90
91/* Return a previously allocated IP address */
jjako88c22162003-07-06 19:33:18 +000092extern int ippool_freeip(struct ippool_t *this, struct ippoolm_t *member);
jjakoa7cd2492003-04-11 09:40:12 +000093
94/* Get net and mask based on ascii string */
95extern int ippool_aton(struct in_addr *addr, struct in_addr *mask,
96 char *pool, int number);
97
98
99#ifndef IPPOOL_NOIP6
100extern unsigned long int ippool_hash6(struct in6_addr *addr);
101extern int ippool_getip6(struct ippool_t *this, struct in6_addr *addr);
102extern int ippool_returnip6(struct ippool_t *this, struct in6_addr *addr);
103#endif
104
105#endif /* !_IPPOOL_H */