conntrackd: support replication of connlabels
Florian Westphal
maintainerPATCH 1/1 conntrackd: support replication of connlabels
- check if ct has label attribute, and at least one label (bit) is set
- serialize bitmap into array-of-u32, in network byte order
- add code to build new nfct_bitmask object from array-of-u32
Current parse functions don't have length information, this adds optional parse2() which gets struct netattr pointer.
Attributes that want to use parse2 need to set .maxsize to nonzero value.
---
Change since v1:
- don't show label names in conntrack -i/-e output
I'll apply this if noone objects.
include/network.h | 4 +++ src/build.c | 39 ++++++++++++++++++++++++++++ src/parse.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 110 insertions(+), 10 deletions(-)
include/network.h +4 -0
@@ -228,9 +228,13 @@ enum nta_attr {NTA_TCP_WSCALE_ORIG ,/* uint8_t */ NTA_TCP_WSCALE_REPL ,/* uint8_t */ NTA_HELPER_NAME ,/* string (variable length) */ +NTA_LABELS ,/* array of uint32_t (variable length) */ NTA_MAX }; +/* allow to serialize/replicate up to 4k labels per flow */ +#define NTA_LABELS_MAX_SIZE (4096/sizeof(uint32_t)) +struct nta_attr_natseqadj {uint32_t orig_seq_correction_pos;uint32_t orig_seq_offset_before;
src/build.c +39 -0
@@ -158,6 +158,42 @@ static void build_l4proto_udp(const struct nf_conntrack *ct, struct nethdr *n) sizeof(struct nfct_attr_grp_port)); } +static void ct_build_clabel (const struct nf_conntrack *ct,struct nethdr *n) +{ +const struct nfct_bitmask *b; +uint32_t *words; +unsigned int wordcount, i, maxbit; + +if (!nfct_attr_is_set (ct,ATTR_CONNLABELS )) +return ; + + b =nfct_get_attr (ct,ATTR_CONNLABELS ); + + maxbit =nfct_bitmask_maxbit (b); +for (i=0 ; i <= maxbit; i++) { +if (nfct_bitmask_test_bit (b, i)) +break ; + } + +if (i > maxbit) +return ; + + wordcount = (nfct_bitmask_maxbit (b) /32 ) +1 ; + words =put_header (n,NTA_LABELS , wordcount *sizeof (*words)); + +for (i=0 ; i < wordcount; i++) { +int bit =31 ; +uint32_t tmp =0 ; + +do { +if (nfct_bitmask_test_bit (b, (32 * i) + bit)) + tmp |= (1 << bit); + }while (--bit >=0 ); + + words[i] =htonl (tmp); + } +} +#ifndef IPPROTO_DCCP #define IPPROTO_DCCP 33#endif
@@ -233,6 +269,9 @@ void ct2msg(const struct nf_conntrack *ct, struct nethdr *n)if (nfct_attr_is_set (ct,ATTR_HELPER_NAME ))ct_build_str (ct,ATTR_HELPER_NAME , n,NTA_HELPER_NAME ); + +if (nfct_attr_is_set (ct,ATTR_CONNLABELS )) +ct_build_clabel (ct, n); } static void
src/parse.c +67 -10
127 lines not on this page · raw message
Signature · 1 line
1.8.1.5
Florian Westphal
maintainerPATCH 2/2 conntrack: add connlabel format attribute
---
Change since v1:
- rename option to '-o labels'
- make it incompatible with xml option (can't
add attributes to existing xml output
buffer without insane hackery ]
conntrack.8 | 4 +++- src/conntrack.c | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-)
conntrack.8 +3 -1
@@ -88,11 +88,13 @@ Show the in-kernel connection tracking system statistics. Atomically zero counters after reading them. This option is only valid in combination with the "-L, --dump" command options. .TP -.BI "-o, --output [extended,xml,timestamp,id,ktimestamp] " +.BI "-o, --output [extended,xml,timestamp,id,ktimestamp,labels] " Display output in a certain format. With the extended output option, this tool displays the layer 3 information. With ktimestamp, it displays the in-kernel timestamp available since 2.6.38 (you can enable it via echo 1 > /proc/sys/net/netfilter/nf_conntrack_timestamp). +The labels output option tells conntrack to show the names of labels that +might be present, this is currently incompatible with xml output. .TP .BI "-e, --event-mask " "[ALL|NEW|UPDATES|DESTROY][,...]" Set the bitmask of events that are to be generated by the in-kernel ctnetlink
src/conntrack.c +35 -4
@@ -488,6 +488,7 @@ static unsigned int addr_valid_flags[ADDR_VALID_FLAGS_MAX] = {static LIST_HEAD (proto_list);static unsigned int options; +static struct nfct_labelmap *label_map;void register_proto (struct ctproto_handler *h) {
@@ -731,6 +732,7 @@ enum { _O_TMS = (1 <<2 ), _O_ID = (1 <<3 ), _O_KTMS = (1 <<4 ), + _O_LAB = (1 << 5), }; enum {
@@ -749,8 +751,8 @@ static struct parse_parameter { { IPS_ASSURED, IPS_SEEN_REPLY, 0, IPS_FIXED_TIMEOUT, IPS_EXPECTED} }, { {"ALL", "NEW", "UPDATES", "DESTROY"}, 4, { CT_EVENT_F_ALL, CT_EVENT_F_NEW, CT_EVENT_F_UPD, CT_EVENT_F_DEL } }, - { {"xml", "extended", "timestamp", "id", "ktimestamp"}, 5, - { _O_XML, _O_EXT, _O_TMS, _O_ID, _O_KTMS }, + { {"xml", "extended", "timestamp", "id", "ktimestamp", "labels", }, 6, + { _O_XML, _O_EXT, _O_TMS, _O_ID, _O_KTMS, _O_LAB }, }, };
@@ -1108,6 +1110,15 @@ exp_event_sighandler(int s)exit (0 ); } +static void print_labels (const struct nfct_bitmask *b) +{ +char buf[1024 ]; +if (!b) +return ; +nfct_snprintf_labels (buf,sizeof (buf), label_map, b,NFCT_O_DEFAULT ); +printf (" labels=%s" , buf); +} +static int event_cb (enum nf_conntrack_msg_type type,struct nf_conntrack *ct,void *data)
@@ -1152,7 +1163,11 @@ static int event_cb(enum nf_conntrack_msg_type type,nfct_snprintf (buf,sizeof (buf), ct, type, op_type, op_flags); -printf ("%s\n" , buf); +printf ("%s" , buf); + +if (output_mask & _O_LAB) +print_labels (nfct_get_attr (ct,ATTR_CONNLABELS )); +printf ("\n" );fflush (stdout); counter++;
@@ -1195,8 +1210,11 @@ static int dump_cb(enum nf_conntrack_msg_type type, op_flags |=NFCT_OF_ID ;nfct_snprintf (buf,sizeof (buf), ct,NFCT_T_UNKNOWN , op_type, op_flags); -printf ("%s\n" , buf); +printf ("%s" , buf); +if (output_mask & _O_LAB) +print_labels (nfct_get_attr (ct,ATTR_CONNLABELS )); +printf ("\n" ); counter++;return NFCT_CB_CONTINUE ;
@@ -1879,6 +1897,17 @@ int main(int argc, char *argv[])case 'o' : options |=CT_OPT_OUTPUT ;parse_parameter (optarg, &output_mask,PARSE_OUTPUT ); +if (output_mask & _O_LAB) { +if (output_mask & _O_XML) { + output_mask &= ~_O_LAB; +break ; + } + label_map =nfct_labelmap_new (NULL ); +if (!label_map) { +perror ("nfct_labelmap_new" ); + output_mask &= ~_O_LAB; + } + }break ;case 'z' : options |=CT_OPT_ZERO ;
@@ -2372,6 +2401,8 @@ try_proc:free_tmpl_objects ();free_options (); +if (label_map) +nfct_labelmap_destroy (label_map);if (command && exit_msg[cmd][0 ]) {fprintf (stderr,"%s v%s (conntrack-tools): " ,PROGNAME ,VERSION );
Signature · 1 line
1.8.1.5
Pablo Neira Ayuso
maintainerRe: [PATCH 2/2] conntrack: add connlabel format attribute
Quoted 7 lines · Florian Westphal
Signed-off-by Florian Westphal <[email protected]>---
Change since v1:
- rename option to '-o labels'
- make it incompatible with xml option (can't
add attributes to existing xml output
buffer without insane hackery ]
Ah, now I understand the XML issue.
You can have something like in libnetfilter_conntrack:
extern int nfct_snprintf_clabels(char *buf,
unsigned int size, const struct nf_conntrack *ct, const unsigned int msg_type, const unsigned int out_type, const unsigned int out_flags, struct nfct_labelmap *map, const struct nfct_bitmask *b);
We have then two interfaces, the normal nfct_snprintf(...) for people that don't need clabels, and the one that includes clabels (including XML support).
Having two interfaces to print seems fine to me. You could even emulate nfct_snprintf by allow last two parameters (labelmap and bitmask) to be NULL, that will simply the patch as nfct_snprintf will interface call nfct_snprintf_clabels.
You'll have to adapt this patch for the conntrack util though.
Thanks.
Quoted 130 lines
conntrack.8 | 4 +++- src/conntrack.c | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-)conntrack.8 +3
-1@@ -88,11 +88,13 @@ Show the in-kernel connection tracking system statistics. Atomically zero counters after reading them. This option is only valid in combination with the "-L, --dump" command options. .TP -.BI "-o, --output [extended,xml,timestamp,id,ktimestamp] " +.BI "-o, --output [extended,xml,timestamp,id,ktimestamp,labels] " Display output in a certain format. With the extended output option, this tool displays the layer 3 information. With ktimestamp, it displays the in-kernel timestamp available since 2.6.38 (you can enable it via echo 1 > /proc/sys/net/netfilter/nf_conntrack_timestamp). +The labels output option tells conntrack to show the names of labels that +might be present, this is currently incompatible with xml output. .TP .BI "-e, --event-mask " "[ALL|NEW|UPDATES|DESTROY][,...]" Set the bitmask of events that are to be generated by the in-kernel ctnetlinksrc/conntrack.c +35
-4@@ -488,6 +488,7 @@ static unsigned int addr_valid_flags[ADDR_VALID_FLAGS_MAX] = {static LIST_HEAD (proto_list);static unsigned int options; +static struct nfct_labelmap *label_map;void register_proto (struct ctproto_handler *h) {@@ -731,6 +732,7 @@ enum { _O_TMS = (1 <<2 ), _O_ID = (1 <<3 ), _O_KTMS = (1 <<4 ), + _O_LAB = (1 << 5), }; enum {@@ -749,8 +751,8 @@ static struct parse_parameter { { IPS_ASSURED, IPS_SEEN_REPLY, 0, IPS_FIXED_TIMEOUT, IPS_EXPECTED} }, { {"ALL", "NEW", "UPDATES", "DESTROY"}, 4, { CT_EVENT_F_ALL, CT_EVENT_F_NEW, CT_EVENT_F_UPD, CT_EVENT_F_DEL } }, - { {"xml", "extended", "timestamp", "id", "ktimestamp"}, 5, - { _O_XML, _O_EXT, _O_TMS, _O_ID, _O_KTMS }, + { {"xml", "extended", "timestamp", "id", "ktimestamp", "labels", }, 6, + { _O_XML, _O_EXT, _O_TMS, _O_ID, _O_KTMS, _O_LAB }, }, };@@ -1108,6 +1110,15 @@ exp_event_sighandler(int s)exit (0 ); } +static void print_labels (const struct nfct_bitmask *b) +{ +char buf[1024 ]; +if (!b) +return ; +nfct_snprintf_labels (buf,sizeof (buf), label_map, b,NFCT_O_DEFAULT ); +printf (" labels=%s" , buf); +} +static int event_cb (enum nf_conntrack_msg_type type,struct nf_conntrack *ct,void *data)@@ -1152,7 +1163,11 @@ static int event_cb(enum nf_conntrack_msg_type type,nfct_snprintf (buf,sizeof (buf), ct, type, op_type, op_flags); -printf ("%s\n" , buf); +printf ("%s" , buf); + +if (output_mask & _O_LAB) +print_labels (nfct_get_attr (ct,ATTR_CONNLABELS )); +printf ("\n" );fflush (stdout); counter++;@@ -1195,8 +1210,11 @@ static int dump_cb(enum nf_conntrack_msg_type type, op_flags |=NFCT_OF_ID ;nfct_snprintf (buf,sizeof (buf), ct,NFCT_T_UNKNOWN , op_type, op_flags); -printf ("%s\n" , buf); +printf ("%s" , buf); +if (output_mask & _O_LAB) +print_labels (nfct_get_attr (ct,ATTR_CONNLABELS )); +printf ("\n" ); counter++;return NFCT_CB_CONTINUE ;@@ -1879,6 +1897,17 @@ int main(int argc, char *argv[])case 'o' : options |=CT_OPT_OUTPUT ;parse_parameter (optarg, &output_mask,PARSE_OUTPUT ); +if (output_mask & _O_LAB) { +if (output_mask & _O_XML) { + output_mask &= ~_O_LAB; +break ; + } + label_map =nfct_labelmap_new (NULL ); +if (!label_map) { +perror ("nfct_labelmap_new" ); + output_mask &= ~_O_LAB; + } + }break ;case 'z' : options |=CT_OPT_ZERO ;@@ -2372,6 +2401,8 @@ try_proc:free_tmpl_objects ();free_options (); +if (label_map) +nfct_labelmap_destroy (label_map);if (command && exit_msg[cmd][0 ]) {fprintf (stderr,"%s v%s (conntrack-tools): " ,PROGNAME ,VERSION );Signature · 6 lines
1.8.1.5 -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html