diff options
author | /C=EU/ST=EU/CN=Jozsef Kadlecsik/emailAddress=kadlec@blackhole.kfki.hu </C=EU/ST=EU/CN=Jozsef Kadlecsik/emailAddress=kadlec@blackhole.kfki.hu> | 2008-10-20 10:00:26 +0000 |
---|---|---|
committer | /C=EU/ST=EU/CN=Jozsef Kadlecsik/emailAddress=kadlec@blackhole.kfki.hu </C=EU/ST=EU/CN=Jozsef Kadlecsik/emailAddress=kadlec@blackhole.kfki.hu> | 2008-10-20 10:00:26 +0000 |
commit | a96e4fca10506462df4ee4035f0f86f09bd9dc34 (patch) | |
tree | 103bed0a7ae3608675f371d2ac91f3fa7f3a58cc /kernel/include/linux/netfilter_ipv4/ip_set_bitmaps.h | |
parent | bc2ddd2d8da1252e78a1f25bd91c1e3cd8016ead (diff) |
ipset 2.4 release
userspace changes:
- Added KBUILD_OUTPUT support (Sven Wegener)
- Fix memory leak in ipset_iptreemap (Sven Wegener)
- Fix multiple compiler warnings (Sven Wegener)
- ipportiphash, ipportnethash and setlist types added
- binding marked as deprecated functionality
- element separator token changed to ',' in anticipating
IPv6 addresses, old separator tokens are still supported
- unnecessary includes removed
- ipset does not try to resolve IP addresses when listing
the content of sets (default changed)
- manpage updated
- ChangeLog forked for kernel part
kernel part changes:
- ipportiphash, ipportnethash and setlist types added
- set type modules reworked to avoid code duplication
as much as possible, code unification macros
- expand_macros Makefile target added to help debugging
code unification macros
- ip_set_addip_kernel and ip_set_delip_kernel
changed from void to int, __ip_set_get_byname and
__ip_set_put_byid added for the sake of setlist type
- unnecessary includes removed
- compatibility fix for kernels >= 2.6.27:
semaphore.h was moved from asm/ to linux/ (James King)
- ChangeLog forked for kernel part
Diffstat (limited to 'kernel/include/linux/netfilter_ipv4/ip_set_bitmaps.h')
-rw-r--r-- | kernel/include/linux/netfilter_ipv4/ip_set_bitmaps.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/kernel/include/linux/netfilter_ipv4/ip_set_bitmaps.h b/kernel/include/linux/netfilter_ipv4/ip_set_bitmaps.h new file mode 100644 index 0000000..916cb80 --- /dev/null +++ b/kernel/include/linux/netfilter_ipv4/ip_set_bitmaps.h @@ -0,0 +1,119 @@ +#ifndef __IP_SET_BITMAPS_H +#define __IP_SET_BITMAPS_H + +/* Macros to generate functions */ + +#define BITMAP_CREATE(type) \ +static int \ +type##_create(struct ip_set *set, const void *data, size_t size) \ +{ \ + int newbytes; \ + const struct ip_set_req_##type##_create *req = data; \ + struct ip_set_##type *map; \ + \ + if (req->from > req->to) { \ + DP("bad range"); \ + return -ENOEXEC; \ + } \ + \ + map = kmalloc(sizeof(struct ip_set_##type), GFP_KERNEL); \ + if (!map) { \ + DP("out of memory for %d bytes", \ + sizeof(struct ip_set_#type)); \ + return -ENOMEM; \ + } \ + map->first_ip = req->from; \ + map->last_ip = req->to; \ + \ + newbytes = __##type##_create(req, map); \ + if (newbytes < 0) { \ + kfree(map); \ + return newbytes; \ + } \ + \ + map->size = newbytes; \ + map->members = ip_set_malloc(newbytes); \ + if (!map->members) { \ + DP("out of memory for %d bytes", newbytes); \ + kfree(map); \ + return -ENOMEM; \ + } \ + memset(map->members, 0, newbytes); \ + \ + set->data = map; \ + return 0; \ +} + +#define BITMAP_DESTROY(type) \ +static void \ +type##_destroy(struct ip_set *set) \ +{ \ + struct ip_set_##type *map = set->data; \ + \ + ip_set_free(map->members, map->size); \ + kfree(map); \ + \ + set->data = NULL; \ +} + +#define BITMAP_FLUSH(type) \ +static void \ +type##_flush(struct ip_set *set) \ +{ \ + struct ip_set_##type *map = set->data; \ + memset(map->members, 0, map->size); \ +} + +#define BITMAP_LIST_HEADER(type) \ +static void \ +type##_list_header(const struct ip_set *set, void *data) \ +{ \ + const struct ip_set_##type *map = set->data; \ + struct ip_set_req_##type##_create *header = data; \ + \ + header->from = map->first_ip; \ + header->to = map->last_ip; \ + __##type##_list_header(map, header); \ +} + +#define BITMAP_LIST_MEMBERS_SIZE(type) \ +static int \ +type##_list_members_size(const struct ip_set *set) \ +{ \ + const struct ip_set_##type *map = set->data; \ + \ + return map->size; \ +} + +#define BITMAP_LIST_MEMBERS(type) \ +static void \ +type##_list_members(const struct ip_set *set, void *data) \ +{ \ + const struct ip_set_##type *map = set->data; \ + \ + memcpy(data, map->members, map->size); \ +} + +#define IP_SET_TYPE(type, __features) \ +struct ip_set_type ip_set_##type = { \ + .typename = #type, \ + .features = __features, \ + .protocol_version = IP_SET_PROTOCOL_VERSION, \ + .create = &type##_create, \ + .destroy = &type##_destroy, \ + .flush = &type##_flush, \ + .reqsize = sizeof(struct ip_set_req_##type), \ + .addip = &type##_uadd, \ + .addip_kernel = &type##_kadd, \ + .delip = &type##_udel, \ + .delip_kernel = &type##_kdel, \ + .testip = &type##_utest, \ + .testip_kernel = &type##_ktest, \ + .header_size = sizeof(struct ip_set_req_##type##_create),\ + .list_header = &type##_list_header, \ + .list_members_size = &type##_list_members_size, \ + .list_members = &type##_list_members, \ + .me = THIS_MODULE, \ +}; + +#endif /* __IP_SET_BITMAPS_H */ |