301c277a6042c2b2c27ee69047e10c09cabe80d8
[rahunas] / src / rh-ipset.h
1 /**
2  * RahuNAS ipset implementation header
3  * Author: Neutron Soutmun <neo.neutron@gmail.com>
4  * Date:   2008-08-20
5  */
6
7 #ifndef __RH_IPSET_H
8 #define __RH_IPSET_H
9
10 #include "rahunasd.h"
11 #include <linux/if_ether.h>
12 #include <linux/netfilter_ipv4/ip_set.h>
13 #include <linux/netfilter_ipv4/ip_set_rahunas.h>
14
15 #define GETSOCK_TRIES 5
16 #define LIST_TRIES 5
17
18 extern struct set **set_list;
19 extern ip_set_id_t max_sets;
20
21 /* The view of an ipset in userspace */
22 struct set {
23         char name[IP_SET_MAXNAMELEN];           /* Name of the set */
24         ip_set_id_t id;                         /* Unique set id */
25         ip_set_id_t index;                      /* Array index */
26         unsigned ref;                           /* References in kernel */
27         struct settype *settype;                /* Pointer to set type functions */
28 };
29
30 enum rh_adt_result {
31   RH_IS_IN_SET,
32   RH_IS_NOT_IN_SET,
33 };
34
35 /* Commands */
36 enum set_commands {
37         CMD_NONE,
38         CMD_CREATE,             /* -N */
39         CMD_DESTROY,            /* -X */
40         CMD_FLUSH,              /* -F */
41         CMD_RENAME,             /* -E */
42         CMD_SWAP,               /* -W */
43         CMD_LIST,               /* -L */
44         CMD_SAVE,               /* -S */
45         CMD_RESTORE,            /* -R */
46         CMD_ADD,                /* -A */
47         CMD_DEL,                /* -D */
48         CMD_TEST,               /* -T */
49         CMD_BIND,               /* -B */
50         CMD_UNBIND,             /* -U */
51         CMD_HELP,               /* -H */
52         CMD_VERSION,            /* -V */
53         NUMBER_OF_CMD = CMD_VERSION,
54         /* Internal commands */
55         CMD_MAX_SETS,
56         CMD_LIST_SIZE,
57         CMD_SAVE_SIZE,
58         CMD_ADT_GET,
59 };
60
61 enum exittype {
62         OTHER_PROBLEM = 1,
63         PARAMETER_PROBLEM,
64         VERSION_PROBLEM
65 };
66
67 int kernel_getsocket(void);
68 int wrapped_getsockopt(void *data, socklen_t *size);
69 int wrapped_setsockopt(void *data, socklen_t size);
70 void kernel_getfrom(void *data, socklen_t * size);
71 int kernel_sendto_handleerrno(unsigned op, void *data, socklen_t size);
72 void kernel_sendto(void *data, size_t size);
73 int kernel_getfrom_handleerrno(void *data, size_t * size);
74 struct set *set_adt_get(const char *name);
75 int set_adtip(struct set *rahunas_set, const char *adtip, const char *adtmac, 
76               unsigned op);
77
78 int set_adtip_nb(struct set *rahunas_set, ip_set_ip_t *adtip, 
79                      unsigned char adtmac[ETH_ALEN], unsigned op);
80
81 void set_flush(const char *name);
82
83 size_t load_set_list(const char name[IP_SET_MAXNAMELEN],
84                             ip_set_id_t *idx,
85                             unsigned op, unsigned cmd);
86
87 int get_header_from_set (struct rahunas_map *map);
88
89 int walk_through_set (int (*callback)(void *));
90
91 void parse_ip(const char *str, ip_set_ip_t *ip);
92 void parse_mac(const char *mac, unsigned char *ethernet);
93 char *ip_tostring(ip_set_ip_t ip);
94 char *mac_tostring(unsigned char macaddress[ETH_ALEN]);
95
96 #define BITSPERBYTE (8*sizeof(char))
97 #define ID2BYTE(id) ((id)/BITSPERBYTE)
98 #define ID2MASK(id) (1 << ((id)%BITSPERBYTE))
99 #define test_bit(id, heap)  ((((char *)(heap))[ID2BYTE(id)] & ID2MASK(id)) != 0)
100
101 #endif //__RH_IPSET_H