mirror of
https://github.com/openvswitch/ovs
synced 2025-09-03 15:55:19 +00:00
Windows: Add conntrack dump and flush support in userspace
Modify dpif-netlink.c and netlink-conntrack.c to send down dump and 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> Acked-by: Paul-Daniel Boca <pboca@cloudbasesolutions.com> Acked-by: Nithin Raju <nithin@vmware.com> Acked-by: Nithin Raju <nithin@vmware.com> Signed-off-by: Gurucharan Shetty <guru@ovn.org>
This commit is contained in:
committed by
Gurucharan Shetty
parent
d33f0efaf2
commit
e0467f6dfc
@@ -372,6 +372,8 @@ lib_libopenvswitch_la_SOURCES += \
|
|||||||
lib/dpif-netlink.c \
|
lib/dpif-netlink.c \
|
||||||
lib/dpif-netlink.h \
|
lib/dpif-netlink.h \
|
||||||
lib/netdev-windows.c \
|
lib/netdev-windows.c \
|
||||||
|
lib/netlink-conntrack.c \
|
||||||
|
lib/netlink-conntrack.h \
|
||||||
lib/netlink-notifier.c \
|
lib/netlink-notifier.c \
|
||||||
lib/netlink-notifier.h \
|
lib/netlink-notifier.h \
|
||||||
lib/netlink-protocol.h \
|
lib/netlink-protocol.h \
|
||||||
|
@@ -2274,7 +2274,6 @@ dpif_netlink_get_datapath_version(void)
|
|||||||
return version_str;
|
return version_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
|
||||||
struct dpif_netlink_ct_dump_state {
|
struct dpif_netlink_ct_dump_state {
|
||||||
struct ct_dpif_dump_state up;
|
struct ct_dpif_dump_state up;
|
||||||
struct nl_ct_dump_state *nl_ct_dump;
|
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();
|
return nl_ct_flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
const struct dpif_class dpif_netlink_class = {
|
const struct dpif_class dpif_netlink_class = {
|
||||||
"system",
|
"system",
|
||||||
@@ -2377,17 +2375,10 @@ const struct dpif_class dpif_netlink_class = {
|
|||||||
NULL, /* enable_upcall */
|
NULL, /* enable_upcall */
|
||||||
NULL, /* disable_upcall */
|
NULL, /* disable_upcall */
|
||||||
dpif_netlink_get_datapath_version, /* get_datapath_version */
|
dpif_netlink_get_datapath_version, /* get_datapath_version */
|
||||||
#ifdef __linux__
|
|
||||||
dpif_netlink_ct_dump_start,
|
dpif_netlink_ct_dump_start,
|
||||||
dpif_netlink_ct_dump_next,
|
dpif_netlink_ct_dump_next,
|
||||||
dpif_netlink_ct_dump_done,
|
dpif_netlink_ct_dump_done,
|
||||||
dpif_netlink_ct_flush,
|
dpif_netlink_ct_flush
|
||||||
#else
|
|
||||||
NULL, /* ct_dump_start */
|
|
||||||
NULL, /* ct_dump_next */
|
|
||||||
NULL, /* ct_dump_done */
|
|
||||||
NULL, /* ct_flush */
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -2442,7 +2433,7 @@ dpif_netlink_is_internal_device(const char *name)
|
|||||||
|
|
||||||
return reply.type == OVS_VPORT_TYPE_INTERNAL;
|
return reply.type == OVS_VPORT_TYPE_INTERNAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parses the contents of 'buf', which contains a "struct ovs_header" followed
|
/* Parses the contents of 'buf', which contains a "struct ovs_header" followed
|
||||||
* by Netlink attributes, into 'vport'. Returns 0 if successful, otherwise a
|
* by Netlink attributes, into 'vport'. Returns 0 if successful, otherwise a
|
||||||
* positive errno value.
|
* 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->used = flow->used ? get_32aligned_u64(flow->used) : 0;
|
||||||
stats->tcp_flags = flow->tcp_flags ? *flow->tcp_flags : 0;
|
stats->tcp_flags = flow->tcp_flags ? *flow->tcp_flags : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Logs information about a packet that was recently lost in 'ch' (in
|
/* Logs information about a packet that was recently lost in 'ch' (in
|
||||||
* 'dpif_'). */
|
* 'dpif_'). */
|
||||||
static void
|
static void
|
||||||
|
@@ -75,6 +75,14 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
|
|||||||
#define IPS_UNTRACKED_BIT 12
|
#define IPS_UNTRACKED_BIT 12
|
||||||
#define IPS_UNTRACKED (1 << IPS_UNTRACKED_BIT)
|
#define IPS_UNTRACKED (1 << IPS_UNTRACKED_BIT)
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#ifdef NETLINK_NETFILTER
|
||||||
|
#undef NETLINK_NETFILTER
|
||||||
|
#endif
|
||||||
|
/* Reuse same socket for nfgenmsg and genlmsghdr in Windows*/
|
||||||
|
#define NETLINK_NETFILTER NETLINK_GENERIC
|
||||||
|
#endif
|
||||||
|
|
||||||
static const struct nl_policy nfnlgrp_conntrack_policy[] = {
|
static const struct nl_policy nfnlgrp_conntrack_policy[] = {
|
||||||
[CTA_TUPLE_ORIG] = { .type = NL_A_NESTED, .optional = false },
|
[CTA_TUPLE_ORIG] = { .type = NL_A_NESTED, .optional = false },
|
||||||
[CTA_TUPLE_REPLY] = { .type = NL_A_NESTED, .optional = false },
|
[CTA_TUPLE_REPLY] = { .type = NL_A_NESTED, .optional = false },
|
||||||
@@ -118,7 +126,7 @@ struct nl_ct_dump_state {
|
|||||||
bool filter_zone;
|
bool filter_zone;
|
||||||
uint16_t zone;
|
uint16_t zone;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Conntrack netlink dumping. */
|
/* Conntrack netlink dumping. */
|
||||||
|
|
||||||
/* Initialize a conntrack netlink dump. */
|
/* Initialize a conntrack netlink dump. */
|
||||||
@@ -200,7 +208,7 @@ nl_ct_dump_done(struct nl_ct_dump_state *state)
|
|||||||
free(state);
|
free(state);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Format conntrack event 'entry' of 'type' to 'ds'. */
|
/* Format conntrack event 'entry' of 'type' to 'ds'. */
|
||||||
void
|
void
|
||||||
nl_ct_format_event_entry(const struct ct_dpif_entry *entry,
|
nl_ct_format_event_entry(const struct ct_dpif_entry *entry,
|
||||||
@@ -235,6 +243,26 @@ nl_ct_flush(void)
|
|||||||
return err;
|
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
|
int
|
||||||
nl_ct_flush_zone(uint16_t flush_zone)
|
nl_ct_flush_zone(uint16_t flush_zone)
|
||||||
{
|
{
|
||||||
@@ -299,7 +327,8 @@ nl_ct_flush_zone(uint16_t flush_zone)
|
|||||||
* have a master connection anymore */
|
* have a master connection anymore */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Conntrack netlink parsing. */
|
/* Conntrack netlink parsing. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@@ -788,7 +817,7 @@ nl_ct_parse_entry(struct ofpbuf *buf, struct ct_dpif_entry *entry,
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NetFilter utility functions. */
|
/* NetFilter utility functions. */
|
||||||
|
|
||||||
/* Puts a nlmsghdr and nfgenmsg at the beginning of 'msg', which must be
|
/* Puts a nlmsghdr and nfgenmsg at the beginning of 'msg', which must be
|
||||||
@@ -826,4 +855,8 @@ nl_msg_put_nfgenmsg(struct ofpbuf *msg, size_t expected_payload,
|
|||||||
nfm->nfgen_family = family;
|
nfm->nfgen_family = family;
|
||||||
nfm->version = NFNETLINK_V0;
|
nfm->version = NFNETLINK_V0;
|
||||||
nfm->res_id = 0;
|
nfm->res_id = 0;
|
||||||
|
#ifdef _WIN32
|
||||||
|
/* nfgenmsg contains ovsHdr padding in windows */
|
||||||
|
nfm->ovsHdr.dp_ifindex = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user