summaryrefslogtreecommitdiffstats
path: root/lib/data.c
diff options
context:
space:
mode:
authorAnton Danilov <littlesmilingcloud@gmail.com>2014-08-28 10:11:31 +0400
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>2014-09-14 20:35:36 +0200
commitc1dd8442aac6cadb29110f763f23cafc63135a79 (patch)
treeac73bf1e0feab1ff602e3450058048c69686022e /lib/data.c
parent89798a24cafa8f1bea391ea577a296f0468971db (diff)
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 <littlesmilingcloud@gmail.com> Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Diffstat (limited to 'lib/data.c')
-rw-r--r--lib/data.c30
1 files changed, 29 insertions, 1 deletions
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: