From c1dd8442aac6cadb29110f763f23cafc63135a79 Mon Sep 17 00:00:00 2001 From: Anton Danilov Date: Thu, 28 Aug 2014 10:11:31 +0400 Subject: libipset: Add userspace code for the skbinfo extension support. Add userspace code to support of the skbinfo extension independly of set types. Defines constants, flag and function for print/parse/send/recieve of skbinfo parameters. Signed-off-by: Anton Danilov Signed-off-by: Jozsef Kadlecsik --- lib/data.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'lib/data.c') diff --git a/lib/data.c b/lib/data.c index c214bec..8372a2f 100644 --- a/lib/data.c +++ b/lib/data.c @@ -78,6 +78,9 @@ struct ipset_data { uint64_t packets; uint64_t bytes; char comment[IPSET_MAX_COMMENT_SIZE+1]; + uint64_t skbmark; + uint32_t skbprio; + uint16_t skbqueue; } adt; }; }; @@ -312,6 +315,9 @@ ipset_data_set(struct ipset_data *data, enum ipset_opt opt, const void *value) case IPSET_OPT_FORCEADD: cadt_flag_type_attr(data, opt, IPSET_FLAG_WITH_FORCEADD); break; + case IPSET_OPT_SKBINFO: + cadt_flag_type_attr(data, opt, IPSET_FLAG_WITH_SKBINFO); + break; /* Create-specific options, filled out by the kernel */ case IPSET_OPT_ELEMENTS: data->create.elements = *(const uint32_t *) value; @@ -374,6 +380,15 @@ ipset_data_set(struct ipset_data *data, enum ipset_opt opt, const void *value) ipset_strlcpy(data->adt.comment, value, IPSET_MAX_COMMENT_SIZE + 1); break; + case IPSET_OPT_SKBMARK: + data->adt.skbmark = *(const uint64_t *) value; + break; + case IPSET_OPT_SKBPRIO: + data->adt.skbprio = *(const uint32_t *) value; + break; + case IPSET_OPT_SKBQUEUE: + data->adt.skbqueue = *(const uint16_t *) value; + break; /* Swap/rename */ case IPSET_OPT_SETNAME2: ipset_strlcpy(data->setname2, value, IPSET_MAXNAMELEN); @@ -410,7 +425,10 @@ ipset_data_set(struct ipset_data *data, enum ipset_opt opt, const void *value) IPSET_FLAG(IPSET_OPT_COUNTERS)); if (data->cadt_flags & IPSET_FLAG_WITH_COMMENT) ipset_data_flags_set(data, - IPSET_FLAG(IPSET_OPT_CREATE_COMMENT)); + IPSET_FLAG(IPSET_OPT_CREATE_COMMENT)); + if (data->cadt_flags & IPSET_FLAG_WITH_SKBINFO) + ipset_data_flags_set(data, + IPSET_FLAG(IPSET_OPT_SKBINFO)); break; default: return -1; @@ -519,6 +537,12 @@ ipset_data_get(const struct ipset_data *data, enum ipset_opt opt) return &data->adt.bytes; case IPSET_OPT_ADT_COMMENT: return &data->adt.comment; + case IPSET_OPT_SKBMARK: + return &data->adt.skbmark; + case IPSET_OPT_SKBPRIO: + return &data->adt.skbprio; + case IPSET_OPT_SKBQUEUE: + return &data->adt.skbqueue; /* Swap/rename */ case IPSET_OPT_SETNAME2: return data->setname2; @@ -533,6 +557,7 @@ ipset_data_get(const struct ipset_data *data, enum ipset_opt opt) case IPSET_OPT_COUNTERS: case IPSET_OPT_CREATE_COMMENT: case IPSET_OPT_FORCEADD: + case IPSET_OPT_SKBINFO: return &data->cadt_flags; default: return NULL; @@ -562,6 +587,7 @@ ipset_data_sizeof(enum ipset_opt opt, uint8_t family) return sizeof(uint32_t); case IPSET_OPT_PORT: case IPSET_OPT_PORT_TO: + case IPSET_OPT_SKBQUEUE: return sizeof(uint16_t); case IPSET_SETNAME: case IPSET_OPT_NAME: @@ -576,9 +602,11 @@ ipset_data_sizeof(enum ipset_opt opt, uint8_t family) case IPSET_OPT_ELEMENTS: case IPSET_OPT_REFERENCES: case IPSET_OPT_MEMSIZE: + case IPSET_OPT_SKBPRIO: return sizeof(uint32_t); case IPSET_OPT_PACKETS: case IPSET_OPT_BYTES: + case IPSET_OPT_SKBMARK: return sizeof(uint64_t); case IPSET_OPT_CIDR: case IPSET_OPT_CIDR2: -- cgit v1.2.3