9
0
Fork 0
This repository has been archived on 2022-06-17. You can view files and clone it, but cannot push or open issues or pull requests.
openggsn/lib/ippool.h

106 lines
3.9 KiB
C
Raw Normal View History

2003-04-11 09:40:12 +00:00
/*
* IP address pool functions.
2004-09-09 20:23:50 +00:00
* Copyright (C) 2003, 2004 Mondru AB.
2003-04-11 09:40:12 +00:00
*
* The contents of this file may be used under the terms of the GNU
* General Public License Version 2, provided that the above copyright
* notice and this permission notice is included in all copies or
* substantial portions of the software.
*
*/
#ifndef _IPPOOL_H
#define _IPPOOL_H
/* Assuming that the address space is fragmented we need a hash table
in order to return the addresses.
The list pool should provide for both IPv4 and IPv6 addresses.
When initialising a new address pool it should be possible to pass
a string of CIDR format networks: "10.0.0.0/24 10.15.0.0/20" would
translate to 256 addresses starting at 10.0.0.0 and 1024 addresses
starting at 10.15.0.0.
The above also applies to IPv6 which can be specified as described
in RFC2373.
*/
#define IPPOOL_NOIP6
#define IPPOOL_NONETWORK 0x01
#define IPPOOL_NOBROADCAST 0x02
#define IPPOOL_NOGATEWAY 0x04
2003-04-11 09:40:12 +00:00
2003-07-06 19:33:18 +00:00
#define IPPOOL_STATSIZE 0x10000
2003-04-11 09:40:12 +00:00
struct ippoolm_t; /* Forward declaration */
struct ippool_t {
unsigned int listsize; /* Total number of addresses */
2003-07-06 19:33:18 +00:00
int allowdyn; /* Allow dynamic IP address allocation */
int allowstat; /* Allow static IP address allocation */
struct in_addr stataddr; /* Static address range network address */
struct in_addr statmask; /* Static address range network mask */
2003-04-11 09:40:12 +00:00
struct ippoolm_t *member; /* Listsize array of members */
unsigned int hashsize; /* Size of hash table */
2003-04-11 09:40:12 +00:00
int hashlog; /* Log2 size of hash table */
int hashmask; /* Bitmask for calculating hash */
struct ippoolm_t **hash; /* Hashsize array of pointer to member */
2003-07-06 19:33:18 +00:00
struct ippoolm_t *firstdyn; /* Pointer to first free dynamic member */
2004-12-30 16:39:11 +00:00
struct ippoolm_t *lastdyn; /* Pointer to last free dynamic member */
2003-07-06 19:33:18 +00:00
struct ippoolm_t *firststat; /* Pointer to first free static member */
struct ippoolm_t *laststat; /* Pointer to last free static member */
2003-04-11 09:40:12 +00:00
};
struct ippoolm_t {
#ifndef IPPOOL_NOIP6
struct in6_addr addr; /* IP address of this member */
#else
struct in_addr addr; /* IP address of this member */
#endif
2003-07-06 19:33:18 +00:00
int inuse; /* 0=available; 1= dynamic; 2 = static */
2003-04-11 09:40:12 +00:00
struct ippoolm_t *nexthash; /* Linked list part of hash table */
2003-07-06 19:33:18 +00:00
struct ippoolm_t *prev, *next; /* Linked list of free dynamic or static */
2003-04-11 09:40:12 +00:00
void *peer; /* Pointer to peer protocol handler */
};
2003-07-06 19:33:18 +00:00
/* The above structures require approximately 20+4 = 24 bytes for
2003-04-11 09:40:12 +00:00
each address (IPv4). For IPv6 the corresponding value is 32+4 = 36
bytes for each address. */
/* Hash an IP address using code based on Bob Jenkins lookupa */
extern unsigned long int ippool_hash4(struct in_addr *addr);
/* Create new address pool */
2003-07-06 19:33:18 +00:00
extern int ippool_new(struct ippool_t **this, char *dyn, char *stat,
int allowdyn, int allowstat, int flags);
2003-04-11 09:40:12 +00:00
/* Delete existing address pool */
extern int ippool_free(struct ippool_t *this);
/* Find an IP address in the pool */
extern int ippool_getip(struct ippool_t *this, struct ippoolm_t **member,
struct in_addr *addr);
/* Get an IP address. If addr = 0.0.0.0 get a dynamic IP address. Otherwise
check to see if the given address is available */
extern int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
2004-12-30 16:39:11 +00:00
struct in_addr *addr, int statip);
2003-04-11 09:40:12 +00:00
/* Return a previously allocated IP address */
2003-07-06 19:33:18 +00:00
extern int ippool_freeip(struct ippool_t *this, struct ippoolm_t *member);
2003-04-11 09:40:12 +00:00
/* Get net and mask based on ascii string */
extern int ippool_aton(struct in_addr *addr, struct in_addr *mask,
char *pool, int number);
#ifndef IPPOOL_NOIP6
extern unsigned long int ippool_hash6(struct in6_addr *addr);
extern int ippool_getip6(struct ippool_t *this, struct in6_addr *addr);
extern int ippool_returnip6(struct ippool_t *this, struct in6_addr *addr);
#endif
#endif /* !_IPPOOL_H */