From patchwork Thu Oct 15 11:49:34 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sorin Vinturis X-Patchwork-Id: 530640 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (unknown [IPv6:2600:3c00::f03c:91ff:fe6e:bdf7]) by ozlabs.org (Postfix) with ESMTP id 4143D1402B7 for ; Thu, 15 Oct 2015 23:23:54 +1100 (AEDT) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id 5EBDC10682; Thu, 15 Oct 2015 05:23:53 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx3v1.cudamail.com (mx3.cudamail.com [64.34.241.5]) by archives.nicira.com (Postfix) with ESMTPS id 08F4310681 for ; Thu, 15 Oct 2015 05:23:52 -0700 (PDT) Received: from bar3.cudamail.com (bar1 [192.168.15.1]) by mx3v1.cudamail.com (Postfix) with ESMTP id 984BF61831F for ; Thu, 15 Oct 2015 06:23:11 -0600 (MDT) X-ASG-Debug-ID: 1444909803-03dd7b78c497df0001-byXFYA Received: from mx3-pf2.cudamail.com ([192.168.14.1]) by bar3.cudamail.com with ESMTP id wUlNGzA7ZJJSeCj2 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 15 Oct 2015 05:50:03 -0600 (MDT) X-Barracuda-Envelope-From: svinturis@cloudbasesolutions.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.14.1 Received: from unknown (HELO cbssmtp1.cloudbase.local) (91.232.152.5) by mx3-pf2.cudamail.com with SMTP; 15 Oct 2015 11:49:57 -0000 Received-SPF: pass (mx3-pf2.cudamail.com: SPF record at cloudbasesolutions.com designates 91.232.152.5 as permitted sender) X-Barracuda-Apparent-Source-IP: 91.232.152.5 X-Barracuda-RBL-IP: 91.232.152.5 Received: from localhost (localhost [127.0.0.1]) by cbssmtp1.cloudbase.local (Postfix) with ESMTP id E04D840460 for ; Thu, 15 Oct 2015 14:49:55 +0300 (EEST) X-Virus-Scanned: amavisd-new at cloudbasesolutions.com Received: from cbssmtp1.cloudbase.local ([127.0.0.1]) by localhost (cbssmtp1.cloudbase.local [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id tYEm3o7B4Isq for ; Thu, 15 Oct 2015 14:49:35 +0300 (EEST) Received: from CBSEX1.cloudbase.local (unknown [10.77.78.3]) by cbssmtp1.cloudbase.local (Postfix) with ESMTP id 51B6A401E6 for ; Thu, 15 Oct 2015 14:49:35 +0300 (EEST) Received: from CBSEX1.cloudbase.local ([10.77.78.3]) by CBSEX1.cloudbase.local ([10.77.78.3]) with mapi id 14.03.0224.002; Thu, 15 Oct 2015 13:49:35 +0200 X-CudaMail-Envelope-Sender: svinturis@cloudbasesolutions.com From: Sorin Vinturis To: "dev@openvswitch.org" X-CudaMail-MID: CM-V2-1014008648 X-CudaMail-DTE: 101515 X-CudaMail-Originating-IP: 91.232.152.5 Thread-Topic: [PATCH v2] datapath-windows: Support attribute OVS_KEY_ATTR_TCP_FLAGS X-ASG-Orig-Subj: [##CM-V2-1014008648##][PATCH v2] datapath-windows: Support attribute OVS_KEY_ATTR_TCP_FLAGS Thread-Index: AQHRBz+PvNTflwEYokeRXUp7qFQYAA== Date: Thu, 15 Oct 2015 11:49:34 +0000 Message-ID: <1443693822-4408-1-git-send-email-svinturis@cloudbasesolutions.com> Accept-Language: en-US, it-IT Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.77.78.1] MIME-Version: 1.0 X-GBUdb-Analysis: 0, 91.232.152.5, Ugly c=0.308711 p=-0.3 Source Normal X-MessageSniffer-Rules: 0-0-0-18000-c X-Barracuda-Connect: UNKNOWN[192.168.14.1] X-Barracuda-Start-Time: 1444909803 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=3.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=3.0 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.23510 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Subject: [ovs-dev] [PATCH v2] datapath-windows: Support attribute OVS_KEY_ATTR_TCP_FLAGS X-BeenThere: dev@openvswitch.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@openvswitch.org Sender: "dev" This patch adds OVS_KEY_ATTR_TCP_FLAGS to our flow mechanism. Also clean unecesarry parts of code. Signed-off-by: Alin Gabriel Serdean Signed-off-by: Sorin Vinturis --- This patch is intended for branch-2.4 as well. --- datapath-windows/ovsext/DpInternal.h | 7 +++--- datapath-windows/ovsext/Flow.c | 40 ++++++++++++++++++++++++++-------- datapath-windows/ovsext/Flow.h | 2 +- datapath-windows/ovsext/PacketParser.c | 1 + datapath-windows/ovsext/PacketParser.h | 3 --- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/datapath-windows/ovsext/DpInternal.h b/datapath-windows/ovsext/DpInternal.h index 8de48a2..0405b8e 100644 --- a/datapath-windows/ovsext/DpInternal.h +++ b/datapath-windows/ovsext/DpInternal.h @@ -65,6 +65,8 @@ 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 { @@ -75,7 +77,7 @@ typedef struct Ipkey { uint8_t nwTtl; /* IP TTL/Hop Limit. */ uint8_t nwFrag; /* FLOW_FRAG_* flags. */ L4Key l4; -} IpKey; /* Size of 16 byte. */ +} IpKey; /* Size of 20 byte. */ typedef struct ArpKey { ovs_be32 nwSrc; /* IPv4 source address. */ @@ -95,7 +97,6 @@ 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 { @@ -110,7 +111,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 72 byte. */ +} Icmp6Key; /* Size of 76 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 b629c93..ca6a353 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++; diff --git a/datapath-windows/ovsext/Flow.h b/datapath-windows/ovsext/Flow.h index e817bcf..5d74ca8 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 e01be17..219ddac 100644 --- a/datapath-windows/ovsext/PacketParser.c +++ b/datapath-windows/ovsext/PacketParser.c @@ -186,6 +186,7 @@ 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 55d110f..765819a 100644 --- a/datapath-windows/ovsext/PacketParser.h +++ b/datapath-windows/ovsext/PacketParser.h @@ -75,11 +75,8 @@ 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 {