It makes possible to reproduce exactly the same set after a save/restore.
Unified · Split
| @@ -92,7 +92,7 @@ enum { · 91 unmodified lines | ||
| 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, |
| @@ -1301,9 +1301,11 @@ mtype_head(struct ip_set *set, struct sk_buff *skb) · 1300 unmodified lines | ||
| 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))) |
| @@ -1546,7 +1548,10 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set, · 236 unmodified lines | ||
| 1546 | 1548 | #ifdef IP_SET_HASH_WITH_MARKMASK |
| 1547 | 1549 | h->markmask = markmask; |
| 1548 | 1550 | #endif |
| 1549 | − get_random_bytes(&h->initval, sizeof(h->initval)); | |
| 1551 | + if (tb[IPSET_ATTR_INITVAL]) | |
| 1552 | + h->initval = ntohl(nla_get_be32(tb[IPSET_ATTR_INITVAL])); | |
| 1553 | + else | |
| 1554 | + get_random_bytes(&h->initval, sizeof(h->initval)); | |
| 1550 | 1555 | h->bucketsize = AHASH_MAX_SIZE; |
| 1551 | 1556 | if (tb[IPSET_ATTR_BUCKETSIZE]) { |
| 1552 | 1557 | h->bucketsize = nla_get_u8(tb[IPSET_ATTR_BUCKETSIZE]); |
| @@ -24,7 +24,7 @@ · 23 unmodified lines | ||
| 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,6 +283,7 @@ static struct ip_set_type hash_ip_type __read_mostly = { · 252 unmodified lines | ||
| 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 }, |
| @@ -23,7 +23,7 @@ · 22 unmodified lines | ||
| 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,6 +273,7 @@ static struct ip_set_type hash_ipmac_type __read_mostly = { · 243 unmodified lines | ||
| 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 }, |
| @@ -22,7 +22,7 @@ · 21 unmodified lines | ||
| 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,6 +281,7 @@ static struct ip_set_type hash_ipmark_type __read_mostly = { · 252 unmodified lines | ||
| 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 }, |
| @@ -26,7 +26,7 @@ · 25 unmodified lines | ||
| 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,6 +347,7 @@ static struct ip_set_type hash_ipport_type __read_mostly = { · 314 unmodified lines | ||
| 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 }, |
| @@ -26,7 +26,7 @@ · 25 unmodified lines | ||
| 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,6 +362,7 @@ static struct ip_set_type hash_ipportip_type __read_mostly = { · 329 unmodified lines | ||
| 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 }, |
| @@ -28,7 +28,7 @@ · 27 unmodified lines | ||
| 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,6 +519,7 @@ static struct ip_set_type hash_ipportnet_type __read_mostly = { · 484 unmodified lines | ||
| 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 }, |
| @@ -16,7 +16,7 @@ · 15 unmodified lines | ||
| 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,6 +130,7 @@ static struct ip_set_type hash_mac_type __read_mostly = { · 107 unmodified lines | ||
| 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 }, |
| @@ -25,7 +25,7 @@ · 24 unmodified lines | ||
| 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,6 +360,7 @@ static struct ip_set_type hash_net_type __read_mostly = { · 328 unmodified lines | ||
| 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 }, |
| @@ -27,7 +27,7 @@ · 26 unmodified lines | ||
| 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,6 +476,7 @@ static struct ip_set_type hash_netiface_type __read_mostly = { · 442 unmodified lines | ||
| 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 }, |
| @@ -23,7 +23,7 @@ · 22 unmodified lines | ||
| 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,6 +465,7 @@ static struct ip_set_type hash_netnet_type __read_mostly = { · 435 unmodified lines | ||
| 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 }, |
| @@ -27,7 +27,7 @@ · 26 unmodified lines | ||
| 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,6 +466,7 @@ static struct ip_set_type hash_netport_type __read_mostly = { · 432 unmodified lines | ||
| 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 }, |
| @@ -24,7 +24,7 @@ · 23 unmodified lines | ||
| 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,6 +564,7 @@ static struct ip_set_type hash_netportnet_type __read_mostly = { · 533 unmodified lines | ||
| 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 }, |