Message ID | 1466472188-3288-6-git-send-email-vsairam@vmware.com |
---|---|
State | Superseded |
Headers | show |
Hi Sai! A small nit inline. Otherwise it looks fine to me. Acked-by: Paul-Daniel Boca <pboca@cloudbasesolutions.com> > -----Original Message----- > From: dev [mailto:dev-bounces@openvswitch.org] On Behalf Of Sairam > Venugopal > Sent: Tuesday, June 21, 2016 4:23 AM > To: dev@openvswitch.org > Subject: [ovs-dev] [PATCH 5/9] Windows: Add conntrack-flush support in > userspace > > Modify dpif-netlink.c and netlink-conntrack.c to send down flush command > to Windows datapath. Include netlink-conntrack.c and netlink-conntrack.h > in automake.mk for Windows binaries. > > Windows currently supports only NETLINK_GENERIC port. In order to support > the NETLINK_NETFILTER messages, the port id is being overwritten to > NETLINK_GENERIC on Windows and datapath has been updated to support > the > new message format. > > Signed-off-by: Sairam Venugopal <vsairam@vmware.com> > --- > lib/automake.mk | 2 ++ > lib/dpif-netlink.c | 15 +++------------ > lib/netlink-conntrack.c | 33 +++++++++++++++++++++++++++++---- > 3 files changed, 34 insertions(+), 16 deletions(-) > > diff --git a/lib/automake.mk b/lib/automake.mk > index eabc0e7..4d4ee01 100644 > --- a/lib/automake.mk > +++ b/lib/automake.mk > @@ -372,6 +372,8 @@ lib_libopenvswitch_la_SOURCES += \ > lib/dpif-netlink.c \ > lib/dpif-netlink.h \ > lib/netdev-windows.c \ > + lib/netlink-conntrack.c \ > + lib/netlink-conntrack.h \ > lib/netlink-notifier.c \ > lib/netlink-notifier.h \ > lib/netlink-protocol.h \ > diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c > index 9bff3a8..e2bea23 100644 > --- a/lib/dpif-netlink.c > +++ b/lib/dpif-netlink.c > @@ -2274,7 +2274,6 @@ dpif_netlink_get_datapath_version(void) > return version_str; > } > > -#ifdef __linux__ > struct dpif_netlink_ct_dump_state { > struct ct_dpif_dump_state up; > struct nl_ct_dump_state *nl_ct_dump; > @@ -2335,7 +2334,6 @@ dpif_netlink_ct_flush(struct dpif *dpif > OVS_UNUSED, const uint16_t *zone) > return nl_ct_flush(); > } > } > -#endif > > const struct dpif_class dpif_netlink_class = { > "system", > @@ -2377,17 +2375,10 @@ const struct dpif_class dpif_netlink_class = { > NULL, /* enable_upcall */ > NULL, /* disable_upcall */ > dpif_netlink_get_datapath_version, /* get_datapath_version */ > -#ifdef __linux__ > dpif_netlink_ct_dump_start, > dpif_netlink_ct_dump_next, > dpif_netlink_ct_dump_done, > - dpif_netlink_ct_flush, > -#else > - NULL, /* ct_dump_start */ > - NULL, /* ct_dump_next */ > - NULL, /* ct_dump_done */ > - NULL, /* ct_flush */ > -#endif > + dpif_netlink_ct_flush > }; > > static int > @@ -2442,7 +2433,7 @@ dpif_netlink_is_internal_device(const char *name) > > return reply.type == OVS_VPORT_TYPE_INTERNAL; > } > - > + > /* Parses the contents of 'buf', which contains a "struct ovs_header" > followed > * by Netlink attributes, into 'vport'. Returns 0 if successful, otherwise a > * positive errno value. > @@ -2946,7 +2937,7 @@ dpif_netlink_flow_get_stats(const struct > dpif_netlink_flow *flow, > stats->used = flow->used ? get_32aligned_u64(flow->used) : 0; > stats->tcp_flags = flow->tcp_flags ? *flow->tcp_flags : 0; > } > - > + > /* Logs information about a packet that was recently lost in 'ch' (in > * 'dpif_'). */ > static void > diff --git a/lib/netlink-conntrack.c b/lib/netlink-conntrack.c > index 47a3c62..bc31391 100644 > --- a/lib/netlink-conntrack.c > +++ b/lib/netlink-conntrack.c > @@ -75,6 +75,10 @@ static struct vlog_rate_limit rl = > VLOG_RATE_LIMIT_INIT(1, 5); > #define IPS_UNTRACKED_BIT 12 > #define IPS_UNTRACKED (1 << IPS_UNTRACKED_BIT) > > +#ifdef _WIN32 > +#define NETLINK_NETFILTER NETLINK_GENERIC //Override for Windowss [Paul Boca] Overriding without #undef would trigger a warning at compile time. *And one 's' in Windows. > +#endif > + > static const struct nl_policy nfnlgrp_conntrack_policy[] = { > [CTA_TUPLE_ORIG] = { .type = NL_A_NESTED, .optional = false }, > [CTA_TUPLE_REPLY] = { .type = NL_A_NESTED, .optional = false }, > @@ -118,7 +122,7 @@ struct nl_ct_dump_state { > bool filter_zone; > uint16_t zone; > }; > - > + > /* Conntrack netlink dumping. */ > > /* Initialize a conntrack netlink dump. */ > @@ -200,7 +204,7 @@ nl_ct_dump_done(struct nl_ct_dump_state *state) > free(state); > return error; > } > - > + > /* Format conntrack event 'entry' of 'type' to 'ds'. */ > void > nl_ct_format_event_entry(const struct ct_dpif_entry *entry, > @@ -235,6 +239,26 @@ nl_ct_flush(void) > return err; > } > > +#ifdef _WIN32 > +int > +nl_ct_flush_zone(uint16_t flush_zone) > +{ > + /* Windows can flush a specific zone */ > + struct ofpbuf buf; > + int err; > + > + ofpbuf_init(&buf, NL_DUMP_BUFSIZE); > + > + nl_msg_put_nfgenmsg(&buf, 0, AF_UNSPEC, NFNL_SUBSYS_CTNETLINK, > + IPCTNL_MSG_CT_DELETE, NLM_F_REQUEST); > + nl_msg_put_be16(&buf, CTA_ZONE, flush_zone); > + > + err = nl_transact(NETLINK_NETFILTER, &buf, NULL); > + ofpbuf_uninit(&buf); > + > + return err; > +} > +#else > int > nl_ct_flush_zone(uint16_t flush_zone) > { > @@ -299,7 +323,8 @@ nl_ct_flush_zone(uint16_t flush_zone) > * have a master connection anymore */ > return 0; > } > - > +#endif > + > /* Conntrack netlink parsing. */ > > static bool > @@ -788,7 +813,7 @@ nl_ct_parse_entry(struct ofpbuf *buf, struct > ct_dpif_entry *entry, > > return true; > } > - > + > /* NetFilter utility functions. */ > > /* Puts a nlmsghdr and nfgenmsg at the beginning of 'msg', which must be > -- > 2.5.0.windows.1 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev
diff --git a/lib/automake.mk b/lib/automake.mk index eabc0e7..4d4ee01 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -372,6 +372,8 @@ lib_libopenvswitch_la_SOURCES += \ lib/dpif-netlink.c \ lib/dpif-netlink.h \ lib/netdev-windows.c \ + lib/netlink-conntrack.c \ + lib/netlink-conntrack.h \ lib/netlink-notifier.c \ lib/netlink-notifier.h \ lib/netlink-protocol.h \ diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 9bff3a8..e2bea23 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -2274,7 +2274,6 @@ dpif_netlink_get_datapath_version(void) return version_str; } -#ifdef __linux__ struct dpif_netlink_ct_dump_state { struct ct_dpif_dump_state up; struct nl_ct_dump_state *nl_ct_dump; @@ -2335,7 +2334,6 @@ dpif_netlink_ct_flush(struct dpif *dpif OVS_UNUSED, const uint16_t *zone) return nl_ct_flush(); } } -#endif const struct dpif_class dpif_netlink_class = { "system", @@ -2377,17 +2375,10 @@ const struct dpif_class dpif_netlink_class = { NULL, /* enable_upcall */ NULL, /* disable_upcall */ dpif_netlink_get_datapath_version, /* get_datapath_version */ -#ifdef __linux__ dpif_netlink_ct_dump_start, dpif_netlink_ct_dump_next, dpif_netlink_ct_dump_done, - dpif_netlink_ct_flush, -#else - NULL, /* ct_dump_start */ - NULL, /* ct_dump_next */ - NULL, /* ct_dump_done */ - NULL, /* ct_flush */ -#endif + dpif_netlink_ct_flush }; static int @@ -2442,7 +2433,7 @@ dpif_netlink_is_internal_device(const char *name) return reply.type == OVS_VPORT_TYPE_INTERNAL; } - + /* Parses the contents of 'buf', which contains a "struct ovs_header" followed * by Netlink attributes, into 'vport'. Returns 0 if successful, otherwise a * positive errno value. @@ -2946,7 +2937,7 @@ dpif_netlink_flow_get_stats(const struct dpif_netlink_flow *flow, stats->used = flow->used ? get_32aligned_u64(flow->used) : 0; stats->tcp_flags = flow->tcp_flags ? *flow->tcp_flags : 0; } - + /* Logs information about a packet that was recently lost in 'ch' (in * 'dpif_'). */ static void diff --git a/lib/netlink-conntrack.c b/lib/netlink-conntrack.c index 47a3c62..bc31391 100644 --- a/lib/netlink-conntrack.c +++ b/lib/netlink-conntrack.c @@ -75,6 +75,10 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); #define IPS_UNTRACKED_BIT 12 #define IPS_UNTRACKED (1 << IPS_UNTRACKED_BIT) +#ifdef _WIN32 +#define NETLINK_NETFILTER NETLINK_GENERIC //Override for Windowss +#endif + static const struct nl_policy nfnlgrp_conntrack_policy[] = { [CTA_TUPLE_ORIG] = { .type = NL_A_NESTED, .optional = false }, [CTA_TUPLE_REPLY] = { .type = NL_A_NESTED, .optional = false }, @@ -118,7 +122,7 @@ struct nl_ct_dump_state { bool filter_zone; uint16_t zone; }; - + /* Conntrack netlink dumping. */ /* Initialize a conntrack netlink dump. */ @@ -200,7 +204,7 @@ nl_ct_dump_done(struct nl_ct_dump_state *state) free(state); return error; } - + /* Format conntrack event 'entry' of 'type' to 'ds'. */ void nl_ct_format_event_entry(const struct ct_dpif_entry *entry, @@ -235,6 +239,26 @@ nl_ct_flush(void) return err; } +#ifdef _WIN32 +int +nl_ct_flush_zone(uint16_t flush_zone) +{ + /* Windows can flush a specific zone */ + struct ofpbuf buf; + int err; + + ofpbuf_init(&buf, NL_DUMP_BUFSIZE); + + nl_msg_put_nfgenmsg(&buf, 0, AF_UNSPEC, NFNL_SUBSYS_CTNETLINK, + IPCTNL_MSG_CT_DELETE, NLM_F_REQUEST); + nl_msg_put_be16(&buf, CTA_ZONE, flush_zone); + + err = nl_transact(NETLINK_NETFILTER, &buf, NULL); + ofpbuf_uninit(&buf); + + return err; +} +#else int nl_ct_flush_zone(uint16_t flush_zone) { @@ -299,7 +323,8 @@ nl_ct_flush_zone(uint16_t flush_zone) * have a master connection anymore */ return 0; } - +#endif + /* Conntrack netlink parsing. */ static bool @@ -788,7 +813,7 @@ nl_ct_parse_entry(struct ofpbuf *buf, struct ct_dpif_entry *entry, return true; } - + /* NetFilter utility functions. */ /* Puts a nlmsghdr and nfgenmsg at the beginning of 'msg', which must be
Modify dpif-netlink.c and netlink-conntrack.c to send down flush command to Windows datapath. Include netlink-conntrack.c and netlink-conntrack.h in automake.mk for Windows binaries. Windows currently supports only NETLINK_GENERIC port. In order to support the NETLINK_NETFILTER messages, the port id is being overwritten to NETLINK_GENERIC on Windows and datapath has been updated to support the new message format. Signed-off-by: Sairam Venugopal <vsairam@vmware.com> --- lib/automake.mk | 2 ++ lib/dpif-netlink.c | 15 +++------------ lib/netlink-conntrack.c | 33 +++++++++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 16 deletions(-)