summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Flow.c
diff options
context:
space:
mode:
authorAlin Gabriel Serdean <aserdean@cloudbasesolutions.com>2015-10-23 18:12:28 +0000
committerGurucharan Shetty <gshetty@nicira.com>2015-10-23 11:30:48 -0700
commita26b2023ce33fed1ef962012dc2c03765d2e92cb (patch)
tree4cabfd49ddec417847b9a5ab34b6305047387584 /datapath-windows/ovsext/Flow.c
parent2979b9158bff4d6fcbddf7e09131a8cfeb9ec746 (diff)
downloadopenvswitch-a26b2023ce33fed1ef962012dc2c03765d2e92cb.tar.gz
datapath-windows: Support attribute OVS_KEY_ATTR_TCP_FLAGS
This patch adds OVS_KEY_ATTR_TCP_FLAGS to our flow mechanism. Also clean unecesarry parts of code. Signed-off-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> Co-authored-by: Sorin Vinturis <svinturis@cloudbasesolutions.com> Signed-off-by: Sorin Vinturis <svinturis@cloudbasesolutions.com> Acked-by: Nithin Raju <nithin@vmware.com> Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Diffstat (limited to 'datapath-windows/ovsext/Flow.c')
-rw-r--r--datapath-windows/ovsext/Flow.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index b629c931c..ca6a35398 100644
--- a/datapath-windows/ovsext/Flow.c
+++ b/datapath-windows/ovsext/Flow.c
@@ -980,6 +980,7 @@ _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,
@@ -988,6 +989,13 @@ _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;
}
@@ -1074,6 +1082,7 @@ _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,
@@ -1082,6 +1091,13 @@ _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;
}
@@ -1357,6 +1373,12 @@ _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]);
@@ -1401,6 +1423,12 @@ _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]);
@@ -1443,8 +1471,6 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
destKey->l2.keyLen += OVS_IPV6_KEY_SIZE;
}
-
- ipv6FlowPutKey->pad = 0;
}
break;
}
@@ -1465,9 +1491,6 @@ _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;
}
@@ -1635,7 +1658,7 @@ OvsFlowUsed(OvsFlow *flow,
flow->used = tickCount.QuadPart * ovsTimeIncrementPerTick;
flow->packetCount++;
flow->byteCount += OvsPacketLenNBL(packet);
- flow->tcpFlags |= OvsGetTcpFlags(packet, &flow->key, layers);
+ flow->tcpFlags |= OvsGetTcpFlags(packet, layers);
}
@@ -1796,6 +1819,7 @@ 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) {
@@ -1829,7 +1853,7 @@ OvsExtractFlow(const NET_BUFFER_LIST *packet,
layers->isIPv6 = 1;
flow->ipv6Key.l4.tpSrc = 0;
flow->ipv6Key.l4.tpDst = 0;
- flow->ipv6Key.pad = 0;
+ flow->ipv6Key.l4.flags = 0;
if (flow->ipv6Key.nwProto == SOCKET_IPPROTO_TCP) {
OvsParseTcp(packet, &(flow->ipv6Key.l4), layers);
@@ -1910,9 +1934,7 @@ AddFlow(OVS_DATAPATH *datapath, OvsFlow *flow)
*/
KeMemoryBarrier();
- //KeAcquireSpinLock(&FilterDeviceExtension->NblQueueLock, &oldIrql);
InsertTailList(head, &flow->ListEntry);
- //KeReleaseSpinLock(&FilterDeviceExtension->NblQueueLock, oldIrql);
datapath->nFlows++;