Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netfilter: ipset: Expose the initval hash parameter to userspace

It makes possible to reproduce exactly the same set after a save/restore.

Signed-off-by: Jozsef Kadlecsik <kadlec@netfilter.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>

authored by

Jozsef Kadlecsik and committed by
Pablo Neira Ayuso
3976ca10 ccf0a4b7

+34 -17
+1 -1
include/uapi/linux/netfilter/ipset/ip_set.h
··· 92 92 /* Reserve empty slots */ 93 93 IPSET_ATTR_CADT_MAX = 16, 94 94 /* Create-only specific attributes */ 95 - IPSET_ATTR_GC, 95 + IPSET_ATTR_INITVAL, /* was unused IPSET_ATTR_GC */ 96 96 IPSET_ATTR_HASHSIZE, 97 97 IPSET_ATTR_MAXELEM, 98 98 IPSET_ATTR_NETMASK,
+9 -4
net/netfilter/ipset/ip_set_hash_gen.h
··· 1301 1301 if (nla_put_u32(skb, IPSET_ATTR_MARKMASK, h->markmask)) 1302 1302 goto nla_put_failure; 1303 1303 #endif 1304 - if (set->flags & IPSET_CREATE_FLAG_BUCKETSIZE && 1305 - nla_put_u8(skb, IPSET_ATTR_BUCKETSIZE, h->bucketsize)) 1306 - goto nla_put_failure; 1304 + if (set->flags & IPSET_CREATE_FLAG_BUCKETSIZE) { 1305 + if (nla_put_u8(skb, IPSET_ATTR_BUCKETSIZE, h->bucketsize) || 1306 + nla_put_net32(skb, IPSET_ATTR_INITVAL, htonl(h->initval))) 1307 + goto nla_put_failure; 1308 + } 1307 1309 if (nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref)) || 1308 1310 nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) || 1309 1311 nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(elements))) ··· 1548 1546 #ifdef IP_SET_HASH_WITH_MARKMASK 1549 1547 h->markmask = markmask; 1550 1548 #endif 1551 - get_random_bytes(&h->initval, sizeof(h->initval)); 1549 + if (tb[IPSET_ATTR_INITVAL]) 1550 + h->initval = ntohl(nla_get_be32(tb[IPSET_ATTR_INITVAL])); 1551 + else 1552 + get_random_bytes(&h->initval, sizeof(h->initval)); 1552 1553 h->bucketsize = AHASH_MAX_SIZE; 1553 1554 if (tb[IPSET_ATTR_BUCKETSIZE]) { 1554 1555 h->bucketsize = nla_get_u8(tb[IPSET_ATTR_BUCKETSIZE]);
+2 -1
net/netfilter/ipset/ip_set_hash_ip.c
··· 24 24 /* 2 Comments support */ 25 25 /* 3 Forceadd support */ 26 26 /* 4 skbinfo support */ 27 - #define IPSET_TYPE_REV_MAX 5 /* bucketsize support */ 27 + #define IPSET_TYPE_REV_MAX 5 /* bucketsize, initval support */ 28 28 29 29 MODULE_LICENSE("GPL"); 30 30 MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@netfilter.org>"); ··· 283 283 .create_policy = { 284 284 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 285 285 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 286 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 286 287 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 287 288 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 288 289 [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 },
+2 -1
net/netfilter/ipset/ip_set_hash_ipmac.c
··· 23 23 #include <linux/netfilter/ipset/ip_set_hash.h> 24 24 25 25 #define IPSET_TYPE_REV_MIN 0 26 - #define IPSET_TYPE_REV_MAX 1 /* bucketsize support */ 26 + #define IPSET_TYPE_REV_MAX 1 /* bucketsize, initval support */ 27 27 28 28 MODULE_LICENSE("GPL"); 29 29 MODULE_AUTHOR("Tomasz Chilinski <tomasz.chilinski@chilan.com>"); ··· 273 273 .create_policy = { 274 274 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 275 275 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 276 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 276 277 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 277 278 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 278 279 [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 },
+2 -1
net/netfilter/ipset/ip_set_hash_ipmark.c
··· 22 22 #define IPSET_TYPE_REV_MIN 0 23 23 /* 1 Forceadd support */ 24 24 /* 2 skbinfo support */ 25 - #define IPSET_TYPE_REV_MAX 3 /* bucketsize support */ 25 + #define IPSET_TYPE_REV_MAX 3 /* bucketsize, initval support */ 26 26 27 27 MODULE_LICENSE("GPL"); 28 28 MODULE_AUTHOR("Vytas Dauksa <vytas.dauksa@smoothwall.net>"); ··· 281 281 [IPSET_ATTR_MARKMASK] = { .type = NLA_U32 }, 282 282 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 283 283 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 284 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 284 285 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 285 286 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 286 287 [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 },
+2 -1
net/netfilter/ipset/ip_set_hash_ipport.c
··· 26 26 /* 3 Comments support added */ 27 27 /* 4 Forceadd support added */ 28 28 /* 5 skbinfo support added */ 29 - #define IPSET_TYPE_REV_MAX 6 /* bucketsize support added */ 29 + #define IPSET_TYPE_REV_MAX 6 /* bucketsize, initval support added */ 30 30 31 31 MODULE_LICENSE("GPL"); 32 32 MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@netfilter.org>"); ··· 347 347 .create_policy = { 348 348 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 349 349 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 350 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 350 351 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 351 352 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 352 353 [IPSET_ATTR_PROTO] = { .type = NLA_U8 },
+2 -1
net/netfilter/ipset/ip_set_hash_ipportip.c
··· 26 26 /* 3 Comments support added */ 27 27 /* 4 Forceadd support added */ 28 28 /* 5 skbinfo support added */ 29 - #define IPSET_TYPE_REV_MAX 6 /* bucketsize support added */ 29 + #define IPSET_TYPE_REV_MAX 6 /* bucketsize, initval support added */ 30 30 31 31 MODULE_LICENSE("GPL"); 32 32 MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@netfilter.org>"); ··· 362 362 .create_policy = { 363 363 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 364 364 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 365 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 365 366 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 366 367 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 367 368 [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 },
+2 -1
net/netfilter/ipset/ip_set_hash_ipportnet.c
··· 28 28 /* 5 Comments support added */ 29 29 /* 6 Forceadd support added */ 30 30 /* 7 skbinfo support added */ 31 - #define IPSET_TYPE_REV_MAX 8 /* bucketsize support added */ 31 + #define IPSET_TYPE_REV_MAX 8 /* bucketsize, initval support added */ 32 32 33 33 MODULE_LICENSE("GPL"); 34 34 MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@netfilter.org>"); ··· 519 519 .create_policy = { 520 520 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 521 521 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 522 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 522 523 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 523 524 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 524 525 [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 },
+2 -1
net/netfilter/ipset/ip_set_hash_mac.c
··· 16 16 #include <linux/netfilter/ipset/ip_set_hash.h> 17 17 18 18 #define IPSET_TYPE_REV_MIN 0 19 - #define IPSET_TYPE_REV_MAX 1 /* bucketsize support */ 19 + #define IPSET_TYPE_REV_MAX 1 /* bucketsize, initval support */ 20 20 21 21 MODULE_LICENSE("GPL"); 22 22 MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@netfilter.org>"); ··· 130 130 .create_policy = { 131 131 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 132 132 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 133 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 133 134 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 134 135 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 135 136 [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 },
+2 -1
net/netfilter/ipset/ip_set_hash_net.c
··· 25 25 /* 4 Comments support added */ 26 26 /* 5 Forceadd support added */ 27 27 /* 6 skbinfo support added */ 28 - #define IPSET_TYPE_REV_MAX 7 /* bucketsize support added */ 28 + #define IPSET_TYPE_REV_MAX 7 /* bucketsize, initval support added */ 29 29 30 30 MODULE_LICENSE("GPL"); 31 31 MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@netfilter.org>"); ··· 360 360 .create_policy = { 361 361 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 362 362 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 363 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 363 364 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 364 365 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 365 366 [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 },
+2 -1
net/netfilter/ipset/ip_set_hash_netiface.c
··· 27 27 /* 5 Forceadd support added */ 28 28 /* 6 skbinfo support added */ 29 29 /* 7 interface wildcard support added */ 30 - #define IPSET_TYPE_REV_MAX 8 /* bucketsize support added */ 30 + #define IPSET_TYPE_REV_MAX 8 /* bucketsize, initval support added */ 31 31 32 32 MODULE_LICENSE("GPL"); 33 33 MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@netfilter.org>"); ··· 476 476 .create_policy = { 477 477 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 478 478 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 479 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 479 480 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 480 481 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 481 482 [IPSET_ATTR_PROTO] = { .type = NLA_U8 },
+2 -1
net/netfilter/ipset/ip_set_hash_netnet.c
··· 23 23 #define IPSET_TYPE_REV_MIN 0 24 24 /* 1 Forceadd support added */ 25 25 /* 2 skbinfo support added */ 26 - #define IPSET_TYPE_REV_MAX 3 /* bucketsize support added */ 26 + #define IPSET_TYPE_REV_MAX 3 /* bucketsize, initval support added */ 27 27 28 28 MODULE_LICENSE("GPL"); 29 29 MODULE_AUTHOR("Oliver Smith <oliver@8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa>"); ··· 465 465 .create_policy = { 466 466 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 467 467 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 468 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 468 469 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 469 470 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 470 471 [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 },
+2 -1
net/netfilter/ipset/ip_set_hash_netport.c
··· 27 27 /* 5 Comments support added */ 28 28 /* 6 Forceadd support added */ 29 29 /* 7 skbinfo support added */ 30 - #define IPSET_TYPE_REV_MAX 8 /* bucketsize support added */ 30 + #define IPSET_TYPE_REV_MAX 8 /* bucketsize, initval support added */ 31 31 32 32 MODULE_LICENSE("GPL"); 33 33 MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@netfilter.org>"); ··· 466 466 .create_policy = { 467 467 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 468 468 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 469 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 469 470 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 470 471 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 471 472 [IPSET_ATTR_PROTO] = { .type = NLA_U8 },
+2 -1
net/netfilter/ipset/ip_set_hash_netportnet.c
··· 24 24 /* 0 Comments support added */ 25 25 /* 1 Forceadd support added */ 26 26 /* 2 skbinfo support added */ 27 - #define IPSET_TYPE_REV_MAX 3 /* bucketsize support added */ 27 + #define IPSET_TYPE_REV_MAX 3 /* bucketsize, initval support added */ 28 28 29 29 MODULE_LICENSE("GPL"); 30 30 MODULE_AUTHOR("Oliver Smith <oliver@8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa>"); ··· 564 564 .create_policy = { 565 565 [IPSET_ATTR_HASHSIZE] = { .type = NLA_U32 }, 566 566 [IPSET_ATTR_MAXELEM] = { .type = NLA_U32 }, 567 + [IPSET_ATTR_INITVAL] = { .type = NLA_U32 }, 567 568 [IPSET_ATTR_BUCKETSIZE] = { .type = NLA_U8 }, 568 569 [IPSET_ATTR_RESIZE] = { .type = NLA_U8 }, 569 570 [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 },