aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlin Serdean <aserdean@cloudbasesolutions.com>2015-10-27 19:50:35 +0000
committerGurucharan Shetty <gshetty@nicira.com>2015-10-27 13:21:39 -0700
commit481c5a6d836f77331e42b1fd65b5fc9786bda5d5 (patch)
treee02a4e627b915045353ef7bc21770220cb4444d4
parent2a33a3c20f56b8ac09abebc8b14fca9314abfacb (diff)
Revert "datapath-windows: Support attribute OVS_KEY_ATTR_TCP_FLAGS"
This reverts commit a26b2023ce33fed1ef962012dc2c03765d2e92cb. This patch punishes performance without the implementation of megaflows on Windows. Once megaflows is implemented in the flow logic this patch will be revisited. Signed-off-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> Acked-by: Sairam Venugopal <vsairam@vmware.com> Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
-rw-r--r--datapath-windows/ovsext/DpInternal.h7
-rw-r--r--datapath-windows/ovsext/Flow.c40
-rw-r--r--datapath-windows/ovsext/Flow.h2
-rw-r--r--datapath-windows/ovsext/PacketParser.c1
-rw-r--r--datapath-windows/ovsext/PacketParser.h3
5 files changed, 16 insertions, 37 deletions
diff --git a/datapath-windows/ovsext/DpInternal.h b/datapath-windows/ovsext/DpInternal.h
index 0405b8e8e..8de48a2c7 100644
--- a/datapath-windows/ovsext/DpInternal.h
+++ b/datapath-windows/ovsext/DpInternal.h
@@ -65,8 +65,6 @@ typedef struct _OVS_VPORT_EXT_INFO {
typedef struct L4Key {
ovs_be16 tpSrc; /* TCP/UDP/SCTP source port. */
ovs_be16 tpDst; /* TCP/UDP/SCTP destination port. */
- ovs_be16 flags; /* TCP flags */
- uint8_t pad[2];
} L4Key;
typedef struct Ipkey {
@@ -77,7 +75,7 @@ typedef struct Ipkey {
uint8_t nwTtl; /* IP TTL/Hop Limit. */
uint8_t nwFrag; /* FLOW_FRAG_* flags. */
L4Key l4;
-} IpKey; /* Size of 20 byte. */
+} IpKey; /* Size of 16 byte. */
typedef struct ArpKey {
ovs_be32 nwSrc; /* IPv4 source address. */
@@ -97,6 +95,7 @@ typedef struct Ipv6Key {
uint8_t nwTtl; /* IP TTL/Hop Limit. */
uint8_t nwFrag; /* FLOW_FRAG_* flags. */
L4Key l4;
+ uint32_t pad;
} Ipv6Key; /* Size of 48 byte. */
typedef struct Icmp6Key {
@@ -111,7 +110,7 @@ typedef struct Icmp6Key {
uint8_t arpSha[6]; /* ARP/ND source hardware address. */
uint8_t arpTha[6]; /* ARP/ND target hardware address. */
struct in6_addr ndTarget; /* IPv6 neighbor discovery (ND) target. */
-} Icmp6Key; /* Size of 76 byte. */
+} Icmp6Key; /* Size of 72 byte. */
typedef struct L2Key {
uint32_t inPort; /* Port number of input port. */
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index ca6a35398..b629c931c 100644
--- a/datapath-windows/ovsext/Flow.c
+++ b/datapath-windows/ovsext/Flow.c
@@ -980,7 +980,6 @@ _MapFlowIpv4KeyToNlKey(PNL_BUFFER nlBuf, IpKey *ipv4FlowPutKey)
switch (ipv4Key.ipv4_proto) {
case IPPROTO_TCP: {
struct ovs_key_tcp tcpKey;
- UINT16 tcpFlags = 0;
tcpKey.tcp_src = ipv4FlowPutKey->l4.tpSrc;
tcpKey.tcp_dst = ipv4FlowPutKey->l4.tpDst;
if (!NlMsgPutTailUnspec(nlBuf, OVS_KEY_ATTR_TCP,
@@ -989,13 +988,6 @@ _MapFlowIpv4KeyToNlKey(PNL_BUFFER nlBuf, IpKey *ipv4FlowPutKey)
rc = STATUS_UNSUCCESSFUL;
goto done;
}
- tcpFlags = ipv4FlowPutKey->l4.flags;
- if (!NlMsgPutTailUnspec(nlBuf, OVS_KEY_ATTR_TCP_FLAGS,
- (PCHAR)(&tcpFlags),
- sizeof(tcpFlags))) {
- rc = STATUS_UNSUCCESSFUL;
- goto done;
- }
break;
}
@@ -1082,7 +1074,6 @@ _MapFlowIpv6KeyToNlKey(PNL_BUFFER nlBuf, Ipv6Key *ipv6FlowPutKey,
switch (ipv6Key.ipv6_proto) {
case IPPROTO_TCP: {
struct ovs_key_tcp tcpKey;
- UINT16 tcpFlags = 0;
tcpKey.tcp_src = ipv6FlowPutKey->l4.tpSrc;
tcpKey.tcp_dst = ipv6FlowPutKey->l4.tpDst;
if (!NlMsgPutTailUnspec(nlBuf, OVS_KEY_ATTR_TCP,
@@ -1091,13 +1082,6 @@ _MapFlowIpv6KeyToNlKey(PNL_BUFFER nlBuf, Ipv6Key *ipv6FlowPutKey,
rc = STATUS_UNSUCCESSFUL;
goto done;
}
- tcpFlags = ipv6FlowPutKey->l4.flags;
- if (!NlMsgPutTailUnspec(nlBuf, OVS_KEY_ATTR_TCP_FLAGS,
- (PCHAR)(&tcpFlags),
- sizeof(tcpFlags))) {
- rc = STATUS_UNSUCCESSFUL;
- goto done;
- }
break;
}
@@ -1373,12 +1357,6 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
ipv4FlowPutKey->l4.tpDst = tcpKey->tcp_dst;
}
- if (keyAttrs[OVS_KEY_ATTR_TCP_FLAGS]) {
- const UINT16 *flags;
- flags = NlAttrGet(keyAttrs[OVS_KEY_ATTR_TCP_FLAGS]);
- ipv4FlowPutKey->l4.flags = *flags;
- }
-
if (keyAttrs[OVS_KEY_ATTR_UDP]) {
const struct ovs_key_udp *udpKey;
udpKey = NlAttrGet(keyAttrs[OVS_KEY_ATTR_UDP]);
@@ -1423,12 +1401,6 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
ipv6FlowPutKey->l4.tpDst = tcpKey->tcp_dst;
}
- if (keyAttrs[OVS_KEY_ATTR_TCP_FLAGS]) {
- const UINT16 *flags;
- flags = NlAttrGet(keyAttrs[OVS_KEY_ATTR_TCP_FLAGS]);
- ipv6FlowPutKey->l4.flags = *flags;
- }
-
if (keyAttrs[OVS_KEY_ATTR_UDP]) {
const struct ovs_key_udp *udpKey;
udpKey = NlAttrGet(keyAttrs[OVS_KEY_ATTR_UDP]);
@@ -1471,6 +1443,8 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
destKey->l2.keyLen += OVS_IPV6_KEY_SIZE;
}
+
+ ipv6FlowPutKey->pad = 0;
}
break;
}
@@ -1491,6 +1465,9 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
/* Kernel datapath assumes 'arpFlowPutKey->nwProto' to be in host
* order. */
arpFlowPutKey->nwProto = (UINT8)ntohs((arpKey->arp_op));
+ arpFlowPutKey->pad[0] = 0;
+ arpFlowPutKey->pad[1] = 0;
+ arpFlowPutKey->pad[2] = 0;
destKey->l2.keyLen += OVS_ARP_KEY_SIZE;
break;
}
@@ -1658,7 +1635,7 @@ OvsFlowUsed(OvsFlow *flow,
flow->used = tickCount.QuadPart * ovsTimeIncrementPerTick;
flow->packetCount++;
flow->byteCount += OvsPacketLenNBL(packet);
- flow->tcpFlags |= OvsGetTcpFlags(packet, layers);
+ flow->tcpFlags |= OvsGetTcpFlags(packet, &flow->key, layers);
}
@@ -1819,7 +1796,6 @@ OvsExtractFlow(const NET_BUFFER_LIST *packet,
ipKey->nwTtl = nh->ttl;
ipKey->l4.tpSrc = 0;
ipKey->l4.tpDst = 0;
- ipKey->l4.flags = 0;
if (!(nh->frag_off & htons(IP_OFFSET))) {
if (ipKey->nwProto == SOCKET_IPPROTO_TCP) {
@@ -1853,7 +1829,7 @@ OvsExtractFlow(const NET_BUFFER_LIST *packet,
layers->isIPv6 = 1;
flow->ipv6Key.l4.tpSrc = 0;
flow->ipv6Key.l4.tpDst = 0;
- flow->ipv6Key.l4.flags = 0;
+ flow->ipv6Key.pad = 0;
if (flow->ipv6Key.nwProto == SOCKET_IPPROTO_TCP) {
OvsParseTcp(packet, &(flow->ipv6Key.l4), layers);
@@ -1934,7 +1910,9 @@ AddFlow(OVS_DATAPATH *datapath, OvsFlow *flow)
*/
KeMemoryBarrier();
+ //KeAcquireSpinLock(&FilterDeviceExtension->NblQueueLock, &oldIrql);
InsertTailList(head, &flow->ListEntry);
+ //KeReleaseSpinLock(&FilterDeviceExtension->NblQueueLock, oldIrql);
datapath->nFlows++;
diff --git a/datapath-windows/ovsext/Flow.h b/datapath-windows/ovsext/Flow.h
index 5d74ca8bb..e817bcf80 100644
--- a/datapath-windows/ovsext/Flow.h
+++ b/datapath-windows/ovsext/Flow.h
@@ -28,7 +28,7 @@ typedef struct _OvsFlow {
OvsFlowKey key;
UINT64 hash;
UINT32 actionsLen;
- UINT8 tcpFlags;
+ UINT8 tcpFlags;
UINT64 used;
UINT64 packetCount;
UINT64 byteCount;
diff --git a/datapath-windows/ovsext/PacketParser.c b/datapath-windows/ovsext/PacketParser.c
index 219ddace1..e01be17e7 100644
--- a/datapath-windows/ovsext/PacketParser.c
+++ b/datapath-windows/ovsext/PacketParser.c
@@ -186,7 +186,6 @@ OvsParseTcp(const NET_BUFFER_LIST *packet,
if (tcp) {
flow->tpSrc = tcp->source;
flow->tpDst = tcp->dest;
- flow->flags = OvsGetTcpFlags(packet, layers);
layers->isTcp = 1;
layers->l7Offset = layers->l4Offset + 4 * tcp->doff;
}
diff --git a/datapath-windows/ovsext/PacketParser.h b/datapath-windows/ovsext/PacketParser.h
index 765819ab0..55d110f11 100644
--- a/datapath-windows/ovsext/PacketParser.h
+++ b/datapath-windows/ovsext/PacketParser.h
@@ -75,8 +75,11 @@ OvsGetTcpCtl(const NET_BUFFER_LIST *packet, // IN
static UINT8
OvsGetTcpFlags(const NET_BUFFER_LIST *packet, // IN
+ const OvsFlowKey *key, // IN
const POVS_PACKET_HDR_INFO layers) // IN
{
+ UNREFERENCED_PARAMETER(key); // should be removed later
+
if (layers->isTcp) {
return TCP_FLAGS(OvsGetTcpCtl(packet, layers));
} else {