summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Conntrack-tcp.c
diff options
context:
space:
mode:
authorSairam Venugopal <vsairam@vmware.com>2016-07-01 13:49:30 -0700
committerGurucharan Shetty <guru@ovn.org>2016-07-01 20:52:29 -0700
commitb50d56a76732d833d7c4ce3cc12b7a200a61bd4b (patch)
treeb6b4e31121199028e644a2afc09039bd5243f88a /datapath-windows/ovsext/Conntrack-tcp.c
parent78f31c2b4c3e90fb72d7ae4f2cd4211b97709480 (diff)
downloadopenvswitch-b50d56a76732d833d7c4ce3cc12b7a200a61bd4b.tar.gz
datapath-windows: Add support for dump-conntrack in datapath
Create the methods used for dumping conntrack entries from the hyper-v datapath to userspace by means of netfilter netlink messages. Some of the attributes are not supported by the datapath and have been defaulted to 0. Signed-off-by: Sairam Venugopal <vsairam@vmware.com> Acked-by: Paul-Daniel Boca <pboca@cloudbasesolutions.com> Acked-by: Nithin Raju <nithin@vmware.com> Signed-off-by: Gurucharan Shetty <guru@ovn.org>
Diffstat (limited to 'datapath-windows/ovsext/Conntrack-tcp.c')
-rw-r--r--datapath-windows/ovsext/Conntrack-tcp.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/datapath-windows/ovsext/Conntrack-tcp.c b/datapath-windows/ovsext/Conntrack-tcp.c
index 862972a26..82edc203b 100644
--- a/datapath-windows/ovsext/Conntrack-tcp.c
+++ b/datapath-windows/ovsext/Conntrack-tcp.c
@@ -516,3 +516,62 @@ OvsConntrackCreateTcpEntry(const TCPHdr *tcp,
return &newconn->up;
}
+
+static __inline uint8_t
+OvsCtTcpPeerToProtoInfoFlags(const struct tcp_peer *peer)
+{
+ uint8_t res = 0;
+
+ if (peer->wscale & CT_WSCALE_FLAG) {
+ res |= CT_DPIF_TCPF_WINDOW_SCALE;
+ }
+
+ if (peer->wscale & CT_WSCALE_UNKNOWN) {
+ res |= CT_DPIF_TCPF_BE_LIBERAL;
+ }
+
+ return res;
+}
+
+NDIS_STATUS
+OvsCtMapTcpProtoInfoToNl(PNL_BUFFER nlBuf, OVS_CT_ENTRY *conn_)
+{
+ struct conn_tcp *conn = OvsCastConntrackEntryToTcpEntry(conn_);
+ NDIS_STATUS status = NDIS_STATUS_SUCCESS;
+ UINT32 offset = 0;
+
+ offset = NlMsgStartNested(nlBuf, CTA_PROTOINFO_TCP);
+ if (!offset) {
+ return NDIS_STATUS_FAILURE;
+ }
+
+ if (!NlMsgPutTailU8(nlBuf, CTA_PROTOINFO_TCP_STATE,
+ conn->peer[0].state)) {
+ status = NDIS_STATUS_FAILURE;
+ goto done;
+ }
+ if (!NlMsgPutTailU8(nlBuf, CTA_PROTOINFO_TCP_WSCALE_ORIGINAL,
+ (conn->peer[0].wscale & CT_WSCALE_MASK))) {
+ status = NDIS_STATUS_FAILURE;
+ goto done;
+ }
+ if (!NlMsgPutTailU8(nlBuf, CTA_PROTOINFO_TCP_WSCALE_REPLY,
+ (conn->peer[1].wscale & CT_WSCALE_MASK))) {
+ status = NDIS_STATUS_FAILURE;
+ goto done;
+ }
+ if (!NlMsgPutTailU16(nlBuf, CTA_PROTOINFO_TCP_FLAGS_ORIGINAL,
+ OvsCtTcpPeerToProtoInfoFlags(&conn->peer[0]))) {
+ status = NDIS_STATUS_FAILURE;
+ goto done;
+ }
+ if (!NlMsgPutTailU16(nlBuf, CTA_PROTOINFO_TCP_FLAGS_REPLY,
+ OvsCtTcpPeerToProtoInfoFlags(&conn->peer[1]))) {
+ status = NDIS_STATUS_FAILURE;
+ goto done;
+ }
+
+done:
+ NlMsgEndNested(nlBuf, offset);
+ return status;
+}