blob: 8249b7f4067e00635aa2ad7b66e7e6b42408260d [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
Harald Welted12eab92017-08-02 19:49:47 +020015#include "../lib/in46_addr.h"
Harald Welted1bf1e12017-08-03 00:00:23 +020016#include "../gtp/gtp.h"
Harald Welted12eab92017-08-02 19:49:47 +020017
jjakoa7cd2492003-04-11 09:40:12 +000018/* Assuming that the address space is fragmented we need a hash table
19 in order to return the addresses.
20
21 The list pool should provide for both IPv4 and IPv6 addresses.
22
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.
27
28 The above also applies to IPv6 which can be specified as described
29 in RFC2373.
30*/
31
jjakoa7cd2492003-04-11 09:40:12 +000032#define IPPOOL_NONETWORK 0x01
33#define IPPOOL_NOBROADCAST 0x02
jjako504ee452003-08-20 15:25:54 +000034#define IPPOOL_NOGATEWAY 0x04
jjakoa7cd2492003-04-11 09:40:12 +000035
jjako88c22162003-07-06 19:33:18 +000036#define IPPOOL_STATSIZE 0x10000
37
Harald Weltebed35df2011-11-02 13:06:18 +010038struct ippoolm_t; /* Forward declaration */
jjakoa7cd2492003-04-11 09:40:12 +000039
40struct ippool_t {
Harald Weltebed35df2011-11-02 13:06:18 +010041 unsigned int listsize; /* Total number of addresses */
42 int allowdyn; /* Allow dynamic IP address allocation */
43 int allowstat; /* Allow static IP address allocation */
Harald Welted12eab92017-08-02 19:49:47 +020044 struct in46_addr stataddr; /* Static address range network address */
45 size_t stataddrprefixlen; /* IPv6 prefix length of stataddr */
Harald Weltebed35df2011-11-02 13:06:18 +010046 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 */
jjakoa7cd2492003-04-11 09:40:12 +000055};
56
57struct ippoolm_t {
Harald Welted12eab92017-08-02 19:49:47 +020058 struct in46_addr addr; /* IP address of this member */
Harald Welteb513b952017-08-12 12:46:39 +020059 struct ippool_t *pool; /* Pool to which we belong */
Harald Weltebed35df2011-11-02 13:06:18 +010060 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 */
jjakoa7cd2492003-04-11 09:40:12 +000064};
65
jjako88c22162003-07-06 19:33:18 +000066/* The above structures require approximately 20+4 = 24 bytes for
jjakoa7cd2492003-04-11 09:40:12 +000067 each address (IPv4). For IPv6 the corresponding value is 32+4 = 36
68 bytes for each address. */
69
70/* Hash an IP address using code based on Bob Jenkins lookupa */
Harald Welted12eab92017-08-02 19:49:47 +020071extern unsigned long int ippool_hash(struct in46_addr *addr);
jjakoa7cd2492003-04-11 09:40:12 +000072
73/* Create new address pool */
Harald Welte53165ed2017-08-02 22:58:54 +020074extern int ippool_new(struct ippool_t **this, const char *dyn, const char *stat,
jjako88c22162003-07-06 19:33:18 +000075 int allowdyn, int allowstat, int flags);
jjakoa7cd2492003-04-11 09:40:12 +000076
77/* Delete existing address pool */
78extern int ippool_free(struct ippool_t *this);
79
80/* Find an IP address in the pool */
81extern int ippool_getip(struct ippool_t *this, struct ippoolm_t **member,
Harald Welted12eab92017-08-02 19:49:47 +020082 struct in46_addr *addr);
jjakoa7cd2492003-04-11 09:40:12 +000083
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 */
86extern int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
Harald Welted12eab92017-08-02 19:49:47 +020087 struct in46_addr *addr, int statip);
jjakoa7cd2492003-04-11 09:40:12 +000088
89/* Return a previously allocated IP address */
jjako88c22162003-07-06 19:33:18 +000090extern int ippool_freeip(struct ippool_t *this, struct ippoolm_t *member);
jjakoa7cd2492003-04-11 09:40:12 +000091
92/* Get net and mask based on ascii string */
Harald Welted12eab92017-08-02 19:49:47 +020093int ippool_aton(struct in46_addr *addr, size_t *prefixlen, const char *pool, int number);
jjakoa7cd2492003-04-11 09:40:12 +000094
Harald Welted12eab92017-08-02 19:49:47 +020095/* Increase IPv4/IPv6 address by 1 */
96extern void in46a_inc(struct in46_addr *addr);
jjakoa7cd2492003-04-11 09:40:12 +000097
Harald Weltebed35df2011-11-02 13:06:18 +010098#endif /* !_IPPOOL_H */