blob: f38889bd02c46ea0f6165bae917e4122fe7a0387 [file] [log] [blame]
--- a/include/internal/object.h 2015-05-27 03:27:34.102294894 -0700
+++ b/include/internal/object.h 2015-10-28 13:01:38.315308063 -0700
@@ -153,6 +153,12 @@
uint32_t set[__NFCT_BITSET];
};
+struct __nfct_comcerto_fp_info {
+ int ifindex;
+ int iif;
+ uint32_t mark;
+};
+
struct nf_conntrack {
struct nfct_tuple_head head;
struct __nfct_tuple repl;
@@ -161,6 +167,7 @@
uint32_t timeout;
uint32_t mark;
uint32_t secmark;
+ struct __nfct_comcerto_fp_info fp_info[__DIR_MAX];
uint32_t status;
uint32_t use;
uint32_t id;
--- a/include/libnetfilter_conntrack/libnetfilter_conntrack.h 2015-10-28 12:16:54.927728157 -0700
+++ b/include/libnetfilter_conntrack/libnetfilter_conntrack.h 2015-10-28 13:03:47.498110493 -0700
@@ -136,6 +136,12 @@
ATTR_HELPER_INFO, /* variable length */
ATTR_CONNLABELS, /* variable length */
ATTR_CONNLABELS_MASK, /* variable length */
+ ATTR_ORIG_COMCERTO_FP_IIF,
+ ATTR_ORIG_COMCERTO_FP_IFINDEX,
+ ATTR_ORIG_COMCERTO_FP_MARK,
+ ATTR_REPL_COMCERTO_FP_IIF,
+ ATTR_REPL_COMCERTO_FP_IFINDEX,
+ ATTR_REPL_COMCERTO_FP_MARK,
ATTR_MAX
};
--- a/include/libnetfilter_conntrack/linux_nfnetlink_conntrack.h 2015-05-27 03:25:48.066296086 -0700
+++ b/include/libnetfilter_conntrack/linux_nfnetlink_conntrack.h 2015-10-28 13:06:10.884777061 -0700
@@ -57,6 +57,8 @@
CTA_MARK_MASK,
CTA_LABELS,
CTA_LABELS_MASK,
+ CTA_COMCERTO_FP_ORIG = 32,
+ CTA_COMCERTO_FP_REPLY,
__CTA_MAX
};
#define CTA_MAX (__CTA_MAX - 1)
@@ -222,6 +224,15 @@
};
#define CTA_HELP_MAX (__CTA_HELP_MAX - 1)
+enum ctattr_comcerto_fp {
+ CTA_COMCERTO_FP_UNSPEC,
+ CTA_COMCERTO_FP_MARK,
+ CTA_COMCERTO_FP_IFINDEX,
+ CTA_COMCERTO_FP_IIF,
+ __CTA_COMCERTO_FP_MAX
+};
+#define CTA_COMCERTO_FP_MAX (__CTA_COMCERTO_FP_MAX - 1)
+
enum ctattr_secctx {
CTA_SECCTX_UNSPEC,
CTA_SECCTX_NAME,
--- a/src/conntrack/getter.c 2015-05-27 03:23:01.782297954 -0700
+++ b/src/conntrack/getter.c 2015-10-28 13:10:43.782229021 -0700
@@ -349,6 +349,36 @@
return ct->connlabels_mask;
}
+static const void *get_attr_orig_comcerto_fp_iif(const struct nf_conntrack *ct)
+{
+ return &ct->fp_info[__DIR_ORIG].iif;
+}
+
+static const void *get_attr_orig_comcerto_fp_ifindex(const struct nf_conntrack *ct)
+{
+ return &ct->fp_info[__DIR_ORIG].ifindex;
+}
+
+static const void *get_attr_orig_comcerto_fp_mark(const struct nf_conntrack *ct)
+{
+ return &ct->fp_info[__DIR_ORIG].mark;
+}
+
+static const void *get_attr_repl_comcerto_fp_iif(const struct nf_conntrack *ct)
+{
+ return &ct->fp_info[__DIR_REPL].iif;
+}
+
+static const void *get_attr_repl_comcerto_fp_ifindex(const struct nf_conntrack *ct)
+{
+ return &ct->fp_info[__DIR_REPL].ifindex;
+}
+
+static const void *get_attr_repl_comcerto_fp_mark(const struct nf_conntrack *ct)
+{
+ return &ct->fp_info[__DIR_REPL].mark;
+}
+
const get_attr get_attr_array[ATTR_MAX] = {
[ATTR_ORIG_IPV4_SRC] = get_attr_orig_ipv4_src,
[ATTR_ORIG_IPV4_DST] = get_attr_orig_ipv4_dst,
@@ -418,4 +448,10 @@
[ATTR_HELPER_INFO] = get_attr_helper_info,
[ATTR_CONNLABELS] = get_attr_connlabels,
[ATTR_CONNLABELS_MASK] = get_attr_connlabels_mask,
+ [ATTR_ORIG_COMCERTO_FP_IIF] = get_attr_orig_comcerto_fp_iif,
+ [ATTR_ORIG_COMCERTO_FP_IFINDEX] = get_attr_orig_comcerto_fp_ifindex,
+ [ATTR_ORIG_COMCERTO_FP_MARK] = get_attr_orig_comcerto_fp_mark,
+ [ATTR_REPL_COMCERTO_FP_IIF] = get_attr_repl_comcerto_fp_iif,
+ [ATTR_REPL_COMCERTO_FP_IFINDEX] = get_attr_repl_comcerto_fp_ifindex,
+ [ATTR_REPL_COMCERTO_FP_MARK] = get_attr_repl_comcerto_fp_mark,
};
--- a/src/conntrack/parse.c 2015-05-27 03:27:34.114294894 -0700
+++ b/src/conntrack/parse.c 2015-10-28 13:21:18.412256588 -0700
@@ -493,6 +493,50 @@
}
}
+static void
+__parse_comcerto_fp(const struct nfattr *attr, struct nf_conntrack *ct, int dir)
+{
+ struct nfattr *tb[CTA_COMCERTO_FP_MAX];
+
+ nfnl_parse_nested(tb, CTA_COMCERTO_FP_MAX, attr);
+
+ if (tb[CTA_COMCERTO_FP_IIF-1]) {
+ ct->fp_info[dir].iif = *(uint32_t *)NFA_DATA(tb[CTA_COMCERTO_FP_IIF-1]);
+ switch(dir) {
+ case __DIR_ORIG:
+ set_bit(ATTR_ORIG_COMCERTO_FP_IIF, ct->head.set);
+ break;
+ case __DIR_REPL:
+ set_bit(ATTR_REPL_COMCERTO_FP_IIF, ct->head.set);
+ break;
+ }
+ }
+
+ if (tb[CTA_COMCERTO_FP_IFINDEX-1]) {
+ ct->fp_info[dir].ifindex = *(uint32_t *)NFA_DATA(tb[CTA_COMCERTO_FP_IFINDEX-1]);
+ switch(dir) {
+ case __DIR_ORIG:
+ set_bit(ATTR_ORIG_COMCERTO_FP_IFINDEX, ct->head.set);
+ break;
+ case __DIR_REPL:
+ set_bit(ATTR_REPL_COMCERTO_FP_IFINDEX, ct->head.set);
+ break;
+ }
+ }
+
+ if (tb[CTA_COMCERTO_FP_MARK-1]) {
+ ct->fp_info[dir].mark = *(uint32_t *)NFA_DATA(tb[CTA_COMCERTO_FP_MARK-1]);
+ switch(dir) {
+ case __DIR_ORIG:
+ set_bit(ATTR_ORIG_COMCERTO_FP_MARK, ct->head.set);
+ break;
+ case __DIR_REPL:
+ set_bit(ATTR_REPL_COMCERTO_FP_MARK, ct->head.set);
+ break;
+ }
+ }
+}
+
void __parse_conntrack(const struct nlmsghdr *nlh,
struct nfattr *cda[],
struct nf_conntrack *ct)
@@ -552,6 +596,12 @@
set_bit(ATTR_SECMARK, ct->head.set);
}
+ if (cda[CTA_COMCERTO_FP_ORIG-1])
+ __parse_comcerto_fp(cda[CTA_COMCERTO_FP_ORIG-1], ct, __DIR_ORIG);
+
+ if (cda[CTA_COMCERTO_FP_REPLY-1])
+ __parse_comcerto_fp(cda[CTA_COMCERTO_FP_REPLY-1], ct, __DIR_REPL);
+
if (cda[CTA_COUNTERS_ORIG-1])
__parse_counters(cda[CTA_COUNTERS_ORIG-1], ct, __DIR_ORIG);