Re: [ovs-dev] [PATCH v3] datapath-windows: Add Connection Tracking Support

2016-04-14 Thread Sairam Venugopal
Thank Nithin and Ben!

On 4/14/16, 10:14 AM, "Ben Pfaff"  wrote:

>On Wed, Apr 13, 2016 at 11:54:03AM -0700, Sairam Venugopal wrote:
>> Enable support for Stateful Firewall in Hyper-V by adding a Connection
>> Tracking module. The module has been ported over from the userspace
>> implementation patch of a similar name.
>> 
>> The current version of the module supports ct - zone, mark and label for
>> TCP packets. Support for other packet formats will be added in
>>subsequent
>> patches.
>> 
>> The conntrack-tcp module is adapted from FreeBSD's pf subsystem and
>>hence
>> the BSD license. It has been ported over to match OVS Hyper-V coding
>> style.
>> 
>> Signed-off-by: Sairam Venugopal 
>> Signed-off-by: Daniele Di Proietto 
>> Co-Authored-by: Daniele Di Proietto 
>
>Applied to master, thanks!
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=BEv2tesTpF_9HAk66PED7BcMpKSrnK
>vzekG8-C2vZWw&s=VXtutM2b-bCChCpRxHuSzenO6Na1WSjkMVmeG9Ze8hQ&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH] datapath-windows: Refactor Conntrack Module in Hyper-V

2016-04-14 Thread Sairam Venugopal
Minor refactors around naming and reusability in lieu of adding support for 
other
protocols for tracking connections.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Conntrack-tcp.c | 15 ---
 datapath-windows/ovsext/Conntrack.c |  2 +-
 datapath-windows/ovsext/Conntrack.h | 13 +
 3 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/datapath-windows/ovsext/Conntrack-tcp.c 
b/datapath-windows/ovsext/Conntrack-tcp.c
index 3e25ba5..ebf0c95 100644
--- a/datapath-windows/ovsext/Conntrack-tcp.c
+++ b/datapath-windows/ovsext/Conntrack-tcp.c
@@ -58,13 +58,6 @@ enum {
 TCPOPT_WINDOW = 3,
 };
 
-/* Given POINTER, the address of the given MEMBER in a STRUCT object, returns
-   the STRUCT object. */
-#define CONTAINER_OF(POINTER, STRUCT, MEMBER)   \
-((STRUCT *) (void *) ((char *) (POINTER) - \
- offsetof (STRUCT, MEMBER)))
-
-
 /* TCP sequence numbers are 32 bit integers operated
  * on with modular arithmetic.  These macros can be
  * used to compare such integers. */
@@ -227,7 +220,7 @@ OvsCastConntrackEntryToTcpEntry(OVS_CT_ENTRY* conn)
 }
 
 enum CT_UPDATE_RES
-OvsConntrackUpdateTcpEntry(struct OVS_CT_ENTRY* conn_,
+OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
const TCPHdr *tcp,
PNET_BUFFER_LIST nbl,
BOOLEAN reply,
@@ -488,9 +481,9 @@ OvsConntrackValidateTcpPacket(const TCPHdr *tcp)
 }
 
 OVS_CT_ENTRY *
-OvsNewTcpConntrack(const TCPHdr *tcp,
-   PNET_BUFFER_LIST nbl,
-   UINT64 now)
+OvsConntrackCreateTcpEntry(const TCPHdr *tcp,
+   PNET_BUFFER_LIST nbl,
+   UINT64 now)
 {
 struct conn_tcp* newconn = NULL;
 struct tcp_peer *src, *dst;
diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index fbeb70c..6391ce8 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -164,7 +164,7 @@ OvsCtEntryCreate(const TCPHdr *tcp,
 
 state |= OVS_CS_F_NEW;
 if (commit) {
-entry = OvsNewTcpConntrack(tcp, curNbl, currentTime);
+entry = OvsConntrackCreateTcpEntry(tcp, curNbl, currentTime);
 NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
 NdisMoveMemory(&entry->rev_key, &ctx->key, sizeof (OVS_CT_KEY));
 OvsCtKeyReverse(&entry->rev_key);
diff --git a/datapath-windows/ovsext/Conntrack.h 
b/datapath-windows/ovsext/Conntrack.h
index 3a73f21..a754544 100644
--- a/datapath-windows/ovsext/Conntrack.h
+++ b/datapath-windows/ovsext/Conntrack.h
@@ -82,6 +82,11 @@ typedef struct OvsConntrackKeyLookupCtx {
 #define CT_HASH_TABLE_MASK (CT_HASH_TABLE_SIZE - 1)
 #define CT_ENTRY_TIMEOUT (2 * 6)   // 2m
 #define CT_CLEANUP_INTERVAL (2 * 6) // 2m
+/* Given POINTER, the address of the given MEMBER in a STRUCT object, returns
+   the STRUCT object. */
+#define CONTAINER_OF(POINTER, STRUCT, MEMBER)   \
+((STRUCT *) (void *) ((char *) (POINTER) - \
+ offsetof (STRUCT, MEMBER)))
 
 VOID OvsCleanupConntrack(VOID);
 NTSTATUS OvsInitConntrack(POVS_SWITCH_CONTEXT context);
@@ -91,10 +96,10 @@ NDIS_STATUS OvsExecuteConntrackAction(PNET_BUFFER_LIST 
curNbl,
   OvsFlowKey *key,
   const PNL_ATTR a);
 BOOLEAN OvsConntrackValidateTcpPacket(const TCPHdr *tcp);
-OVS_CT_ENTRY * OvsNewTcpConntrack(const TCPHdr *tcp,
-  PNET_BUFFER_LIST nbl,
-  UINT64 now);
-enum CT_UPDATE_RES OvsConntrackUpdateTcpEntry(struct OVS_CT_ENTRY* conn_,
+OVS_CT_ENTRY * OvsConntrackCreateTcpEntry(const TCPHdr *tcp,
+  PNET_BUFFER_LIST nbl,
+  UINT64 now);
+enum CT_UPDATE_RES OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
   const TCPHdr *tcp,
   PNET_BUFFER_LIST nbl,
   BOOLEAN reply,
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH] datapath-windows: Add ICMP types in NetProto.h

2016-04-14 Thread Sairam Venugopal
Update NetProto.h to include ICMP and ICMPv6 types. Update ICMP header to
keep it consistent with KVM. Add UDP and ICMP min length definitions.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/NetProto.h | 53 +-
 1 file changed, 46 insertions(+), 7 deletions(-)

diff --git a/datapath-windows/ovsext/NetProto.h 
b/datapath-windows/ovsext/NetProto.h
index c18135c..f7527f8 100644
--- a/datapath-windows/ovsext/NetProto.h
+++ b/datapath-windows/ovsext/NetProto.h
@@ -39,7 +39,9 @@ typedef struct EthHdr {
 #define IP_HDR_MIN_LENGTH  20
 #define TCP_HDR_MIN_LENGTH 20
 #define TCP_CSUM_OFFSET16
+#define UDP_HDR_MIN_LENGTH 8
 #define UDP_CSUM_OFFSET6
+#define ICMP_HDR_MIN_LENGTH8
 #define ICMP_CSUM_OFFSET   2
 #define INET_CSUM_LENGTH   (sizeof(UINT16))
 
@@ -99,10 +101,6 @@ typedef UINT64 IP6UnitLength;
 #define IPPROTO_DSTOPTS 60  /* Destination options header 
*/
 #define IPPROTO_ETHERIP 97  /* etherIp tunneled protocol */
 
-/* ICMPv6 types. */
-#define ND_NEIGHBOR_SOLICIT 135 /* neighbor solicitation */
-#define ND_NEIGHBOR_ADVERT  136 /* neighbor advertisment */
-
 /* IPv6 Neighbor discovery option header. */
 #define ND_OPT_SOURCE_LINKADDR  1
 #define ND_OPT_TARGET_LINKADDR  2
@@ -121,9 +119,39 @@ typedef UINT64 IP6UnitLength;
 #define RARPOP_REQUEST_NBO 0x0300   /* NBO RARP request.  */
 #define RARPOP_REPLY_NBO   0x0300   /* NBO RARP reply.*/
 
-#define ICMP_ECHO  8/* Echo Request */
-#define ICMP_ECHOREPLY 0/* Echo Reply */
-#define ICMP_DEST_UNREACH  3/* Destination Unreachable */
+/* ICMPv4 types. */
+#define ICMP4_ECHO_REPLY 0   /* Echo Reply   */
+#define ICMP4_DEST_UNREACH   3   /* Destination Unreachable  */
+#define ICMP4_SOURCE_QUENCH  4   /* Source Quench*/
+#define ICMP4_REDIRECT   5   /* Redirect (change route)  */
+#define ICMP4_ECHO_REQUEST   8   /* Echo Request */
+#define ICMP4_ROUTER_ADVERT  9   /* Router Advert*/
+#define ICMP4_ROUTER_SOLICIT 10  /* Router Solicit   */
+#define ICMP4_TIME_EXCEEDED  11  /* Time Exceeded*/
+#define ICMP4_PARAM_PROB 12  /* Parameter Problem*/
+#define ICMP4_TIMESTAMP_REQUEST  13  /* Timestamp Request*/
+#define ICMP4_TIMESTAMP_REPLY14  /* Timestamp Reply  */
+#define ICMP4_INFO_REQUEST   15  /* Information Request  */
+#define ICMP4_INFO_REPLY 16  /* Information Reply*/
+#define ICMP4_MASK_REQUEST   17  /* Address Mask Request */
+#define ICMP4_MASK_REPLY 18  /* Address Mask Reply   */
+
+/* ICMPv6 types. */
+#define ICMP6_DST_UNREACH  1
+#define ICMP6_PACKET_TOO_BIG   2
+#define ICMP6_TIME_EXCEEDED3
+#define ICMP6_PARAM_PROB   4
+#define ICMP6_ECHO_REQUEST 128
+#define ICMP6_ECHO_REPLY   129
+#define ICMP6_MEMBERSHIP_QUERY 130
+#define ICMP6_MEMBERSHIP_REPORT131
+#define ICMP6_MEMBERSHIP_REDUCTION 132
+#define ND_ROUTER_SOLICIT  133
+#define ND_ROUTER_ADVERT   134
+#define ND_NEIGHBOR_SOLICIT135 /* neighbor solicitation */
+#define ND_NEIGHBOR_ADVERT 136 /* neighbor advertisment */
+#define ND_REDIRECT137
+
 
 /* IGMP related constants */
 #define IGMP_UNKNOWN0x00/* For IGMP packets where we don't know the 
type */
@@ -273,6 +301,17 @@ typedef struct ICMPHdr {
UINT8type;
UINT8code;
UINT16   checksum;
+   union {
+struct {
+UINT16 id;
+UINT16 seq;
+} echo;
+struct {
+UINT16 empty;
+UINT16 mtu;
+} frag;
+UINT32 gateway;
+} fields;
 } ICMPHdr;
 
 typedef struct ICMPEcho {
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH] datapath-windows: remove OvsAllocateForwardingContextForNBL

2016-04-15 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 4/15/16, 7:05 AM, "Nithin Raju"  wrote:

>dead code.
>
>Signed-off-by: Nithin Raju 
>---
> datapath-windows/ovsext/User.c | 10 --
> 1 file changed, 10 deletions(-)
>
>diff --git a/datapath-windows/ovsext/User.c
>b/datapath-windows/ovsext/User.c
>index 04d2294..d2ff236 100644
>--- a/datapath-windows/ovsext/User.c
>+++ b/datapath-windows/ovsext/User.c
>@@ -247,16 +247,6 @@ OvsReadDpIoctl(PFILE_OBJECT fileObject,
> return STATUS_SUCCESS;
> }
> 
>-/* Helper function to allocate a Forwarding Context for an NBL */
>-NTSTATUS
>-OvsAllocateForwardingContextForNBL(POVS_SWITCH_CONTEXT switchContext,
>-   PNET_BUFFER_LIST nbl)
>-{
>-return switchContext->NdisSwitchHandlers.
>-AllocateNetBufferListForwardingContext(
>-switchContext->NdisSwitchContext, nbl);
>-}
>-
> /*
>  
>*-
>---
>  *  OvsNlExecuteCmdHandler --
>-- 
>2.6.2
>
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=96ueorwe12Hg1l7GcxtEHeTAdE-0iQ
>8HnVgQUiTHVWU&s=cbog-VBe0gx5PhAkJHb5xebm1LDh2VqNa3FDjkozI7k&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH] datapath-windows: Refactor Conntrack Module in Hyper-V

2016-04-15 Thread Sairam Venugopal
Thanks for the review. I will make the changes as part of a different
patch.

Sairam

On 4/14/16, 10:53 PM, "Nithin Raju"  wrote:

>Instead of using OvsConntrack*, it might be better to use OvsCt*. But, not
>a big deal.
>
>Acked-by: Nithin Raju 
>
>-Original Message-----
>From: dev  on behalf of Sairam Venugopal
>
>Date: Thursday, April 14, 2016 at 12:07 PM
>To: "dev@openvswitch.org" 
>Subject: [ovs-dev] [PATCH] datapath-windows: Refactor Conntrack Module
>in Hyper-V
>
>>Minor refactors around naming and reusability in lieu of adding support
>>for other
>>protocols for tracking connections.
>>
>>Signed-off-by: Sairam Venugopal 
>>---
>> datapath-windows/ovsext/Conntrack-tcp.c | 15 ---
>> datapath-windows/ovsext/Conntrack.c |  2 +-
>> datapath-windows/ovsext/Conntrack.h | 13 +
>> 3 files changed, 14 insertions(+), 16 deletions(-)
>>
>>diff --git a/datapath-windows/ovsext/Conntrack-tcp.c
>>b/datapath-windows/ovsext/Conntrack-tcp.c
>>index 3e25ba5..ebf0c95 100644
>>--- a/datapath-windows/ovsext/Conntrack-tcp.c
>>+++ b/datapath-windows/ovsext/Conntrack-tcp.c
>>@@ -58,13 +58,6 @@ enum {
>> TCPOPT_WINDOW = 3,
>> };
>> 
>>-/* Given POINTER, the address of the given MEMBER in a STRUCT object,
>>returns
>>-   the STRUCT object. */
>>-#define CONTAINER_OF(POINTER, STRUCT, MEMBER)
>>\
>>-((STRUCT *) (void *) ((char *) (POINTER) - \
>>- offsetof (STRUCT, MEMBER)))
>>-
>>-
>> /* TCP sequence numbers are 32 bit integers operated
>>  * on with modular arithmetic.  These macros can be
>>  * used to compare such integers. */
>>@@ -227,7 +220,7 @@ OvsCastConntrackEntryToTcpEntry(OVS_CT_ENTRY* conn)
>> }
>> 
>> enum CT_UPDATE_RES
>>-OvsConntrackUpdateTcpEntry(struct OVS_CT_ENTRY* conn_,
>>+OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
>>const TCPHdr *tcp,
>>PNET_BUFFER_LIST nbl,
>>BOOLEAN reply,
>>@@ -488,9 +481,9 @@ OvsConntrackValidateTcpPacket(const TCPHdr *tcp)
>> }
>> 
>> OVS_CT_ENTRY *
>>-OvsNewTcpConntrack(const TCPHdr *tcp,
>>-   PNET_BUFFER_LIST nbl,
>>-   UINT64 now)
>>+OvsConntrackCreateTcpEntry(const TCPHdr *tcp,
>>+   PNET_BUFFER_LIST nbl,
>>+   UINT64 now)
>> {
>> struct conn_tcp* newconn = NULL;
>> struct tcp_peer *src, *dst;
>>diff --git a/datapath-windows/ovsext/Conntrack.c
>>b/datapath-windows/ovsext/Conntrack.c
>>index fbeb70c..6391ce8 100644
>>--- a/datapath-windows/ovsext/Conntrack.c
>>+++ b/datapath-windows/ovsext/Conntrack.c
>>@@ -164,7 +164,7 @@ OvsCtEntryCreate(const TCPHdr *tcp,
>> 
>> state |= OVS_CS_F_NEW;
>> if (commit) {
>>-entry = OvsNewTcpConntrack(tcp, curNbl, currentTime);
>>+entry = OvsConntrackCreateTcpEntry(tcp, curNbl, currentTime);
>> NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
>> NdisMoveMemory(&entry->rev_key, &ctx->key, sizeof (OVS_CT_KEY));
>> OvsCtKeyReverse(&entry->rev_key);
>>diff --git a/datapath-windows/ovsext/Conntrack.h
>>b/datapath-windows/ovsext/Conntrack.h
>>index 3a73f21..a754544 100644
>>--- a/datapath-windows/ovsext/Conntrack.h
>>+++ b/datapath-windows/ovsext/Conntrack.h
>>@@ -82,6 +82,11 @@ typedef struct OvsConntrackKeyLookupCtx {
>> #define CT_HASH_TABLE_MASK (CT_HASH_TABLE_SIZE - 1)
>> #define CT_ENTRY_TIMEOUT (2 * 6)   // 2m
>> #define CT_CLEANUP_INTERVAL (2 * 6) // 2m
>>+/* Given POINTER, the address of the given MEMBER in a STRUCT object,
>>returns
>>+   the STRUCT object. */
>>+#define CONTAINER_OF(POINTER, STRUCT, MEMBER)
>>\
>>+((STRUCT *) (void *) ((char *) (POINTER) - \
>>+ offsetof (STRUCT, MEMBER)))
>> 
>> VOID OvsCleanupConntrack(VOID);
>> NTSTATUS OvsInitConntrack(POVS_SWITCH_CONTEXT context);
>>@@ -91,10 +96,10 @@ NDIS_STATUS
>>OvsExecuteConntrackAction(PNET_BUFFER_LIST curNbl,
>>   OvsFlowKey *key,
>>   const PNL_ATTR a);
>> BOOLEAN OvsConntrackValidateTcpPacket(const TCPHdr *tcp);
>>-OVS_CT_ENTRY * OvsNewTcpConntrack(const TCPHdr *tcp,
>>-  PNET_BUFFER_LIST nbl,
>>-  UINT64 now);
>>-enum CT_UPDATE_RES OvsConntrackUpda

Re: [ovs-dev] [PATCH] datapath-windows: Fix bug in OvsTcpGetWscale().

2016-04-20 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 4/15/16, 5:04 PM, "Daniele Di Proietto"  wrote:

>The userspace conntrack had a bug in tcp_wscale_get(), where the length
>of an option would be read from the third octet of the option TLV
>instead of the second.  This could cause an incorrect wscale value to
>be returned, and it would at least impact performance.
>
>Also use 'int' instead of 'unsigned' for 'len', since the value can be
>negative.
>
>CC: Sairam Venugopal 
>Signed-off-by: Daniele Di Proietto 
>---
>
>I tested a similar fix on the userspace connection tracker, but I didn't
>compile this for the windows datapath.
>
>---
> datapath-windows/ovsext/Conntrack-tcp.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Conntrack-tcp.c
>b/datapath-windows/ovsext/Conntrack-tcp.c
>index 3e25ba5..340c469 100644
>--- a/datapath-windows/ovsext/Conntrack-tcp.c
>+++ b/datapath-windows/ovsext/Conntrack-tcp.c
>@@ -166,7 +166,7 @@ OvsConntrackValidateTcpFlags(const TCPHdr *tcp)
> static __inline uint8_t
> OvsTcpGetWscale(const TCPHdr *tcp)
> {
>-unsigned len = tcp->doff * 4 - sizeof *tcp;
>+int len = tcp->doff * 4 - sizeof *tcp;
> const uint8_t *opt = (const uint8_t *)(tcp + 1);
> uint8_t wscale = 0;
> uint8_t optlen;
>@@ -185,7 +185,7 @@ OvsTcpGetWscale(const TCPHdr *tcp)
> wscale |= CT_WSCALE_FLAG;
> /* fall through */
> default:
>-optlen = opt[2];
>+optlen = opt[1];
> if (optlen < 2) {
> optlen = 2;
> }
>@@ -529,4 +529,4 @@ OvsNewTcpConntrack(const TCPHdr *tcp,
> OvsConntrackUpdateExpiration(newconn, now, CT_ENTRY_TIMEOUT);
> 
> return &newconn->up;
>-}
>\ No newline at end of file
>+}
>-- 
>2.1.4
>

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH] datapath-windows: Add paranthesis to fix error C2275

2016-04-21 Thread Sairam Venugopal
Add braces around the if condition to prevent Visual Studio from giving
the "error C2275: illegal use of this type as an expresion". This happens
when a variable is declared after a block. This error occurs on certain
versions of compilers.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Conntrack.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index fbeb70c..158d9d8 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -186,8 +186,9 @@ OvsCtEntryDelete(POVS_CT_ENTRY entry)
 static __inline BOOLEAN
 OvsCtEntryExpired(POVS_CT_ENTRY entry)
 {
-if (entry == NULL)
+if (entry == NULL) {
 return TRUE;
+}
 
 UINT64 currentTime;
 NdisGetCurrentSystemTime((LARGE_INTEGER *)¤tTime);
-- 
1.9.5.msysgit.0

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH v2] datapath-windows: Improved offloading on STT tunnel

2016-04-25 Thread Sairam Venugopal
Hi Paul,

Please see the comments inlined.

Thanks,
Sairam

On 4/18/16, 1:31 PM, "Paul Boca"  wrote:

>Added OvsExtractLayers - populates only the layers field without
>unnecessary
>memory operations for flow part
>If in STT header the flags are 0 then force packets checksums calculation
>Ensure correct pseudo checksum is set for LSO both on send and receive
>
>Signed-off-by: Paul-Daniel Boca 
>---
>v2: Fixed a NULL pointer dereference.
>Removed some unused local variables and multiple initializations.
>---
> datapath-windows/ovsext/Flow.c | 219
>+++--
> datapath-windows/ovsext/Flow.h |   2 +
> datapath-windows/ovsext/PacketParser.c |  60 +
> datapath-windows/ovsext/PacketParser.h |   8 +-
> datapath-windows/ovsext/Stt.c  | 161 +++-
> datapath-windows/ovsext/User.c |  20 +--
> 6 files changed, 368 insertions(+), 102 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Flow.c
>b/datapath-windows/ovsext/Flow.c
>index f74ce12..e26f068 100644
>--- a/datapath-windows/ovsext/Flow.c
>+++ b/datapath-windows/ovsext/Flow.c
>@@ -712,7 +712,7 @@ done:
> static NTSTATUS
> _MapFlowInfoToNl(PNL_BUFFER nlBuf, OvsFlowInfo *flowInfo)
> {
>-NTSTATUS rc = STATUS_SUCCESS;
>+NTSTATUS rc;
> 
> rc = MapFlowKeyToNlKey(nlBuf, &(flowInfo->key), OVS_FLOW_ATTR_KEY,
>OVS_KEY_ATTR_TUNNEL);
>@@ -1515,7 +1515,8 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
> 
> ndKey = NlAttrGet(keyAttrs[OVS_KEY_ATTR_ND]);
> RtlCopyMemory(&icmp6FlowPutKey->ndTarget,
>-  ndKey->nd_target, sizeof
>(icmp6FlowPutKey->ndTarget));
>+  ndKey->nd_target,
>+  sizeof (icmp6FlowPutKey->ndTarget));
> RtlCopyMemory(icmp6FlowPutKey->arpSha,
>   ndKey->nd_sll, ETH_ADDR_LEN);
> RtlCopyMemory(icmp6FlowPutKey->arpTha,
>@@ -1545,8 +1546,10 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
> arpFlowPutKey->nwSrc = arpKey->arp_sip;
> arpFlowPutKey->nwDst = arpKey->arp_tip;
> 
>-RtlCopyMemory(arpFlowPutKey->arpSha, arpKey->arp_sha,
>ETH_ADDR_LEN);
>-RtlCopyMemory(arpFlowPutKey->arpTha, arpKey->arp_tha,
>ETH_ADDR_LEN);
>+RtlCopyMemory(arpFlowPutKey->arpSha,
>+arpKey->arp_sha, ETH_ADDR_LEN);

Sai: Can you align the arguments? We usually try to restrict lines to 78
characters before introducing newline.

Eg:
RtlCopyMemory(arpFlowPutKey->arpSha,
  arpKey->arp_sha, ETH_ADDR_LEN);



>+RtlCopyMemory(arpFlowPutKey->arpTha,
>+arpKey->arp_tha, ETH_ADDR_LEN);
Sai: Same.

> /* Kernel datapath assumes 'arpFlowPutKey->nwProto' to be in
>host
>  * order. */
> arpFlowPutKey->nwProto = (UINT8)ntohs((arpKey->arp_op));
>@@ -1777,29 +1780,172 @@ OvsGetFlowMetadata(OvsFlowKey *key,
> return status;
> }

Sai: Can you add a description summary for OvsExtractLayers? We usually do
that for public methods.

> 
>+NDIS_STATUS
>+OvsExtractLayers(const NET_BUFFER_LIST *packet,
>+ POVS_PACKET_HDR_INFO layers)
>+{
>+struct Eth_Header *eth;
>+UINT8 offset = 0;
>+PVOID vlanTagValue;
>+ovs_be16 dlType;
>+
>+layers->value = 0;
>+
>+/* Link layer. */
>+eth = (Eth_Header *)GetStartAddrNBL((NET_BUFFER_LIST *)packet);
>+
>+/*
>+* vlan_tci.
>+*/
>+vlanTagValue = NET_BUFFER_LIST_INFO(packet,
>Ieee8021QNetBufferListInfo);
>+if (!vlanTagValue) {
>+if (eth->dix.typeNBO == ETH_TYPE_802_1PQ_NBO) {
>+offset = sizeof(Eth_802_1pq_Tag);
>+}
>+
>+/*
>+* XXX

Sai: You can continue after XXX on the same line.

>+* Please note after this point, src mac and dst mac should
>+* not be accessed through eth
>+*/
>+eth = (Eth_Header *)((UINT8 *)eth + offset);
>+}
>+
>+/*
>+* dl_type.
>+*
>+* XXX assume that at least the first
>+* 12 bytes of received packets are mapped.  This code has the
>stronger
>+* assumption that at least the first 22 bytes of 'packet' is mapped
>(if my
>+* arithmetic is right).
>+*/
>+if (ETH_TYPENOT8023(eth->dix.typeNBO)) {
>+dlType = eth->dix.typeNBO;
>+layers->l3Offset = ETH_HEADER_LEN_DIX + offset;
>+} else if (OvsPacketLenNBL(packet) >= ETH_HEADER_LEN_802_3 &&

Sai: Align the conditions with the if (.

>+eth->e802_3.llc.dsap == 0xaa &&
>+eth->e802_3.llc.ssap == 0xaa &&
>+eth->e802_3.llc.control == ETH_LLC_CONTROL_UFRAME &&
>+eth->e802_3.snap.snapOrg[0] == 0x00 &&
>+eth->e802_3.snap.snapOrg[1] == 0x00 &&
>+eth->e802_3.snap.snapOrg[2] == 0x00) {
>+dlType = eth->e802_3.snap.snapType.typeNBO;
>+layers->l3Offset = ETH_HEADER_LEN_802_3 + offset;
>+}

Re: [ovs-dev] [PATCH v2] datapath-windows: Pause switch state on PnP event

2016-04-25 Thread Sairam Venugopal
Thanks for incorporating the review comments. I noticed that V2 hasn¹t
been ACKED yet. 

Acked-by: Sairam Venugopal 



On 3/10/16, 5:33 AM, "Alin Serdean" 
wrote:

>A PnP(plug and play) event will be triggered before trying to disable
>the extension. We could use this PnP event to prepare for detaching
>the datapath.
>
>This patch sets the switch into a paused state so no more net buffers
>are queued.
>
>Also clean some commentaries.
>
>Signed-off-by: Alin Gabriel Serdean 
>---
>v2: Address comments
>---
> datapath-windows/ovsext/Switch.c | 8 ++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Switch.c
>b/datapath-windows/ovsext/Switch.c
>index 77bafb4..2a19988 100644
>--- a/datapath-windows/ovsext/Switch.c
>+++ b/datapath-windows/ovsext/Switch.c
>@@ -345,14 +345,13 @@ OvsExtPause(NDIS_HANDLE filterModuleContext,
> OVS_LOG_TRACE("Enter: filterModuleContext %p",
>   filterModuleContext);
> 
>-ASSERT(switchContext->dataFlowState == OvsSwitchRunning);
> switchContext->dataFlowState = OvsSwitchPaused;
> KeMemoryBarrier();
> while(switchContext->pendingOidCount > 0) {
> NdisMSleep(1000);
> }
> 
>-OVS_LOG_TRACE("Exit: OvsDetach Successfully");
>+OVS_LOG_TRACE("Exit: OvsExtPause Successfully");
> return NDIS_STATUS_SUCCESS;
> }
> 
>@@ -605,6 +604,11 @@ OvsExtNetPnPEvent(NDIS_HANDLE filterModuleContext,
> }
> }
> 
>+if (netPnPEvent->NetPnPEvent.NetEvent == NetEventFilterPreDetach) {
>+switchContext->dataFlowState = OvsSwitchPaused;
>+KeMemoryBarrier();
>+}
>+
> status = NdisFNetPnPEvent(switchContext->NdisFilterHandle,
>   netPnPEvent);
> OVS_LOG_TRACE("Exit: OvsExtNetPnPEvent");
>-- 
>1.9.5.msysgit.0
>___
>dev mailing list
>dev@openvswitch.org
>http://openvswitch.org/mailman/listinfo/dev

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH v2] datapath-windows: Improved offloading on STT tunnel

2016-04-26 Thread Sairam Venugopal
Hosts after Windows 7 use LSOv2 by default. The issue is with using Windows XP 
VM on a Win2012R2 host. The latter will be forced to use LSOv1 since XP doesn't 
support V2. We discussed about this in the previous IRC meeting. You can check 
the history of the irc channel for more info. 

Regards,
Sairam Venugopal

On Apr 26, 2016, at 9:08 AM, Alin Serdean  
wrote:

>>> -UINT32 encapMss = OvsGetExternalMtu(switchContext) - sizeof(IPHdr) -
>>> sizeof(TCPHdr);
>>> +UINT32 encapMss = OvsGetExternalMtu(switchContext)
>>> +  - sizeof(IPHdr)
>>> +  - sizeof(TCPHdr);
>>>if (ipTotalLen > encapMss) {
>>> -lsoInfo.Value = 0;
>>> -lsoInfo.LsoV2Transmit.TcpHeaderOffset = tcpHeaderOffset;
>>> -lsoInfo.LsoV2Transmit.MSS = encapMss;
>>> -lsoInfo.LsoV2Transmit.Type =
>> NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;
>>> -lsoInfo.LsoV2Transmit.IPVersion =
>>> NDIS_TCP_LARGE_SEND_OFFLOAD_IPv4;
>>> +outerIpHdr->check = IPChecksum((UINT8 *)outerIpHdr,
>>> +   sizeof *outerIpHdr, 0);
>>> +outerTcpHdr->check = IPPseudoChecksum(&fwdInfo->srcIpAddr,
>>> +  (uint32 *) &tunKey->dst,
>>> +  IPPROTO_TCP, (uint16)
>>> + 0);
>>> +
>> 
>> Sai: We discussed about this in the Hyper-V IRC meeting. You can get rid of
>> the V1 type since we can¹t enforce the type of an inner VM on outer host.
> [Alin Gabriel Serdean: ] My question would be the following. What happens if 
> the miniport (the actual host adapter) does not support LSO V2.
> 
> Alin. 
___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH] datapath-windows: Fix recirculation when it is not the last attribute

2016-04-26 Thread Sairam Venugopal
When the recirc action is in middle, the current code creates a clone of
the NBL. However, it overwrites the pointer to point to the cloned NBL
without completing it. This causes a memory leak that crashes the kernel.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Actions.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/datapath-windows/ovsext/Actions.c 
b/datapath-windows/ovsext/Actions.c
index 5dae6b4..5ad29ee 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -1557,10 +1557,14 @@ OvsExecuteRecirc(OvsForwardingContext *ovsFwdCtx,
 ovsActionStats.noCopiedNbl++;
 return NDIS_STATUS_SUCCESS;
 }
-ovsFwdCtx->curNbl = newNbl;
 }
 
-deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key, NULL);
+if (newNbl) {
+deferredAction = OvsAddDeferredActions(newNbl, key, NULL);
+} else {
+deferredAction = OvsAddDeferredActions(ovsFwdCtx->curNbl, key, NULL);
+}
+
 if (deferredAction) {
 deferredAction->key.recircId = NlAttrGetU32(actions);
 } else {
-- 
1.9.5.msysgit.0

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-04-27 Thread Sairam Venugopal
Enable support for UDP and ICMP in the connection tracking module on
Hyper-V.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/automake.mk  |   1 +
 datapath-windows/ovsext/Conntrack-other.c |  78 ++
 datapath-windows/ovsext/Conntrack.c   | 174 ++
 datapath-windows/ovsext/Conntrack.h   |   4 +
 datapath-windows/ovsext/ovsext.vcxproj|   1 +
 5 files changed, 214 insertions(+), 44 deletions(-)
 create mode 100644 datapath-windows/ovsext/Conntrack-other.c

diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index c9af806..668cf2c 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -13,6 +13,7 @@ EXTRA_DIST += \
datapath-windows/ovsext/Atomic.h \
datapath-windows/ovsext/BufferMgmt.c \
datapath-windows/ovsext/BufferMgmt.h \
+   datapath-windows/ovsext/Conntrack-other.c \
datapath-windows/ovsext/Conntrack-tcp.c \
datapath-windows/ovsext/Conntrack.c \
datapath-windows/ovsext/Conntrack.h \
diff --git a/datapath-windows/ovsext/Conntrack-other.c 
b/datapath-windows/ovsext/Conntrack-other.c
new file mode 100644
index 000..bcd38d5
--- /dev/null
+++ b/datapath-windows/ovsext/Conntrack-other.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2015, 2016 VMware, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Conntrack.h"
+#include 
+
+enum other_state {
+OTHERS_FIRST,
+OTHERS_MULTIPLE,
+OTHERS_BIDIR,
+};
+
+struct conn_other {
+struct OVS_CT_ENTRY up;
+enum other_state state;
+};
+
+static const long long other_timeouts[] = {
+[OTHERS_FIRST] = 60 * 1000,
+[OTHERS_MULTIPLE] = 60 * 1000,
+[OTHERS_BIDIR] = 30 * 1000,
+};
+
+static __inline struct conn_other*
+OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
+{
+return CONTAINER_OF(conn, struct conn_other, up);
+}
+
+static __inline VOID
+OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
+{
+conn->up.expiration = now + other_timeouts[conn->state];
+}
+
+enum ct_update_res
+OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
+ BOOLEAN reply,
+ UINT64 now)
+{
+struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
+
+if (reply && conn->state != OTHERS_BIDIR) {
+conn->state = OTHERS_BIDIR;
+} else if (conn->state == OTHERS_FIRST) {
+conn->state = OTHERS_MULTIPLE;
+}
+
+OvsConntrackUpdateExpiration(conn, now);
+
+return CT_UPDATE_VALID;
+}
+
+OVS_CT_ENTRY *
+OvsConntrackCreateOtherEntry(UINT64 now)
+{
+struct conn_other *conn;
+conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
+OVS_CT_POOL_TAG);
+/* XXX Handle memory allocation error*/
+conn->up = (OVS_CT_ENTRY) {0};
+conn->state = OTHERS_FIRST;
+OvsConntrackUpdateExpiration(conn, now);
+return &conn->up;
+}
\ No newline at end of file
diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 544fd51..50204cb 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -146,9 +146,20 @@ OvsCtUpdateFlowKey(struct OvsFlowKey *key,
 }
 }
 
+static __inline VOID
+OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx)
+{
+NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
+NdisMoveMemory(&entry->rev_key, &ctx->key, sizeof (OVS_CT_KEY));
+OvsCtKeyReverse(&entry->rev_key);
+InsertHeadList(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],
+   &entry->link);
+}
+
 static __inline POVS_CT_ENTRY
-OvsCtEntryCreate(const TCPHdr *tcp,
- PNET_BUFFER_LIST curNbl,
+OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
+ UINT8 ipProto,
+ UINT32 l4Offset,
  OvsConntrackKeyLookupCtx *ctx,
  OvsFlowKey *key,
  BOOLEAN commit,
@@ -156,26 +167,71 @@ OvsCtEntryCreate(const TCPHdr *tcp,
 {
 POVS_CT_ENTRY entry = NULL;
 UINT32 state = 0;
-if (!OvsConntrackValidateTcpPacket(tcp)) {
-state |= OVS_CS_F_INVALID;
-OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
-return entry;
-}
+switch (ipProto)
+{
+case IPPROTO_

Re: [ovs-dev] [PATCH V3] datapath-windows: Improved offloading on STT tunnel

2016-04-30 Thread Sairam Venugopal
Hey Paul,

Thanks for clarifying what OvsExtractLayers was doing. You shouldn¹t have
to extract the layers info for the inner packet since they can be derived
from the STT Header Flags - especially when it¹s CSUM_Partial. That¹s even
mentioned in the STT IETF draft under the STT Flags section -
https://tools.ietf.org/html/draft-davie-stt-08. This definitely impacts
the efficiency of STT.

Are you running into issues when the inner checksum isn¹t computed and the
STT flags mention otherwise? If yes, then that¹s a bug in the Encap side
of things. I would test a similar setup on KVM and verify if it works. The
function - OvsDecapSetOffloads mimics what KVM does -
https://github.com/openvswitch/ovs/blob/d271907f817db25be8da8d425ac256d7ed8
c96a9/datapath/linux/compat/stt.c#L1222 and handles the case when the
inner checksum is partially computed. When inner checksum is already
computed, why is it necessary to update the IP version of the csumInfo?
Since we don¹t request any further offloads.

Moreover, using OvsGetExternalMTU for the inner VM¹s MSS is also
incorrect. Ideally we should be able to retrieve the MTU of the inner VM
and use that or require that a certain default MTU should be set for the
inner VMs. Were you able to test this by changing the MTU of external
adapter without changing that of the inner VM?

I don¹t think the STT header flags can be 0. We should probably get it
confirmed from some other person on the OVS team. If you are encountering
any issues with the current STT setup, please file a bug. There is a
higher likelihood of having a bug in OvsSttEncap(). Although, I see an
advantage in differentiating OvsExtractLayers from OvsExtractFlows, I am
still unsure if this patch improves STT offloading. Do correct me if my
understanding is off.

Thanks,
Sairam


On 4/27/16, 12:25 AM, "Paul Boca"  wrote:

>Added OvsExtractLayers - populates only the layers field without
>unnecessary
>memory operations for flow part
>If in STT header the flags are 0 then force packets checksums calculation
>Ensure correct pseudo checksum is set for LSO both on send and receive
>
>Signed-off-by: Paul-Daniel Boca 
>---
>v2: Fixed a NULL pointer dereference.
>Removed some unused local variables and multiple initializations.
>v3: Use LSO V2 in OvsDoEncapStt
>Fixed alignment and code style
>Use IpHdr TTL for fragment expiration on receive instead 30s
>---
> datapath-windows/ovsext/Flow.c | 243
>-
> datapath-windows/ovsext/Flow.h |   2 +
> datapath-windows/ovsext/PacketParser.c |  97 +++--
> datapath-windows/ovsext/PacketParser.h |   8 +-
> datapath-windows/ovsext/Stt.c  | 157 +
> datapath-windows/ovsext/Stt.h  |   1 -
> datapath-windows/ovsext/User.c |  20 +--
> 7 files changed, 413 insertions(+), 115 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Flow.c
>b/datapath-windows/ovsext/Flow.c
>index 1f23625..a49a60c 100644
>--- a/datapath-windows/ovsext/Flow.c
>+++ b/datapath-windows/ovsext/Flow.c
>@@ -1566,7 +1566,8 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
> 
> ndKey = NlAttrGet(keyAttrs[OVS_KEY_ATTR_ND]);
> RtlCopyMemory(&icmp6FlowPutKey->ndTarget,
>-  ndKey->nd_target, sizeof
>(icmp6FlowPutKey->ndTarget));
>+  ndKey->nd_target,
>+  sizeof (icmp6FlowPutKey->ndTarget));
> RtlCopyMemory(icmp6FlowPutKey->arpSha,
>   ndKey->nd_sll, ETH_ADDR_LEN);
> RtlCopyMemory(icmp6FlowPutKey->arpTha,
>@@ -1596,8 +1597,10 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
> arpFlowPutKey->nwSrc = arpKey->arp_sip;
> arpFlowPutKey->nwDst = arpKey->arp_tip;
> 
>-RtlCopyMemory(arpFlowPutKey->arpSha, arpKey->arp_sha,
>ETH_ADDR_LEN);
>-RtlCopyMemory(arpFlowPutKey->arpTha, arpKey->arp_tha,
>ETH_ADDR_LEN);
>+RtlCopyMemory(arpFlowPutKey->arpSha, arpKey->arp_sha,
>+  ETH_ADDR_LEN);
>+RtlCopyMemory(arpFlowPutKey->arpTha, arpKey->arp_tha,
>+  ETH_ADDR_LEN);
> /* Kernel datapath assumes 'arpFlowPutKey->nwProto' to be in
>host
>  * order. */
> arpFlowPutKey->nwProto = (UINT8)ntohs((arpKey->arp_op));
>@@ -1846,29 +1849,195 @@ OvsGetFlowMetadata(OvsFlowKey *key,
> return status;
> }
> 
>+
> /*
>- 
>*-
>---
>- * Initializes 'flow' members from 'packet', 'skb_priority', 'tun_id',
>and
>- * 'ofp_in_port'.
>- *
>- * Initializes 'packet' header pointers as follows:
>- *
>- *- packet->l2 to the start of the Ethernet header.
>- *
>- *- packet->l3 to just past the Ethernet header, or just past the
>- *  vlan_header if one is present, to the first byte of the payload
>of the
>- *  Ethernet frame.
>- *
>- *   

Re: [ovs-dev] [PATCH V3] datapath-windows: Improved offloading on STT tunnel

2016-05-03 Thread Sairam Venugopal
Hi Paul,

I have added my reply below.

Thanks,
Sairam

On 5/3/16, 5:17 AM, "Paul Boca"  wrote:

>Hi Sai,
>
>Please see the comments inline.
>
>Thanks,
>Paul
>
>> -Original Message-
>> From: Sairam Venugopal [mailto:vsai...@vmware.com]
>> Sent: Saturday, April 30, 2016 11:38 AM
>> To: Paul Boca; dev@openvswitch.org
>> Subject: Re: [ovs-dev] [PATCH V3] datapath-windows: Improved offloading
>>on
>> STT tunnel
>> 
>> Hey Paul,
>> 
>> Thanks for clarifying what OvsExtractLayers was doing. You shouldn¹t
>>have
>> to extract the layers info for the inner packet since they can be
>>derived
>> from the STT Header Flags - especially when it¹s CSUM_Partial. That¹s
>>even
>> mentioned in the STT IETF draft under the STT Flags section -
>> 
>>https://urldefense.proofpoint.com/v2/url?u=https-3A__tools.ietf.org_html_
>>draft-2Ddavie-2Dstt-2D08&d=BQIFAw&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNt
>>Xt-uEs&r=Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=0e7PJ1EsBgAr5B9GL8
>>JU926nGRjTVJxfDZPkLFe_0C0&s=UPsD0tpTT7fevR7JaFvFI6cUT6pq88J9f_V16bysiaU&e
>>= . This definitely impacts
>> the efficiency of STT.
>
>PB: That's true, in case of CSUM_Partial I extract the info from STT
>header with few exceptions
>explained below. 
>For CSUM_Verified I'll move extract layers after because it isn't needed.
>
>> 
>> Are you running into issues when the inner checksum isn¹t computed and
>>the
>> STT flags mention otherwise? If yes, then that¹s a bug in the Encap side
>> of things. I would test a similar setup on KVM and verify if it works.
>>The
>> function - OvsDecapSetOffloads mimics what KVM does -
>> 
>>https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openvswit
>>ch_ovs_blob_d271907f817db25be8da8d425ac256&d=BQIFAw&c=Sqcl0Ez6M0X8aeM67LK
>>IiDJAXVeAw-YihVMNtXt-uEs&r=Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=
>>0e7PJ1EsBgAr5B9GL8JU926nGRjTVJxfDZPkLFe_0C0&s=Gojy-_UB_GvnZJffFSyUhosf1Zr
>>sKB2KjdmUKvXPFW0&e=
>> d7ed8
>> c96a9/datapath/linux/compat/stt.c#L1222 and handles the case when the
>> inner checksum is partially computed. When inner checksum is already
>> computed, why is it necessary to update the IP version of the csumInfo?
>> Since we don¹t request any further offloads.
>
>PB: I've tested Win-to-Win and Lin-to-Win connections and encountered
>some issues regarding
>checksums and how flags are set.
>In __push_stt_header function
>https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openvswitc
>h_ovs_blob_&d=BQIFAw&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dcruz
>40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=0e7PJ1EsBgAr5B9GL8JU926nGRjTVJxfD
>ZPkLFe_0C0&s=stK-oN_CrsVsGRRyzsY1RgiTBCuET1w9zCK1wKGzeZ4&e=
>d271907f817db25be8da8d425ac256d7ed8c96a9/datapath/linux/compat/stt.c#L566
>only 
>CHECKSUM_PARTIAL and CHECKSUM_UNNECESSARY is verified, ignoring
>CHECKSUM_COMPLETE 
>and CHECKSUM_NONE in skb->ip_summed. This leads to packets with STT
>header flags set to 0
>even if the checksum is not computed/verified.
>In case of LSO I added code to recompute pseudo-checksum because I get
>invalid pseudo-check
>from Linux on CSUM_Partial case. If I understood the explanation
>correctly from 
>https://urldefense.proofpoint.com/v2/url?u=http-3A__lxr.free-2Delectrons.c
>om_source_include_linux_skbuff.h-23L204&d=BQIFAw&c=Sqcl0Ez6M0X8aeM67LKIiDJ
>AXVeAw-YihVMNtXt-uEs&r=Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=0e7PJ
>1EsBgAr5B9GL8JU926nGRjTVJxfDZPkLFe_0C0&s=T3QNozDyL0cuTo_ZgJfbJdHIvzOyXV2vJ
>Tua_KSXHl0&e=  skb->ip_summed field is always
>set to CHECKSUM_PARTIAL in case of LSO.
>I will rename back OvsDecapApplyOffloads to OvsDecapSetOffloads.

I still don’t think we should be computing checksum for the inner packet
on the receiving side. Can you check what happens in KVM when the inner
checksum isn’t computed and flags are wrong? We can discuss about this in
meeting.

If Linux sends down CSUM_Partial, then it definitely computed the
PseudoChecksum once and we shouldn’t have to recompute it. We should
probably file a bug for this in OVS-Issues and fix KVM since it’s doesn’t
send down the right STT header for Pseudo Checksum. Adding more info into
reproducing the issue will help.


>
>> 
>> Moreover, using OvsGetExternalMTU for the inner VM¹s MSS is also
>> incorrect. Ideally we should be able to retrieve the MTU of the inner VM
>> and use that or require that a certain default MTU should be set for the
>> inner VMs. Were you able to test this by changing the MTU of external
>>

[ovs-dev] [PATCH] datapath-windows: Fix recirculation to use the proper FlowKey

2016-05-06 Thread Sairam Venugopal
Pass down the right sendFlags for re-init fwdCtx. Remove the redundant
call to ExtractFlow. It resets the flowKey causing failure in tunnel
context.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Actions.c | 15 +++
 datapath-windows/ovsext/Actions.h |  1 +
 datapath-windows/ovsext/Recirc.c  |  1 +
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/datapath-windows/ovsext/Actions.c 
b/datapath-windows/ovsext/Actions.c
index 5ad29ee..5ee9f17 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -1976,6 +1976,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
 PNET_BUFFER_LIST curNbl,
 OvsFlowKey *key,
 UINT32 srcPortNo,
+ULONG sendFlags,
 OVS_PACKET_HDR_INFO *layers)
 {
 NDIS_STATUS status;
@@ -1983,17 +1984,15 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
 OvsForwardingContext ovsFwdCtx = { 0 };
 UINT64 hash = 0;
 ASSERT(layers);
+PNDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO fwdDetail =
+NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl);
 
-OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl,
- srcPortNo, 0,
- NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl),
- completionList, layers, TRUE);
-
-status = OvsExtractFlow(ovsFwdCtx.curNbl, ovsFwdCtx.srcVportNo, key,
-&ovsFwdCtx.layers, NULL);
+status = OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl,
+  srcPortNo, sendFlags, fwdDetail,
+  completionList, layers, TRUE);
 if (status != NDIS_STATUS_SUCCESS) {
 OvsCompleteNBLForwardingCtx(&ovsFwdCtx,
-L"OVS-Dropped due to extract flow failure");
+L"OVS-initing destination port list failed at recirc");
 ovsActionStats.failedFlowMiss++;
 return NDIS_STATUS_FAILURE;
 }
diff --git a/datapath-windows/ovsext/Actions.h 
b/datapath-windows/ovsext/Actions.h
index c56c260..e80ac4a 100644
--- a/datapath-windows/ovsext/Actions.h
+++ b/datapath-windows/ovsext/Actions.h
@@ -50,6 +50,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
 PNET_BUFFER_LIST curNbl,
 OvsFlowKey *key,
 UINT32 srcPortNo,
+ULONG sendFlags,
 OVS_PACKET_HDR_INFO *layers);
 
 #endif /* __ACTIONS_H_ */
diff --git a/datapath-windows/ovsext/Recirc.c b/datapath-windows/ovsext/Recirc.c
index 2febf06..733e105 100644
--- a/datapath-windows/ovsext/Recirc.c
+++ b/datapath-windows/ovsext/Recirc.c
@@ -327,6 +327,7 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext,
  deferredAction->nbl,
  &deferredAction->key,
  portNo,
+ sendFlags,
  layers);
 }
 }
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-05-06 Thread Sairam Venugopal
Hi Paul,

Thanks for reviewing the patch. You are right, I will update it to check
for NULL and re-send it.

Thanks,
Sairam

On 5/6/16, 3:00 AM, "Paul Boca"  wrote:

>Hi Sairam!
>
>
>
>I added a comment below. Besides this, looks good to me.
>
>Please correct me if I'm wrong.
>
>
>
>Thanks,
>
>Paul
>
>
>
>> -Original Message-----
>
>> From: dev [mailto:dev-boun...@openvswitch.org] On Behalf Of Sairam
>
>> Venugopal
>
>> Sent: Thursday, April 28, 2016 2:23 AM
>
>> To: dev@openvswitch.org
>
>> Subject: [ovs-dev] [PATCH] datapath-windows: Add support for UDP and
>>ICMP
>
>> to Conntrack Module
>
>> 
>
>> Enable support for UDP and ICMP in the connection tracking module on
>
>> Hyper-V.
>
>> 
>
>> Signed-off-by: Sairam Venugopal 
>
>> ---
>
>>  datapath-windows/automake.mk  |   1 +
>
>>  datapath-windows/ovsext/Conntrack-other.c |  78 ++
>
>>  datapath-windows/ovsext/Conntrack.c   | 174
>>++
>
>> 
>
>>  datapath-windows/ovsext/Conntrack.h   |   4 +
>
>>  datapath-windows/ovsext/ovsext.vcxproj|   1 +
>
>>  5 files changed, 214 insertions(+), 44 deletions(-)
>
>>  create mode 100644 datapath-windows/ovsext/Conntrack-other.c
>
>> 
>
>> diff --git a/datapath-windows/automake.mk b/datapath-
>
>> windows/automake.mk
>
>> index c9af806..668cf2c 100644
>
>> --- a/datapath-windows/automake.mk
>
>> +++ b/datapath-windows/automake.mk
>
>> @@ -13,6 +13,7 @@ EXTRA_DIST += \
>
>>  datapath-windows/ovsext/Atomic.h \
>
>>  datapath-windows/ovsext/BufferMgmt.c \
>
>>  datapath-windows/ovsext/BufferMgmt.h \
>
>> +datapath-windows/ovsext/Conntrack-other.c \
>
>>  datapath-windows/ovsext/Conntrack-tcp.c \
>
>>  datapath-windows/ovsext/Conntrack.c \
>
>>  datapath-windows/ovsext/Conntrack.h \
>
>> diff --git a/datapath-windows/ovsext/Conntrack-other.c b/datapath-
>
>> windows/ovsext/Conntrack-other.c
>
>> new file mode 100644
>
>> index 000..bcd38d5
>
>> --- /dev/null
>
>> +++ b/datapath-windows/ovsext/Conntrack-other.c
>
>> @@ -0,0 +1,78 @@
>
>> +/*
>
>> + * Copyright (c) 2015, 2016 VMware, Inc.
>
>> + *
>
>> + * Licensed under the Apache License, Version 2.0 (the "License");
>
>> + * you may not use this file except in compliance with the License.
>
>> + * You may obtain a copy of the License at:
>
>> + *
>
>> + * 
>>https://urldefense.proofpoint.com/v2/url?u=http-3A__www.apache.org_licens
>>es_LICENSE-2D2.0&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r
>>=Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=H9iFWy0mgbr-yfEWK5q7tVgH1V
>>p5aeJJTe2FuyGMRIM&s=_n_tpqEXJrn1R2I9bXGMvgspbmfpklqr2chMB-GARPI&e=
>
>> + *
>
>> + * Unless required by applicable law or agreed to in writing, software
>
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>
>> implied.
>
>> + * See the License for the specific language governing permissions and
>
>> + * limitations under the License.
>
>> + */
>
>> +
>
>> +#include "Conntrack.h"
>
>> +#include 
>
>> +
>
>> +enum other_state {
>
>> +OTHERS_FIRST,
>
>> +OTHERS_MULTIPLE,
>
>> +OTHERS_BIDIR,
>
>> +};
>
>> +
>
>> +struct conn_other {
>
>> +struct OVS_CT_ENTRY up;
>
>> +enum other_state state;
>
>> +};
>
>> +
>
>> +static const long long other_timeouts[] = {
>
>> +[OTHERS_FIRST] = 60 * 1000,
>
>> +[OTHERS_MULTIPLE] = 60 * 1000,
>
>> +[OTHERS_BIDIR] = 30 * 1000,
>
>> +};
>
>> +
>
>> +static __inline struct conn_other*
>
>> +OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
>
>> +{
>
>> +return CONTAINER_OF(conn, struct conn_other, up);
>
>> +}
>
>> +
>
>> +static __inline VOID
>
>> +OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
>
>> +{
>
>> +conn->up.expiration = now + other_timeouts[conn->state];
>
>> +}
>
>> +
>
>> +enum ct_update_res
>
>> +OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
>
>> + BOOLEAN reply,
&

[ovs-dev] [PATCH v2] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-05-06 Thread Sairam Venugopal
Enable support for UDP and ICMP in the connection tracking module on
Hyper-V.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/automake.mk  |   1 +
 datapath-windows/ovsext/Conntrack-other.c |  78 +
 datapath-windows/ovsext/Conntrack.c   | 180 ++
 datapath-windows/ovsext/Conntrack.h   |   4 +
 datapath-windows/ovsext/ovsext.vcxproj|   1 +
 5 files changed, 219 insertions(+), 45 deletions(-)
 create mode 100644 datapath-windows/ovsext/Conntrack-other.c

diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index c9af806..668cf2c 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -13,6 +13,7 @@ EXTRA_DIST += \
datapath-windows/ovsext/Atomic.h \
datapath-windows/ovsext/BufferMgmt.c \
datapath-windows/ovsext/BufferMgmt.h \
+   datapath-windows/ovsext/Conntrack-other.c \
datapath-windows/ovsext/Conntrack-tcp.c \
datapath-windows/ovsext/Conntrack.c \
datapath-windows/ovsext/Conntrack.h \
diff --git a/datapath-windows/ovsext/Conntrack-other.c 
b/datapath-windows/ovsext/Conntrack-other.c
new file mode 100644
index 000..bcd38d5
--- /dev/null
+++ b/datapath-windows/ovsext/Conntrack-other.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2015, 2016 VMware, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Conntrack.h"
+#include 
+
+enum other_state {
+OTHERS_FIRST,
+OTHERS_MULTIPLE,
+OTHERS_BIDIR,
+};
+
+struct conn_other {
+struct OVS_CT_ENTRY up;
+enum other_state state;
+};
+
+static const long long other_timeouts[] = {
+[OTHERS_FIRST] = 60 * 1000,
+[OTHERS_MULTIPLE] = 60 * 1000,
+[OTHERS_BIDIR] = 30 * 1000,
+};
+
+static __inline struct conn_other*
+OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
+{
+return CONTAINER_OF(conn, struct conn_other, up);
+}
+
+static __inline VOID
+OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
+{
+conn->up.expiration = now + other_timeouts[conn->state];
+}
+
+enum ct_update_res
+OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
+ BOOLEAN reply,
+ UINT64 now)
+{
+struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
+
+if (reply && conn->state != OTHERS_BIDIR) {
+conn->state = OTHERS_BIDIR;
+} else if (conn->state == OTHERS_FIRST) {
+conn->state = OTHERS_MULTIPLE;
+}
+
+OvsConntrackUpdateExpiration(conn, now);
+
+return CT_UPDATE_VALID;
+}
+
+OVS_CT_ENTRY *
+OvsConntrackCreateOtherEntry(UINT64 now)
+{
+struct conn_other *conn;
+conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
+OVS_CT_POOL_TAG);
+/* XXX Handle memory allocation error*/
+conn->up = (OVS_CT_ENTRY) {0};
+conn->state = OTHERS_FIRST;
+OvsConntrackUpdateExpiration(conn, now);
+return &conn->up;
+}
\ No newline at end of file
diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 544fd51..e193e9f 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -146,9 +146,20 @@ OvsCtUpdateFlowKey(struct OvsFlowKey *key,
 }
 }
 
+static __inline VOID
+OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx)
+{
+NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
+NdisMoveMemory(&entry->rev_key, &ctx->key, sizeof (OVS_CT_KEY));
+OvsCtKeyReverse(&entry->rev_key);
+InsertHeadList(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],
+   &entry->link);
+}
+
 static __inline POVS_CT_ENTRY
-OvsCtEntryCreate(const TCPHdr *tcp,
- PNET_BUFFER_LIST curNbl,
+OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
+ UINT8 ipProto,
+ UINT32 l4Offset,
  OvsConntrackKeyLookupCtx *ctx,
  OvsFlowKey *key,
  BOOLEAN commit,
@@ -156,26 +167,71 @@ OvsCtEntryCreate(const TCPHdr *tcp,
 {
 POVS_CT_ENTRY entry = NULL;
 UINT32 state = 0;
-if (!OvsConntrackValidateTcpPacket(tcp)) {
-state |= OVS_CS_F_INVALID;
-OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
-return entry;
-}
+switch (ipProto)
+{
+case IPPROTO_

Re: [ovs-dev] [PATCH] datapath-windows: Fix recirculation to use the proper FlowKey

2016-05-06 Thread Sairam Venugopal
Disregard this patch. I have more changes on this.

Thanks,
Sairam

On 5/6/16, 2:21 PM, "Sairam Venugopal"  wrote:

>Pass down the right sendFlags for re-init fwdCtx. Remove the redundant
>call to ExtractFlow. It resets the flowKey causing failure in tunnel
>context.
>
>Signed-off-by: Sairam Venugopal 
>---
> datapath-windows/ovsext/Actions.c | 15 +++
> datapath-windows/ovsext/Actions.h |  1 +
> datapath-windows/ovsext/Recirc.c  |  1 +
> 3 files changed, 9 insertions(+), 8 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Actions.c
>b/datapath-windows/ovsext/Actions.c
>index 5ad29ee..5ee9f17 100644
>--- a/datapath-windows/ovsext/Actions.c
>+++ b/datapath-windows/ovsext/Actions.c
>@@ -1976,6 +1976,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
> PNET_BUFFER_LIST curNbl,
> OvsFlowKey *key,
> UINT32 srcPortNo,
>+ULONG sendFlags,
> OVS_PACKET_HDR_INFO *layers)
> {
> NDIS_STATUS status;
>@@ -1983,17 +1984,15 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
> OvsForwardingContext ovsFwdCtx = { 0 };
> UINT64 hash = 0;
> ASSERT(layers);
>+PNDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO fwdDetail =
>+NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl);
> 
>-OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl,
>- srcPortNo, 0,
>- 
>NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl),
>- completionList, layers, TRUE);
>-
>-status = OvsExtractFlow(ovsFwdCtx.curNbl, ovsFwdCtx.srcVportNo, key,
>-&ovsFwdCtx.layers, NULL);
>+status = OvsInitForwardingCtx(&ovsFwdCtx, switchContext, curNbl,
>+  srcPortNo, sendFlags, fwdDetail,
>+  completionList, layers, TRUE);
> if (status != NDIS_STATUS_SUCCESS) {
> OvsCompleteNBLForwardingCtx(&ovsFwdCtx,
>-L"OVS-Dropped due to extract flow failure");
>+L"OVS-initing destination port list failed at recirc");
> ovsActionStats.failedFlowMiss++;
> return NDIS_STATUS_FAILURE;
> }
>diff --git a/datapath-windows/ovsext/Actions.h
>b/datapath-windows/ovsext/Actions.h
>index c56c260..e80ac4a 100644
>--- a/datapath-windows/ovsext/Actions.h
>+++ b/datapath-windows/ovsext/Actions.h
>@@ -50,6 +50,7 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
> PNET_BUFFER_LIST curNbl,
> OvsFlowKey *key,
> UINT32 srcPortNo,
>+ULONG sendFlags,
> OVS_PACKET_HDR_INFO *layers);
> 
> #endif /* __ACTIONS_H_ */
>diff --git a/datapath-windows/ovsext/Recirc.c
>b/datapath-windows/ovsext/Recirc.c
>index 2febf06..733e105 100644
>--- a/datapath-windows/ovsext/Recirc.c
>+++ b/datapath-windows/ovsext/Recirc.c
>@@ -327,6 +327,7 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT
>switchContext,
>  deferredAction->nbl,
>  &deferredAction->key,
>  portNo,
>+ sendFlags,
>  layers);
> }
> }
>-- 
>2.5.0.windows.1
>

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH] appveyor: Update OpenSSL version

2016-05-17 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 




On 5/11/16, 1:49 PM, "Alin Serdean" 
wrote:

>OpenSSL version changed from 1.0.2g to 1.0.2h this patch bumps the
>version.
>
>Signed-off-by: Alin Gabriel Serdean 
>---
> appveyor.yml | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
>diff --git a/appveyor.yml b/appveyor.yml
>index 422c4af..0fd003b 100644
>--- a/appveyor.yml
>+++ b/appveyor.yml
>@@ -15,9 +15,9 @@ init:
> 
> Invoke-WebRequest $source -OutFile $destination
> 
>-$source = 
>"https://urldefense.proofpoint.com/v2/url?u=https-3A__slproweb.com_downloa
>d_Win32OpenSSL-2D1-5F0-5F2g.exe&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-Y
>ihVMNtXt-uEs&r=Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=Xm4k_CUB6cjsE
>4CKUY7gZ_hZLztWreWdvFSoR0xq4D4&s=RHYMp9e4bJPpP-41MwFP4-RokXU2axiwQ26YAo6Ey
>Kk&e= "
>+$source = 
>"https://urldefense.proofpoint.com/v2/url?u=https-3A__slproweb.com_downloa
>d_Win32OpenSSL-2D1-5F0-5F2h.exe&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-Y
>ihVMNtXt-uEs&r=Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=Xm4k_CUB6cjsE
>4CKUY7gZ_hZLztWreWdvFSoR0xq4D4&s=f6PQSfgweOvUMwNMwJru8JvA7yL5Ua-KtEJek_cFD
>n0&e= "
> 
>-$destination = "C:\ovs-build-downloads\Win32OpenSSL-1_0_2g.exe"
>+$destination = "C:\ovs-build-downloads\Win32OpenSSL-1_0_2h.exe"
> 
> Invoke-WebRequest $source -OutFile $destination
> 
>@@ -27,7 +27,7 @@ init:
> 
> cd C:\ovs-build-downloads
> 
>-.\Win32OpenSSL-1_0_2g.exe /silent /verysilent /sp- /suppressmsgboxes
>+.\Win32OpenSSL-1_0_2h.exe /silent /verysilent /sp- /suppressmsgboxes
> 
> Start-Sleep -s 30
> 
>-- 
>1.9.5.msysgit.0
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=Xm4k_CUB6cjsE4CKUY7gZ_hZLztWre
>WdvFSoR0xq4D4&s=7rjYuXTb8DZSXfF0Ih9SUY4hBTEPkKl929Rhxivn2io&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 1/4 v2] datapath-windows: add nlMsgHdr to OvsPacketExecute

2016-05-17 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 5/17/16, 10:15 AM, "Nithin Raju"  wrote:

>We'll need this for parsing nested attributes.
>
>Signed-off-by: Nithin Raju 
>---
> datapath-windows/ovsext/DpInternal.h |  1 +
> datapath-windows/ovsext/User.c   | 13 -
> 2 files changed, 9 insertions(+), 5 deletions(-)
>
>diff --git a/datapath-windows/ovsext/DpInternal.h
>b/datapath-windows/ovsext/DpInternal.h
>index a3ce311..07bc180 100644
>--- a/datapath-windows/ovsext/DpInternal.h
>+++ b/datapath-windows/ovsext/DpInternal.h
>@@ -275,6 +275,7 @@ typedef struct OvsPacketExecute {
> 
>uint32_t packetLen;
>uint32_t actionsLen;
>+   PNL_MSG_HDR nlMsgHdr;
>PCHAR packetBuf;
>PNL_ATTR actions;
>PNL_ATTR *keyAttrs;
>diff --git a/datapath-windows/ovsext/User.c
>b/datapath-windows/ovsext/User.c
>index 34f38f4..3b3f662 100644
>--- a/datapath-windows/ovsext/User.c
>+++ b/datapath-windows/ovsext/User.c
>@@ -46,8 +46,9 @@ extern PNDIS_SPIN_LOCK gOvsCtrlLock;
> extern POVS_SWITCH_CONTEXT gOvsSwitchContext;
> OVS_USER_STATS ovsUserStats;
> 
>-static VOID _MapNlAttrToOvsPktExec(PNL_ATTR *nlAttrs, PNL_ATTR *keyAttrs,
>-   OvsPacketExecute  *execute);
>+static VOID _MapNlAttrToOvsPktExec(PNL_MSG_HDR nlMsgHdr, PNL_ATTR
>*nlAttrs,
>+   PNL_ATTR *keyAttrs,
>+   OvsPacketExecute *execute);
> extern NL_POLICY nlFlowKeyPolicy[];
> extern UINT32 nlFlowKeyPolicyLen;
> 
>@@ -311,7 +312,7 @@ OvsNlExecuteCmdHandler(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
> 
> execute.dpNo = ovsHdr->dp_ifindex;
> 
>-_MapNlAttrToOvsPktExec(nlAttrs, keyAttrs, &execute);
>+_MapNlAttrToOvsPktExec(nlMsgHdr, nlAttrs, keyAttrs, &execute);
> 
> status = OvsExecuteDpIoctl(&execute);
> 
>@@ -363,12 +364,14 @@ done:
>  
>*-
>---
>  */
> static VOID
>-_MapNlAttrToOvsPktExec(PNL_ATTR *nlAttrs, PNL_ATTR *keyAttrs,
>-   OvsPacketExecute *execute)
>+_MapNlAttrToOvsPktExec(PNL_MSG_HDR nlMsgHdr, PNL_ATTR *nlAttrs,
>+   PNL_ATTR *keyAttrs, OvsPacketExecute *execute)
> {
> execute->packetBuf = NlAttrGet(nlAttrs[OVS_PACKET_ATTR_PACKET]);
> execute->packetLen = NlAttrGetSize(nlAttrs[OVS_PACKET_ATTR_PACKET]);
> 
>+execute->nlMsgHdr = nlMsgHdr;
>+
> execute->actions = NlAttrGet(nlAttrs[OVS_PACKET_ATTR_ACTIONS]);
> execute->actionsLen =
>NlAttrGetSize(nlAttrs[OVS_PACKET_ATTR_ACTIONS]);
> 
>-- 
>2.7.1.windows.1
>
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=tJhRVVo0rjI2E92N5U9i_r5cDd9QaF
>GMfltIClUXPuc&s=s35yZEfEVTweh7A6099p-s97UgAhoLRpxqEd8teNJ2M&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 3/4 v2] datapath-windows: Use l2 port and tunkey during execute

2016-05-17 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 5/17/16, 10:15 AM, "Nithin Raju"  wrote:

>While testing DFW and recirc code it was found that userspace
>was calling into packet execute with the tunnel key and the
>vport added as part of the execute structure. We were not passing
>this along to the code that executes actions. The right thing is
>to contruct the key based on all of the attributes sent down from
>userspace.
>
>Signed-off-by: Nithin Raju 
>---
> datapath-windows/ovsext/User.c | 32 ++--
> 1 file changed, 30 insertions(+), 2 deletions(-)
>
>diff --git a/datapath-windows/ovsext/User.c
>b/datapath-windows/ovsext/User.c
>index 3b3f662..2312940 100644
>--- a/datapath-windows/ovsext/User.c
>+++ b/datapath-windows/ovsext/User.c
>@@ -51,6 +51,8 @@ static VOID _MapNlAttrToOvsPktExec(PNL_MSG_HDR
>nlMsgHdr, PNL_ATTR *nlAttrs,
>OvsPacketExecute *execute);
> extern NL_POLICY nlFlowKeyPolicy[];
> extern UINT32 nlFlowKeyPolicyLen;
>+extern NL_POLICY nlFlowTunnelKeyPolicy[];
>+extern UINT32 nlFlowTunnelKeyPolicyLen;
> 
> static __inline VOID
> OvsAcquirePidHashLock()
>@@ -375,6 +377,7 @@ _MapNlAttrToOvsPktExec(PNL_MSG_HDR nlMsgHdr, PNL_ATTR
>*nlAttrs,
> execute->actions = NlAttrGet(nlAttrs[OVS_PACKET_ATTR_ACTIONS]);
> execute->actionsLen =
>NlAttrGetSize(nlAttrs[OVS_PACKET_ATTR_ACTIONS]);
> 
>+ASSERT(keyAttrs[OVS_KEY_ATTR_IN_PORT]);
> execute->inPort = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_IN_PORT]);
> execute->keyAttrs = keyAttrs;
> }
>@@ -391,6 +394,8 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute)
> OvsFlowKey  key = { 0 };
> OVS_PACKET_HDR_INFO layers = { 0 };
> POVS_VPORT_ENTRYvport = NULL;
>+PNL_ATTR tunnelAttrs[__OVS_TUNNEL_KEY_ATTR_MAX];
>+OvsFlowKey tempTunKey = {0};
> 
> if (execute->packetLen == 0) {
> status = STATUS_INVALID_PARAMETER;
>@@ -428,8 +433,31 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute)
> goto dropit;
> }
> 
>-ndisStatus = OvsExtractFlow(pNbl, fwdDetail->SourcePortId, &key,
>&layers,
>-NULL);
>+if (execute->keyAttrs[OVS_KEY_ATTR_TUNNEL]) {
>+UINT32 tunnelKeyAttrOffset;
>+
>+tunnelKeyAttrOffset = (UINT32)((PCHAR)
>+  (execute->keyAttrs[OVS_KEY_ATTR_TUNNEL])
>+  - (PCHAR)execute->nlMsgHdr);
>+
>+/* Get tunnel keys attributes */
>+if ((NlAttrParseNested(execute->nlMsgHdr, tunnelKeyAttrOffset,
>+ 
>NlAttrLen(execute->keyAttrs[OVS_KEY_ATTR_TUNNEL]),
>+   nlFlowTunnelKeyPolicy,
>nlFlowTunnelKeyPolicyLen,
>+   tunnelAttrs, ARRAY_SIZE(tunnelAttrs)))
>+   != TRUE) {
>+OVS_LOG_ERROR("Tunnel key Attr Parsing failed for msg: %p",
>+   execute->nlMsgHdr);
>+status = STATUS_INVALID_PARAMETER;
>+goto dropit;
>+}
>+
>+MapTunAttrToFlowPut(execute->keyAttrs, tunnelAttrs, &tempTunKey);
>+}
>+
>+ndisStatus = OvsExtractFlow(pNbl, execute->inPort, &key, &layers,
>+ tempTunKey.tunKey.dst == 0 ? NULL :
>&tempTunKey.tunKey);
>+
> if (ndisStatus == NDIS_STATUS_SUCCESS) {
> NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock,
>&lockState, 0);
> ndisStatus = OvsActionsExecute(gOvsSwitchContext, NULL, pNbl,
>-- 
>2.7.1.windows.1
>
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=mE4pOA9uAtGpEoievwTcJydab3Jw-7
>6Vpblw52FhsEg&s=fEjTj2Ex5CHB7kiq7yCe0M4z6DRiCQcuYW4IwwStBiw&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 2/4 v2] datapath-windows: Make _MapTunAttrToFlowPut() global

2016-05-17 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 5/17/16, 10:15 AM, "Nithin Raju"  wrote:

>Move this function out from file scope.
>
>Signed-off-by: Nithin Raju 
>---
> datapath-windows/ovsext/Flow.c | 16 +++-
> datapath-windows/ovsext/Flow.h |  2 ++
> 2 files changed, 9 insertions(+), 9 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Flow.c
>b/datapath-windows/ovsext/Flow.c
>index 1f23625..0682617 100644
>--- a/datapath-windows/ovsext/Flow.c
>+++ b/datapath-windows/ovsext/Flow.c
>@@ -54,9 +54,6 @@ static VOID _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
>  PNL_ATTR *tunnelAttrs,
>  OvsFlowKey *destKey);
> 
>-static VOID _MapTunAttrToFlowPut(PNL_ATTR *keyAttrs,
>- PNL_ATTR *tunnelAttrs,
>- OvsFlowKey *destKey);
> static VOID _MapNlToFlowPutFlags(PGENL_MSG_HDR genlMsgHdr,
>  PNL_ATTR flowAttrClear,
>  OvsFlowPut *mappedFlow);
>@@ -207,6 +204,7 @@ const NL_POLICY nlFlowTunnelKeyPolicy[] = {
> [OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS] = {.type = NL_A_VAR_LEN,
>  .optional = TRUE}
> };
>+const UINT32 nlFlowTunnelKeyPolicyLen =
>ARRAY_SIZE(nlFlowTunnelKeyPolicy);
> 
> /* For Parsing nested OVS_FLOW_ATTR_ACTIONS attributes */
> const NL_POLICY nlFlowActionPolicy[] = {
>@@ -1409,7 +1407,7 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
>  PNL_ATTR *tunnelAttrs,
>  OvsFlowKey *destKey)
> {
>-_MapTunAttrToFlowPut(keyAttrs, tunnelAttrs, destKey);
>+MapTunAttrToFlowPut(keyAttrs, tunnelAttrs, destKey);
> 
> if (keyAttrs[OVS_KEY_ATTR_RECIRC_ID]) {
> destKey->recircId =
>NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_RECIRC_ID]);
>@@ -1631,14 +1629,14 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
> 
> /*
>  
>*-
>---
>- *  _MapTunAttrToFlowPut --
>+ *  MapTunAttrToFlowPut --
>  *Converts FLOW_TUNNEL_KEY attribute to OvsFlowKey->tunKey.
>  
>*-
>---
>  */
>-static VOID
>-_MapTunAttrToFlowPut(PNL_ATTR *keyAttrs,
>- PNL_ATTR *tunAttrs,
>- OvsFlowKey *destKey)
>+VOID
>+MapTunAttrToFlowPut(PNL_ATTR *keyAttrs,
>+PNL_ATTR *tunAttrs,
>+OvsFlowKey *destKey)
> {
> if (keyAttrs[OVS_KEY_ATTR_TUNNEL]) {
> 
>diff --git a/datapath-windows/ovsext/Flow.h
>b/datapath-windows/ovsext/Flow.h
>index 310c472..fb3fb59 100644
>--- a/datapath-windows/ovsext/Flow.h
>+++ b/datapath-windows/ovsext/Flow.h
>@@ -81,6 +81,8 @@ NTSTATUS MapFlowKeyToNlKey(PNL_BUFFER nlBuf, OvsFlowKey
>*flowKey,
>UINT16 keyType, UINT16 tunKeyType);
> NTSTATUS MapFlowTunKeyToNlKey(PNL_BUFFER nlBuf, OvsIPv4TunnelKey *tunKey,
>   UINT16 tunKeyType);
>+VOID MapTunAttrToFlowPut(PNL_ATTR *keyAttrs, PNL_ATTR *tunAttrs,
>+ OvsFlowKey *destKey);
> UINT32 OvsFlowKeyAttrSize(void);
> UINT32 OvsTunKeyAttrSize(void);
> 
>-- 
>2.7.1.windows.1
>
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=vKYUclG45y9DG5ytaV-lA7iWOcxhIt
>a8gn4BgCyKPeQ&s=qBfcE_vQynt70wCwaOaRJRI4jtDxOGpx4ubWHUnkEvE&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 4/4 v2] datapath-windows: remove extract flow in OvsDoRecirc()

2016-05-17 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 5/17/16, 10:15 AM, "Nithin Raju"  wrote:

>It is not necessary to do a flow extract in OvsDoRecirc().
>In fact, doing it would overwrite the tunnel key within
>'key'. So, let's remove the call.
>
>Signed-off-by: Nithin Raju 
>Signed-off-by: Sairam Venugopal 
>Co-Authored-by: Sairam Venugopal 
>---
> datapath-windows/ovsext/Actions.c | 9 -
> 1 file changed, 9 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Actions.c
>b/datapath-windows/ovsext/Actions.c
>index 5ad29ee..4edf7d0 100644
>--- a/datapath-windows/ovsext/Actions.c
>+++ b/datapath-windows/ovsext/Actions.c
>@@ -1989,15 +1989,6 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT switchContext,
>  
>NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(curNbl),
>  completionList, layers, TRUE);
> 
>-status = OvsExtractFlow(ovsFwdCtx.curNbl, ovsFwdCtx.srcVportNo, key,
>-&ovsFwdCtx.layers, NULL);
>-if (status != NDIS_STATUS_SUCCESS) {
>-OvsCompleteNBLForwardingCtx(&ovsFwdCtx,
>-L"OVS-Dropped due to extract flow failure");
>-ovsActionStats.failedFlowMiss++;
>-return NDIS_STATUS_FAILURE;
>-}
>-
> flow = OvsLookupFlow(&ovsFwdCtx.switchContext->datapath, key, &hash,
>FALSE);
> if (flow) {
> UINT32 level = OvsDeferredActionsLevelGet();
>-- 
>2.7.1.windows.1
>

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 1/4] datapath-windows: Improved offloading on STT tunnel

2016-06-01 Thread Sairam Venugopal
Hi Paul,

Thanks for updating the patch. I had some minor comments that I have added
inline.

It looks good overall.

Thanks,
Sairam

On 5/17/16, 8:23 AM, "Paul Boca"  wrote:

>*Added OvsExtractLayers - populates only the layers field without
>unnecessary
>memory operations for flow part
>*If in STT header the flags are 0 then force packets checksums calculation
>on receive.
>*Ensure correct pseudo checksum is set for LSO both on send and receive.
>Linux includes the segment length to TCP pseudo-checksum conforming to
>RFC 793 but in case of LSO Windows expects this to be only on
>Source IP Address, Destination IP Address, and Protocol.
>*Fragment expiration on rx side of STT was set to 30 seconds, but the
>correct
>timeout would be TTL of the packet
>
>Signed-off-by: Paul-Daniel Boca 
>---
>v2: Fixed a NULL pointer dereference.
>  Removed some unused local variables and multiple initializations.
>v3: Use LSO V2 in OvsDoEncapStt
>  Fixed alignment and code style
>  Use IpHdr TTL for fragment expiration on receive instead 30s
>V4: Use stored MSS in STT header on rx for lsoInfo of encapsulated packet
>  If STT_CSUM_VERIFIED flag is set then we don't have to extract
>  layers on receive.
>V5: If CSUM_VERIFIED or no flag is set in STT header then don't recompute
>  checksums
>V6: Add define for conversion of TTL to seconds
>  Fixes LSO MSS on rx side
>  Compute TCP checksum only once on TX side over STT header
>---
> datapath-windows/ovsext/Flow.c | 243
>-
> datapath-windows/ovsext/Flow.h |   2 +
> datapath-windows/ovsext/IpHelper.h |   3 +-
> datapath-windows/ovsext/PacketParser.c |  97 +++--
> datapath-windows/ovsext/PacketParser.h |   8 +-
> datapath-windows/ovsext/Stt.c  | 127 +
> datapath-windows/ovsext/Stt.h  |   1 -
> datapath-windows/ovsext/User.c |  17 ++-
> 8 files changed, 381 insertions(+), 117 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Flow.c
>b/datapath-windows/ovsext/Flow.c
>index d957d39..3af1da5 100644
>--- a/datapath-windows/ovsext/Flow.c
>+++ b/datapath-windows/ovsext/Flow.c
>@@ -1570,7 +1570,8 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
> 
> ndKey = NlAttrGet(keyAttrs[OVS_KEY_ATTR_ND]);
> RtlCopyMemory(&icmp6FlowPutKey->ndTarget,
>-  ndKey->nd_target, sizeof
>(icmp6FlowPutKey->ndTarget));
>+  ndKey->nd_target,
>+  sizeof (icmp6FlowPutKey->ndTarget));
> RtlCopyMemory(icmp6FlowPutKey->arpSha,
>   ndKey->nd_sll, ETH_ADDR_LEN);
> RtlCopyMemory(icmp6FlowPutKey->arpTha,
>@@ -1600,8 +1601,10 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
> arpFlowPutKey->nwSrc = arpKey->arp_sip;
> arpFlowPutKey->nwDst = arpKey->arp_tip;
> 
>-RtlCopyMemory(arpFlowPutKey->arpSha, arpKey->arp_sha,
>ETH_ADDR_LEN);
>-RtlCopyMemory(arpFlowPutKey->arpTha, arpKey->arp_tha,
>ETH_ADDR_LEN);
>+RtlCopyMemory(arpFlowPutKey->arpSha, arpKey->arp_sha,
>+  ETH_ADDR_LEN);
>+RtlCopyMemory(arpFlowPutKey->arpTha, arpKey->arp_tha,
>+  ETH_ADDR_LEN);
> /* Kernel datapath assumes 'arpFlowPutKey->nwProto' to be in
>host
>  * order. */
> arpFlowPutKey->nwProto = (UINT8)ntohs((arpKey->arp_op));
>@@ -1850,29 +1853,195 @@ OvsGetFlowMetadata(OvsFlowKey *key,
> return status;
> }
> 
>+
> /*
>- 
>*-
>---
>- * Initializes 'flow' members from 'packet', 'skb_priority', 'tun_id',
>and
>- * 'ofp_in_port'.
>- *
>- * Initializes 'packet' header pointers as follows:
>- *
>- *- packet->l2 to the start of the Ethernet header.
>- *
>- *- packet->l3 to just past the Ethernet header, or just past the
>- *  vlan_header if one is present, to the first byte of the payload
>of the
>- *  Ethernet frame.
>- *
>- *- packet->l4 to just past the IPv4 header, if one is present and
>has a
>- *  correct length, and otherwise NULL.
>- *
>- *- packet->l7 to just past the TCP, UDP, SCTP or ICMP header, if
>one is
>- *  present and has a correct length, and otherwise NULL.
>- *
>- * Returns NDIS_STATUS_SUCCESS normally.  Fails only if packet data
>cannot be accessed
>- * (e.g. if Pkt_CopyBytesOut() returns an error).
>- 
>*-
>---
>- */
>+*
>
>+* Initializes 'layers' members from 'packet'
>+*
>+* Initializes 'layers' header pointers as follows:
>+*
>+*- layers->l2 to the start of the Ethernet header.
>+*
>+*- layers->l3 to just past the Ethernet header, or just past the
>+*  vlan_header if one is present, to the first 

Re: [ovs-dev] [PATCH 3/4] datapath-windows: STT reassemble small fix

2016-06-01 Thread Sairam Venugopal
Thanks for fixing this. Should we log an error if we try to copy more than
allocated packet length?

Acked-by: Sairam Venugopal 


On 5/17/16, 8:23 AM, "Paul Boca"  wrote:

>Fixed possible deadlock in case NdisGetDataBuffer fails
>Validate the segment length and offset on reassemble to avoid buffer
>overflow
>
>Signed-off-by: Paul-Daniel Boca 
>---
> datapath-windows/ovsext/Stt.c | 16 +---
> datapath-windows/ovsext/Stt.h |  1 +
> 2 files changed, 14 insertions(+), 3 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c
>index 5b5d950..8a1b1a9 100644
>--- a/datapath-windows/ovsext/Stt.c
>+++ b/datapath-windows/ovsext/Stt.c
>@@ -607,9 +607,6 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> SttHdr *sttHdr = NULL;
> sourceNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
> 
>-/* XXX optimize this lock */
>-NdisAcquireSpinLock(&OvsSttSpinLock);
>-
> /* If this is the first fragment, copy the STT header */
> if (segOffset == 0) {
> sttHdr = NdisGetDataBuffer(sourceNb, sizeof(SttHdr), &stt, 1, 0);
>@@ -621,6 +618,14 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> startOffset = startOffset + STT_HDR_LEN;
> }
> 
>+if (offset + fragmentLength > innerPacketLen) {
>+// avoid buffer overflow on copy
>+return NULL;
>+}
>+
>+/* XXX optimize this lock */
>+NdisAcquireSpinLock(&OvsSttSpinLock);
>+
> /* Lookup fragment */
> OVS_STT_PKT_KEY pktKey = OvsGeneratePacketKey(ipHdr, tcp);
> UINT32 hash = OvsSttGetPktHash(&pktKey);
>@@ -649,6 +654,7 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> }
> 
> /* Copy the data from Source to new buffer */
>+entry->allocatedLen = innerPacketLen;
> entry->packetBuf = OvsAllocateMemoryWithTag(innerPacketLen,
> OVS_STT_POOL_TAG);
> if (OvsGetPacketBytes(curNbl, fragmentLength, startOffset,
>@@ -661,6 +667,10 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> InsertHeadList(&OvsSttPktFragHash[hash & STT_HASH_TABLE_MASK],
>&entry->link);
> } else {
>+if (offset + fragmentLength > pktFragEntry->allocatedLen) {
>+// don't copy more than it is allocated
>+goto handle_error;
>+}
> /* Add to recieved length to identify if this is the last
>fragment */
> pktFragEntry->recvdLen += fragmentLength;
> lastPacket = (pktFragEntry->recvdLen == innerPacketLen);
>diff --git a/datapath-windows/ovsext/Stt.h b/datapath-windows/ovsext/Stt.h
>index 20066e6..8aea164 100644
>--- a/datapath-windows/ovsext/Stt.h
>+++ b/datapath-windows/ovsext/Stt.h
>@@ -67,6 +67,7 @@ typedef struct _OVS_STT_PKT_ENTRY {
> OVS_STT_PKT_KEY ovsPktKey;
> UINT64  timeout;
> UINT32  recvdLen;
>+UINT32  allocatedLen;
> SttHdr  sttHdr;
> PCHAR   packetBuf;
> LIST_ENTRY  link;
>-- 
>2.7.2.windows.1
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=ks6H7c0dJA42Wc_Cm_8KRvAlNMZCZ1
>q0OcbL35AInvU&s=rCUHnvtDWaBmIb-8bKkBv6GpeDHX48S_WwQUS2yXLuc&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 2/4] datapath-windows: Add VLAN support to STT

2016-06-02 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 5/17/16, 8:23 AM, "Paul Boca"  wrote:

>Add VLAN to STT header and on receive applyit to encapsulated packet
>
>Signed-off-by: Paul-Daniel Boca 
>---
> datapath-windows/ovsext/Stt.c | 22 +-
> 1 file changed, 21 insertions(+), 1 deletion(-)
>
>diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c
>index 406e690..5b5d950 100644
>--- a/datapath-windows/ovsext/Stt.c
>+++ b/datapath-windows/ovsext/Stt.c
>@@ -156,6 +156,7 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> PUINT8 bufferStart;
> ULONG mss = 0;
> NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO lsoInfo;
>+PVOID vlanTagValue;
> 
> curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
> 
>@@ -173,6 +174,7 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
> csumInfo.Value = NET_BUFFER_LIST_INFO(curNbl,
>  
>TcpIpChecksumNetBufferListInfo);
>+vlanTagValue = NET_BUFFER_LIST_INFO(curNbl,
>Ieee8021QNetBufferListInfo);
> *newNbl = OvsPartialCopyNBL(switchContext, curNbl, 0, headRoom,
> FALSE /*copy NblInfo*/);
> if (*newNbl == NULL) {
>@@ -313,8 +315,16 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> }
> }
> 
>-sttHdr->reserved = 0;
>+/* Set VLAN tag */
> sttHdr->vlanTCI = 0;
>+if (vlanTagValue) {
>+PNDIS_NET_BUFFER_LIST_8021Q_INFO vlanTag =
>+(PNDIS_NET_BUFFER_LIST_8021Q_INFO)(PVOID *)&vlanTagValue;
>+sttHdr->vlanTCI = htons(vlanTag->TagHeader.VlanId |
>OVSWIN_VLAN_CFI |
>+(vlanTag->TagHeader.UserPriority << 13));
>+}
>+
>+sttHdr->reserved = 0;
> sttHdr->key = tunKey->tunnelId;
> /* Zero out stt padding */
> *(uint16 *)(sttHdr + 1) = 0;
>@@ -900,6 +910,16 @@ OvsDecapStt(POVS_SWITCH_CONTEXT switchContext,
> tunKey->ttl = ipHdr->ttl;
> tunKey->pad = 0;
> 
>+/* Apply VLAN tag if present */
>+if (ntohs(sttHdr->vlanTCI) & OVSWIN_VLAN_CFI) {
>+NDIS_NET_BUFFER_LIST_8021Q_INFO vlanTag;
>+vlanTag.Value = 0;
>+vlanTag.TagHeader.VlanId = ntohs(sttHdr->vlanTCI) & 0xfff;
>+vlanTag.TagHeader.UserPriority = ntohs(sttHdr->vlanTCI) >> 13;
>+NET_BUFFER_LIST_INFO(*newNbl,
>+Ieee8021QNetBufferListInfo) = vlanTag.Value;
>+}
>+
> /* Set Checksum and LSO offload flags */
> OvsDecapSetOffloads(newNbl, sttHdr);
> 
>-- 
>2.7.2.windows.1
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=QvWslawbaDcox_mJS25wJEYrMz746s
>dvPy5kJgGNIIw&s=wn-bLozMCaqiKEqElD3Al-1ugBt-EaTqaTy60N3m-qo&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH v2] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-06-02 Thread Sairam Venugopal
Hi Alin,

Thanks for the comments. Will resend a patch with some of the updates.
Have responded to some of the comments inline.

Sairam

On 5/26/16, 3:00 AM, "Alin Serdean" 
wrote:

>I am unsure if we actual need another file but that maybe a personal
>preference.

Sai: Ideally we should be able to re-use the code once it¹s in userspace.
With that idea, am trying to keep the file structure similar with
Daniele¹s patch.
>
>Other comments inlined.
>
>Alin.
>> +
>> +static const long long other_timeouts[] = {
>> +[OTHERS_FIRST] = 60 * 1000,
>> +[OTHERS_MULTIPLE] = 60 * 1000,
>> +[OTHERS_BIDIR] = 30 * 1000,
>> +};
>[Alin Gabriel Serdean: ] Maybe define 1000 somewhere and add a
>comment on how many ms/s they will be.
>> +
>> +static __inline struct conn_other*
>> +OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn) {
>> +return CONTAINER_OF(conn, struct conn_other, up); }
>[Alin Gabriel Serdean: ] Add an assert conn
>> +
>> +static __inline VOID
>> +OvsConntrackUpdateExpiration(struct conn_other *conn, long long now) {
>> +conn->up.expiration = now + other_timeouts[conn->state]; }
>[Alin Gabriel Serdean: ] Add an assert to conn
>> +
>> +enum ct_update_res
>> +OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
>> + BOOLEAN reply,
>> + UINT64 now) {
>> +struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
>[Alin Gabriel Serdean: ] Add an assert to conn_
>> +
>> +OVS_CT_ENTRY *
>> +OvsConntrackCreateOtherEntry(UINT64 now) {
>> +struct conn_other *conn;
>> +conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
>> +OVS_CT_POOL_TAG);
>> +/* XXX Handle memory allocation error*/
>[Alin Gabriel Serdean: ] Please handle the memory allocation or at least
>add an assert to it

Sai: I have a different update that covers it. Will add an assertion for
this patch.

>> +conn->up = (OVS_CT_ENTRY) {0};
>> +conn->state = OTHERS_FIRST;
>> +OvsConntrackUpdateExpiration(conn, now);
>> +return &conn->up;
>> +}
>> \ No newline at end of file
>[Alin Gabriel Serdean: ] Nit no new line
>> diff --git a/datapath-windows/ovsext/Conntrack.c b/datapath-
>> windows/ovsext/Conntrack.c
>> index 544fd51..e193e9f 100644
>> --- a/datapath-windows/ovsext/Conntrack.c
>> +++ b/datapath-windows/ovsext/Conntrack.c
>> @@ -146,9 +146,20 @@ OvsCtUpdateFlowKey(struct OvsFlowKey *key,
>>  }
>>  }
>> 
>> +static __inline VOID
>> +OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx) {
>> +NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
>> +NdisMoveMemory(&entry->rev_key, &ctx->key, sizeof (OVS_CT_KEY));
>[Alin Gabriel Serdean: ] Maybe use RtlCopyMemory
Sai: NdisMoveMemory is appropriate given that we are in NDIS context. It
calls RtlCopyMemory under the hoods.
#define NdisMoveMemory(Destination, Source, Length)
RtlCopyMemory(Destination, Source, Length)

>> +OvsCtKeyReverse(&entry->rev_key);
>> +InsertHeadList(&ovsConntrackTable[ctx->hash &
>> CT_HASH_TABLE_MASK],
>> +   &entry->link);
>> +}
>> +
>>  static __inline POVS_CT_ENTRY
>> -OvsCtEntryCreate(const TCPHdr *tcp,
>> - PNET_BUFFER_LIST curNbl,
>> +OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
>> + UINT8 ipProto,
>> + UINT32 l4Offset,
>>   OvsConntrackKeyLookupCtx *ctx,
>>   OvsFlowKey *key,
>>   BOOLEAN commit,
>> @@ -156,26 +167,71 @@ OvsCtEntryCreate(const TCPHdr *tcp,  {
>>  POVS_CT_ENTRY entry = NULL;
>>  UINT32 state = 0;
>> -if (!OvsConntrackValidateTcpPacket(tcp)) {
>> -state |= OVS_CS_F_INVALID;
>> -OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
>> -return entry;
>> -}
>> +switch (ipProto)
>> +{
>> +case IPPROTO_TCP:
>> +{
>> +TCPHdr tcpStorage;
>> +const TCPHdr *tcp;
>> +tcp = OvsGetTcp(curNbl, l4Offset, &tcpStorage);
>> +if (!OvsConntrackValidateTcpPacket(tcp)) {
>> +goto invalid;
>> +}
>> +
>> +state |= OVS_CS_F_NEW;
>> +if (commit) {
>> +entry = OvsConntrackCreateTcpEntry(tcp, curNbl,
>>currentTime);
>> +OvsCtAddEntry(entry, ctx);
>> +}
>> +
>> +OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
>> +return entry;
>> +}
>> +case IPPROTO_ICMP:
>> +case IPPROTO_UDP:
>> +state |= OVS_CS_F_NEW;
>> +if (commit) {
>> +entry = OvsConntrackCreateOtherEntry(currentTime);
>> +OvsCtAddEntry(entry, ctx);
>> +}
>> 
>> -state |= OVS_CS_F_NEW;
>> -if (commit) {
>> -entry = OvsConntrackCreateTcpEntry(tcp, curNbl, currentTime);
>> -NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
>> -NdisMoveMemory(&entry->re

Re: [ovs-dev] [PATCH 4/4] datapath-windows: Add ECN support on STT decapsulation

2016-06-02 Thread Sairam Venugopal
Hi Paul,

Please see the comments inline.

Thanks!
Sairam

On 5/17/16, 8:23 AM, "Paul Boca"  wrote:

>Signed-off-by: Paul-Daniel Boca 
>---
> datapath-windows/ovsext/NetProto.h | 10 -
> datapath-windows/ovsext/PacketParser.h | 67
>++
> datapath-windows/ovsext/Stt.c  | 45 +++
> datapath-windows/ovsext/Stt.h  |  1 +
> 4 files changed, 122 insertions(+), 1 deletion(-)
>
>diff --git a/datapath-windows/ovsext/NetProto.h
>b/datapath-windows/ovsext/NetProto.h
>index f7527f8..6cf6d8e 100644
>--- a/datapath-windows/ovsext/NetProto.h
>+++ b/datapath-windows/ovsext/NetProto.h
>@@ -45,6 +45,8 @@ typedef struct EthHdr {
> #define ICMP_CSUM_OFFSET   2
> #define INET_CSUM_LENGTH   (sizeof(UINT16))
> 
>+#define PACKET_MAX_LENGTH  64*1024 // 64K
>+
> #define IP4_UNITS_TO_BYTES(x) ((x) << 2)
> #define IP4_BYTES_TO_UNITS(x) ((x) >> 2)
> 
>@@ -245,7 +247,13 @@ typedef union _OVS_PACKET_HDR_INFO {
> typedef struct IPHdr {
>UINT8ihl:4,
> version:4;
>-   UINT8tos;
>+   union {
>+   struct {
>+   UINT8 ecn:2,
>+ dscp:6;
>+   };
>+   UINT8tos;
>+   };
>UINT16   tot_len;
>UINT16   id;
>UINT16   frag_off;
>diff --git a/datapath-windows/ovsext/PacketParser.h
>b/datapath-windows/ovsext/PacketParser.h
>index f1d7f28..a72b7dc 100644
>--- a/datapath-windows/ovsext/PacketParser.h
>+++ b/datapath-windows/ovsext/PacketParser.h
>@@ -99,6 +99,73 @@ OvsGetArp(const NET_BUFFER_LIST *packet,
> return OvsGetPacketBytes(packet, sizeof *storage, ofs, storage);
> }
> 
>+/*
>+* Returns the start of NBL and computes the total length of Ethernet
>header
>+* Also returns the type of L3 header
>+*/
>+static const PVOID

Sai: This should return EthHdr * similar to other methods in PacketParser.h
Nit - name the function - OvsGetEth to keep it consistent with OvsGetTcp,
OvsGetIp, OvsGetArp

>+OvsGetEthHeader(const NET_BUFFER_LIST *packet,
>+UINT16 *length,
>+UINT16 *dlType,
>+Eth_Header *storage)
>+{
>+UINT8 offset = 0;
>+PVOID vlanTagValue;
>+PUINT8 buffStart = NULL;
>+
>+const Eth_Header *eth = OvsGetPacketBytes(packet, ETH_MAX_HEADER_LEN,
>+  0, storage);

Sai: You can use EthHdr from NetProto.h instead of Eth_Header. Looks like
Eth_Header gets used only in Flow.c


>+if (eth == NULL) {
>+return NULL;
>+}
>+
>+/* Keep a copy of packet start */
>+buffStart = (PUINT8)eth;
>+
>+/*
>+* vlan_tci.
>+*/
>+vlanTagValue = NET_BUFFER_LIST_INFO(packet,
>Ieee8021QNetBufferListInfo);
>+if (!vlanTagValue) {
>+if (eth->dix.typeNBO == ETH_TYPE_802_1PQ_NBO) {
>+offset = sizeof(Eth_802_1pq_Tag);
>+}
>+
>+/*
>+* XXX Please note after this point, src mac and dst mac should
>+* not be accessed through eth
>+*/
Sai: You can get rid of this comment. Doesn¹t apply here.

>+eth = (Eth_Header *)((UINT8 *)eth + offset);
>+}
>+

Sai: Same with this one.
>+/*
>+* dl_type.
>+*
>+* XXX assume that at least the first
>+* 12 bytes of received packets are mapped.  This code has the
>stronger
>+* assumption that at least the first 22 bytes of 'packet' is mapped
>(if my
>+* arithmetic is right).
>+*/
>+if (ETH_TYPENOT8023(eth->dix.typeNBO)) {
>+*dlType = eth->dix.typeNBO;
>+*length = ETH_HEADER_LEN_DIX + offset;
>+} else if (OvsPacketLenNBL(packet) >= ETH_HEADER_LEN_802_3 &&
>+   eth->e802_3.llc.dsap == 0xaa &&
>+   eth->e802_3.llc.ssap == 0xaa &&
>+   eth->e802_3.llc.control == ETH_LLC_CONTROL_UFRAME &&
>+   eth->e802_3.snap.snapOrg[0] == 0x00 &&
>+   eth->e802_3.snap.snapOrg[1] == 0x00 &&
>+   eth->e802_3.snap.snapOrg[2] == 0x00) {
>+*dlType = eth->e802_3.snap.snapType.typeNBO;
>+*length = ETH_HEADER_LEN_802_3 + offset;
>+} else {
>+*dlType = htons(OVSWIN_DL_TYPE_NONE);
>+*length = ETH_HEADER_LEN_DIX + offset;
>+}
>+
Sai: can reutrn EthHdr * isntead of this cast.
>+return (UINT8*)eth;
>+}
>+
> static const IPHdr *
> OvsGetIp(const NET_BUFFER_LIST *packet,
>  UINT32 ofs,
>diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c
>index 8a1b1a9..a9e1cac 100644
>--- a/datapath-windows/ovsext/Stt.c
>+++ b/datapath-windows/ovsext/Stt.c
>@@ -642,6 +642,9 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> NdisMoveMemory(&entry->ovsPktKey, &pktKey, sizeof
>(OVS_STT_PKT_KEY));
> 
> entry->recvdLen = fragmentLength;
>+if (ipHdr->ecn == IP_ECN_CE) {
>+entry->ecn = IP_ECN_CE;
>+}
> 
> UINT64 currentTime;
> NdisGetCurrentSystemTime((LARGE_INTEGER *) ¤tTime);
>@@ -678,6 +681,9 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> if (segOffset == 0

[ovs-dev] [PATCH v3] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-06-02 Thread Sairam Venugopal
Enable support for UDP and ICMP in the connection tracking module on
Hyper-V.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/automake.mk  |   1 +
 datapath-windows/ovsext/Conntrack-other.c |  82 ++
 datapath-windows/ovsext/Conntrack.c   | 177 ++
 datapath-windows/ovsext/Conntrack.h   |   6 +-
 datapath-windows/ovsext/ovsext.vcxproj|   1 +
 5 files changed, 222 insertions(+), 45 deletions(-)
 create mode 100644 datapath-windows/ovsext/Conntrack-other.c

diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index c9af806..668cf2c 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -13,6 +13,7 @@ EXTRA_DIST += \
datapath-windows/ovsext/Atomic.h \
datapath-windows/ovsext/BufferMgmt.c \
datapath-windows/ovsext/BufferMgmt.h \
+   datapath-windows/ovsext/Conntrack-other.c \
datapath-windows/ovsext/Conntrack-tcp.c \
datapath-windows/ovsext/Conntrack.c \
datapath-windows/ovsext/Conntrack.h \
diff --git a/datapath-windows/ovsext/Conntrack-other.c 
b/datapath-windows/ovsext/Conntrack-other.c
new file mode 100644
index 000..60bc76c
--- /dev/null
+++ b/datapath-windows/ovsext/Conntrack-other.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015, 2016 VMware, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Conntrack.h"
+#include 
+
+enum other_state {
+OTHERS_FIRST,
+OTHERS_MULTIPLE,
+OTHERS_BIDIR,
+};
+
+struct conn_other {
+struct OVS_CT_ENTRY up;
+enum other_state state;
+};
+
+static const long long other_timeouts[] = {
+[OTHERS_FIRST] = 60 * 1000,
+[OTHERS_MULTIPLE] = 60 * 1000,
+[OTHERS_BIDIR] = 30 * 1000,
+};
+
+static __inline struct conn_other*
+OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
+{
+ASSERT(conn);
+return CONTAINER_OF(conn, struct conn_other, up);
+}
+
+static __inline VOID
+OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
+{
+ASSERT(conn);
+conn->up.expiration = now + other_timeouts[conn->state];
+}
+
+enum ct_update_res
+OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
+ BOOLEAN reply,
+ UINT64 now)
+{
+ASSERT(conn_);
+struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
+
+if (reply && conn->state != OTHERS_BIDIR) {
+conn->state = OTHERS_BIDIR;
+} else if (conn->state == OTHERS_FIRST) {
+conn->state = OTHERS_MULTIPLE;
+}
+
+OvsConntrackUpdateExpiration(conn, now);
+
+return CT_UPDATE_VALID;
+}
+
+OVS_CT_ENTRY *
+OvsConntrackCreateOtherEntry(UINT64 now)
+{
+struct conn_other *conn;
+conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
+OVS_CT_POOL_TAG);
+/* XXX Handle memory allocation error (by returning a status) */
+ASSERT(conn);
+conn->up = (OVS_CT_ENTRY) {0};
+conn->state = OTHERS_FIRST;
+OvsConntrackUpdateExpiration(conn, now);
+return &conn->up;
+}
diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 544fd51..e285a62 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -146,9 +146,20 @@ OvsCtUpdateFlowKey(struct OvsFlowKey *key,
 }
 }
 
+static __inline VOID
+OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx)
+{
+NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
+NdisMoveMemory(&entry->rev_key, &ctx->key, sizeof (OVS_CT_KEY));
+OvsCtKeyReverse(&entry->rev_key);
+InsertHeadList(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],
+   &entry->link);
+}
+
 static __inline POVS_CT_ENTRY
-OvsCtEntryCreate(const TCPHdr *tcp,
- PNET_BUFFER_LIST curNbl,
+OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
+ UINT8 ipProto,
+ UINT32 l4Offset,
  OvsConntrackKeyLookupCtx *ctx,
  OvsFlowKey *key,
  BOOLEAN commit,
@@ -156,26 +167,74 @@ OvsCtEntryCreate(const TCPHdr *tcp,
 {
 POVS_CT_ENTRY entry = NULL;
 UINT32 state = 0;
-if (!OvsConntrackValidateTcpPacket(tcp)) {
-state |= OVS_CS_F_INVALID;
-OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
- 

[ovs-dev] [PATCH v4] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-06-02 Thread Sairam Venugopal
Enable support for UDP and ICMP in the connection tracking module on
Hyper-V. Define 1s as variable and reuse it.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/automake.mk  |   1 +
 datapath-windows/ovsext/Conntrack-other.c |  82 ++
 datapath-windows/ovsext/Conntrack-tcp.c   |  10 +-
 datapath-windows/ovsext/Conntrack.c   | 177 ++
 datapath-windows/ovsext/Conntrack.h   |  13 ++-
 datapath-windows/ovsext/ovsext.vcxproj|   1 +
 6 files changed, 232 insertions(+), 52 deletions(-)
 create mode 100644 datapath-windows/ovsext/Conntrack-other.c

diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index c9af806..668cf2c 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -13,6 +13,7 @@ EXTRA_DIST += \
datapath-windows/ovsext/Atomic.h \
datapath-windows/ovsext/BufferMgmt.c \
datapath-windows/ovsext/BufferMgmt.h \
+   datapath-windows/ovsext/Conntrack-other.c \
datapath-windows/ovsext/Conntrack-tcp.c \
datapath-windows/ovsext/Conntrack.c \
datapath-windows/ovsext/Conntrack.h \
diff --git a/datapath-windows/ovsext/Conntrack-other.c 
b/datapath-windows/ovsext/Conntrack-other.c
new file mode 100644
index 000..5d39389
--- /dev/null
+++ b/datapath-windows/ovsext/Conntrack-other.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015, 2016 VMware, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Conntrack.h"
+#include 
+
+enum other_state {
+OTHERS_FIRST,
+OTHERS_MULTIPLE,
+OTHERS_BIDIR,
+};
+
+struct conn_other {
+struct OVS_CT_ENTRY up;
+enum other_state state;
+};
+
+static const long long other_timeouts[] = {
+[OTHERS_FIRST] = 60 * CT_INTERVAL_SEC,
+[OTHERS_MULTIPLE] = 60 * CT_INTERVAL_SEC,
+[OTHERS_BIDIR] = 30 * CT_INTERVAL_SEC,
+};
+
+static __inline struct conn_other*
+OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
+{
+ASSERT(conn);
+return CONTAINER_OF(conn, struct conn_other, up);
+}
+
+static __inline VOID
+OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
+{
+ASSERT(conn);
+conn->up.expiration = now + other_timeouts[conn->state];
+}
+
+enum ct_update_res
+OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
+ BOOLEAN reply,
+ UINT64 now)
+{
+ASSERT(conn_);
+struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
+
+if (reply && conn->state != OTHERS_BIDIR) {
+conn->state = OTHERS_BIDIR;
+} else if (conn->state == OTHERS_FIRST) {
+conn->state = OTHERS_MULTIPLE;
+}
+
+OvsConntrackUpdateExpiration(conn, now);
+
+return CT_UPDATE_VALID;
+}
+
+OVS_CT_ENTRY *
+OvsConntrackCreateOtherEntry(UINT64 now)
+{
+struct conn_other *conn;
+conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
+OVS_CT_POOL_TAG);
+/* XXX Handle memory allocation error (by returning a status) */
+ASSERT(conn);
+conn->up = (OVS_CT_ENTRY) {0};
+conn->state = OTHERS_FIRST;
+OvsConntrackUpdateExpiration(conn, now);
+return &conn->up;
+}
diff --git a/datapath-windows/ovsext/Conntrack-tcp.c 
b/datapath-windows/ovsext/Conntrack-tcp.c
index 24f5e7c..19925c3 100644
--- a/datapath-windows/ovsext/Conntrack-tcp.c
+++ b/datapath-windows/ovsext/Conntrack-tcp.c
@@ -389,18 +389,18 @@ OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
 
 if (src->state >= CT_DPIF_TCPS_FIN_WAIT_2
 && dst->state >= CT_DPIF_TCPS_FIN_WAIT_2) {
-OvsConntrackUpdateExpiration(conn, now, 30 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 30 * CT_INTERVAL_SEC);
 } else if (src->state >= CT_DPIF_TCPS_CLOSING
&& dst->state >= CT_DPIF_TCPS_CLOSING) {
-OvsConntrackUpdateExpiration(conn, now, 45 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 45 * CT_INTERVAL_SEC);
 } else if (src->state < CT_DPIF_TCPS_ESTABLISHED
|| dst->state < CT_DPIF_TCPS_ESTABLISHED) {
-OvsConntrackUpdateExpiration(conn, now, 30 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 30 * CT_INTERVAL_SEC);
 } else if (src->state >= CT_DPIF_TCPS_CLOSING
   

Re: [ovs-dev] [PATCH v3] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-06-02 Thread Sairam Venugopal
Disregard this patch. I have sent out a v4 which addresses another review
comment.

On 6/2/16, 5:12 PM, "Sairam Venugopal"  wrote:

>Enable support for UDP and ICMP in the connection tracking module on
>Hyper-V.
>
>Signed-off-by: Sairam Venugopal 
>---
> datapath-windows/automake.mk  |   1 +
> datapath-windows/ovsext/Conntrack-other.c |  82 ++
> datapath-windows/ovsext/Conntrack.c   | 177
>++
> datapath-windows/ovsext/Conntrack.h   |   6 +-
> datapath-windows/ovsext/ovsext.vcxproj|   1 +
> 5 files changed, 222 insertions(+), 45 deletions(-)
> create mode 100644 datapath-windows/ovsext/Conntrack-other.c
>
>diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
>index c9af806..668cf2c 100644
>--- a/datapath-windows/automake.mk
>+++ b/datapath-windows/automake.mk
>@@ -13,6 +13,7 @@ EXTRA_DIST += \
>   datapath-windows/ovsext/Atomic.h \
>   datapath-windows/ovsext/BufferMgmt.c \
>   datapath-windows/ovsext/BufferMgmt.h \
>+  datapath-windows/ovsext/Conntrack-other.c \
>   datapath-windows/ovsext/Conntrack-tcp.c \
>   datapath-windows/ovsext/Conntrack.c \
>   datapath-windows/ovsext/Conntrack.h \
>diff --git a/datapath-windows/ovsext/Conntrack-other.c
>b/datapath-windows/ovsext/Conntrack-other.c
>new file mode 100644
>index 000..60bc76c
>--- /dev/null
>+++ b/datapath-windows/ovsext/Conntrack-other.c
>@@ -0,0 +1,82 @@
>+/*
>+ * Copyright (c) 2015, 2016 VMware, Inc.
>+ *
>+ * Licensed under the Apache License, Version 2.0 (the "License");
>+ * you may not use this file except in compliance with the License.
>+ * You may obtain a copy of the License at:
>+ *
>+ * http://www.apache.org/licenses/LICENSE-2.0
>+ *
>+ * Unless required by applicable law or agreed to in writing, software
>+ * distributed under the License is distributed on an "AS IS" BASIS,
>+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>implied.
>+ * See the License for the specific language governing permissions and
>+ * limitations under the License.
>+ */
>+
>+#include "Conntrack.h"
>+#include 
>+
>+enum other_state {
>+OTHERS_FIRST,
>+OTHERS_MULTIPLE,
>+OTHERS_BIDIR,
>+};
>+
>+struct conn_other {
>+struct OVS_CT_ENTRY up;
>+enum other_state state;
>+};
>+
>+static const long long other_timeouts[] = {
>+[OTHERS_FIRST] = 60 * 1000,
>+[OTHERS_MULTIPLE] = 60 * 1000,
>+[OTHERS_BIDIR] = 30 * 1000,
>+};
>+
>+static __inline struct conn_other*
>+OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
>+{
>+ASSERT(conn);
>+return CONTAINER_OF(conn, struct conn_other, up);
>+}
>+
>+static __inline VOID
>+OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
>+{
>+ASSERT(conn);
>+conn->up.expiration = now + other_timeouts[conn->state];
>+}
>+
>+enum ct_update_res
>+OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
>+ BOOLEAN reply,
>+ UINT64 now)
>+{
>+ASSERT(conn_);
>+struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
>+
>+if (reply && conn->state != OTHERS_BIDIR) {
>+conn->state = OTHERS_BIDIR;
>+} else if (conn->state == OTHERS_FIRST) {
>+conn->state = OTHERS_MULTIPLE;
>+}
>+
>+OvsConntrackUpdateExpiration(conn, now);
>+
>+return CT_UPDATE_VALID;
>+}
>+
>+OVS_CT_ENTRY *
>+OvsConntrackCreateOtherEntry(UINT64 now)
>+{
>+struct conn_other *conn;
>+conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
>+OVS_CT_POOL_TAG);
>+/* XXX Handle memory allocation error (by returning a status) */
>+ASSERT(conn);
>+conn->up = (OVS_CT_ENTRY) {0};
>+conn->state = OTHERS_FIRST;
>+OvsConntrackUpdateExpiration(conn, now);
>+return &conn->up;
>+}
>diff --git a/datapath-windows/ovsext/Conntrack.c
>b/datapath-windows/ovsext/Conntrack.c
>index 544fd51..e285a62 100644
>--- a/datapath-windows/ovsext/Conntrack.c
>+++ b/datapath-windows/ovsext/Conntrack.c
>@@ -146,9 +146,20 @@ OvsCtUpdateFlowKey(struct OvsFlowKey *key,
> }
> }
> 
>+static __inline VOID
>+OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx)
>+{
>+NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
>+NdisMoveMemory(&entry->rev_key, &ctx->key, sizeof (OVS_CT_KEY));
>+OvsCtKeyReverse(&entry->rev_key);
>+InsertHeadList(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],

Re: [ovs-dev] [PATCH] datapath-windows: Fix misc on vport

2016-06-02 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 5/9/16, 5:46 PM, "Alin Serdean"  wrote:

>Remove ununsed variables, found by inspection.
>
>On fail reset extInfo name.
>
>Signed-off-by: Alin Gabriel Serdean 
>---
> datapath-windows/ovsext/Vport.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Vport.c
>b/datapath-windows/ovsext/Vport.c
>index d04b12b..9ac1361 100644
>--- a/datapath-windows/ovsext/Vport.c
>+++ b/datapath-windows/ovsext/Vport.c
>@@ -404,7 +404,6 @@ HvConnectNic(POVS_SWITCH_CONTEXT switchContext,
> {
> LOCK_STATE_EX lockState;
> POVS_VPORT_ENTRY vport;
>-UINT32 portNo;
> 
> VPORT_NIC_ENTER(nicParam);
> 
>@@ -430,7 +429,6 @@ HvConnectNic(POVS_SWITCH_CONTEXT switchContext,
> 
> vport->ovsState = OVS_STATE_CONNECTED;
> vport->nicState = NdisSwitchNicStateConnected;
>-portNo = vport->portNo;
> 
> NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
> 
>@@ -1641,7 +1639,7 @@ OvsGetExtInfoIoctl(POVS_VPORT_GET vportGet,
>  
>OVS_MAX_PORT_NAME_LENGTH);
> if (status != STATUS_SUCCESS) {
> OVS_LOG_INFO("Fail to convert NIC name.");
>-extInfo->vmUUID[0] = 0;
>+extInfo->name[0] = 0;
> }
> 
> status = OvsConvertIfCountedStrToAnsiStr(&vport->vmName,
>-- 
>1.9.5.msysgit.0
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=WrXSQm6gkPFP458CWT0QCEVUyB5CXc
>DkTq90mw10k6M&s=laNn3SJ4oX8awwBMaSwlhtJMBAXPIHFk3oqEQ0EArE4&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 8/9] datapath-windows: Update OvsReadEventCmdHandler in Datapath.c to support different events

2016-07-13 Thread Sairam Venugopal
OvsReadEventCmdHandler must now reflect the right event being read. If the
event is a Conntrack related event, then convert the entry to netlink
format and send it to userspace. If it's Vport event, retain the existing
workflow.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Datapath.c | 59 +-
 1 file changed, 45 insertions(+), 14 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index a5a0b35..fff788a 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1674,7 +1674,6 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 #endif
 NL_BUFFER nlBuf;
 NTSTATUS status;
-OVS_VPORT_EVENT_ENTRY eventEntry;
 
 ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
 
@@ -1687,21 +1686,53 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 /* Output buffer has been validated while validating read dev op. */
 ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof *msgOut);
 
-NlBufInit(&nlBuf, usrParamsCtx->outputBuffer, usrParamsCtx->outputLength);
+if (instance->protocol == NETLINK_NETFILTER) {
+if (!instance->mcastMask) {
+status = STATUS_SUCCESS;
+*replyLen = 0;
+goto cleanup;
+}
 
-/* remove an event entry from the event queue */
-status = OvsRemoveVportEventEntry(usrParamsCtx->ovsInstance,
-  &eventEntry);
-if (status != STATUS_SUCCESS) {
-/* If there were not elements, read should return no data. */
-status = STATUS_SUCCESS;
-*replyLen = 0;
-goto cleanup;
-}
+OVS_CT_EVENT_ENTRY ctEventEntry;
+status = OvsRemoveCtEventEntry(usrParamsCtx->ovsInstance, 
&ctEventEntry);
 
-status = OvsPortFillInfo(usrParamsCtx, &eventEntry, &nlBuf);
-if (status == NDIS_STATUS_SUCCESS) {
-*replyLen = NlBufSize(&nlBuf);
+if (status != STATUS_SUCCESS) {
+/* If there were not elements, read should return no data. */
+status = STATUS_SUCCESS;
+*replyLen = 0;
+goto cleanup;
+}
+
+status = OvsCreateNlMsgFromCtEntry(&ctEventEntry.entry,
+   usrParamsCtx->outputBuffer,
+   usrParamsCtx->outputLength,
+   ctEventEntry.type,
+   0,
+   usrParamsCtx->ovsInstance->pid,
+   NFNETLINK_V0,
+   0);
+if (status == NDIS_STATUS_SUCCESS) {
+*replyLen = msgOut->nlMsg.nlmsgLen;
+}
+} else if (instance->protocol == NETLINK_GENERIC) {
+NlBufInit(&nlBuf, usrParamsCtx->outputBuffer, 
usrParamsCtx->outputLength);
+
+OVS_VPORT_EVENT_ENTRY eventEntry;
+/* remove vport event entry from the vport event queue */
+status = OvsRemoveVportEventEntry(usrParamsCtx->ovsInstance, 
&eventEntry);
+if (status != STATUS_SUCCESS) {
+/* If there were not elements, read should return no data. */
+status = STATUS_SUCCESS;
+*replyLen = 0;
+goto cleanup;
+}
+
+status = OvsPortFillInfo(usrParamsCtx, &eventEntry, &nlBuf);
+if (status == NDIS_STATUS_SUCCESS) {
+*replyLen = NlBufSize(&nlBuf);
+}
+} else {
+status = STATUS_INVALID_PARAMETER;
 }
 
 cleanup:
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 9/9] datapath-windows: Post Conntrack delete and new events

2016-07-13 Thread Sairam Venugopal
Post Conntrack delete and create events when entries are deleted or
created.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Conntrack.c | 12 
 1 file changed, 12 insertions(+)

diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 382c13d..af3d966 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -23,6 +23,7 @@
 #include "Jhash.h"
 #include "PacketParser.h"
 #include "Debug.h"
+#include "Event.h"
 
 #define WINDOWS_TICK 1000
 #define SEC_TO_UNIX_EPOCH 11644473600LL
@@ -154,6 +155,15 @@ OvsCtUpdateFlowKey(struct OvsFlowKey *key,
 }
 
 static __inline VOID
+OvsPostCtEventEntry(POVS_CT_ENTRY entry, UINT8 type)
+{
+OVS_CT_EVENT_ENTRY ctEventEntry = {0};
+NdisMoveMemory(&ctEventEntry.entry, entry, sizeof(OVS_CT_ENTRY));
+ctEventEntry.type = type;
+OvsPostCtEvent(&ctEventEntry);
+}
+
+static __inline VOID
 OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx, UINT64 now)
 {
 NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
@@ -162,6 +172,7 @@ OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx 
*ctx, UINT64 now)
 entry->timestampStart = now;
 InsertHeadList(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],
&entry->link);
+OvsPostCtEventEntry(entry, OVS_EVENT_CT_NEW);
 ctTotalEntries++;
 }
 
@@ -253,6 +264,7 @@ OvsCtUpdateEntry(OVS_CT_ENTRY* entry,
 static __inline VOID
 OvsCtEntryDelete(POVS_CT_ENTRY entry)
 {
+OvsPostCtEventEntry(entry, OVS_EVENT_CT_DELETE);
 RemoveEntryList(&entry->link);
 OvsFreeMemoryWithTag(entry, OVS_CT_POOL_TAG);
 ctTotalEntries--;
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 0/9] Add support for sending Conntrack events

2016-07-13 Thread Sairam Venugopal
Send out events when a Conntrack entry is created or destroyed. The events can 
be listened using the netlink multicast subscription. Also fix few bugs in 
Event.c around event handling. 

Sairam Venugopal (9):
  datapath-windows: Rename OVS_EVENT_ENTRY to OVS_VPORT_EVENT_ENTRY
  datapath-windows: Add supported netlink family protocols to
NetlinkProto.h
  datapath-windows: Explicitly name vport related event to vportEvent
  datapath-windows: Fix bugs in Event.c around subscribe and lock
  datapath-windows: Define new multicast conntrack events
  datapath-windows: Modify OvsCreateNlMsgFromCtEntry to make it reusable
  datapath-windows: Add support for multiple event queue in Event.c
  datapath-windows: Update OvsReadEventCmdHandler in Datapath.c to
support different events
  datapath-windows: Post Conntrack delete and new events

 datapath-windows/ovsext/Conntrack.c|  44 +++-
 datapath-windows/ovsext/Conntrack.h|   9 +
 datapath-windows/ovsext/Datapath.c |  81 +--
 datapath-windows/ovsext/Datapath.h |   3 +-
 datapath-windows/ovsext/DpInternal.h   |  25 ++-
 datapath-windows/ovsext/Event.c| 279 -
 datapath-windows/ovsext/Event.h|  22 +-
 datapath-windows/ovsext/Netlink/NetlinkProto.h |   3 +
 datapath-windows/ovsext/Vport.c|  12 +-
 9 files changed, 383 insertions(+), 95 deletions(-)

-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 3/9] datapath-windows: Explicitly name vport related event to vportEvent

2016-07-13 Thread Sairam Venugopal
Update the datapath to refer to events as vportEvents. This will aid in
the introduction of other events.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Datapath.c |  3 ++-
 datapath-windows/ovsext/Event.c| 10 +-
 datapath-windows/ovsext/Event.h|  7 ---
 datapath-windows/ovsext/Vport.c|  6 +++---
 4 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index 42af450..e4d6ab1 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1675,7 +1675,8 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 NlBufInit(&nlBuf, usrParamsCtx->outputBuffer, usrParamsCtx->outputLength);
 
 /* remove an event entry from the event queue */
-status = OvsRemoveEventEntry(usrParamsCtx->ovsInstance, &eventEntry);
+status = OvsRemoveVportEventEntry(usrParamsCtx->ovsInstance,
+  &eventEntry);
 if (status != STATUS_SUCCESS) {
 /* If there were not elements, read should return no data. */
 status = STATUS_SUCCESS;
diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index 53ee556..8c7c3ec 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -109,7 +109,7 @@ OvsCleanupEvent(POVS_OPEN_INSTANCE instance)
  * --
  */
 VOID
-OvsPostEvent(POVS_VPORT_EVENT_ENTRY event)
+OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 {
 POVS_EVENT_QUEUE_ELEM elem;
 POVS_EVENT_QUEUE queue;
@@ -141,7 +141,7 @@ OvsPostEvent(POVS_VPORT_EVENT_ENTRY event)
 return;
 }
 
-RtlCopyMemory(&elem->event, event, sizeof elem->event);
+RtlCopyMemory(&elem->vportEvent, event, sizeof elem->vportEvent);
 InsertTailList(&queue->elemList, &elem->link);
 queue->numElems++;
 OVS_LOG_INFO("Queue: %p, numElems: %d",
@@ -409,8 +409,8 @@ unlock:
  * --
  */
 NTSTATUS
-OvsRemoveEventEntry(POVS_OPEN_INSTANCE instance,
-POVS_VPORT_EVENT_ENTRY entry)
+OvsRemoveVportEventEntry(POVS_OPEN_INSTANCE instance,
+ POVS_VPORT_EVENT_ENTRY entry)
 {
 NTSTATUS status = STATUS_UNSUCCESSFUL;
 POVS_EVENT_QUEUE queue;
@@ -427,7 +427,7 @@ OvsRemoveEventEntry(POVS_OPEN_INSTANCE instance,
 
 if (queue->numElems) {
 elem = (POVS_EVENT_QUEUE_ELEM)RemoveHeadList(&queue->elemList);
-*entry = elem->event;
+*entry = elem->vportEvent;
 OvsFreeMemoryWithTag(elem, OVS_EVENT_POOL_TAG);
 queue->numElems--;
 status = STATUS_SUCCESS;
diff --git a/datapath-windows/ovsext/Event.h b/datapath-windows/ovsext/Event.h
index fe03f0e..255594c 100644
--- a/datapath-windows/ovsext/Event.h
+++ b/datapath-windows/ovsext/Event.h
@@ -19,7 +19,7 @@
 
 typedef struct _OVS_EVENT_QUEUE_ELEM {
 LIST_ENTRY link;
-OVS_VPORT_EVENT_ENTRY event;
+OVS_VPORT_EVENT_ENTRY vportEvent;
 } OVS_EVENT_QUEUE_ELEM, *POVS_EVENT_QUEUE_ELEM;
 
 typedef struct _OVS_EVENT_QUEUE {
@@ -38,7 +38,7 @@ VOID OvsCleanupEventQueue(VOID);
 struct _OVS_OPEN_INSTANCE;
 
 VOID OvsCleanupEvent(struct _OVS_OPEN_INSTANCE *instance);
-VOID OvsPostEvent(POVS_VPORT_EVENT_ENTRY event);
+VOID OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event);
 NTSTATUS OvsSubscribeEventIoctl(PFILE_OBJECT fileObject, PVOID inputBuffer,
 UINT32 inputLength);
 NTSTATUS OvsPollEventIoctl(PFILE_OBJECT fileObject, PVOID inputBuffer,
@@ -46,6 +46,7 @@ NTSTATUS OvsPollEventIoctl(PFILE_OBJECT fileObject, PVOID 
inputBuffer,
UINT32 outputLength, UINT32 *replyLen);
 NTSTATUS OvsWaitEventIoctl(PIRP irp, PFILE_OBJECT fileObject,
PVOID inputBuffer, UINT32 inputLength);
-NTSTATUS OvsRemoveEventEntry(PVOID instance, POVS_VPORT_EVENT_ENTRY entry);
+NTSTATUS OvsRemoveVportEventEntry(POVS_OPEN_INSTANCE instance,
+  POVS_VPORT_EVENT_ENTRY entry);
 
 #endif /* __EVENT_H_ */
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index 534d76a..23e1e04 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -300,7 +300,7 @@ HvDeletePort(POVS_SWITCH_CONTEXT switchContext,
 RtlCopyMemory(&event.ovsName, &vport->ovsName, sizeof event.ovsName);
 event.type = OVS_EVENT_LINK_DOWN;
 OvsRemoveAndDeleteVport(NULL, switchContext, vport, TRUE, FALSE);
-OvsPostEvent(&event);
+OvsPostVportEvent(&event);
 } else {
 OVS_LOG_WARN("Vport not present.");
 }
@@ -538,7 +538,7 @@ HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
 RtlCopyMemory(&evt.ovsName, &vpo

[ovs-dev] [PATCH 4/9] datapath-windows: Fix bugs in Event.c around subscribe and lock

2016-07-13 Thread Sairam Venugopal
When userspace tries to resubscribe to an existing queue, return
STATUS_INVALID_PARAMETER since it's not supported. The current bug
overwrites status to STATUS_SUCCESS.

The second bug fix is around releasing the EventQueue lock if an open
instance couldn't be found. The current version returns back without
releasing the lock. Moving the OvsAcquireEventQueueLock() after the
instance is verified.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Event.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index 8c7c3ec..8ff0322 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -217,9 +217,8 @@ OvsSubscribeEventIoctl(PFILE_OBJECT fileObject,
 if (queue->mask != request->mask) {
 status = STATUS_INVALID_PARAMETER;
 OVS_LOG_WARN("Can not chnage mask when the queue is subscribed");
+goto done_event_subscribe;
 }
-status = STATUS_SUCCESS;
-goto done_event_subscribe;
 } else if (!request->subscribe && queue == NULL) {
 status = STATUS_SUCCESS;
 goto done_event_subscribe;
@@ -356,8 +355,6 @@ OvsWaitEventIoctl(PIRP irp,
 }
 poll = (POVS_EVENT_POLL)inputBuffer;
 
-OvsAcquireEventQueueLock();
-
 instance = OvsGetOpenInstance(fileObject, poll->dpNo);
 if (instance == NULL) {
 OVS_LOG_TRACE("Exit: Can not find open instance, dpNo: %d",
@@ -365,6 +362,7 @@ OvsWaitEventIoctl(PIRP irp,
 return STATUS_INVALID_PARAMETER;
 }
 
+OvsAcquireEventQueueLock();
 queue = (POVS_EVENT_QUEUE)instance->eventQueue;
 if (queue == NULL) {
 OVS_LOG_TRACE("Exit: Event queue does not exist");
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 6/9] datapath-windows: Modify OvsCreateNlMsgFromCtEntry to make it reusable

2016-07-13 Thread Sairam Venugopal
Tweak the OvsCreateNlMsgFromCtEntry() method to reuse it for creating
netlink messages from other files. Also define the function in Conntrack.h
to make it accessible.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Conntrack.c | 32 ++--
 datapath-windows/ovsext/Conntrack.h |  9 +
 2 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 90b59ce..382c13d 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -934,12 +934,15 @@ WindowsTickToUnixSeconds(long long windowsTicks)
 - SEC_TO_UNIX_EPOCH));
 }
 
-static NTSTATUS
+NTSTATUS
 OvsCreateNlMsgFromCtEntry(POVS_CT_ENTRY entry,
-  POVS_MESSAGE msgIn,
   PVOID outBuffer,
   UINT32 outBufLen,
-  int dpIfIndex)
+  UINT8 eventType,
+  UINT32 nlmsgSeq,
+  UINT32 nlmsgPid,
+  UINT8 nfGenVersion,
+  UINT32 dpIfIndex)
 {
 NL_BUFFER nlBuf;
 BOOLEAN ok;
@@ -947,6 +950,7 @@ OvsCreateNlMsgFromCtEntry(POVS_CT_ENTRY entry,
 UINT32 timeout;
 NDIS_STATUS status;
 UINT64 currentTime, expiration;
+UINT16 nlmsgType;
 NdisGetCurrentSystemTime((LARGE_INTEGER *)¤tTime);
 UINT8 nfgenFamily = 0;
 if (entry->key.dl_type == htons(ETH_TYPE_IPV4)) {
@@ -957,13 +961,17 @@ OvsCreateNlMsgFromCtEntry(POVS_CT_ENTRY entry,
 
 NlBufInit(&nlBuf, outBuffer, outBufLen);
 /* Mimic netfilter */
-UINT16 nlmsgType = (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_NEW);
+if (eventType == OVS_EVENT_CT_NEW) {
+nlmsgType = (UINT16) (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_NEW);
+} else if (eventType == OVS_EVENT_CT_DELETE) {
+nlmsgType = (UINT16) (NFNL_SUBSYS_CTNETLINK << 8 | 
IPCTNL_MSG_CT_DELETE);
+} else {
+return STATUS_INVALID_PARAMETER;
+}
+
 ok = NlFillOvsMsgForNfGenMsg(&nlBuf, nlmsgType, NLM_F_CREATE,
- msgIn->nlMsg.nlmsgSeq,
- msgIn->nlMsg.nlmsgPid,
- nfgenFamily,
- msgIn->nfGenMsg.version,
- dpIfIndex);
+ nlmsgSeq, nlmsgPid, nfgenFamily,
+ nfGenVersion, dpIfIndex);
 if (!ok) {
 return STATUS_INVALID_BUFFER_SIZE;
 }
@@ -1130,9 +1138,13 @@ OvsCtDumpCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 if (outIndex >= inIndex) {
 entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
 
-rc = OvsCreateNlMsgFromCtEntry(entry, msgIn,
+rc = OvsCreateNlMsgFromCtEntry(entry,
usrParamsCtx->outputBuffer,
usrParamsCtx->outputLength,
+   OVS_EVENT_CT_NEW,
+   msgIn->nlMsg.nlmsgSeq,
+   msgIn->nlMsg.nlmsgPid,
+   msgIn->nfGenMsg.version,
0);
 
 if (rc != NDIS_STATUS_SUCCESS) {
diff --git a/datapath-windows/ovsext/Conntrack.h 
b/datapath-windows/ovsext/Conntrack.h
index 6d573c8..4995ff4 100644
--- a/datapath-windows/ovsext/Conntrack.h
+++ b/datapath-windows/ovsext/Conntrack.h
@@ -116,4 +116,13 @@ enum CT_UPDATE_RES 
OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
 enum ct_update_res OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
 BOOLEAN reply,
 UINT64 now);
+NTSTATUS
+OvsCreateNlMsgFromCtEntry(POVS_CT_ENTRY entry,
+  PVOID outBuffer,
+  UINT32 outBufLen,
+  UINT8 eventType,
+  UINT32 nlmsgSeq,
+  UINT32 nlmsgPid,
+  UINT8 nfGenVersion,
+  UINT32 dpIfIndex);
 #endif /* __OVS_CONNTRACK_H_ */
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 5/9] datapath-windows: Define new multicast conntrack events

2016-07-13 Thread Sairam Venugopal
Define new Conntrack events (new and delete) and add support for
subscribing to these events. Parse out OVS_NL_ATTR_MCAST_GRP and store it
as part of OVS_EVENT_SUBSCRIBE structure.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Datapath.c   | 21 ++---
 datapath-windows/ovsext/Datapath.h   |  3 ++-
 datapath-windows/ovsext/DpInternal.h | 15 +++
 3 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index e4d6ab1..a5a0b35 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1268,11 +1268,12 @@ OvsSubscribeEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 OVS_EVENT_SUBSCRIBE request;
 BOOLEAN rc;
 UINT8 join;
+UINT32 mcastGrp;
 PNL_ATTR attrs[2];
 const NL_POLICY policy[] =  {
 [OVS_NL_ATTR_MCAST_GRP] = {.type = NL_A_U32 },
 [OVS_NL_ATTR_MCAST_JOIN] = {.type = NL_A_U8 },
-};
+};
 
 UNREFERENCED_PARAMETER(replyLen);
 
@@ -1288,11 +1289,25 @@ OvsSubscribeEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 goto done;
 }
 
-/* XXX Ignore the MC group for now */
+mcastGrp = NlAttrGetU32(attrs[OVS_NL_ATTR_MCAST_GRP]);
 join = NlAttrGetU8(attrs[OVS_NL_ATTR_MCAST_JOIN]);
 request.dpNo = msgIn->ovsHdr.dp_ifindex;
 request.subscribe = join;
-request.mask = OVS_EVENT_MASK_ALL;
+request.mcastGrp = mcastGrp;
+request.protocol = instance->protocol;
+request.mask = 0;
+
+/* We currently support Vport and CT related events */
+if (instance->protocol == NETLINK_GENERIC) {
+request.mask = OVS_EVENT_MASK_ALL;
+} else if (instance->protocol == NETLINK_NETFILTER) {
+if (mcastGrp == NFNLGRP_CONNTRACK_NEW) {
+request.mask = OVS_EVENT_CT_NEW;
+}
+if (mcastGrp == NFNLGRP_CONNTRACK_DESTROY) {
+request.mask = OVS_EVENT_CT_DELETE;
+}
+}
 
 status = OvsSubscribeEventIoctl(instance->fileObject, &request,
 sizeof request);
diff --git a/datapath-windows/ovsext/Datapath.h 
b/datapath-windows/ovsext/Datapath.h
index 2b41d82..57b483a 100644
--- a/datapath-windows/ovsext/Datapath.h
+++ b/datapath-windows/ovsext/Datapath.h
@@ -51,7 +51,8 @@ typedef struct _OVS_OPEN_INSTANCE {
 PVOID eventQueue;
 POVS_USER_PACKET_QUEUE packetQueue;
 UINT32 pid;
-UINT32 protocol; /* Refers to NETLINK Family (eg. NETLINK_GENERIC)*/
+UINT32 protocol;/* Refers to NETLINK Family (eg. NETLINK_GENERIC)*/
+UINT32 mcastMask;   /* Mask of subscribed Mcast Groups */
 
 struct {
 POVS_MESSAGE ovsMsg;/* OVS message passed during dump start. */
diff --git a/datapath-windows/ovsext/DpInternal.h 
b/datapath-windows/ovsext/DpInternal.h
index 8abe61d..9641bf6 100644
--- a/datapath-windows/ovsext/DpInternal.h
+++ b/datapath-windows/ovsext/DpInternal.h
@@ -310,6 +310,8 @@ typedef struct _OVS_EVENT_SUBSCRIBE {
 uint32_t dpNo;
 uint32_t subscribe;
 uint32_t mask;
+uint32_t mcastGrp;
+uint32_t protocol;
 } OVS_EVENT_SUBSCRIBE, *POVS_EVENT_SUBSCRIBE;
 
 typedef struct _OVS_EVENT_POLL {
@@ -327,6 +329,19 @@ enum {
 OVS_EVENT_MASK_ALL  = 0x3f,
 };
 
+enum {
+OVS_EVENT_CT_NEW= ((uint32_t)0x1 << 0),
+OVS_EVENT_CT_DELETE = ((uint32_t)0x1 << 1),
+OVS_EVENT_CT_MASK_ALL   = 0x3
+};
+
+/* Supported mcast event groups */
+enum OVS_MCAST_EVENT_ENTRIES {
+OVS_MCAST_VPORT_EVENT,
+OVS_MCAST_CT_EVENT,
+__OVS_MCAST_EVENT_ENTRIES_MAX
+};
+#define OVS_MCAST_EVENT_ENTRIES_MAX (__OVS_MCAST_EVENT_ENTRIES_MAX - 
OVS_MCAST_VPORT_EVENT)
 
 typedef struct _OVS_VPORT_EVENT_ENTRY {
 UINT32 portNo;
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 7/9] datapath-windows: Add support for multiple event queue in Event.c

2016-07-13 Thread Sairam Venugopal
Update Event.c to have multiple event queues and mechanism to retrieve the
associated queue. Introduce OvsPostCtEvent and OvsRemoveCtEventEntry
similar to OvsPostVportEvent and OvsRemoveVportEventEntry.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Event.c | 265 +---
 datapath-windows/ovsext/Event.h |  17 ++-
 2 files changed, 239 insertions(+), 43 deletions(-)

diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index 8ff0322..ffc32a6 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -26,36 +26,62 @@
 #define OVS_DBG_MOD OVS_DBG_EVENT
 #include "Debug.h"
 
-LIST_ENTRY ovsEventQueue;
-static NDIS_SPIN_LOCK eventQueueLock;
-UINT32 ovsNumEventQueue;
+LIST_ENTRY ovsEventQueueArr[OVS_MCAST_EVENT_ENTRIES_MAX];
+static NDIS_SPIN_LOCK eventQueueLockArr[OVS_MCAST_EVENT_ENTRIES_MAX];
+UINT32 ovsNumEventQueueArr[OVS_MCAST_EVENT_ENTRIES_MAX];
 
 NTSTATUS
 OvsInitEventQueue()
 {
-InitializeListHead(&ovsEventQueue);
-NdisAllocateSpinLock(&eventQueueLock);
+for (int i = 0; i < OVS_MCAST_EVENT_ENTRIES_MAX; i++) {
+InitializeListHead(&ovsEventQueueArr[i]);
+NdisAllocateSpinLock(&eventQueueLockArr[i]);
+}
 return STATUS_SUCCESS;
 }
 
 VOID
 OvsCleanupEventQueue()
 {
-ASSERT(IsListEmpty(&ovsEventQueue));
-ASSERT(ovsNumEventQueue == 0);
-NdisFreeSpinLock(&eventQueueLock);
+for (int i = 0; i < OVS_MCAST_EVENT_ENTRIES_MAX; i++) {
+ASSERT(IsListEmpty(&ovsEventQueueArr[i]));
+ASSERT(ovsNumEventQueueArr[i] == 0);
+NdisFreeSpinLock(&eventQueueLockArr[i]);
+}
 }
 
 static __inline VOID
-OvsAcquireEventQueueLock()
+OvsAcquireEventQueueLock(int eventId)
 {
-NdisAcquireSpinLock(&eventQueueLock);
+NdisAcquireSpinLock(&eventQueueLockArr[eventId]);
 }
 
 static __inline VOID
-OvsReleaseEventQueueLock()
+OvsReleaseEventQueueLock(int eventId)
 {
-   NdisReleaseSpinLock(&eventQueueLock);
+   NdisReleaseSpinLock(&eventQueueLockArr[eventId]);
+}
+
+NDIS_STATUS
+OvsGetMcastEventId(UINT32 protocol, UINT32 mcastMask, UINT32 *eventId)
+{
+switch (protocol) {
+case NETLINK_GENERIC:
+*eventId = OVS_MCAST_VPORT_EVENT;
+return NDIS_STATUS_SUCCESS;
+case NETLINK_NETFILTER:
+if ((mcastMask & OVS_EVENT_CT_NEW)
+|| (mcastMask & OVS_EVENT_CT_DELETE)) {
+*eventId =  OVS_MCAST_CT_EVENT;
+return NDIS_STATUS_SUCCESS;
+}
+break;
+default:
+goto error;
+}
+
+error:
+return NDIS_STATUS_INVALID_PARAMETER;
 }
 
 /*
@@ -68,14 +94,17 @@ OvsCleanupEvent(POVS_OPEN_INSTANCE instance)
 {
 POVS_EVENT_QUEUE queue;
 PIRP irp = NULL;
+UINT32 eventId;
 queue = (POVS_EVENT_QUEUE)instance->eventQueue;
 if (queue) {
 POVS_EVENT_QUEUE_ELEM elem;
 PLIST_ENTRY link, next;
 
-OvsAcquireEventQueueLock();
+/* Handle the error */
+OvsGetMcastEventId(instance->protocol, instance->mcastMask, &eventId);
+OvsAcquireEventQueueLock(eventId);
 RemoveEntryList(&queue->queueLink);
-ovsNumEventQueue--;
+ovsNumEventQueueArr[eventId]--;
 if (queue->pendingIrp) {
 PDRIVER_CANCEL cancelRoutine;
 irp = queue->pendingIrp;
@@ -86,7 +115,7 @@ OvsCleanupEvent(POVS_OPEN_INSTANCE instance)
 }
 }
 instance->eventQueue = NULL;
-OvsReleaseEventQueueLock();
+OvsReleaseEventQueueLock(eventId);
 if (irp) {
 OvsCompleteIrpRequest(irp, 0, STATUS_SUCCESS);
 }
@@ -115,7 +144,7 @@ OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 POVS_EVENT_QUEUE queue;
 PLIST_ENTRY link;
 LIST_ENTRY list;
-   PLIST_ENTRY entry;
+PLIST_ENTRY entry;
 PIRP irp;
 
 InitializeListHead(&list);
@@ -123,9 +152,9 @@ OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 OVS_LOG_TRACE("Enter: portNo: %#x, status: %#x", event->portNo,
   event->type);
 
-OvsAcquireEventQueueLock();
+OvsAcquireEventQueueLock(OVS_MCAST_VPORT_EVENT);
 
-LIST_FORALL(&ovsEventQueue, link) {
+LIST_FORALL(&ovsEventQueueArr[OVS_MCAST_VPORT_EVENT], link) {
 queue = CONTAINING_RECORD(link, OVS_EVENT_QUEUE, queueLink);
 if ((event->type & queue->mask) == 0) {
 continue;
@@ -137,7 +166,7 @@ OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 
 if (elem == NULL) {
 OVS_LOG_WARN("Fail to allocate memory for event");
-OvsReleaseEventQueueLock();
+OvsReleaseEventQueueLock(OVS_MCAST_VPORT_EVENT);
 return;
 }
 
@@ -157,7 +186,7 @@ OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 }
 }
 }
-OvsReleaseEventQueueLock();
+OvsReleaseEventQueueLock(OVS_MCAST_VPORT_E

[ovs-dev] [PATCH 1/9] datapath-windows: Rename OVS_EVENT_ENTRY to OVS_VPORT_EVENT_ENTRY

2016-07-13 Thread Sairam Venugopal
OVS_EVENT_ENTRY currently handles only Vport related events. Updating the
name of the struct to OVS_VPORT_EVENT_ENTRY. This will assist in
introducing other structs to manage other events.

Remove OVS_EVENT_STATUS since it's currently not in use.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Datapath.c   |  4 ++--
 datapath-windows/ovsext/DpInternal.h | 10 ++
 datapath-windows/ovsext/Event.c  |  4 ++--
 datapath-windows/ovsext/Event.h  |  6 +++---
 datapath-windows/ovsext/Vport.c  |  6 +++---
 5 files changed, 12 insertions(+), 18 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index 4f47be5..42af450 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1582,7 +1582,7 @@ MapIrpOutputBuffer(PIRP irp,
  */
 static NTSTATUS
 OvsPortFillInfo(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
-POVS_EVENT_ENTRY eventEntry,
+POVS_VPORT_EVENT_ENTRY eventEntry,
 PNL_BUFFER nlBuf)
 {
 NTSTATUS status;
@@ -1659,7 +1659,7 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 #endif
 NL_BUFFER nlBuf;
 NTSTATUS status;
-OVS_EVENT_ENTRY eventEntry;
+OVS_VPORT_EVENT_ENTRY eventEntry;
 
 ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
 
diff --git a/datapath-windows/ovsext/DpInternal.h 
b/datapath-windows/ovsext/DpInternal.h
index 42b5ec9..8abe61d 100644
--- a/datapath-windows/ovsext/DpInternal.h
+++ b/datapath-windows/ovsext/DpInternal.h
@@ -328,19 +328,13 @@ enum {
 };
 
 
-typedef struct _OVS_EVENT_ENTRY {
+typedef struct _OVS_VPORT_EVENT_ENTRY {
 UINT32 portNo;
 OVS_VPORT_TYPE ovsType;
 UINT32 upcallPid;
 CHAR ovsName[OVS_MAX_PORT_NAME_LENGTH];
 UINT32 type;
-} OVS_EVENT_ENTRY, *POVS_EVENT_ENTRY;
-
-
-typedef struct _OVS_EVENT_STATUS {
-uint32_t numberEntries;
-OVS_EVENT_ENTRY eventEntries[0];
-} OVS_EVENT_STATUS, *POVS_EVENT_STATUS;
+} OVS_VPORT_EVENT_ENTRY, *POVS_VPORT_EVENT_ENTRY;
 
 #pragma pack(pop)
 
diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index f9bea7f..53ee556 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -109,7 +109,7 @@ OvsCleanupEvent(POVS_OPEN_INSTANCE instance)
  * --
  */
 VOID
-OvsPostEvent(POVS_EVENT_ENTRY event)
+OvsPostEvent(POVS_VPORT_EVENT_ENTRY event)
 {
 POVS_EVENT_QUEUE_ELEM elem;
 POVS_EVENT_QUEUE queue;
@@ -410,7 +410,7 @@ unlock:
  */
 NTSTATUS
 OvsRemoveEventEntry(POVS_OPEN_INSTANCE instance,
-POVS_EVENT_ENTRY entry)
+POVS_VPORT_EVENT_ENTRY entry)
 {
 NTSTATUS status = STATUS_UNSUCCESSFUL;
 POVS_EVENT_QUEUE queue;
diff --git a/datapath-windows/ovsext/Event.h b/datapath-windows/ovsext/Event.h
index b087875..fe03f0e 100644
--- a/datapath-windows/ovsext/Event.h
+++ b/datapath-windows/ovsext/Event.h
@@ -19,7 +19,7 @@
 
 typedef struct _OVS_EVENT_QUEUE_ELEM {
 LIST_ENTRY link;
-OVS_EVENT_ENTRY event;
+OVS_VPORT_EVENT_ENTRY event;
 } OVS_EVENT_QUEUE_ELEM, *POVS_EVENT_QUEUE_ELEM;
 
 typedef struct _OVS_EVENT_QUEUE {
@@ -38,7 +38,7 @@ VOID OvsCleanupEventQueue(VOID);
 struct _OVS_OPEN_INSTANCE;
 
 VOID OvsCleanupEvent(struct _OVS_OPEN_INSTANCE *instance);
-VOID OvsPostEvent(POVS_EVENT_ENTRY event);
+VOID OvsPostEvent(POVS_VPORT_EVENT_ENTRY event);
 NTSTATUS OvsSubscribeEventIoctl(PFILE_OBJECT fileObject, PVOID inputBuffer,
 UINT32 inputLength);
 NTSTATUS OvsPollEventIoctl(PFILE_OBJECT fileObject, PVOID inputBuffer,
@@ -46,6 +46,6 @@ NTSTATUS OvsPollEventIoctl(PFILE_OBJECT fileObject, PVOID 
inputBuffer,
UINT32 outputLength, UINT32 *replyLen);
 NTSTATUS OvsWaitEventIoctl(PIRP irp, PFILE_OBJECT fileObject,
PVOID inputBuffer, UINT32 inputLength);
-NTSTATUS OvsRemoveEventEntry(PVOID instance, POVS_EVENT_ENTRY entry);
+NTSTATUS OvsRemoveEventEntry(PVOID instance, POVS_VPORT_EVENT_ENTRY entry);
 
 #endif /* __EVENT_H_ */
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index 1462453..534d76a 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -292,7 +292,7 @@ HvDeletePort(POVS_SWITCH_CONTEXT switchContext,
  * delete will delete the vport.
 */
 if (vport) {
-OVS_EVENT_ENTRY event;
+OVS_VPORT_EVENT_ENTRY event;
 
 event.portNo = vport->portNo;
 event.ovsType = vport->ovsType;
@@ -531,7 +531,7 @@ HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
 vport->numaNodeId = nicParam->NumaNodeId;
 
 if (nameChanged) {
-OVS_EVENT_ENTRY evt;
+OVS_VPORT_EVENT_ENTRY evt;
 evt.portNo = vport->portNo;
 evt.ovsType = vport->ovsType;
 evt.upcallPid = vport->upcallPid;
@@ -567,7 +567,7 @@ HvDisconnectNic(POVS

[ovs-dev] [PATCH 2/9] datapath-windows: Add supported netlink family protocols to NetlinkProto.h

2016-07-13 Thread Sairam Venugopal
The Hyper-V datapath supports NETLINK_GENERIC and NETLINK_NETFILTER
protocols for netlink communication. Define these two protocols in the
datapath.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Netlink/NetlinkProto.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/datapath-windows/ovsext/Netlink/NetlinkProto.h 
b/datapath-windows/ovsext/Netlink/NetlinkProto.h
index beb14d5..5175311 100644
--- a/datapath-windows/ovsext/Netlink/NetlinkProto.h
+++ b/datapath-windows/ovsext/Netlink/NetlinkProto.h
@@ -125,4 +125,7 @@ BUILD_ASSERT_DECL(sizeof(NL_ATTR) == 4);
 #define OVS_HDRLEN NLMSG_ALIGN(sizeof(OVS_HDR))
 #define NLA_HDRLEN ((INT) NLA_ALIGN(sizeof(NL_ATTR)))
 
+#define NETLINK_NETFILTER   12
+#define NETLINK_GENERIC 16
+
 #endif /* NetlinProto.h */
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH] datapath-windows: Fixed packet limits on STT protocol

2016-07-15 Thread Sairam Venugopal
Thanks for the patch!

Acked-by: Sairam Venugopal 


On 7/4/16, 2:53 AM, "Paul Boca"  wrote:

>"If the length of the payload to be encapsulated exceeds 64KB, or if
>the offset to the L4 header exceeds 255 bytes, then it will not be
>possible to offload the packet to the NIC for segmentation." (STT RFC)
>In this case the packet needs to be segmented by us, before sending it.
>
>Signed-off-by: Paul-Daniel Boca 
>---
> datapath-windows/ovsext/Stt.c | 363
>++
> 1 file changed, 194 insertions(+), 169 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c
>index e8f33a9..ad322d2 100644
>--- a/datapath-windows/ovsext/Stt.c
>+++ b/datapath-windows/ovsext/Stt.c
>@@ -36,6 +36,8 @@
> #endif
> #define OVS_DBG_MOD OVS_DBG_STT
> 
>+#define OVS_MAX_STT_PACKET_LENGTH 0x1
>+#define OVS_MAX_STT_L4_OFFSET_LENGTH 0xFF
> 
> KSTART_ROUTINE OvsSttDefragCleaner;
> static PLIST_ENTRY OvsSttPktFragHash;
>@@ -157,6 +159,10 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> ULONG mss = 0;
> NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO lsoInfo;
> PVOID vlanTagValue;
>+ULONG tcpHeaderOffset = sizeof(EthHdr) + sizeof(IPHdr);
>+UINT32 encapMss = OvsGetExternalMtu(switchContext)
>+- sizeof(IPHdr)
>+- sizeof(TCPHdr);
> 
> curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
> 
>@@ -166,6 +172,24 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> 
> if (layers->isTcp) {
> mss = OVSGetTcpMSS(curNbl);
>+
>+curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
>+innerFrameLen = NET_BUFFER_DATA_LENGTH(curNb);
>+
>+/* If the length of the packet exceeds 64K or if the L4 offset is
>+   bigger than 255 bytes, then the packet cannot be offloaded to
>the
>+   network card */
>+if ((innerFrameLen > OVS_MAX_STT_PACKET_LENGTH) ||
>+(layers->l4Offset > OVS_MAX_STT_L4_OFFSET_LENGTH)) {
>+*newNbl = OvsTcpSegmentNBL(switchContext, curNbl, layers,
>+mss - headRoom, headRoom);
>+if (*newNbl == NULL) {
>+OVS_LOG_ERROR("Unable to segment NBL");
>+return NDIS_STATUS_FAILURE;
>+}
>+/* Clear out LSO flags after this point */
>+NET_BUFFER_LIST_INFO(*newNbl, TcpLargeSendNetBufferListInfo)
>= 0;
>+}
> }
> 
> vportStt = (POVS_STT_VPORT) GetOvsVportPriv(vport);
>@@ -175,164 +199,195 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> csumInfo.Value = NET_BUFFER_LIST_INFO(curNbl,
>  
>TcpIpChecksumNetBufferListInfo);
> vlanTagValue = NET_BUFFER_LIST_INFO(curNbl,
>Ieee8021QNetBufferListInfo);
>-*newNbl = OvsPartialCopyNBL(switchContext, curNbl, 0, headRoom,
>-FALSE /*copy NblInfo*/);
> if (*newNbl == NULL) {
>-OVS_LOG_ERROR("Unable to copy NBL");
>-return NDIS_STATUS_FAILURE;
>+*newNbl = OvsPartialCopyNBL(switchContext, curNbl, 0, headRoom,
>+FALSE /*copy NblInfo*/);
>+if (*newNbl == NULL) {
>+OVS_LOG_ERROR("Unable to copy NBL");
>+return NDIS_STATUS_FAILURE;
>+}
> }
>-
> curNbl = *newNbl;
>-curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
>-curMdl = NET_BUFFER_CURRENT_MDL(curNb);
>-/* NB Chain should be split before */
>-ASSERT(NET_BUFFER_NEXT_NB(curNb) == NULL);
>-innerFrameLen = NET_BUFFER_DATA_LENGTH(curNb);
>-
>-bufferStart = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl,
>-   LowPagePriority);
>-if (bufferStart == NULL) {
>-status = NDIS_STATUS_RESOURCES;
>-goto ret_error;
>-}
>-bufferStart += NET_BUFFER_CURRENT_MDL_OFFSET(curNb);
>-
>-if (layers->isIPv4) {
>-IPHdr *ip = (IPHdr *)(bufferStart + layers->l3Offset);
>-if (!ip->tot_len) {
>-ip->tot_len = htons(innerFrameLen - layers->l3Offset);
>+for (curNb = NET_BUFFER_LIST_FIRST_NB(curNbl); curNb != NULL;
>+curNb = curNb->Next) {
>+curMdl = NET_BUFFER_CURRENT_MDL(curNb);
>+innerFrameLen = NET_BUFFER_DATA_LENGTH(curNb);
>+bufferStart = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl,
>+ 
>LowPagePriority);
>+if (bufferStart == NULL) {
>+status = NDIS_STATUS_RESOURCES;
>+goto ret_error;
> }
>-if (!ip->check) {
>-ip->check = IPChecksum((UINT8 *)ip, ip->ihl * 4, 0);
>+bufferS

Re: [ovs-dev] [PATCH 4/9] datapath-windows: Fix bugs in Event.c around subscribe and lock

2016-07-18 Thread Sairam Venugopal
Hi Yin,

Thanks for reviewing this. (1) has been addressed in a different patch.
(2) We don¹t need the lock for OvsGetOpenInstance().

Thanks,
Sairam

On 7/18/16, 11:07 AM, "Yin Lin"  wrote:

>Thanks Sai for fixing the bugs. A few questions:
>
>1. There is also an unrelease lock in line 359, function
>OvsWaitEventIoctl.
>2. Do we need the lock before OvsGetOpenInstance? If so, please release
>the
>lock inside "if (instance == NULL)"; if not, you should do the same thing
>on line 359.
>
>
>
>
>On Wed, Jul 13, 2016 at 4:38 PM, Sairam Venugopal 
>wrote:
>
>> When userspace tries to resubscribe to an existing queue, return
>> STATUS_INVALID_PARAMETER since it's not supported. The current bug
>> overwrites status to STATUS_SUCCESS.
>>
>> The second bug fix is around releasing the EventQueue lock if an open
>> instance couldn't be found. The current version returns back without
>> releasing the lock. Moving the OvsAcquireEventQueueLock() after the
>> instance is verified.
>>
>> Signed-off-by: Sairam Venugopal 
>> ---
>>  datapath-windows/ovsext/Event.c | 6 ++
>>  1 file changed, 2 insertions(+), 4 deletions(-)
>>
>> diff --git a/datapath-windows/ovsext/Event.c
>> b/datapath-windows/ovsext/Event.c
>> index 8c7c3ec..8ff0322 100644
>> --- a/datapath-windows/ovsext/Event.c
>> +++ b/datapath-windows/ovsext/Event.c
>> @@ -217,9 +217,8 @@ OvsSubscribeEventIoctl(PFILE_OBJECT fileObject,
>>  if (queue->mask != request->mask) {
>>  status = STATUS_INVALID_PARAMETER;
>>  OVS_LOG_WARN("Can not chnage mask when the queue is
>> subscribed");
>> +goto done_event_subscribe;
>>  }
>> -status = STATUS_SUCCESS;
>> -goto done_event_subscribe;
>>  } else if (!request->subscribe && queue == NULL) {
>>  status = STATUS_SUCCESS;
>>  goto done_event_subscribe;
>> @@ -356,8 +355,6 @@ OvsWaitEventIoctl(PIRP irp,
>>  }
>>  poll = (POVS_EVENT_POLL)inputBuffer;
>>
>> -OvsAcquireEventQueueLock();
>> -
>>  instance = OvsGetOpenInstance(fileObject, poll->dpNo);
>>  if (instance == NULL) {
>>  OVS_LOG_TRACE("Exit: Can not find open instance, dpNo: %d",
>> @@ -365,6 +362,7 @@ OvsWaitEventIoctl(PIRP irp,
>>  return STATUS_INVALID_PARAMETER;
>>  }
>>
>> +OvsAcquireEventQueueLock();
>>  queue = (POVS_EVENT_QUEUE)instance->eventQueue;
>>  if (queue == NULL) {
>>  OVS_LOG_TRACE("Exit: Event queue does not exist");
>> --
>> 2.9.0.windows.1
>>
>> ___
>> dev mailing list
>> dev@openvswitch.org
>> 
>>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailm
>>an_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=
>>Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=_qUqkq3AbylbGTt0FRPDctPJYJN
>>u3r80SqmGYDgiNA4&s=HbFssXsaXxSrxCuEo36BQmPdk4BlTDTMpnC_OQkp_Ok&e=
>>
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=_qUqkq3AbylbGTt0FRPDctPJYJNu3r
>80SqmGYDgiNA4&s=HbFssXsaXxSrxCuEo36BQmPdk4BlTDTMpnC_OQkp_Ok&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 0/9] Add support for sending Conntrack events

2016-07-21 Thread Sairam Venugopal
Hi Alin,

That is true. I will remember to do this in future patches.

Thanks,
Sairam

On 7/21/16, 6:55 AM, "Alin Serdean" 
wrote:

>Hi Sai,
>
>
>
>Thanks a lot for the series.
>
>
>
>As a general comment could you please squash commits and have one per
>concept (I find them hard to follow):
>
>
>
>i.e. 1 and 3 
>(https://urldefense.proofpoint.com/v2/url?u=https-3A__patchwork.ozlabs.org
>_patch_648116_&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=eybt4o8VJX0HbeXExij2h0bnIiNvZ4
>taiXuS5vSNrGc&s=ynDG4u-5ZlRyJQY4gklQi0BpnxQQkphx9gapXREbF2s&e=  ,
>https://urldefense.proofpoint.com/v2/url?u=https-3A__patchwork.ozlabs.org_
>patch_648110_&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dcr
>uz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=eybt4o8VJX0HbeXExij2h0bnIiNvZ4t
>aiXuS5vSNrGc&s=W3wJa0-s3z-UnHt4f_dmgb7pHjNMEOpZaG4h3trlcf0&e=  ) can be a
>single commit since you are renaming events to vport_events
>
>2, 5 and maybe 8 can be a single commit as well since they are using the
>newly introduced NETLINK_NETFILTER, NETLINK_GENERIC.
>
>
>
>Thanks,
>
>Alin.
>
>
>
>> -Mesaj original-
>
>> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Sairam
>
>> Venugopal
>
>> Trimis: Thursday, July 14, 2016 2:38 AM
>
>> Către: dev@openvswitch.org
>
>> Subiect: [ovs-dev] [PATCH 0/9] Add support for sending Conntrack events
>
>> 
>
>> Send out events when a Conntrack entry is created or destroyed. The
>>events
>
>> can be listened using the netlink multicast subscription. Also fix few
>>bugs in
>
>> Event.c around event handling.
>
>> 
>
>> Sairam Venugopal (9):
>
>>   datapath-windows: Rename OVS_EVENT_ENTRY to
>
>> OVS_VPORT_EVENT_ENTRY
>
>>   datapath-windows: Add supported netlink family protocols to
>
>> NetlinkProto.h
>
>>   datapath-windows: Explicitly name vport related event to vportEvent
>
>>   datapath-windows: Fix bugs in Event.c around subscribe and lock
>
>>   datapath-windows: Define new multicast conntrack events
>
>>   datapath-windows: Modify OvsCreateNlMsgFromCtEntry to make it
>
>> reusable
>
>>   datapath-windows: Add support for multiple event queue in Event.c
>
>>   datapath-windows: Update OvsReadEventCmdHandler in Datapath.c to
>
>> support different events
>
>>   datapath-windows: Post Conntrack delete and new events
>
>> 
>
>>  datapath-windows/ovsext/Conntrack.c|  44 +++-
>
>>  datapath-windows/ovsext/Conntrack.h|   9 +
>
>>  datapath-windows/ovsext/Datapath.c |  81 +--
>
>>  datapath-windows/ovsext/Datapath.h |   3 +-
>
>>  datapath-windows/ovsext/DpInternal.h   |  25 ++-
>
>>  datapath-windows/ovsext/Event.c| 279
>>--
>
>> ---
>
>>  datapath-windows/ovsext/Event.h|  22 +-
>
>>  datapath-windows/ovsext/Netlink/NetlinkProto.h |   3 +
>
>>  datapath-windows/ovsext/Vport.c|  12 +-
>
>>  9 files changed, 383 insertions(+), 95 deletions(-)
>
>> 
>
>> --
>
>> 2.9.0.windows.1
>
>> 
>
>> ___
>
>> dev mailing list
>
>> dev@openvswitch.org
>
>> 
>>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailm
>>an_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=
>>Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=eybt4o8VJX0HbeXExij2h0bnIiN
>>vZ4taiXuS5vSNrGc&s=0zQo_zsVcWpwIeQB21s5d_UtiKCNYYKwF68s6l-sPJU&e=
>

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 4/9] datapath-windows: Fix bugs in Event.c around subscribe and lock

2016-07-21 Thread Sairam Venugopal
Hi Alin,

gOvsSwitchContext->dpNo and gOvsSwitchContext in general is currently read
in a lot of places without any locks being taken out.

Eg: - 
https://github.com/openvswitch/ovs/blob/15850211ce88d540e57a6f2fc80963465b9
a5475/datapath-windows/ovsext/Datapath.c#L973
https://github.com/openvswitch/ovs/blob/15850211ce88d540e57a6f2fc80963465b9
a5475/datapath-windows/ovsext/Datapath.c#L1420

The function OvsGetOpenInstance() is currently defined in Datapath.c and
only used by 2 methods in Event.c. If gOvsSwitchContext->dpNo was meant to
be read after acquiring a lock,  then we need to define a lock specific to
gOvsSwitchContext inside OvsGetOpenInstance() and not rely on EventQueue
lock to enforce it.

Thanks,
Sairam




On 7/21/16, 6:58 AM, "Alin Serdean" 
wrote:

>> -Mesaj original-
>
>> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Sairam
>
>> Venugopal
>
>> Trimis: Monday, July 18, 2016 9:27 PM
>
>> Către: Yin Lin 
>
>> Cc: dev@openvswitch.org
>
>> Subiect: Re: [ovs-dev] [PATCH 4/9] datapath-windows: Fix bugs in Event.c
>
>> around subscribe and lock
>
>> 
>
>> Hi Yin,
>
>> 
>
>> Thanks for reviewing this. (1) has been addressed in a different patch.
>
>> (2) We don¹t need the lock for OvsGetOpenInstance().
>
>[Alin Gabriel Serdean: ] we need a lock in OvsGetOpenInstance because:
>
>https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openvswitc
>h_ovs_blob_master_datapath-2Dwindows_ovsext_Datapath.c-23L527&d=CwIGaQ&c=S
>qcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dcruz40PROJ40ROzSpxyQSLw6fcrO
>WpJgEcEmNR3JEQ&m=TIfmnsdkLsgajJWRZp6fyWcW_1eXVWsfuqHqHzvVhiM&s=Lb5uwUvekGK
>ck_ubpcUaZVZkJMFEEgaBwQtbZVsD8vw&e=
>
>
>
>gOvsSwitchContext->dpNo

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 4/9] datapath-windows: Fix bugs in Event.c around subscribe and lock

2016-07-21 Thread Sairam Venugopal
Hi Yin,

I think you are confused about what this patch does. Or I may not be 
understanding this correctly.

As it stands, Event.c in OVS master has 2 bugs that I identified while looking 
at it.


  1.  OvsSubscribeEventIoctl - Subscribe function doesn’t set the right status 
parameter when queue is subscribed
  2.  OvsWaitEventIoctl - Releasing an acquired lock instead of simply 
returning back.

The 2nd bug in question is on line 359 in Event.c on master - 
https://github.com/openvswitch/ovs/blob/15850211ce88d540e57a6f2fc80963465b9a5475/datapath-windows/ovsext/Event.c#L359

And that’s exactly what this patch addresses. The only thing special about 
OvsWaitEventIoctl is that it has a bug that needed to be fixed before I 
modified it further with my original changes. I kept the bug fixes separate 
from the intended changes mainly because we can use this patch to address 
issues on ToT without being blocked on my other changes.

Thanks,
Sairam

From: Yin Lin mailto:yinli...@gmail.com>>
Date: Thursday, July 21, 2016 at 1:12 PM
To: Sairam Venugopal mailto:vsai...@vmware.com>>
Cc: "dev@openvswitch.org<mailto:dev@openvswitch.org>" 
mailto:dev@openvswitch.org>>
Subject: Re: [ovs-dev] [PATCH 4/9] datapath-windows: Fix bugs in Event.c around 
subscribe and lock

Can you refer me to the patch you fix the lock in line 359? I don't see why 
function OvsWaitEventIoctl is so special that we need to fix it in another 
patch. It is the same thing as other places you fixed so it's better to address 
them together..

On Mon, Jul 18, 2016 at 11:27 AM, Sairam Venugopal 
mailto:vsai...@vmware.com>> wrote:
Hi Yin,

Thanks for reviewing this. (1) has been addressed in a different patch.
(2) We don¹t need the lock for OvsGetOpenInstance().

Thanks,
Sairam

On 7/18/16, 11:07 AM, "Yin Lin" mailto:yinli...@gmail.com>> 
wrote:

>Thanks Sai for fixing the bugs. A few questions:
>
>1. There is also an unrelease lock in line 359, function
>OvsWaitEventIoctl.
>2. Do we need the lock before OvsGetOpenInstance? If so, please release
>the
>lock inside "if (instance == NULL)"; if not, you should do the same thing
>on line 359.
>
>
>
>
>On Wed, Jul 13, 2016 at 4:38 PM, Sairam Venugopal 
>mailto:vsai...@vmware.com>>
>wrote:
>
>> When userspace tries to resubscribe to an existing queue, return
>> STATUS_INVALID_PARAMETER since it's not supported. The current bug
>> overwrites status to STATUS_SUCCESS.
>>
>> The second bug fix is around releasing the EventQueue lock if an open
>> instance couldn't be found. The current version returns back without
>> releasing the lock. Moving the OvsAcquireEventQueueLock() after the
>> instance is verified.
>>
>> Signed-off-by: Sairam Venugopal 
>> mailto:vsai...@vmware.com>>
>> ---
>>  datapath-windows/ovsext/Event.c | 6 ++
>>  1 file changed, 2 insertions(+), 4 deletions(-)
>>
>> diff --git a/datapath-windows/ovsext/Event.c
>> b/datapath-windows/ovsext/Event.c
>> index 8c7c3ec..8ff0322 100644
>> --- a/datapath-windows/ovsext/Event.c
>> +++ b/datapath-windows/ovsext/Event.c
>> @@ -217,9 +217,8 @@ OvsSubscribeEventIoctl(PFILE_OBJECT fileObject,
>>  if (queue->mask != request->mask) {
>>  status = STATUS_INVALID_PARAMETER;
>>  OVS_LOG_WARN("Can not chnage mask when the queue is
>> subscribed");
>> +goto done_event_subscribe;
>>  }
>> -status = STATUS_SUCCESS;
>> -goto done_event_subscribe;
>>  } else if (!request->subscribe && queue == NULL) {
>>  status = STATUS_SUCCESS;
>>  goto done_event_subscribe;
>> @@ -356,8 +355,6 @@ OvsWaitEventIoctl(PIRP irp,
>>  }
>>  poll = (POVS_EVENT_POLL)inputBuffer;
>>
>> -OvsAcquireEventQueueLock();
>> -
>>  instance = OvsGetOpenInstance(fileObject, poll->dpNo);
>>  if (instance == NULL) {
>>  OVS_LOG_TRACE("Exit: Can not find open instance, dpNo: %d",
>> @@ -365,6 +362,7 @@ OvsWaitEventIoctl(PIRP irp,
>>  return STATUS_INVALID_PARAMETER;
>>  }
>>
>> +OvsAcquireEventQueueLock();
>>  queue = (POVS_EVENT_QUEUE)instance->eventQueue;
>>  if (queue == NULL) {
>>  OVS_LOG_TRACE("Exit: Event queue does not exist");
>> --
>> 2.9.0.windows.1
>>
>> ___
>> dev mailing list
>> dev@openvswitch.org<mailto:dev@openvswitch.org>
>>
>>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailm
>>an_listinfo_dev&d=CwIGaQ

Re: [ovs-dev] [PATCH 5/9] datapath-windows: Define new multicast conntrack events

2016-07-22 Thread Sairam Venugopal
Yes, I wanted to keep it similar to the VPORT events:

enum {
OVS_EVENT_CONNECT   = ((uint32_t)0x1 << 0),
OVS_EVENT_DISCONNECT= ((uint32_t)0x1 << 1),
OVS_EVENT_LINK_UP   = ((uint32_t)0x1 << 2),
OVS_EVENT_LINK_DOWN = ((uint32_t)0x1 << 3),
OVS_EVENT_MAC_CHANGE= ((uint32_t)0x1 << 4),
OVS_EVENT_MTU_CHANGE= ((uint32_t)0x1 << 5),
OVS_EVENT_MASK_ALL  = 0x3f,
};




As you can see, we need to update these EVENT_FOO to EVENT_VPORT_FOO.


On 7/22/16, 10:11 AM, "Alin Serdean" 
wrote:

>Looks good just one question inlined.
>
>
>
>> -Mesaj original-
>
>> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Sairam
>
>> Venugopal
>
>> Trimis: Thursday, July 14, 2016 2:39 AM
>
>> Către: dev@openvswitch.org
>
>> Subiect: [ovs-dev] [PATCH 5/9] datapath-windows: Define new multicast
>
>> conntrack events
>
>> 
>
>> Define new Conntrack events (new and delete) and add support for
>
>> subscribing to these events. Parse out OVS_NL_ATTR_MCAST_GRP and
>
>> store it as part of OVS_EVENT_SUBSCRIBE structure.
>
>> 
>
>> Signed-off-by: Sairam Venugopal 
>
>> ---
>
>>  datapath-windows/ovsext/Datapath.c   | 21 ++---
>
>>  datapath-windows/ovsext/Datapath.h   |  3 ++-
>
>>  datapath-windows/ovsext/DpInternal.h | 15 +++
>
>>  3 files changed, 35 insertions(+), 4 deletions(-)
>
>> 
>
> 
>
>> +enum {
>
>> +OVS_EVENT_CT_NEW= ((uint32_t)0x1 << 0),
>
>> +OVS_EVENT_CT_DELETE = ((uint32_t)0x1 << 1),
>
>> +OVS_EVENT_CT_MASK_ALL   = 0x3
>
>
>
>[Alin Gabriel Serdean: ] Any particular reason for not using: 1 << 0, 1
><< 1, 1 << 2, etc?
>
>> +};
>
>> +
>
>> +/* Supported mcast event groups */
>
>> +enum OVS_MCAST_EVENT_ENTRIES {
>
>> +OVS_MCAST_VPORT_EVENT,
>
>> +OVS_MCAST_CT_EVENT,
>
>> +__OVS_MCAST_EVENT_ENTRIES_MAX
>
>> +};
>
>> +#define OVS_MCAST_EVENT_ENTRIES_MAX
>
>> (__OVS_MCAST_EVENT_ENTRIES_MAX -
>
>> +OVS_MCAST_VPORT_EVENT)
>
>> 
>
>>  typedef struct _OVS_VPORT_EVENT_ENTRY {
>
>>  UINT32 portNo;
>
>> --
>
>> 2.9.0.windows.1
>
>> 
>
>> ___
>
>> dev mailing list
>
>> dev@openvswitch.org
>
>> 
>>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailm
>>an_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=
>>Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=iSTxSaNGMjpm4rJ9g61SytrFDZZ
>>UmN9pPUtTtra_Jio&s=C57tzRDXzgUTFoJQMs5YrgcOVl_5UQLicoBzRg2b7lI&e=
>

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 4/9] datapath-windows: Fix bugs in Event.c around subscribe and lock

2016-07-22 Thread Sairam Venugopal
Yes, I was also thinking of using the gOvsSwitchContext->dispatchLock to
keep it safe. 

That said, we would want to do the following:
1) Add this to OvsGetOpenInstance()
2) Update all unsafe usages of gOvsSwitchContext to either use
OvsGetOpenInstance() or acquire gOvsSwitchContext->dispatchLock.

I will file a bug for this and follow it up.

Thanks,
Sairam

On 7/22/16, 9:57 AM, "Alin Serdean" 
wrote:

>The idea is dpNo could change in odd circumstances.
>
>
>
>We could use gOvsSwitchContext->dispatchLock and make OvsGetOpenInstance
>safe by itself.
>
>
>
>Thanks,
>
>Alin.
>
>
>
>> -Mesaj original-
>
>> De la: Sairam Venugopal [mailto:vsai...@vmware.com]
>
>> Trimis: Thursday, July 21, 2016 9:52 PM
>
>> Către: Alin Serdean ; Yin Lin
>
>> 
>
>> Cc: dev@openvswitch.org
>
>> Subiect: Re: [ovs-dev] [PATCH 4/9] datapath-windows: Fix bugs in Event.c
>
>> around subscribe and lock
>
>> 
>
>> Hi Alin,
>
>> 
>
>> gOvsSwitchContext->dpNo and gOvsSwitchContext in general is currently
>
>> gOvsSwitchContext->read
>
>> in a lot of places without any locks being taken out.
>
>> 
>
>> Eg: -
>
>> 
>>https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openvswit
>>ch_ovs_blob_15850211ce88d540e57a6f2fc8096&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKI
>>iDJAXVeAw-YihVMNtXt-uEs&r=Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=3
>>u3GI2uiqwVsds-qnZQrKxEq0hIgf5QgkFs4Fgq_9a4&s=HXq_96fjf6h_3PgWBQMt342vsEcd
>>J4gwQL12akeRGao&e=
>
>> 3465b9
>
>> a5475/datapath-windows/ovsext/Datapath.c#L973
>
>> 
>>https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openvswit
>>ch_ovs_blob_15850211ce88d540e57a6f2fc8096&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKI
>>iDJAXVeAw-YihVMNtXt-uEs&r=Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=3
>>u3GI2uiqwVsds-qnZQrKxEq0hIgf5QgkFs4Fgq_9a4&s=HXq_96fjf6h_3PgWBQMt342vsEcd
>>J4gwQL12akeRGao&e=
>
>> 3465b9
>
>> a5475/datapath-windows/ovsext/Datapath.c#L1420
>
>> 
>
>> The function OvsGetOpenInstance() is currently defined in Datapath.c and
>
>> only used by 2 methods in Event.c. If gOvsSwitchContext->dpNo was meant
>
>> to be read after acquiring a lock,  then we need to define a lock
>>specific to
>
>> gOvsSwitchContext inside OvsGetOpenInstance() and not rely on
>
>> EventQueue lock to enforce it.
>
>> 
>
>> Thanks,
>
>> Sairam
>
>> 
>
>> 
>
>> 
>
>> 
>
>> On 7/21/16, 6:58 AM, "Alin Serdean" 
>
>> wrote:
>
>> 
>
>> >> -Mesaj original-
>
>> >
>
>> >> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Sairam
>
>> >
>
>> >> Venugopal
>
>> >
>
>> >> Trimis: Monday, July 18, 2016 9:27 PM
>
>> >
>
>> >> Către: Yin Lin 
>
>> >
>
>> >> Cc: dev@openvswitch.org
>
>> >
>
>> >> Subiect: Re: [ovs-dev] [PATCH 4/9] datapath-windows: Fix bugs in
>
>> >> Event.c
>
>> >
>
>> >> around subscribe and lock
>
>> >
>
>> >>
>
>> >
>
>> >> Hi Yin,
>
>> >
>
>> >>
>
>> >
>
>> >> Thanks for reviewing this. (1) has been addressed in a different
>>patch.
>
>> >
>
>> >> (2) We don¹t need the lock for OvsGetOpenInstance().
>
>> >
>
>> >[Alin Gabriel Serdean: ] we need a lock in OvsGetOpenInstance because:
>
>> >
>
>> >https://urldefense.proofpoint.com/v2/url?u=https-
>
>> 3A__github.com_openvsw
>
>> >itc
>
>> >h_ovs_blob_master_datapath-2Dwindows_ovsext_Datapath.c-
>
>> 23L527&d=CwIGaQ&
>
>> >c=S
>
>> >qcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-
>
>> uEs&r=Dcruz40PROJ40ROzSpxyQSLw6f
>
>> >crO
>
>> >WpJgEcEmNR3JEQ&m=TIfmnsdkLsgajJWRZp6fyWcW_1eXVWsfuqHqHzvVhi
>
>> M&s=Lb5uwUve
>
>> >kGK
>
>> >ck_ubpcUaZVZkJMFEEgaBwQtbZVsD8vw&e=
>
>> >
>
>> >
>
>> >
>
>> >gOvsSwitchContext->dpNo
>
>
>

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 5/9] datapath-windows: Define new multicast conntrack events

2016-07-25 Thread Sairam Venugopal
I will update the current one and make a note to update VPORT usage as
well.

On 7/22/16, 5:59 PM, "Alin Serdean" 
wrote:

>It looks like a mistake was done when setting them up, don't know if it
>such a good idea to propagate it.
>
>Thanks,
>Alin.
>
>> -----Mesaj original-
>> De la: Sairam Venugopal [mailto:vsai...@vmware.com]
>> Trimis: Friday, July 22, 2016 11:15 PM
>> Către: Alin Serdean ;
>> dev@openvswitch.org
>> Subiect: Re: [ovs-dev] [PATCH 5/9] datapath-windows: Define new
>>multicast
>> conntrack events
>> 
>> Yes, I wanted to keep it similar to the VPORT events:
>> 
>> enum {
>> OVS_EVENT_CONNECT   = ((uint32_t)0x1 << 0),
>> OVS_EVENT_DISCONNECT= ((uint32_t)0x1 << 1),
>> OVS_EVENT_LINK_UP   = ((uint32_t)0x1 << 2),
>> OVS_EVENT_LINK_DOWN = ((uint32_t)0x1 << 3),
>> OVS_EVENT_MAC_CHANGE= ((uint32_t)0x1 << 4),
>> OVS_EVENT_MTU_CHANGE= ((uint32_t)0x1 << 5),
>> OVS_EVENT_MASK_ALL  = 0x3f,
>> };
>> 
>> 
>> 
>> 
>> As you can see, we need to update these EVENT_FOO to
>> EVENT_VPORT_FOO.
>> 
>> 
>> On 7/22/16, 10:11 AM, "Alin Serdean" 
>> wrote:
>> 
>> >Looks good just one question inlined.
>> >
>> >
>> >
>> >> -Mesaj original-
>> >
>> >> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Sairam
>> >
>> >> Venugopal
>> >
>> >> Trimis: Thursday, July 14, 2016 2:39 AM
>> >
>> >> Către: dev@openvswitch.org
>> >
>> >> Subiect: [ovs-dev] [PATCH 5/9] datapath-windows: Define new multicast
>> >
>> >> conntrack events
>> >
>> >>
>> >
>> >> Define new Conntrack events (new and delete) and add support for
>> >
>> >> subscribing to these events. Parse out OVS_NL_ATTR_MCAST_GRP and
>> >
>> >> store it as part of OVS_EVENT_SUBSCRIBE structure.
>> >
>> >>
>> >
>> >> Signed-off-by: Sairam Venugopal 
>> >
>> >> ---
>> >
>> >>  datapath-windows/ovsext/Datapath.c   | 21 ++---
>> >
>> >>  datapath-windows/ovsext/Datapath.h   |  3 ++-
>> >
>> >>  datapath-windows/ovsext/DpInternal.h | 15 +++
>> >
>> >>  3 files changed, 35 insertions(+), 4 deletions(-)
>> >
>> >>
>> >
>> >
>> >
>> >> +enum {
>> >
>> >> +OVS_EVENT_CT_NEW= ((uint32_t)0x1 << 0),
>> >
>> >> +OVS_EVENT_CT_DELETE = ((uint32_t)0x1 << 1),
>> >
>> >> +OVS_EVENT_CT_MASK_ALL   = 0x3
>> >
>> >
>> >
>> >[Alin Gabriel Serdean: ] Any particular reason for not using: 1 << 0, 1
>> ><< 1, 1 << 2, etc?
>> >
>> >> +};
>> >
>> >> +
>> >
>> >> +/* Supported mcast event groups */
>> >
>> >> +enum OVS_MCAST_EVENT_ENTRIES {
>> >
>> >> +OVS_MCAST_VPORT_EVENT,
>> >
>> >> +OVS_MCAST_CT_EVENT,
>> >
>> >> +__OVS_MCAST_EVENT_ENTRIES_MAX
>> >
>> >> +};
>> >
>> >> +#define OVS_MCAST_EVENT_ENTRIES_MAX
>> >
>> >> (__OVS_MCAST_EVENT_ENTRIES_MAX -
>> >
>> >> +OVS_MCAST_VPORT_EVENT)
>> >
>> >>
>> >
>> >>  typedef struct _OVS_VPORT_EVENT_ENTRY {
>> >
>> >>  UINT32 portNo;
>> >
>> >> --
>> >
>> >> 2.9.0.windows.1
>> >
>> >>
>> >
>> >> ___
>> >
>> >> dev mailing list
>> >
>> >> dev@openvswitch.org
>> >
>> >>
>> >>https://urldefense.proofpoint.com/v2/url?u=http-
>> 3A__openvswitch.org_ma
>> >>ilm
>> >>an_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-
>> YihVMNtXt-uEs
>> >>&r=
>> >>Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=iSTxSaNGMjpm
>> 4rJ9g61SytrF
>> >>DZZ
>> UmN9pPUtTtra_Jio&s=C57tzRDXzgUTFoJQMs5YrgcOVl_5UQLicoBzRg2b7lI&e
>> =
>> >
>

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 7/9] datapath-windows: Add support for multiple event queue in Event.c

2016-07-25 Thread Sairam Venugopal
I added the padding to keep the sizeof(OVS_CT_EVENT_ENTRY) ==
sizeof(OVS_VPORT_EVENT_ENTRY)


I should have sent this as part of Patch 0. This is the general idea:

1. Currently we only support subscribing/unsubscribing to Vport related
events. Even for VPORT, we only care about the VPORT-Down event.
2. Event.c maintains a single queue of Event entries that are then read by
user space. This worked because we only supported 1 event type.
3. In order to add support for multiple events, I modified the event queue
into an array (size 2). The size of the event queue array is driven by
value of enum (we explicitly add new event types here).
4. I decided to make Event Queue an array to avoid creating new ones for
every event type. This also meant smaller code changes and not having
multiple if-else in the code.
5. Each event queue can be uniquely identified based on the mcast
EventType and hence the requirement for multiple locks based on the event
id.
6. Though we may not have multiple event queues subscribed for 1 socket, I
still wanted to ensure that we have support for it if it were ever
requested.
7. Each event type will be added to the underlying enum and subtypes can
be represent by means of masks (eg: vport up/down, ct delete/add/update
etc.,)
/* Supported mcast event groups */
enum OVS_MCAST_EVENT_ENTRIES {
OVS_MCAST_VPORT_EVENT,
OVS_MCAST_CT_EVENT,
__OVS_MCAST_EVENT_ENTRIES_MAX
};


I hope this clarifies the questions.

Thanks,
Sairam

On 7/22/16, 6:10 PM, "Alin Serdean" 
wrote:

>Looks good. Just a few questions from my side so I get up to speed with
>the changes in events.
>Why do we need a lock per eventid ?
>
>> +typedef struct _OVS_CT_EVENT_ENTRY {
>> +OVS_CT_ENTRY entry;
>> +UINT8 type;
>> +UINT64 pad[10];
>> +} OVS_CT_EVENT_ENTRY, *POVS_CT_EVENT_ENTRY;
>
>Why such a big pad?
>
>Thanks,
>Alin.
>
>> -Mesaj original-
>> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Sairam
>> Venugopal
>> Trimis: Thursday, July 14, 2016 2:39 AM
>> Către: dev@openvswitch.org
>> Subiect: [ovs-dev] [PATCH 7/9] datapath-windows: Add support for
>>multiple
>> event queue in Event.c
>> 
>> Update Event.c to have multiple event queues and mechanism to retrieve
>> the associated queue. Introduce OvsPostCtEvent and
>> OvsRemoveCtEventEntry similar to OvsPostVportEvent and
>> OvsRemoveVportEventEntry.

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH] Windows: daemon-windows lockfile

2016-07-25 Thread Sairam Venugopal

Acked-by: Sairam Venugopal 



On 7/25/16, 2:58 PM, "Alin Serdean" 
wrote:

>_get_osfhandle returns an errno value not a GetLastErrorValue.
>(https://urldefense.proofpoint.com/v2/url?u=https-3A__msdn.microsoft.com_e
>n-2Dus_library_ks2530z6-28v-3Dvs.120-29.aspx&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67L
>KIiDJAXVeAw-YihVMNtXt-uEs&r=Dcruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=
>eoYj3TrkB5OnllBARR7u9dbNPOyruvsz_ohCjrjgEOw&s=9zmLE02fla7YB6YcWaovbvNeztub
>j-5OUN9HKBgVcJA&e= )
>
>Signed-off-by: Alin Gabriel Serdean 
>---
> lib/daemon-windows.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
>diff --git a/lib/daemon-windows.c b/lib/daemon-windows.c
>index d77724e..7e2e9da 100644
>--- a/lib/daemon-windows.c
>+++ b/lib/daemon-windows.c
>@@ -417,7 +417,7 @@ flock(FILE* fd, int operation)
> hFile = (HANDLE)_get_osfhandle(fileno(fd));
> if (hFile == INVALID_HANDLE_VALUE) {
> VLOG_FATAL("Failed to get PID file handle (%s).",
>-   ovs_lasterror_to_string());
>+   ovs_strerror(errno));
> }
> 
> if (operation & LOCK_UNLOCK) {
>-- 
>1.9.5.msysgit.0
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=eoYj3TrkB5OnllBARR7u9dbNPOyruv
>sz_ohCjrjgEOw&s=T2gQ2b0DClEq6c2UUOB6zlJxRbj2v_lBydDR_CNtS2Y&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH 8/9] datapath-windows: Update OvsReadEventCmdHandler in Datapath.c to support different events

2016-07-25 Thread Sairam Venugopal
Will address this in v2.

Thanks,
Sairam

On 7/22/16, 6:20 PM, "Alin Serdean" 
wrote:

>Just one comment inlined.
>
>
>
>> -Mesaj original-
>
>> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Sairam
>
>> Venugopal
>
>> Trimis: Thursday, July 14, 2016 2:39 AM
>
>> Către: dev@openvswitch.org
>
>> Subiect: [ovs-dev] [PATCH 8/9] datapath-windows: Update
>
>> OvsReadEventCmdHandler in Datapath.c to support different events
>
>> 
>
>> OvsReadEventCmdHandler must now reflect the right event being read. If
>
>> the event is a Conntrack related event, then convert the entry to
>>netlink
>
>> format and send it to userspace. If it's Vport event, retain the
>>existing
>
>> workflow.
>
>> 
>
>> Signed-off-by: Sairam Venugopal 
>
>> ---
>
>>  datapath-windows/ovsext/Datapath.c | 59
>
>> +-
>
>>  1 file changed, 45 insertions(+), 14 deletions(-)
>
>> 
>
>> diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-
>
>> windows/ovsext/Datapath.c
>
>> index a5a0b35..fff788a 100644
>
>> --- a/datapath-windows/ovsext/Datapath.c
>
>> +++ b/datapath-windows/ovsext/Datapath.c
>
>> @@ -1674,7 +1674,6 @@
>
>> OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>
>> #endif
>
>>  NL_BUFFER nlBuf;
>
>>  NTSTATUS status;
>
>> -OVS_VPORT_EVENT_ENTRY eventEntry;
>
>> 
>
>>  ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
>
>> 
>
>> @@ -1687,21 +1686,53 @@
>
>> OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>
>>  /* Output buffer has been validated while validating read dev op.
>>*/
>
>>  ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof
>
>> *msgOut);
>
>> 
>
>> -NlBufInit(&nlBuf, usrParamsCtx->outputBuffer, usrParamsCtx-
>
>> >outputLength);
>
>> +if (instance->protocol == NETLINK_NETFILTER) {
>
>> +if (!instance->mcastMask) {
>
>> +status = STATUS_SUCCESS;
>
>> +*replyLen = 0;
>
>> +goto cleanup;
>
>> +}
>
>> 
>
>> -/* remove an event entry from the event queue */
>
>> -status = OvsRemoveVportEventEntry(usrParamsCtx->ovsInstance,
>
>> -  &eventEntry);
>
>> -if (status != STATUS_SUCCESS) {
>
>> -/* If there were not elements, read should return no data. */
>
>> -status = STATUS_SUCCESS;
>
>> -*replyLen = 0;
>
>> -goto cleanup;
>
>> -}
>
>> +OVS_CT_EVENT_ENTRY ctEventEntry;
>
>> +status = OvsRemoveCtEventEntry(usrParamsCtx->ovsInstance,
>
>> + &ctEventEntry);
>
>> 
>
>> -status = OvsPortFillInfo(usrParamsCtx, &eventEntry, &nlBuf);
>
>> -if (status == NDIS_STATUS_SUCCESS) {
>
>> -*replyLen = NlBufSize(&nlBuf);
>
>> +if (status != STATUS_SUCCESS) {
>
>> +/* If there were not elements, read should return no data.
>>*/
>
>> +status = STATUS_SUCCESS;
>
>> +*replyLen = 0;
>
>> +goto cleanup;
>
>> +}
>
>> +
>
>> +status = OvsCreateNlMsgFromCtEntry(&ctEventEntry.entry,
>
>> +   usrParamsCtx->outputBuffer,
>
>> +   usrParamsCtx->outputLength,
>
>> +   ctEventEntry.type,
>
>> +   0,
>
>[Alin Gabriel Serdean: ] Why hard zero for the sequence instead of using
>the input
>
>> +   
>>usrParamsCtx->ovsInstance->pid,
>
>> +   NFNETLINK_V0,
>
>> +   0);
>
>[Alin Gabriel Serdean: ] Again why hard use of constants for the reply
>message?
>
>> +if (status == NDIS_STATUS_SUCCESS) {
>
>> +*replyLen = msgOut->nlMsg.nlmsgLen;
>
>> +}
>
>> +} else if (instance->protocol == NETLINK_GENERIC) {
>
>> +NlBufInit(&nlBuf, usrParamsCtx->outputBuffer,
>
>> + usrParamsCtx->outputLength);
>
>> +
>
>> +OVS_VPORT_EVENT_ENTRY eventEntry;
>
>> +/* remove vport event e

[ovs-dev] [PATCH v2 2/7] datapath-windows: Fix bugs in Event.c around subscribe and lock

2016-07-25 Thread Sairam Venugopal
When userspace tries to resubscribe to an existing queue, return
STATUS_INVALID_PARAMETER since it's not supported. The current bug
overwrites status to STATUS_SUCCESS.

The second bug fix is around releasing the EventQueue lock if an open
instance couldn't be found. The current version returns back without
releasing the lock. Moving the OvsAcquireEventQueueLock() after the
instance is verified.

OvsGetOpenInstance does not enforce a safe read for
gOvsSwitchContext->dpNo. Use the gOvsSwitchContext->dispatchLock for
accessing the parameter.

v2: Address review comments from Alin Serdean and Yin Lin (around keeping
OvsGetOpenInstance safe).

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Datapath.c | 7 ++-
 datapath-windows/ovsext/Event.c| 6 ++
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index e4d6ab1..75f133a 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -521,12 +521,17 @@ POVS_OPEN_INSTANCE
 OvsGetOpenInstance(PFILE_OBJECT fileObject,
UINT32 dpNo)
 {
+LOCK_STATE_EX lockState;
 POVS_OPEN_INSTANCE instance = (POVS_OPEN_INSTANCE)fileObject->FsContext;
 ASSERT(instance);
 ASSERT(instance->fileObject == fileObject);
+NdisAcquireRWLockWrite(gOvsSwitchContext->dispatchLock, &lockState, 0);
+
 if (gOvsSwitchContext->dpNo != dpNo) {
-return NULL;
+instance = NULL;
 }
+
+NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
 return instance;
 }
 
diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index 8c7c3ec..8ff0322 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -217,9 +217,8 @@ OvsSubscribeEventIoctl(PFILE_OBJECT fileObject,
 if (queue->mask != request->mask) {
 status = STATUS_INVALID_PARAMETER;
 OVS_LOG_WARN("Can not chnage mask when the queue is subscribed");
+goto done_event_subscribe;
 }
-status = STATUS_SUCCESS;
-goto done_event_subscribe;
 } else if (!request->subscribe && queue == NULL) {
 status = STATUS_SUCCESS;
 goto done_event_subscribe;
@@ -356,8 +355,6 @@ OvsWaitEventIoctl(PIRP irp,
 }
 poll = (POVS_EVENT_POLL)inputBuffer;
 
-OvsAcquireEventQueueLock();
-
 instance = OvsGetOpenInstance(fileObject, poll->dpNo);
 if (instance == NULL) {
 OVS_LOG_TRACE("Exit: Can not find open instance, dpNo: %d",
@@ -365,6 +362,7 @@ OvsWaitEventIoctl(PIRP irp,
 return STATUS_INVALID_PARAMETER;
 }
 
+OvsAcquireEventQueueLock();
 queue = (POVS_EVENT_QUEUE)instance->eventQueue;
 if (queue == NULL) {
 OVS_LOG_TRACE("Exit: Event queue does not exist");
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH v2 0/7] Windows: Add support for sending Conntrack events

2016-07-25 Thread Sairam Venugopal
Add support for sending out Conntrack events on Windows (if subscribed). This 
meant adding support for handling multiple event queues.

v2: Address review comments and squashed the 9 series patch to 7.

The following gives an overview of the design:
1. Currently we only support subscribing/unsubscribing to Vport related events.
2. Event.c maintains a single queue of Event entries that are then read by user 
space.
3. In order to add support for multiple events, I modified the event queue into 
an array (size 2). The size of the event queue array is driven by value of enum 
(we explicitly add new event types here).
4. I decided to make Event Queue an array to avoid creating new ones for every 
event type. This also meant smaller code changes and not having multiple 
if-else in the code.
5. Each event queue can be uniquely identified based on the mcast EventType and 
hence the requirement for multiple locks based on the event type.
6. Though we may not have multiple event queues subscribed for 1 socket, I 
still wanted to ensure that we have support for it if it were ever requested.
7. In future, as we add support for new events, we can add it to the enum 
OVS_MCAST_EVENT_TYPES and subtypes can be represent by means of masks (eg: 
vport up/down, ct delete/add/update etc.,)



Sairam Venugopal (7):
  datapath-windows: Explicitly name vport related event to vportEvent
  datapath-windows: Fix bugs in Event.c around subscribe and lock
  datapath-windows: Define new multicast conntrack events and netlink
protocol
  datapath-windows: Modify OvsCreateNlMsgFromCtEntry to make it reusable
  datapath-windows: Add support for multiple event queue in Event.c
  datapath-windows: Update OvsReadEventCmdHandler in Datapath.c to
support different events
  datapath-windows: Post Conntrack delete and new events

 datapath-windows/ovsext/Conntrack.c|  44 +++-
 datapath-windows/ovsext/Conntrack.h|   9 +
 datapath-windows/ovsext/Datapath.c |  95 +++--
 datapath-windows/ovsext/Datapath.h |   3 +-
 datapath-windows/ovsext/DpInternal.h   |  26 ++-
 datapath-windows/ovsext/Event.c| 279 -
 datapath-windows/ovsext/Event.h|  22 +-
 datapath-windows/ovsext/Netlink/NetlinkProto.h |   3 +
 datapath-windows/ovsext/Vport.c|  12 +-
 9 files changed, 395 insertions(+), 98 deletions(-)

-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH v2 6/7] datapath-windows: Update OvsReadEventCmdHandler in Datapath.c to support different events

2016-07-25 Thread Sairam Venugopal
OvsReadEventCmdHandler must now reflect the right event being read. If the
event is a Conntrack related event, then convert the entry to netlink
format and send it to userspace. If it's Vport event, retain the existing
workflow.

v2: Address review comments from Alin Serdean (Not default values to 0 and
instead read from msgIn). Added Acked-By

Signed-off-by: Sairam Venugopal 
Acked-by: Paul Boca 
---
 datapath-windows/ovsext/Datapath.c | 66 +-
 1 file changed, 50 insertions(+), 16 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index f9f965c..745cdb6 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1672,14 +1672,12 @@ static NTSTATUS
 OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
UINT32 *replyLen)
 {
-#ifdef DBG
 POVS_MESSAGE msgOut = (POVS_MESSAGE)usrParamsCtx->outputBuffer;
+POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
 POVS_OPEN_INSTANCE instance =
 (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
-#endif
 NL_BUFFER nlBuf;
 NTSTATUS status;
-OVS_VPORT_EVENT_ENTRY eventEntry;
 
 ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
 
@@ -1692,21 +1690,57 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 /* Output buffer has been validated while validating read dev op. */
 ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof *msgOut);
 
-NlBufInit(&nlBuf, usrParamsCtx->outputBuffer, usrParamsCtx->outputLength);
+if (instance->protocol == NETLINK_NETFILTER) {
+if (!instance->mcastMask) {
+status = STATUS_SUCCESS;
+*replyLen = 0;
+goto cleanup;
+}
 
-/* remove an event entry from the event queue */
-status = OvsRemoveVportEventEntry(usrParamsCtx->ovsInstance,
-  &eventEntry);
-if (status != STATUS_SUCCESS) {
-/* If there were not elements, read should return no data. */
-status = STATUS_SUCCESS;
-*replyLen = 0;
-goto cleanup;
-}
+OVS_CT_EVENT_ENTRY ctEventEntry;
+status = OvsRemoveCtEventEntry(usrParamsCtx->ovsInstance,
+   &ctEventEntry);
 
-status = OvsPortFillInfo(usrParamsCtx, &eventEntry, &nlBuf);
-if (status == NDIS_STATUS_SUCCESS) {
-*replyLen = NlBufSize(&nlBuf);
+if (status != STATUS_SUCCESS) {
+/* If there were not elements, read should return no data. */
+status = STATUS_SUCCESS;
+*replyLen = 0;
+goto cleanup;
+}
+
+status = OvsCreateNlMsgFromCtEntry(&ctEventEntry.entry,
+   usrParamsCtx->outputBuffer,
+   usrParamsCtx->outputLength,
+   ctEventEntry.type,
+   msgIn->nlMsg.nlmsgSeq,
+   usrParamsCtx->ovsInstance->pid,
+   NFNETLINK_V0,
+   gOvsSwitchContext->dpNo);
+if (status == NDIS_STATUS_SUCCESS) {
+*replyLen = msgOut->nlMsg.nlmsgLen;
+}
+} else if (instance->protocol == NETLINK_GENERIC) {
+NlBufInit(&nlBuf,
+  usrParamsCtx->outputBuffer,
+  usrParamsCtx->outputLength);
+
+OVS_VPORT_EVENT_ENTRY eventEntry;
+/* remove vport event entry from the vport event queue */
+status = OvsRemoveVportEventEntry(usrParamsCtx->ovsInstance,
+  &eventEntry);
+if (status != STATUS_SUCCESS) {
+/* If there were not elements, read should return no data. */
+status = STATUS_SUCCESS;
+*replyLen = 0;
+goto cleanup;
+}
+
+status = OvsPortFillInfo(usrParamsCtx, &eventEntry, &nlBuf);
+if (status == NDIS_STATUS_SUCCESS) {
+*replyLen = NlBufSize(&nlBuf);
+}
+} else {
+status = STATUS_INVALID_PARAMETER;
 }
 
 cleanup:
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH v2 1/7] datapath-windows: Explicitly name vport related event to vportEvent

2016-07-25 Thread Sairam Venugopal
OVS_EVENT_ENTRY currently handles only Vport related events. Updating the
name of the struct to OVS_VPORT_EVENT_ENTRY. Remove OVS_EVENT_STATUS since
it's currently not in use. Update the datapath to refer to events as
vportEvents. This will aid in the introduction of other events.

v2: Squash 1/9 and 3/9 into one commit. Added Acked-by.

Signed-off-by: Sairam Venugopal 
Acked-By: Yin Lin 
Acked-by: Alin Gabriel Serdean 
---
 datapath-windows/ovsext/Datapath.c   |  7 ---
 datapath-windows/ovsext/DpInternal.h | 10 ++
 datapath-windows/ovsext/Event.c  | 10 +-
 datapath-windows/ovsext/Event.h  |  7 ---
 datapath-windows/ovsext/Vport.c  | 12 ++--
 5 files changed, 21 insertions(+), 25 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index 4f47be5..e4d6ab1 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1582,7 +1582,7 @@ MapIrpOutputBuffer(PIRP irp,
  */
 static NTSTATUS
 OvsPortFillInfo(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
-POVS_EVENT_ENTRY eventEntry,
+POVS_VPORT_EVENT_ENTRY eventEntry,
 PNL_BUFFER nlBuf)
 {
 NTSTATUS status;
@@ -1659,7 +1659,7 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 #endif
 NL_BUFFER nlBuf;
 NTSTATUS status;
-OVS_EVENT_ENTRY eventEntry;
+OVS_VPORT_EVENT_ENTRY eventEntry;
 
 ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
 
@@ -1675,7 +1675,8 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 NlBufInit(&nlBuf, usrParamsCtx->outputBuffer, usrParamsCtx->outputLength);
 
 /* remove an event entry from the event queue */
-status = OvsRemoveEventEntry(usrParamsCtx->ovsInstance, &eventEntry);
+status = OvsRemoveVportEventEntry(usrParamsCtx->ovsInstance,
+  &eventEntry);
 if (status != STATUS_SUCCESS) {
 /* If there were not elements, read should return no data. */
 status = STATUS_SUCCESS;
diff --git a/datapath-windows/ovsext/DpInternal.h 
b/datapath-windows/ovsext/DpInternal.h
index 42b5ec9..8abe61d 100644
--- a/datapath-windows/ovsext/DpInternal.h
+++ b/datapath-windows/ovsext/DpInternal.h
@@ -328,19 +328,13 @@ enum {
 };
 
 
-typedef struct _OVS_EVENT_ENTRY {
+typedef struct _OVS_VPORT_EVENT_ENTRY {
 UINT32 portNo;
 OVS_VPORT_TYPE ovsType;
 UINT32 upcallPid;
 CHAR ovsName[OVS_MAX_PORT_NAME_LENGTH];
 UINT32 type;
-} OVS_EVENT_ENTRY, *POVS_EVENT_ENTRY;
-
-
-typedef struct _OVS_EVENT_STATUS {
-uint32_t numberEntries;
-OVS_EVENT_ENTRY eventEntries[0];
-} OVS_EVENT_STATUS, *POVS_EVENT_STATUS;
+} OVS_VPORT_EVENT_ENTRY, *POVS_VPORT_EVENT_ENTRY;
 
 #pragma pack(pop)
 
diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index f9bea7f..8c7c3ec 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -109,7 +109,7 @@ OvsCleanupEvent(POVS_OPEN_INSTANCE instance)
  * --
  */
 VOID
-OvsPostEvent(POVS_EVENT_ENTRY event)
+OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 {
 POVS_EVENT_QUEUE_ELEM elem;
 POVS_EVENT_QUEUE queue;
@@ -141,7 +141,7 @@ OvsPostEvent(POVS_EVENT_ENTRY event)
 return;
 }
 
-RtlCopyMemory(&elem->event, event, sizeof elem->event);
+RtlCopyMemory(&elem->vportEvent, event, sizeof elem->vportEvent);
 InsertTailList(&queue->elemList, &elem->link);
 queue->numElems++;
 OVS_LOG_INFO("Queue: %p, numElems: %d",
@@ -409,8 +409,8 @@ unlock:
  * --
  */
 NTSTATUS
-OvsRemoveEventEntry(POVS_OPEN_INSTANCE instance,
-POVS_EVENT_ENTRY entry)
+OvsRemoveVportEventEntry(POVS_OPEN_INSTANCE instance,
+ POVS_VPORT_EVENT_ENTRY entry)
 {
 NTSTATUS status = STATUS_UNSUCCESSFUL;
 POVS_EVENT_QUEUE queue;
@@ -427,7 +427,7 @@ OvsRemoveEventEntry(POVS_OPEN_INSTANCE instance,
 
 if (queue->numElems) {
 elem = (POVS_EVENT_QUEUE_ELEM)RemoveHeadList(&queue->elemList);
-*entry = elem->event;
+*entry = elem->vportEvent;
 OvsFreeMemoryWithTag(elem, OVS_EVENT_POOL_TAG);
 queue->numElems--;
 status = STATUS_SUCCESS;
diff --git a/datapath-windows/ovsext/Event.h b/datapath-windows/ovsext/Event.h
index b087875..255594c 100644
--- a/datapath-windows/ovsext/Event.h
+++ b/datapath-windows/ovsext/Event.h
@@ -19,7 +19,7 @@
 
 typedef struct _OVS_EVENT_QUEUE_ELEM {
 LIST_ENTRY link;
-OVS_EVENT_ENTRY event;
+OVS_VPORT_EVENT_ENTRY vportEvent;
 } OVS_EVENT_QUEUE_ELEM, *POVS_EVENT_QUEUE_ELEM;
 
 typedef struct _OVS_EVENT_QUEUE {
@@ -38,7 +38,7 @@ VOID OvsCleanupEventQueue(VOID);
 struct _OVS_OPEN_INSTANCE;
 
 VOID OvsCl

[ovs-dev] [PATCH v2 4/7] datapath-windows: Modify OvsCreateNlMsgFromCtEntry to make it reusable

2016-07-25 Thread Sairam Venugopal
Tweak the OvsCreateNlMsgFromCtEntry() method to reuse it for creating
netlink messages from other files. Also define the function in Conntrack.h
to make it accessible.

v2: Added Acked-By

Signed-off-by: Sairam Venugopal 
Acked-By: Yin Lin 
Acked-by: Alin Gabriel Serdean 
---
 datapath-windows/ovsext/Conntrack.c | 32 ++--
 datapath-windows/ovsext/Conntrack.h |  9 +
 2 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 90b59ce..382c13d 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -934,12 +934,15 @@ WindowsTickToUnixSeconds(long long windowsTicks)
 - SEC_TO_UNIX_EPOCH));
 }
 
-static NTSTATUS
+NTSTATUS
 OvsCreateNlMsgFromCtEntry(POVS_CT_ENTRY entry,
-  POVS_MESSAGE msgIn,
   PVOID outBuffer,
   UINT32 outBufLen,
-  int dpIfIndex)
+  UINT8 eventType,
+  UINT32 nlmsgSeq,
+  UINT32 nlmsgPid,
+  UINT8 nfGenVersion,
+  UINT32 dpIfIndex)
 {
 NL_BUFFER nlBuf;
 BOOLEAN ok;
@@ -947,6 +950,7 @@ OvsCreateNlMsgFromCtEntry(POVS_CT_ENTRY entry,
 UINT32 timeout;
 NDIS_STATUS status;
 UINT64 currentTime, expiration;
+UINT16 nlmsgType;
 NdisGetCurrentSystemTime((LARGE_INTEGER *)¤tTime);
 UINT8 nfgenFamily = 0;
 if (entry->key.dl_type == htons(ETH_TYPE_IPV4)) {
@@ -957,13 +961,17 @@ OvsCreateNlMsgFromCtEntry(POVS_CT_ENTRY entry,
 
 NlBufInit(&nlBuf, outBuffer, outBufLen);
 /* Mimic netfilter */
-UINT16 nlmsgType = (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_NEW);
+if (eventType == OVS_EVENT_CT_NEW) {
+nlmsgType = (UINT16) (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_NEW);
+} else if (eventType == OVS_EVENT_CT_DELETE) {
+nlmsgType = (UINT16) (NFNL_SUBSYS_CTNETLINK << 8 | 
IPCTNL_MSG_CT_DELETE);
+} else {
+return STATUS_INVALID_PARAMETER;
+}
+
 ok = NlFillOvsMsgForNfGenMsg(&nlBuf, nlmsgType, NLM_F_CREATE,
- msgIn->nlMsg.nlmsgSeq,
- msgIn->nlMsg.nlmsgPid,
- nfgenFamily,
- msgIn->nfGenMsg.version,
- dpIfIndex);
+ nlmsgSeq, nlmsgPid, nfgenFamily,
+ nfGenVersion, dpIfIndex);
 if (!ok) {
 return STATUS_INVALID_BUFFER_SIZE;
 }
@@ -1130,9 +1138,13 @@ OvsCtDumpCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 if (outIndex >= inIndex) {
 entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
 
-rc = OvsCreateNlMsgFromCtEntry(entry, msgIn,
+rc = OvsCreateNlMsgFromCtEntry(entry,
usrParamsCtx->outputBuffer,
usrParamsCtx->outputLength,
+   OVS_EVENT_CT_NEW,
+   msgIn->nlMsg.nlmsgSeq,
+   msgIn->nlMsg.nlmsgPid,
+   msgIn->nfGenMsg.version,
0);
 
 if (rc != NDIS_STATUS_SUCCESS) {
diff --git a/datapath-windows/ovsext/Conntrack.h 
b/datapath-windows/ovsext/Conntrack.h
index 6d573c8..4995ff4 100644
--- a/datapath-windows/ovsext/Conntrack.h
+++ b/datapath-windows/ovsext/Conntrack.h
@@ -116,4 +116,13 @@ enum CT_UPDATE_RES 
OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
 enum ct_update_res OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
 BOOLEAN reply,
 UINT64 now);
+NTSTATUS
+OvsCreateNlMsgFromCtEntry(POVS_CT_ENTRY entry,
+  PVOID outBuffer,
+  UINT32 outBufLen,
+  UINT8 eventType,
+  UINT32 nlmsgSeq,
+  UINT32 nlmsgPid,
+  UINT8 nfGenVersion,
+  UINT32 dpIfIndex);
 #endif /* __OVS_CONNTRACK_H_ */
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH v2 7/7] datapath-windows: Post Conntrack delete and new events

2016-07-25 Thread Sairam Venugopal
Post Conntrack delete and create events when entries are deleted or
created.

v2: Added Acked-By

Signed-off-by: Sairam Venugopal 
Acked-by: Paul Boca 
Acked-by: Alin Gabriel Serdean 
---
 datapath-windows/ovsext/Conntrack.c | 12 
 1 file changed, 12 insertions(+)

diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 382c13d..af3d966 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -23,6 +23,7 @@
 #include "Jhash.h"
 #include "PacketParser.h"
 #include "Debug.h"
+#include "Event.h"
 
 #define WINDOWS_TICK 1000
 #define SEC_TO_UNIX_EPOCH 11644473600LL
@@ -154,6 +155,15 @@ OvsCtUpdateFlowKey(struct OvsFlowKey *key,
 }
 
 static __inline VOID
+OvsPostCtEventEntry(POVS_CT_ENTRY entry, UINT8 type)
+{
+OVS_CT_EVENT_ENTRY ctEventEntry = {0};
+NdisMoveMemory(&ctEventEntry.entry, entry, sizeof(OVS_CT_ENTRY));
+ctEventEntry.type = type;
+OvsPostCtEvent(&ctEventEntry);
+}
+
+static __inline VOID
 OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx, UINT64 now)
 {
 NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
@@ -162,6 +172,7 @@ OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx 
*ctx, UINT64 now)
 entry->timestampStart = now;
 InsertHeadList(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],
&entry->link);
+OvsPostCtEventEntry(entry, OVS_EVENT_CT_NEW);
 ctTotalEntries++;
 }
 
@@ -253,6 +264,7 @@ OvsCtUpdateEntry(OVS_CT_ENTRY* entry,
 static __inline VOID
 OvsCtEntryDelete(POVS_CT_ENTRY entry)
 {
+OvsPostCtEventEntry(entry, OVS_EVENT_CT_DELETE);
 RemoveEntryList(&entry->link);
 OvsFreeMemoryWithTag(entry, OVS_CT_POOL_TAG);
 ctTotalEntries--;
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH v2 3/7] datapath-windows: Define new multicast conntrack events and netlink protocol

2016-07-25 Thread Sairam Venugopal
The Hyper-V datapath supports NETLINK_GENERIC and NETLINK_NETFILTER
protocols for netlink communication. Define these two protocols in the
datapath.

Define new Conntrack events (new and delete) and add support for
subscribing to these events. Parse out OVS_NL_ATTR_MCAST_GRP and store it
as part of OVS_EVENT_SUBSCRIBE structure.

v2: Squashed patches 2/9 and 5/9 into one. Addressed review comments from
Yin Lin and Alin Serdean

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Datapath.c | 21 ++---
 datapath-windows/ovsext/Datapath.h |  3 ++-
 datapath-windows/ovsext/DpInternal.h   | 16 
 datapath-windows/ovsext/Netlink/NetlinkProto.h |  3 +++
 4 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index 75f133a..f9f965c 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1273,11 +1273,12 @@ OvsSubscribeEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 OVS_EVENT_SUBSCRIBE request;
 BOOLEAN rc;
 UINT8 join;
+UINT32 mcastGrp;
 PNL_ATTR attrs[2];
 const NL_POLICY policy[] =  {
 [OVS_NL_ATTR_MCAST_GRP] = {.type = NL_A_U32 },
 [OVS_NL_ATTR_MCAST_JOIN] = {.type = NL_A_U8 },
-};
+};
 
 UNREFERENCED_PARAMETER(replyLen);
 
@@ -1293,11 +1294,25 @@ OvsSubscribeEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 goto done;
 }
 
-/* XXX Ignore the MC group for now */
+mcastGrp = NlAttrGetU32(attrs[OVS_NL_ATTR_MCAST_GRP]);
 join = NlAttrGetU8(attrs[OVS_NL_ATTR_MCAST_JOIN]);
 request.dpNo = msgIn->ovsHdr.dp_ifindex;
 request.subscribe = join;
-request.mask = OVS_EVENT_MASK_ALL;
+request.mcastGrp = mcastGrp;
+request.protocol = instance->protocol;
+request.mask = 0;
+
+/* We currently support Vport and CT related events */
+if (instance->protocol == NETLINK_GENERIC) {
+request.mask = OVS_EVENT_MASK_ALL;
+} else if (instance->protocol == NETLINK_NETFILTER) {
+if (mcastGrp == NFNLGRP_CONNTRACK_NEW) {
+request.mask = OVS_EVENT_CT_NEW;
+}
+if (mcastGrp == NFNLGRP_CONNTRACK_DESTROY) {
+request.mask = OVS_EVENT_CT_DELETE;
+}
+}
 
 status = OvsSubscribeEventIoctl(instance->fileObject, &request,
 sizeof request);
diff --git a/datapath-windows/ovsext/Datapath.h 
b/datapath-windows/ovsext/Datapath.h
index 2b41d82..57b483a 100644
--- a/datapath-windows/ovsext/Datapath.h
+++ b/datapath-windows/ovsext/Datapath.h
@@ -51,7 +51,8 @@ typedef struct _OVS_OPEN_INSTANCE {
 PVOID eventQueue;
 POVS_USER_PACKET_QUEUE packetQueue;
 UINT32 pid;
-UINT32 protocol; /* Refers to NETLINK Family (eg. NETLINK_GENERIC)*/
+UINT32 protocol;/* Refers to NETLINK Family (eg. NETLINK_GENERIC)*/
+UINT32 mcastMask;   /* Mask of subscribed Mcast Groups */
 
 struct {
 POVS_MESSAGE ovsMsg;/* OVS message passed during dump start. */
diff --git a/datapath-windows/ovsext/DpInternal.h 
b/datapath-windows/ovsext/DpInternal.h
index 8abe61d..22599a0 100644
--- a/datapath-windows/ovsext/DpInternal.h
+++ b/datapath-windows/ovsext/DpInternal.h
@@ -310,6 +310,8 @@ typedef struct _OVS_EVENT_SUBSCRIBE {
 uint32_t dpNo;
 uint32_t subscribe;
 uint32_t mask;
+uint32_t mcastGrp;
+uint32_t protocol;
 } OVS_EVENT_SUBSCRIBE, *POVS_EVENT_SUBSCRIBE;
 
 typedef struct _OVS_EVENT_POLL {
@@ -327,6 +329,20 @@ enum {
 OVS_EVENT_MASK_ALL  = 0x3f,
 };
 
+enum {
+OVS_EVENT_CT_NEW= (1 << 0),
+OVS_EVENT_CT_DELETE = (1 << 1),
+OVS_EVENT_CT_MASK_ALL   = 0x3
+};
+
+/* Supported mcast event groups */
+enum OVS_MCAST_EVENT_TYPES {
+OVS_MCAST_VPORT_EVENT,
+OVS_MCAST_CT_EVENT,
+__OVS_MCAST_EVENT_TYPES_MAX
+};
+#define OVS_MCAST_EVENT_TYPES_MAX (__OVS_MCAST_EVENT_TYPES_MAX \
+   - OVS_MCAST_VPORT_EVENT)
 
 typedef struct _OVS_VPORT_EVENT_ENTRY {
 UINT32 portNo;
diff --git a/datapath-windows/ovsext/Netlink/NetlinkProto.h 
b/datapath-windows/ovsext/Netlink/NetlinkProto.h
index beb14d5..5175311 100644
--- a/datapath-windows/ovsext/Netlink/NetlinkProto.h
+++ b/datapath-windows/ovsext/Netlink/NetlinkProto.h
@@ -125,4 +125,7 @@ BUILD_ASSERT_DECL(sizeof(NL_ATTR) == 4);
 #define OVS_HDRLEN NLMSG_ALIGN(sizeof(OVS_HDR))
 #define NLA_HDRLEN ((INT) NLA_ALIGN(sizeof(NL_ATTR)))
 
+#define NETLINK_NETFILTER   12
+#define NETLINK_GENERIC 16
+
 #endif /* NetlinProto.h */
-- 
2.9.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH v2 5/7] datapath-windows: Add support for multiple event queue in Event.c

2016-07-25 Thread Sairam Venugopal
Update Event.c to have multiple event queues and mechanism to retrieve the
associated queue. Introduce OvsPostCtEvent and OvsRemoveCtEventEntry
similar to OvsPostVportEvent and OvsRemoveVportEventEntry.

v2: Added Acked-By

Signed-off-by: Sairam Venugopal 
Acked-by: Paul Boca 
Acked-by: Alin Gabriel Serdean 
---
 datapath-windows/ovsext/Event.c | 265 +---
 datapath-windows/ovsext/Event.h |  17 ++-
 2 files changed, 239 insertions(+), 43 deletions(-)

diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index 8ff0322..cb0dc92 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -26,36 +26,62 @@
 #define OVS_DBG_MOD OVS_DBG_EVENT
 #include "Debug.h"
 
-LIST_ENTRY ovsEventQueue;
-static NDIS_SPIN_LOCK eventQueueLock;
-UINT32 ovsNumEventQueue;
+LIST_ENTRY ovsEventQueueArr[OVS_MCAST_EVENT_TYPES_MAX];
+static NDIS_SPIN_LOCK eventQueueLockArr[OVS_MCAST_EVENT_TYPES_MAX];
+UINT32 ovsNumEventQueueArr[OVS_MCAST_EVENT_TYPES_MAX];
 
 NTSTATUS
 OvsInitEventQueue()
 {
-InitializeListHead(&ovsEventQueue);
-NdisAllocateSpinLock(&eventQueueLock);
+for (int i = 0; i < OVS_MCAST_EVENT_TYPES_MAX; i++) {
+InitializeListHead(&ovsEventQueueArr[i]);
+NdisAllocateSpinLock(&eventQueueLockArr[i]);
+}
 return STATUS_SUCCESS;
 }
 
 VOID
 OvsCleanupEventQueue()
 {
-ASSERT(IsListEmpty(&ovsEventQueue));
-ASSERT(ovsNumEventQueue == 0);
-NdisFreeSpinLock(&eventQueueLock);
+for (int i = 0; i < OVS_MCAST_EVENT_TYPES_MAX; i++) {
+ASSERT(IsListEmpty(&ovsEventQueueArr[i]));
+ASSERT(ovsNumEventQueueArr[i] == 0);
+NdisFreeSpinLock(&eventQueueLockArr[i]);
+}
 }
 
 static __inline VOID
-OvsAcquireEventQueueLock()
+OvsAcquireEventQueueLock(int eventId)
 {
-NdisAcquireSpinLock(&eventQueueLock);
+NdisAcquireSpinLock(&eventQueueLockArr[eventId]);
 }
 
 static __inline VOID
-OvsReleaseEventQueueLock()
+OvsReleaseEventQueueLock(int eventId)
 {
-   NdisReleaseSpinLock(&eventQueueLock);
+   NdisReleaseSpinLock(&eventQueueLockArr[eventId]);
+}
+
+NDIS_STATUS
+OvsGetMcastEventId(UINT32 protocol, UINT32 mcastMask, UINT32 *eventId)
+{
+switch (protocol) {
+case NETLINK_GENERIC:
+*eventId = OVS_MCAST_VPORT_EVENT;
+return NDIS_STATUS_SUCCESS;
+case NETLINK_NETFILTER:
+if ((mcastMask & OVS_EVENT_CT_NEW)
+|| (mcastMask & OVS_EVENT_CT_DELETE)) {
+*eventId =  OVS_MCAST_CT_EVENT;
+return NDIS_STATUS_SUCCESS;
+}
+break;
+default:
+goto error;
+}
+
+error:
+return NDIS_STATUS_INVALID_PARAMETER;
 }
 
 /*
@@ -68,14 +94,17 @@ OvsCleanupEvent(POVS_OPEN_INSTANCE instance)
 {
 POVS_EVENT_QUEUE queue;
 PIRP irp = NULL;
+UINT32 eventId;
 queue = (POVS_EVENT_QUEUE)instance->eventQueue;
 if (queue) {
 POVS_EVENT_QUEUE_ELEM elem;
 PLIST_ENTRY link, next;
 
-OvsAcquireEventQueueLock();
+/* Handle the error */
+OvsGetMcastEventId(instance->protocol, instance->mcastMask, &eventId);
+OvsAcquireEventQueueLock(eventId);
 RemoveEntryList(&queue->queueLink);
-ovsNumEventQueue--;
+ovsNumEventQueueArr[eventId]--;
 if (queue->pendingIrp) {
 PDRIVER_CANCEL cancelRoutine;
 irp = queue->pendingIrp;
@@ -86,7 +115,7 @@ OvsCleanupEvent(POVS_OPEN_INSTANCE instance)
 }
 }
 instance->eventQueue = NULL;
-OvsReleaseEventQueueLock();
+OvsReleaseEventQueueLock(eventId);
 if (irp) {
 OvsCompleteIrpRequest(irp, 0, STATUS_SUCCESS);
 }
@@ -115,7 +144,7 @@ OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 POVS_EVENT_QUEUE queue;
 PLIST_ENTRY link;
 LIST_ENTRY list;
-   PLIST_ENTRY entry;
+PLIST_ENTRY entry;
 PIRP irp;
 
 InitializeListHead(&list);
@@ -123,9 +152,9 @@ OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 OVS_LOG_TRACE("Enter: portNo: %#x, status: %#x", event->portNo,
   event->type);
 
-OvsAcquireEventQueueLock();
+OvsAcquireEventQueueLock(OVS_MCAST_VPORT_EVENT);
 
-LIST_FORALL(&ovsEventQueue, link) {
+LIST_FORALL(&ovsEventQueueArr[OVS_MCAST_VPORT_EVENT], link) {
 queue = CONTAINING_RECORD(link, OVS_EVENT_QUEUE, queueLink);
 if ((event->type & queue->mask) == 0) {
 continue;
@@ -137,7 +166,7 @@ OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 
 if (elem == NULL) {
 OVS_LOG_WARN("Fail to allocate memory for event");
-OvsReleaseEventQueueLock();
+OvsReleaseEventQueueLock(OVS_MCAST_VPORT_EVENT);
 return;
 }
 
@@ -157,7 +186,7 @@ OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 }
 }
 }
-OvsRe

Re: [ovs-dev] [PATCH v2 1/7] datapath-windows: Explicitly name vport related event to vportEvent

2016-07-29 Thread Sairam Venugopal
Hi Guru,

Thanks for applying the patches. I will keep note of that for my future 
patches. I wasn’t aware of the complications it caused.

Regards,
Sairam

From: Guru Shetty mailto:g...@ovn.org>>
Date: Friday, July 29, 2016 at 8:46 AM
To: Sairam Venugopal mailto:vsai...@vmware.com>>
Cc: ovs dev mailto:dev@openvswitch.org>>
Subject: Re: [ovs-dev] [PATCH v2 1/7] datapath-windows: Explicitly name vport 
related event to vportEvent



On 25 July 2016 at 17:04, Sairam Venugopal 
mailto:vsai...@vmware.com>> wrote:
OVS_EVENT_ENTRY currently handles only Vport related events. Updating the
name of the struct to OVS_VPORT_EVENT_ENTRY. Remove OVS_EVENT_STATUS since
it's currently not in use. Update the datapath to refer to events as
vportEvents. This will aid in the introduction of other events.

v2: Squash 1/9 and 3/9 into one commit. Added Acked-by.

I applied the series, thank you! Please note that you should not add versioning 
information in the commit message. When you do a 'git am' of this patch series, 
each commit has some versioning information. If they end up in the eventual 
commit history, it does not add any useful information, and looks wrong. You 
should add any of this versioning information below the "---". You can look at 
some other patches in the mailing list for examples. You can also try 'git am' 
ing your own patch to see the end result.


Signed-off-by: Sairam Venugopal mailto:vsai...@vmware.com>>
Acked-By: Yin Lin mailto:li...@vmware.com>>
Acked-by: Alin Gabriel Serdean 
mailto:aserd...@cloudbasesolutions.com>>
---
 datapath-windows/ovsext/Datapath.c   |  7 ---
 datapath-windows/ovsext/DpInternal.h | 10 ++
 datapath-windows/ovsext/Event.c  | 10 +-
 datapath-windows/ovsext/Event.h  |  7 ---
 datapath-windows/ovsext/Vport.c  | 12 ++--
 5 files changed, 21 insertions(+), 25 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index 4f47be5..e4d6ab1 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1582,7 +1582,7 @@ MapIrpOutputBuffer(PIRP irp,
  */
 static NTSTATUS
 OvsPortFillInfo(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
-POVS_EVENT_ENTRY eventEntry,
+POVS_VPORT_EVENT_ENTRY eventEntry,
 PNL_BUFFER nlBuf)
 {
 NTSTATUS status;
@@ -1659,7 +1659,7 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 #endif
 NL_BUFFER nlBuf;
 NTSTATUS status;
-OVS_EVENT_ENTRY eventEntry;
+OVS_VPORT_EVENT_ENTRY eventEntry;

 ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);

@@ -1675,7 +1675,8 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
 NlBufInit(&nlBuf, usrParamsCtx->outputBuffer, usrParamsCtx->outputLength);

 /* remove an event entry from the event queue */
-status = OvsRemoveEventEntry(usrParamsCtx->ovsInstance, &eventEntry);
+status = OvsRemoveVportEventEntry(usrParamsCtx->ovsInstance,
+  &eventEntry);
 if (status != STATUS_SUCCESS) {
 /* If there were not elements, read should return no data. */
 status = STATUS_SUCCESS;
diff --git a/datapath-windows/ovsext/DpInternal.h 
b/datapath-windows/ovsext/DpInternal.h
index 42b5ec9..8abe61d 100644
--- a/datapath-windows/ovsext/DpInternal.h
+++ b/datapath-windows/ovsext/DpInternal.h
@@ -328,19 +328,13 @@ enum {
 };


-typedef struct _OVS_EVENT_ENTRY {
+typedef struct _OVS_VPORT_EVENT_ENTRY {
 UINT32 portNo;
 OVS_VPORT_TYPE ovsType;
 UINT32 upcallPid;
 CHAR ovsName[OVS_MAX_PORT_NAME_LENGTH];
 UINT32 type;
-} OVS_EVENT_ENTRY, *POVS_EVENT_ENTRY;
-
-
-typedef struct _OVS_EVENT_STATUS {
-uint32_t numberEntries;
-OVS_EVENT_ENTRY eventEntries[0];
-} OVS_EVENT_STATUS, *POVS_EVENT_STATUS;
+} OVS_VPORT_EVENT_ENTRY, *POVS_VPORT_EVENT_ENTRY;

 #pragma pack(pop)

diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index f9bea7f..8c7c3ec 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -109,7 +109,7 @@ OvsCleanupEvent(POVS_OPEN_INSTANCE instance)
  * --
  */
 VOID
-OvsPostEvent(POVS_EVENT_ENTRY event)
+OvsPostVportEvent(POVS_VPORT_EVENT_ENTRY event)
 {
 POVS_EVENT_QUEUE_ELEM elem;
 POVS_EVENT_QUEUE queue;
@@ -141,7 +141,7 @@ OvsPostEvent(POVS_EVENT_ENTRY event)
 return;
 }

-RtlCopyMemory(&elem->event, event, sizeof elem->event);
+RtlCopyMemory(&elem->vportEvent, event, sizeof elem->vportEvent);
 InsertTailList(&queue->elemList, &elem->link);
 queue->numElems++;
 OVS_LOG_INFO("Queue: %p, numElems: %d",
@@ -409,8 +409,8 @@ unlock:
  * ---

Re: [ovs-dev] [PATCH v3 3/3] Windows: document multiple NIC support setup

2016-08-03 Thread Sairam Venugopal
Hi Alin,

Thanks for the patch! Had some inlined comments about the documentation.

I will run some tests and send out the review comments for other 2 patches.

Thanks,
Sairam


On 8/2/16, 12:51 PM, "Alin Serdean" 
wrote:

>This patch updates the documentation on how to set up OVS with multiple
>NICs.
>
>Also update the documentation to show users how new internal ports are
>created
>
>Signed-off-by: Alin Gabriel Serdean 
>Acked-by: Paul Boca 
>---
>v3: Add acked
>v2: Rebase
>---
>---
> INSTALL.Windows.md | 143
>+
> 1 file changed, 101 insertions(+), 42 deletions(-)
>
>diff --git a/INSTALL.Windows.md b/INSTALL.Windows.md
>index 6b0f5d8..c7d914d 100644
>--- a/INSTALL.Windows.md
>+++ b/INSTALL.Windows.md
>@@ -72,9 +72,9 @@ or from a distribution tar ball.
>   directories, etc. For example,
> 
> % ./configure CC=./build-aux/cccl LD="`which link`" \
>-  LIBS="-lws2_32 -liphlpapi" --prefix="C:/openvswitch/usr" \
>-  --localstatedir="C:/openvswitch/var"
>--sysconfdir="C:/openvswitch/etc" \
>-   --with-pthread="C:/pthread"
>+  LIBS="-lws2_32 -liphlpapi -lwbemuuid -lole32 -loleaut32" \
>+  --prefix="C:/openvswitch/usr" --localstatedir="C:/openvswitch/var"
>\
>+  --sysconfdir="C:/openvswitch/etc" --with-pthread="C:/pthread"
> 
> By default, the above enables compiler optimization for fast code.
> For default compiler optimization, pass the "--with-debug" configure
>@@ -125,9 +125,10 @@ Note down the directory where OpenSSL is installed
>(e.g.: C:/OpenSSL-Win32).
> For example,
> 
> % ./configure CC=./build-aux/cccl LD="`which link`"  \
>-LIBS="-lws2_32 -liphlpapi" --prefix="C:/openvswitch/usr" \
>---localstatedir="C:/openvswitch/var"
>--sysconfdir="C:/openvswitch/etc" \
>---with-pthread="C:/pthread" --enable-ssl
>--with-openssl="C:/OpenSSL-Win32"
>+LIBS="-lws2_32 -liphlpapi -lwbemuuid -lole32 -loleaut32" \
>+--prefix="C:/openvswitch/usr" --localstatedir="C:/openvswitch/var" \
>+--sysconfdir="C:/openvswitch/etc" --with-pthread="C:/pthread" \
>+--enable-ssl --with-openssl="C:/OpenSSL-Win32"
> 
> * Run make for the ported executables.
> 
>@@ -142,10 +143,11 @@ level 'make' will invoke building the kernel
>datapath, if the
> For example,
> 
> % ./configure CC=./build-aux/cccl LD="`which link`" \
>-LIBS="-lws2_32 -liphlpapi" --prefix="C:/openvswitch/usr" \
>---localstatedir="C:/openvswitch/var"
>--sysconfdir="C:/openvswitch/etc" \
>---with-pthread="C:/pthread" --enable-ssl \
>---with-openssl="C:/OpenSSL-Win32" --with-vstudiotarget="type>"
>+LIBS="-lws2_32 -liphlpapi -lwbemuuid -lole32 -loleaut32" \
>+--prefix="C:/openvswitch/usr" --localstatedir="C:/openvswitch/var" \
>+--sysconfdir="C:/openvswitch/etc" --with-pthread="C:/pthread" \
>+--enable-ssl --with-openssl="C:/OpenSSL-Win32" \
>+--with-vstudiotarget=""
> 
> Possible values for "" are:
> "Debug" and "Release"
>@@ -186,8 +188,7 @@ to work (covered later).
> 
> The command to create a new switch named 'OVS-Extended-Switch' using a
>physical
> NIC named 'Ethernet 1' is:
>-% New-VMSwitch "OVS-Extended-Switch" -AllowManagementOS $true \
>-   -NetAdapterName "Ethernet 1"
>+% New-VMSwitch "OVS-Extended-Switch" -NetAdapterName "Ethernet 1"
> 
> Note: you can obtain the list of physical NICs on the host using
> 'Get-NetAdapter' command.
>@@ -278,23 +279,20 @@ connected to the Hyper-V switch. I.e. let us
>suppose we created the Hyper-V
> virtual switch on top of the adapter named 'Ethernet0'. In OVS for
>Hyper-V, we
> use that name('Ethernet0') as a special name to refer to that adapter.
> 
>-Note: Currently, we assume that the Hyper-V switch on which OVS
>extension is
>-enabled has a single physical NIC connected to it.
>-
>-Internal port is the virtual adapter created on the Hyper-V switch using
>the
>-'AllowManagementOS' setting.  This has already been setup while creating
>the
>-switch using the instructions above.  In OVS for Hyper-V, we use a the
>name of
>-that specific adapter as a special name to refer to that adapter. By
>default it
>-is created under the following rule "vEthernet ()".
>+Internal ports are the virtual adapters created on the Hyper-V switch
>using the
>+ovs-vsctl add-br  command. By default they are created under the
>+following rule "" and the adapters are disabled. One
>needs to
>+enable them and set the corresponding values to it to make them IP-able.
> 
> As a whole example, if we issue the following in a powershell console:
>-PS C:\package\binaries> Get-NetAdapter | select
>Name,MacAddress,InterfaceDescription
>+PS C:\package\binaries> Get-NetAdapter | select Name,InterfaceDescription
> 
>-Name   MacAddress InterfaceDescription
>-   -- 
>-Ethernet1  00-0C-29-94-05-65  Intel(R) PRO/1000 MT Network
>Connection
>-vEthernet (external)   00-0C-29-94-05-5B  Hyper-V Virtua

Re: [ovs-dev] [PATCH v3 1/3] Windows: Add internal switch port per OVS bridge

2016-08-03 Thread Sairam Venugopal
Nice work putting this together!

I went over the changes and had some comments. Haven¹t tested it yet.

Thanks,
Sairam

On 8/2/16, 12:46 PM, "Alin Serdean" 
wrote:

>This patch updates the following commands in the vswitch:
>ovs-vsctl add-br br-test
>ovs-vsctl del-br br-test
>
>ovs-vsctl add-br br-test:
>This command will now create an internal port on the MSFT virtual
>switch
>  using the WMI interface from Msvm_VirtualEthernetSwitchManagementService
>  leveraging the method AddResourceSettings.
>Before creating the actual port, the switch will be queried to see if
>there
>  is not a port already created (good for restarts when restarting the
>  vswitch daemon). If there is a port defined it will return success and
>log
>  a message.
>After checking if the port already exists the command will also verify
>  if the forwarding extension (windows datapath) is enabled and on a
>single
>  switch. If it is not activated or if it is activated on multiple
>switches
>  it will return an error and a message will be logged.
>After the port was created on the switch, we will disable the adapter
>on
>  the host and rename to the corresponding OVS bridge name for
>consistency.
>The user will enable and set the values he wants after creation.
>
>ovs-vsctl del-br br-test
>This command will remove an internal port on the MSFT virtual switch
>  using the Msvm_VirtualEthernetSwitchManagementService class and
>executing
>  the method RemoveResourceSettings.
>
>Both commands will be blocking until the WMI job is finished, this allows
>us
>to guarantee that the ports are created and their name are set before
>issuing
>a netlink message to the windows datapath.
>
>This patch also includes helpers for normal WMI retrievals and
>initializations.
>Appveyor and documentation has been modified to include the libraries
>needed
>for COM objects.
>
>This patch was tested individually using IMallocSpy and CRT heap checks
>to ensure no new memory leaks are introduced.
>
>Tested on the following OS's:
>Windows 2012 and Windows 2012r2
>
>Signed-off-by: Alin Gabriel Serdean 
>Acked-by: Paul Boca 
>---
>v3: rebase, add acked
>v2: Address comments. Rebase
>---
> appveyor.yml   |2 +-
> lib/automake.mk|4 +-
> lib/dpif-netlink.c |   21 +
> lib/wmi.c  | 1279
>
> lib/wmi.h  |   51 +++
> 5 files changed, 1355 insertions(+), 2 deletions(-)
> create mode 100644 lib/wmi.c
> create mode 100644 lib/wmi.h
>
>diff --git a/appveyor.yml b/appveyor.yml
>index 0fd003b..1061df6 100644
>--- a/appveyor.yml
>+++ b/appveyor.yml
>@@ -41,5 +41,5 @@ build_script:
> - C:\MinGW\msys\1.0\bin\bash -lc "cp
>/c/pthreads-win32/Pre-built.2/dll/x86/*.dll /c/openvswitch/."
> - C:\MinGW\msys\1.0\bin\bash -lc "mv /bin/link.exe /bin/link_copy.exe"
> - C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && ./boot.sh"
>-- C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && ./configure
>CC=build-aux/cccl LD=\"`which link`\" LIBS=\"-lws2_32 -liphlpapi\"
>--with-pthread=C:/pthreads-win32/Pre-built.2
>--with-openssl=C:/OpenSSL-Win32 --with-vstudiotarget=\"Debug\""
>+- C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && ./configure
>CC=build-aux/cccl LD=\"`which link`\" LIBS=\"-lws2_32 -liphlpapi
>-lwbemuuid -lole32 -loleaut32\"
>--with-pthread=C:/pthreads-win32/Pre-built.2
>--with-openssl=C:/OpenSSL-Win32 --with-vstudiotarget=\"Debug\""
> - C:\MinGW\msys\1.0\bin\bash -lc "cd /c/openvswitch && make"
>diff --git a/lib/automake.mk b/lib/automake.mk
>index 646306d..7c21f65 100644
>--- a/lib/automake.mk
>+++ b/lib/automake.mk
>@@ -386,7 +386,9 @@ lib_libopenvswitch_la_SOURCES += \
>   lib/netlink-notifier.h \
>   lib/netlink-protocol.h \
>   lib/netlink-socket.c \
>-  lib/netlink-socket.h
>+  lib/netlink-socket.h \
>+  lib/wmi.c \
>+  lib/wmi.h
> endif
> 
> if HAVE_POSIX_AIO
>diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
>index a39faa2..c8b0e37 100644
>--- a/lib/dpif-netlink.c
>+++ b/lib/dpif-netlink.c
>@@ -58,6 +58,7 @@
> 
> VLOG_DEFINE_THIS_MODULE(dpif_netlink);
> #ifdef _WIN32
>+#include "wmi.h"
> enum { WINDOWS = 1 };
> #else
> enum { WINDOWS = 0 };
>@@ -849,6 +850,16 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif,
>struct netdev *netdev,
> #endif
> }
> 
>+#ifdef _WIN32
>+if (request.type == OVS_VPORT_TYPE_INTERNAL) {
>+if (!create_wmi_port(name)){
>+VLOG_ERR("Could not create wmi internal port with name:%s",
>name);
>+vport_del_socksp(dpif, socksp);
>+return EINVAL;
>+};
>+}
>+#endif
>+
> tnl_cfg = netdev_get_tunnel_config(netdev);
> if (tnl_cfg && (tnl_cfg->dst_port != 0 || tnl_cfg->exts)) {
> ofpbuf_use_stack(&options, options_stub, sizeof options_stub);
>@@ -940,6 +951,16 @@ dpif_netlink_port_del__(struct dpif_netlink *dpif,
>odp_port_t port_no)
> vport.cmd = OVS_VPORT_CMD_DEL;
> vport.dp_ifindex = dpif->dp_ifindex;
> vport.port_no = port_no;
>+

Re: [ovs-dev] [PATCH v3 2/3] datapath-windows: Add multiple switch internal ports

2016-08-05 Thread Sairam Venugopal
Hi Alin,

I keep getting this error (different GUID( when I try to add a bridge -
'ovs-vsctl add-br br-pif'

OvsAddIpInterfaceNotification:647 Fail to get IF entry for internal port
with GUID  ----
OvsHandleInternalAdapterUp:1556 Fail to get IP entry for internal port
with GUID  7ab207b3-0d72-495c-cc81-653d75a514b4


Is this something expected? I wanted to clarify this before I ventured
further. Will test out the teaming aspect.

Thanks,
Sairam


On 8/2/16, 12:47 PM, "Alin Serdean" 
wrote:

>This patch adds multiple intenal ports support to the windows datapath.
>All tunnels types have been updated to accommodate this new functionality.
>
>Signed-off-by: Alin Gabriel Serdean 
>Co-authored-by: Sorin Vinturis 
>Acked-by: Paul Boca 
>---
>v3: Add acked
>v2: Rebase
>---
> datapath-windows/ovsext/Actions.c  |  47 +-
> datapath-windows/ovsext/Geneve.c   |   5 +-
> datapath-windows/ovsext/Geneve.h   |   6 +-
> datapath-windows/ovsext/Gre.c  |   5 +-
> datapath-windows/ovsext/Gre.h  |   8 +-
> datapath-windows/ovsext/IpHelper.c | 917
>-
> datapath-windows/ovsext/IpHelper.h |  20 +-
> datapath-windows/ovsext/Stt.c  |   5 +-
> datapath-windows/ovsext/Stt.h  |   7 +-
> datapath-windows/ovsext/Switch.h   |   8 +-
> datapath-windows/ovsext/Vport.c| 135 +++---
> datapath-windows/ovsext/Vport.h| 104 ++---
> datapath-windows/ovsext/Vxlan.c|   8 +-
> datapath-windows/ovsext/Vxlan.h|  10 +-
> 14 files changed, 882 insertions(+), 403 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Actions.c
>b/datapath-windows/ovsext/Actions.c
>index 722a2a8..803b2b7 100644
>--- a/datapath-windows/ovsext/Actions.c
>+++b/datapath-windows/ovsext/Actions.c
>@@ -301,7 +301,6 @@ OvsDetectTunnelPkt(OvsForwardingContext *ovsFwdCtx,
> return TRUE;
> }
> } else if (OvsIsTunnelVportType(dstVport->ovsType)) {
>-ASSERT(ovsFwdCtx->tunnelTxNic == NULL);
> ASSERT(ovsFwdCtx->tunnelRxNic == NULL);
> 
> /*
>@@ -322,7 +321,7 @@ OvsDetectTunnelPkt(OvsForwardingContext *ovsFwdCtx,
> 
> if (!vport ||
> (vport->ovsType != OVS_VPORT_TYPE_NETDEV &&
>- !OvsIsBridgeInternalVport(vport))) {
>+ vport->ovsType != OVS_VPORT_TYPE_INTERNAL)) {
> ovsFwdCtx->tunKey.dst = 0;
> }
> }
>@@ -402,10 +401,6 @@ OvsAddPorts(OvsForwardingContext *ovsFwdCtx,
> vport->stats.txBytes +=
> 
>NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl));
> 
>-if (OvsIsBridgeInternalVport(vport)) {
>-return NDIS_STATUS_SUCCESS;
>-}
>-
> if (OvsDetectTunnelPkt(ovsFwdCtx, vport, flowKey)) {
> return NDIS_STATUS_SUCCESS;
> }
>@@ -667,41 +662,36 @@ OvsTunnelPortTx(OvsForwardingContext *ovsFwdCtx)
>  * Setup the source port to be the internal port to as to facilitate
>the
>  * second OvsLookupFlow.
>  */
>-if (ovsFwdCtx->switchContext->internalVport == NULL ||
>+if (ovsFwdCtx->switchContext->countInternalVports <= 0 ||
> ovsFwdCtx->switchContext->virtualExternalVport == NULL) {
> OvsClearTunTxCtx(ovsFwdCtx);
> OvsCompleteNBLForwardingCtx(ovsFwdCtx,
> L"OVS-Dropped since either internal or external port is
>absent");
> return NDIS_STATUS_FAILURE;
> }
>-ovsFwdCtx->srcVportNo =
>-
>((POVS_VPORT_ENTRY)ovsFwdCtx->switchContext->internalVport)->portNo;
> 
>-ovsFwdCtx->fwdDetail->SourcePortId =
>ovsFwdCtx->switchContext->internalPortId;
>-ovsFwdCtx->fwdDetail->SourceNicIndex =
>-
>((POVS_VPORT_ENTRY)ovsFwdCtx->switchContext->internalVport)->nicIndex;
>-
>-/* Do the encap. Encap function does not consume the NBL. */
>+OVS_FWD_INFO switchFwdInfo = { 0 };
>+/* Do the encapsulation. The encapsulation will not consume the NBL.
>*/
> switch(ovsFwdCtx->tunnelTxNic->ovsType) {
> case OVS_VPORT_TYPE_GRE:
> status = OvsEncapGre(ovsFwdCtx->tunnelTxNic, ovsFwdCtx->curNbl,
>  &ovsFwdCtx->tunKey,
>ovsFwdCtx->switchContext,
>- &ovsFwdCtx->layers, &newNbl);
>+ &ovsFwdCtx->layers, &newNbl,
>&switchFwdInfo);
> break;
> case OVS_VPORT_TYPE_VXLAN:
> status = OvsEncapVxlan(ovsFwdCtx->tunnelTxNic, ovsFwdCtx->curNbl,
>&ovsFwdCtx->tunKey,
>ovsFwdCtx->switchContext,
>-   &ovsFwdCtx->layers, &newNbl);
>+   &ovsFwdCtx->layers, &newNbl,
>&switchFwdInfo);
> break;
> case OVS_VPORT_TYPE_STT:
> status = OvsEncapStt(ovsFwdCtx->tunnelTxNic, ovsFwdCtx->curNbl,
>  &ovsFwdCtx->tunKey,
>ovsFwdCtx->switchContext,
>- &ovsFwdCtx->layers, &newNbl);
>+ &ovsFwdCtx->layers, &newNbl,
>&switchFwdInfo);
> break;
> case OVS_VPORT_TYPE

Re: [ovs-dev] [PATCH v3 2/3] datapath-windows: Add multiple switch internal ports

2016-08-09 Thread Sairam Venugopal
Hi Alin,

I took a preliminary look at the patch and have added some review
comments. 

I was mainly concerned about the use of switchContext->internalPortId when
we no longer have switchContext->internalVport and we can have multiple
internal ports. 

Thanks,
Sairam

On 8/2/16, 12:47 PM, "Alin Serdean" 
wrote:

>This patch adds multiple internal ports support to the windows datapath.
>All tunnels types have been updated to accommodate this new functionality.
>
>Signed-off-by: Alin Gabriel Serdean 
>Co-authored-by: Sorin Vinturis 
>Acked-by: Paul Boca 
>---
>v3: Add acked
>v2: Rebase
>---
> datapath-windows/ovsext/Actions.c  |  47 +-
> datapath-windows/ovsext/Geneve.c   |   5 +-
> datapath-windows/ovsext/Geneve.h   |   6 +-
> datapath-windows/ovsext/Gre.c  |   5 +-
> datapath-wndows/ovsext/Gre.h  |   8 +-
> datapath-windows/ovsext/IpHelper.c | 917
>-
> datapath-windows/ovsext/IpHelper.h |  20 +-
> datapath-windows/ovsext/Stt.c  |   5 +-
> datapath-windows/ovsext/Stt.h  |   7 +-
> datapath-windows/ovsext/Switch.h   |   8 +-
> datapath-windows/ovsext/Vport.c   | 135 +++---
> datapath-windows/ovsext/Vport.h| 104 ++---
> datapath-windows/ovsext/Vxlan.c|   8 +-
> datapath-windows/ovsext/Vxlan.h|  10 +-
> 14 files changed, 882 insertions(+), 403 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Actions.c
>b/datapath-windows/ovsext/Actions.c
>index 722a2a8..803b2b7 100644
>--- a/datapath-windows/ovsext/Actions.c
>+++ b/datapath-windows/ovsext/Actions.c
>@@ -301,7 +301,6 @@ OvsDetectTunnelPkt(OvsForwardingContext *ovsFwdCtx,
> return TRUE;
> }
> } else if (OvsIsTunnelVportType(dstVport->ovsType)) {
>-ASSERT(ovsFwdCtx->tunnelTxNic == NULL);
> ASSERT(ovsFwdCtx->tunnelRxNic == NULL);
> 
> /*
>@@ -322,7 +321,7 @@ OvsDetectTunnelPkt(OvsForwardingContext *ovsFwdCtx,
> 
> if (!vport ||
> (vport->ovsType != OVS_VPORT_TYPE_NETDEV &&
>- !OvsIsBridgeInternalVport(vport))) {
>+ vport->ovsType != OVS_VPORT_TYPE_INTERNAL)) {
> ovsFwdCtx->tunKey.dst = 0;
> }
> }
>@@ -402,10 +401,6 @@ OvsAddPorts(OvsForwardingContext *ovsFwdCtx,
> vport->stats.txBytes +=
> 
>NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl));
> 
>-if (OvssBridgeInternalVport(vport)) {
>-return NDIS_STATUS_SUCCESS;
>-}
>-
> if (OvsDetectTunnelPkt(ovsFwdCtx, vport, flowKey)) {
> return NDIS_STATUS_SUCCESS;
> }
>@@ -667,41 +662,36 @@ OvsTunnelPortTx(OvsForwardingContext *ovsFwdCtx)
>  * Setup the source port to be the internal port to as to facilitate
>the
>  * second OvsLookupFlow.
>  */
>-if (ovsFwdCtx->switchContext->internalVport == NULL ||
>+if (ovsFwdCtx->switchContext->countInternalVports <= 0 ||
> ovsFwdCtx->switchContext->virtualExternalVport == NULL) {
> OvsClearTunTxCtx(ovsFwdCtx);
> OvsCompleteNBLForwardingCtx(ovsFwdCtx,
> L"OVS-Dropped since either internal or external port is
>absent");
> return NDIS_STATUS_FAILURE;
> }
>-ovsFwdCtx->srcVportNo =
>-
>((POVS_VPORT_ENTRY)ovsFwdCtx->switchContext->internalVport)->portNo;
> 
>-ovsFwdCtx->fwdDetail->SourcePortId =
>ovsFwdCtx->switchContext->internalPortId;
>-ovsFwdCtx->fwdDetail->SourceNicIndex =
>-
>((POVS_VPORT_ENTRY)ovsFwdCtx->switchContext->internalVport)->nicIndex;
>-
>-/* Do the encap. Encap function does not consume the NBL. */
>+OVS_FWD_INFO switchFwdInfo = { 0 };
>+/* Do the encapsulation. The encapsulation will not consume the NBL.
>*/
> switch(ovsFwdCtx->tunnelTxNic->ovsType) {
> case OVS_VPORT_TYPE_GRE:
> status = OvsEncapGre(ovsFwdCtx->tunnelTxNic, ovsFwdCtx->curNbl,
>  &ovsFwdCtx->tunKey,
>ovsFwdCtx->switchContext,
>- &ovsFwdCtx->layers, &newNbl);
>+ &ovsFwdCtx->layers, &newNbl,
>&switchFwdInfo);
> break;
> case OVS_VPORT_TYPE_VXLAN:
> status = OvsEncapVxlan(ovsFwdCtx->tunnelTxNic, ovsFwdCtx->curNbl,
>&ovsFwdCtx->tunKey,
>ovsFwdCtx->switchContext,
>-   &ovsFwdCtx->layers, &newNbl);
>+   &ovsFwdCtx->layers, &newNbl,
>&switchFwdInfo);
> break;
> case OVS_VPORT_TYPE_STT:
> status = OvsEncapStt(ovsFwdCtx->tunnelTxNic, ovsFwdCtx->curNbl,
>  &ovsFwdCtx->tunKey,
>ovsFwdCtx->switchContext,
>- &ovsFwdCtx->layers, &newNbl);
>+ &ovsFwdCtx->layers, &newNbl,
>&switchFwdInfo);
> break;
> case OVS_VPORT_TYPE_GENEVE:
> status = OvsEncapGeneve(ovsFwdCtx->tunnelTxNic,
>ovsFwdCtx->curNbl,
> &ovsFwdCtx->tunKey,
>ovsFwdCtx->switchContext,
>-&ovsFwdCtx->l

Re: [ovs-dev] [PATCH V2 2/4] datapath-windows: Add VLAN support to STT

2016-06-06 Thread Sairam Venugopal
Just in case it¹s required for V2:

Acked-by: Sairam Venugopal 


On 6/6/16, 9:45 AM, "Paul Boca"  wrote:

>Add VLAN to STT header and on receive applyit to encapsulated packet
>
>Signed-off-by: Paul-Daniel Boca 
>Acked-by: Sairam Venugopal 
>---
>V2: No changes
>---
> datapath-windows/ovsext/Stt.c | 22 +-
> 1 file changed, 21 insertions(+), 1 deletion(-)
>
>diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c
>index c93db75..9345255 100644
>--- a/datapath-windows/ovsext/Stt.c
>+++ b/datapath-windows/ovsext/Stt.c
>@@ -156,6 +156,7 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> PUINT8 bufferStart;
> ULONG mss = 0;
> NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO lsoInfo;
>+PVOID vlanTagValue;
> 
> curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
> 
>@@ -173,6 +174,7 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
> csumInfo.Value = NET_BUFFER_LIST_INFO(curNbl,
>  
>TcpIpChecksumNetBufferListInfo);
>+vlanTagValue = NET_BUFFER_LIST_INFO(curNbl,
>Ieee8021QNetBufferListInfo);
> *newNbl = OvsPartialCopyNBL(switchContext, curNbl, 0, headRoom,
> FALSE /*copy NblInfo*/);
> if (*newNbl == NULL) {
>@@ -310,8 +312,16 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> sttHdr->mss = 0;
> }
> 
>-sttHdr->reserved = 0;
>+/* Set VLAN tag */
> sttHdr->vlanTCI = 0;
>+if (vlanTagValue) {
>+PNDIS_NET_BUFFER_LIST_8021Q_INFO vlanTag =
>+(PNDIS_NET_BUFFER_LIST_8021Q_INFO)(PVOID *)&vlanTagValue;
>+sttHdr->vlanTCI = htons(vlanTag->TagHeader.VlanId |
>OVSWIN_VLAN_CFI |
>+(vlanTag->TagHeader.UserPriority << 13));
>+}
>+
>+sttHdr->reserved = 0;
> sttHdr->key = tunKey->tunnelId;
> /* Zero out stt padding */
> *(uint16 *)(sttHdr + 1) = 0;
>@@ -899,6 +909,16 @@ OvsDecapStt(POVS_SWITCH_CONTEXT switchContext,
> tunKey->ttl = ipHdr->ttl;
> tunKey->pad = 0;
> 
>+/* Apply VLAN tag if present */
>+if (ntohs(sttHdr->vlanTCI) & OVSWIN_VLAN_CFI) {
>+NDIS_NET_BUFFER_LIST_8021Q_INFO vlanTag;
>+vlanTag.Value = 0;
>+vlanTag.TagHeader.VlanId = ntohs(sttHdr->vlanTCI) & 0xfff;
>+vlanTag.TagHeader.UserPriority = ntohs(sttHdr->vlanTCI) >> 13;
>+NET_BUFFER_LIST_INFO(*newNbl,
>+Ieee8021QNetBufferListInfo) = vlanTag.Value;
>+}
>+
> /* Set Checksum and LSO offload flags */
> OvsDecapSetOffloads(newNbl, sttHdr);
> 
>-- 
>2.7.2.windows.1
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=gauqI4G7bJTdFCfHUYB5Tmn35Htdsh
>J18rUHlJ3rqeo&s=nZKVy_X97XsB_NdX3B5Uu2WEwZifAhpDUYukDLszyoI&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH V2 3/4] datapath-windows: STT reassemble small fix

2016-06-06 Thread Sairam Venugopal
Just in case it¹s required for V2:

Acked-by: Sairam Venugopal 




On 6/6/16, 9:45 AM, "Paul Boca"  wrote:

>Fixed possible deadlock in case NdisGetDataBuffer fails
>Validate the segment length and offset on reassemble to avoid buffer
>overflow
>
>Signed-off-by: Paul-Daniel Boca 
>Acked-by: Sairam Venugopal 
>---
>V2: No changes
>---
> datapath-windows/ovsext/Stt.c | 16 +---
> datapath-windows/ovsext/Stt.h |  1 +
> 2 files changed, 14 insertions(+), 3 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c
>index 9345255..fd9b32b 100644
>--- a/datapath-windows/ovsext/Stt.c
>+++ b/datapath-windows/ovsext/Stt.c
>@@ -612,9 +612,6 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> SttHdr *sttHdr = NULL;
> sourceNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
> 
>-/* XXX optimize this lock */
>-NdisAcquireSpinLock(&OvsSttSpinLock);
>-
> /* If this is the first fragment, copy the STT header */
> if (segOffset == 0) {
> sttHdr = NdisGetDataBuffer(sourceNb, sizeof(SttHdr), &stt, 1, 0);
>@@ -626,6 +623,14 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> startOffset = startOffset + STT_HDR_LEN;
> }
> 
>+if (offset + fragmentLength > innerPacketLen) {
>+// avoid buffer overflow on copy
>+return NULL;
>+}
>+
>+/* XXX optimize this lock */
>+NdisAcquireSpinLock(&OvsSttSpinLock);
>+
> /* Lookup fragment */
> OVS_STT_PKT_KEY pktKey = OvsGeneratePacketKey(ipHdr, tcp);
> UINT32 hash = OvsSttGetPktHash(&pktKey);
>@@ -652,6 +657,7 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> }
> 
> /* Copy the data from Source to new buffer */
>+entry->allocatedLen = innerPacketLen;
> entry->packetBuf = OvsAllocateMemoryWithTag(innerPacketLen,
> OVS_STT_POOL_TAG);
> if (OvsGetPacketBytes(curNbl, fragmentLength, startOffset,
>@@ -664,6 +670,10 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> InsertHeadList(&OvsSttPktFragHash[hash & STT_HASH_TABLE_MASK],
>&entry->link);
> } else {
>+if (offset + fragmentLength > pktFragEntry->allocatedLen) {
>+// don't copy more than it is allocated
>+goto handle_error;
>+}
> /* Add to recieved length to identify if this is the last
>fragment */
> pktFragEntry->recvdLen += fragmentLength;
> lastPacket = (pktFragEntry->recvdLen == innerPacketLen);
>diff --git a/datapath-windows/ovsext/Stt.h b/datapath-windows/ovsext/Stt.h
>index a3e3915..faa00d7 100644
>--- a/datapath-windows/ovsext/Stt.h
>+++ b/datapath-windows/ovsext/Stt.h
>@@ -68,6 +68,7 @@ typedef struct _OVS_STT_PKT_ENTRY {
> OVS_STT_PKT_KEY ovsPktKey;
> UINT64  timeout;
> UINT32  recvdLen;
>+UINT32  allocatedLen;
> SttHdr  sttHdr;
> PCHAR   packetBuf;
> LIST_ENTRY  link;
>-- 
>2.7.2.windows.1
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=KBEW9Ar6kdibHQGGkQYfU6dTh3ygBF
>z5PN5DJxfpGaA&s=53cmZhcWT6vigu_gFHbyFCXT7xeTL35GUSxob3A95EA&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH V2 1/4] datapath-windows: Improved offloading on STT tunnel

2016-06-06 Thread Sairam Venugopal
Thanks for making the changes.

Acked-by: Sairam Venugopal 


On 6/6/16, 9:45 AM, "Paul Boca"  wrote:

>*Added OvsExtractLayers - populates only the layers field without
>unnecessary
>memory operations for flow part
>*If in STT header the flags are 0 then force packets checksums calculation
>on receive.
>*Ensure correct pseudo checksum is set for LSO both on send and receive.
>Linux includes the segment length to TCP pseudo-checksum conforming to
>RFC 793 but in case of LSO Windows expects this to be only on
>Source IP Address, Destination IP Address, and Protocol.
>*Fragment expiration on rx side of STT was set to 30 seconds, but the
>correct
>timeout would be TTL of the packet
>
>Signed-off-by: Paul-Daniel Boca 
>---
>V2: Use STT_ENTRY_TIMEOUT on STT reassmble.
>Small refactoring and added LSO comment with specific requirements.
>---
> datapath-windows/ovsext/Flow.c | 243
>-
> datapath-windows/ovsext/Flow.h |   2 +
> datapath-windows/ovsext/PacketParser.c |  97 +++--
> datapath-windows/ovsext/PacketParser.h |   8 +-
> datapath-windows/ovsext/Stt.c  | 124 +
> datapath-windows/ovsext/User.c |  17 ++-
> 6 files changed, 377 insertions(+), 114 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Flow.c
>b/datapath-windows/ovsext/Flow.c
>index c2e0227..2a91855 100644
>--- a/datapath-windows/ovsext/Flow.c
>+++ b/datapath-windows/ovsext/Flow.c
>@@ -1570,7 +1570,8 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
> 
> ndKey = NlAttrGet(keyAttrs[OVS_KEY_ATTR_ND]);
> RtlCopyMemory(&icmp6FlowPutKey->ndTarget,
>-  ndKey->nd_target, sizeof
>(icmp6FlowPutKey->ndTarget));
>+  ndKey->nd_target,
>+  sizeof (icmp6FlowPutKey->ndTarget));
> RtlCopyMemory(icmp6FlowPutKey->arpSha,
>   ndKey->nd_sll, ETH_ADDR_LEN);
> RtlCopyMemory(icmp6FlowPutKey->arpTha,
>@@ -1600,8 +1601,10 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
> arpFlowPutKey->nwSrc = arpKey->arp_sip;
> arpFlowPutKey->nwDst = arpKey->arp_tip;
> 
>-RtlCopyMemory(arpFlowPutKey->arpSha, arpKey->arp_sha,
>ETH_ADDR_LEN);
>-RtlCopyMemory(arpFlowPutKey->arpTha, arpKey->arp_tha,
>ETH_ADDR_LEN);
>+RtlCopyMemory(arpFlowPutKey->arpSha, arpKey->arp_sha,
>+  ETH_ADDR_LEN);
>+RtlCopyMemory(arpFlowPutKey->arpTha, arpKey->arp_tha,
>+  ETH_ADDR_LEN);
> /* Kernel datapath assumes 'arpFlowPutKey->nwProto' to be in
>host
>  * order. */
> arpFlowPutKey->nwProto = (UINT8)ntohs((arpKey->arp_op));
>@@ -1850,29 +1853,195 @@ OvsGetFlowMetadata(OvsFlowKey *key,
> return status;
> }
> 
>+
> /*
>- 
>*-
>---
>- * Initializes 'flow' members from 'packet', 'skb_priority', 'tun_id',
>and
>- * 'ofp_in_port'.
>- *
>- * Initializes 'packet' header pointers as follows:
>- *
>- *- packet->l2 to the start of the Ethernet header.
>- *
>- *- packet->l3 to just past the Ethernet header, or just past the
>- *  vlan_header if one is present, to the first byte of the payload
>of the
>- *  Ethernet frame.
>- *
>- *- packet->l4 to just past the IPv4 header, if one is present and
>has a
>- *  correct length, and otherwise NULL.
>- *
>- *- packet->l7 to just past the TCP, UDP, SCTP or ICMP header, if
>one is
>- *  present and has a correct length, and otherwise NULL.
>- *
>- * Returns NDIS_STATUS_SUCCESS normally.  Fails only if packet data
>cannot be accessed
>- * (e.g. if Pkt_CopyBytesOut() returns an error).
>- 
>*-
>---
>- */
>+*
>
>+* Initializes 'layers' members from 'packet'
>+*
>+* Initializes 'layers' header pointers as follows:
>+*
>+*- layers->l2 to the start of the Ethernet header.
>+*
>+*- layers->l3 to just past the Ethernet header, or just past the
>+*  vlan_header if one is present, to the first byte of the payload
>of the
>+*  Ethernet frame.
>+*
>+*- layers->l4 to just past the IPv4 header, if one is present and
>has a
>+*  correct lengt

Re: [ovs-dev] [PATCH V2 4/4] datapath-windows: Add ECN support on STT decapsulation

2016-06-06 Thread Sairam Venugopal
Thanks for incorporating the changes.

Acked-by: Sairam Venugopal 




On 6/6/16, 9:45 AM, "Paul Boca"  wrote:

>Signed-off-by: Paul-Daniel Boca 
>---
>V2: Removed previously added OvsGetEthHdr and use OveExtractLayers instead
>on STT decapsulation. Extracted layers will be used in SetOffloads if
>needed.
>---
> datapath-windows/ovsext/NetProto.h | 10 -
> datapath-windows/ovsext/Stt.c  | 85
>+-
> datapath-windows/ovsext/Stt.h  |  1 +
> 3 files changed, 85 insertions(+), 11 deletions(-)
>
>diff --git a/datapath-windows/ovsext/NetProto.h
>b/datapath-windows/ovsext/NetProto.h
>index f7527f8..6cf6d8e 100644
>--- a/datapath-windows/ovsext/NetProto.h
>+++ b/datapath-windows/ovsext/NetProto.h
>@@ -45,6 +45,8 @@ typedef struct EthHdr {
> #define ICMP_CSUM_OFFSET   2
> #define INET_CSUM_LENGTH   (sizeof(UINT16))
> 
>+#define PACKET_MAX_LENGTH  64*1024 // 64K
>+
> #define IP4_UNITS_TO_BYTES(x) ((x) << 2)
> #define IP4_BYTES_TO_UNITS(x) ((x) >> 2)
> 
>@@ -245,7 +247,13 @@ typedef union _OVS_PACKET_HDR_INFO {
> typedef struct IPHdr {
>UINT8ihl:4,
> version:4;
>-   UINT8tos;
>+   union {
>+   struct {
>+   UINT8 ecn:2,
>+ dscp:6;
>+   };
>+   UINT8tos;
>+   };
>UINT16   tot_len;
>UINT16   id;
>UINT16   frag_off;
>diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c
>index fd9b32b..0bac5f2 100644
>--- a/datapath-windows/ovsext/Stt.c
>+++ b/datapath-windows/ovsext/Stt.c
>@@ -647,6 +647,9 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> NdisMoveMemory(&entry->ovsPktKey, &pktKey, sizeof
>(OVS_STT_PKT_KEY));
> 
> entry->recvdLen = fragmentLength;
>+if (ipHdr->ecn == IP_ECN_CE) {
>+entry->ecn = IP_ECN_CE;
>+}
> 
> UINT64 currentTime;
> NdisGetCurrentSystemTime((LARGE_INTEGER *) ¤tTime);
>@@ -681,6 +684,9 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> if (segOffset == 0) {
> pktFragEntry->sttHdr = *sttHdr;
> }
>+if (ipHdr->ecn == IP_ECN_CE) {
>+pktFragEntry->ecn = IP_ECN_CE;
>+}
> 
> /* Copy the fragment data from Source to existing buffer */
> if (OvsGetPacketBytes(curNbl, fragmentLength, startOffset,
>@@ -692,6 +698,14 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> 
> handle_error:
> if (lastPacket) {
>+/* It is RECOMMENDED that if any segment of the received STT
>+*  frame has the CE (congestion experienced) bit set
>+*  in its IP header, then the CE bit SHOULD be set in the IP
>+*  header of the decapsulated STT frame.*/
>+if (pktFragEntry->ecn == IP_ECN_CE) {
>+ipHdr->ecn = IP_ECN_CE;
>+}
>+
> /* Retrieve the original STT header */
> NdisMoveMemory(newSttHdr, &pktFragEntry->sttHdr, sizeof
>(SttHdr));
> targetPNbl = OvsAllocateNBLFromBuffer(switchContext,
>@@ -723,7 +737,9 @@ handle_error:
> 
>*-
>---
> */
> NDIS_STATUS
>-OvsDecapSetOffloads(PNET_BUFFER_LIST *curNbl, SttHdr *sttHdr)
>+OvsDecapSetOffloads(PNET_BUFFER_LIST *curNbl,
>+SttHdr *sttHdr,
>+OVS_PACKET_HDR_INFO *layers)
> {
> if ((sttHdr->flags & STT_CSUM_VERIFIED)
> || !(sttHdr->flags & STT_CSUM_PARTIAL)) {
>@@ -767,11 +783,13 @@ OvsDecapSetOffloads(PNET_BUFFER_LIST *curNbl,
>SttHdr *sttHdr)
> PMDL curMdl = NULL;
> PNET_BUFFER curNb;
> PUINT8 buf = NULL;
>-OVS_PACKET_HDR_INFO layers;
> 
>-status = OvsExtractLayers(*curNbl, &layers);
>-if (status != NDIS_STATUS_SUCCESS) {
>-return status;
>+// if layers not initialized by the caller we extract layers here
>+if (layers->value == 0) {
>+status = OvsExtractLayers(*curNbl, layers);
>+if (status != NDIS_STATUS_SUCCESS) {
>+return status;
>+}
> }
> 
> curNb = NET_BUFFER_LIST_FIRST_NB(*curNbl);
>@@ -786,8 +804,8 @@ OvsDecapSetOffloads(PNET_BUFFER_LIST *curNbl, SttHdr
>*sttHdr)
> IPHdr *ipHdr;
> TCPHdr *tcpHdr;
> 
>-ipHdr = (IPHdr *)(buf + layers.l3Offset);
>-tcpHdr = (TCPHdr *)(buf + layers.l4Offset);
>+ipHdr = (IPHdr *)(buf + layers->l3Offset);
>+tcpHdr = (TCPHdr *)(buf + layers->l4Offset);
> 
> tcpHdr->check

[ovs-dev] [PATCH v5] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-06-07 Thread Sairam Venugopal
Enable support for UDP and ICMP in the connection tracking module on
Hyper-V. Define 1s as variable and reuse it.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/automake.mk  |   1 +
 datapath-windows/ovsext/Conntrack-other.c |  82 ++
 datapath-windows/ovsext/Conntrack-tcp.c   |  10 +-
 datapath-windows/ovsext/Conntrack.c   | 178 ++
 datapath-windows/ovsext/Conntrack.h   |  13 ++-
 datapath-windows/ovsext/ovsext.vcxproj|   1 +
 6 files changed, 233 insertions(+), 52 deletions(-)
 create mode 100644 datapath-windows/ovsext/Conntrack-other.c

diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index c9af806..668cf2c 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -13,6 +13,7 @@ EXTRA_DIST += \
datapath-windows/ovsext/Atomic.h \
datapath-windows/ovsext/BufferMgmt.c \
datapath-windows/ovsext/BufferMgmt.h \
+   datapath-windows/ovsext/Conntrack-other.c \
datapath-windows/ovsext/Conntrack-tcp.c \
datapath-windows/ovsext/Conntrack.c \
datapath-windows/ovsext/Conntrack.h \
diff --git a/datapath-windows/ovsext/Conntrack-other.c 
b/datapath-windows/ovsext/Conntrack-other.c
new file mode 100644
index 000..5d39389
--- /dev/null
+++ b/datapath-windows/ovsext/Conntrack-other.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015, 2016 VMware, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Conntrack.h"
+#include 
+
+enum other_state {
+OTHERS_FIRST,
+OTHERS_MULTIPLE,
+OTHERS_BIDIR,
+};
+
+struct conn_other {
+struct OVS_CT_ENTRY up;
+enum other_state state;
+};
+
+static const long long other_timeouts[] = {
+[OTHERS_FIRST] = 60 * CT_INTERVAL_SEC,
+[OTHERS_MULTIPLE] = 60 * CT_INTERVAL_SEC,
+[OTHERS_BIDIR] = 30 * CT_INTERVAL_SEC,
+};
+
+static __inline struct conn_other*
+OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
+{
+ASSERT(conn);
+return CONTAINER_OF(conn, struct conn_other, up);
+}
+
+static __inline VOID
+OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
+{
+ASSERT(conn);
+conn->up.expiration = now + other_timeouts[conn->state];
+}
+
+enum ct_update_res
+OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
+ BOOLEAN reply,
+ UINT64 now)
+{
+ASSERT(conn_);
+struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
+
+if (reply && conn->state != OTHERS_BIDIR) {
+conn->state = OTHERS_BIDIR;
+} else if (conn->state == OTHERS_FIRST) {
+conn->state = OTHERS_MULTIPLE;
+}
+
+OvsConntrackUpdateExpiration(conn, now);
+
+return CT_UPDATE_VALID;
+}
+
+OVS_CT_ENTRY *
+OvsConntrackCreateOtherEntry(UINT64 now)
+{
+struct conn_other *conn;
+conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
+OVS_CT_POOL_TAG);
+/* XXX Handle memory allocation error (by returning a status) */
+ASSERT(conn);
+conn->up = (OVS_CT_ENTRY) {0};
+conn->state = OTHERS_FIRST;
+OvsConntrackUpdateExpiration(conn, now);
+return &conn->up;
+}
diff --git a/datapath-windows/ovsext/Conntrack-tcp.c 
b/datapath-windows/ovsext/Conntrack-tcp.c
index 24f5e7c..19925c3 100644
--- a/datapath-windows/ovsext/Conntrack-tcp.c
+++ b/datapath-windows/ovsext/Conntrack-tcp.c
@@ -389,18 +389,18 @@ OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
 
 if (src->state >= CT_DPIF_TCPS_FIN_WAIT_2
 && dst->state >= CT_DPIF_TCPS_FIN_WAIT_2) {
-OvsConntrackUpdateExpiration(conn, now, 30 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 30 * CT_INTERVAL_SEC);
 } else if (src->state >= CT_DPIF_TCPS_CLOSING
&& dst->state >= CT_DPIF_TCPS_CLOSING) {
-OvsConntrackUpdateExpiration(conn, now, 45 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 45 * CT_INTERVAL_SEC);
 } else if (src->state < CT_DPIF_TCPS_ESTABLISHED
|| dst->state < CT_DPIF_TCPS_ESTABLISHED) {
-OvsConntrackUpdateExpiration(conn, now, 30 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 30 * CT_INTERVAL_SEC);
 } else if (src->state >= CT_DPIF_TCPS_CLOSING
   

Re: [ovs-dev] [PATCH v2] datapath-windows: use ip proto for tunnel port lookup

2016-06-07 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 6/3/16, 9:34 AM, "Nithin Raju"  wrote:

>In Actions.c, based on the IP Protocol type and L4 port of
>the outer packet, we lookup the tunnel port. The function
>that made this happen took the tunnel type as an argument.
>Semantically, is is better to pass the IP protocol type and
>let the lookup code map IP protocol type to tunnel type.
>
>In the vport add code, we make sure that we block tunnel
>port addition if there's already a tunnel port that uses
>the same IP protocol type and L4 port number.
>
>This is required for Geneve port lookups the references to
>which can find in the patch.
>
>Signed-off-by: Nithin Raju 
>---
> datapath-windows/ovsext/Actions.c | 39 +---
> datapath-windows/ovsext/Tunnel.c  |  6 ++---
> datapath-windows/ovsext/Vport.c   | 53
>+--
> datapath-windows/ovsext/Vport.h   | 11 
> 4 files changed, 73 insertions(+), 36 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Actions.c
>b/datapath-windows/ovsext/Actions.c
>index 4edf7d0..53be718 100644
>--- a/datapath-windows/ovsext/Actions.c
>+++ b/datapath-windows/ovsext/Actions.c
>@@ -217,30 +217,27 @@ OvsDetectTunnelRxPkt(OvsForwardingContext
>*ovsFwdCtx,
>  */
> if (!flowKey->ipKey.nwFrag) {
> UINT16 dstPort = htons(flowKey->ipKey.l4.tpDst);
>-switch (flowKey->ipKey.nwProto) {
>-case IPPROTO_GRE:
>-tunnelVport =
>OvsFindTunnelVportByPortType(ovsFwdCtx->switchContext,
>- 
>OVS_VPORT_TYPE_GRE);
>-if (tunnelVport) {
>-ovsActionStats.rxGre++;
>-}
>-break;
>-case IPPROTO_TCP:
>-tunnelVport =
>OvsFindTunnelVportByDstPort(ovsFwdCtx->switchContext,
>-  dstPort,
>- 
>OVS_VPORT_TYPE_STT);
>-if (tunnelVport) {
>+tunnelVport =
>+
>OvsFindTunnelVportByDstPortAndNWProto(ovsFwdCtx->switchContext,
>+  dstPort,
>+ 
>flowKey->ipKey.nwProto);
>+if (tunnelVport) {
>+switch(tunnelVport->ovsType) {
>+case OVS_VPORT_TYPE_STT:
> ovsActionStats.rxStt++;
>-}
>-break;
>-case IPPROTO_UDP:
>-tunnelVport =
>OvsFindTunnelVportByDstPort(ovsFwdCtx->switchContext,
>-  dstPort,
>- 
>OVS_VPORT_TYPE_VXLAN);
>-if (tunnelVport) {
>+break;
>+case OVS_VPORT_TYPE_VXLAN:
> ovsActionStats.rxVxlan++;
>+break;
>+#if 0
>+case OVS_VPORT_TYPE_GENEVE:
>+ovsActionStats.rxGeneve++;
>+break;
>+#endif
>+case OVS_VPORT_TYPE_GRE:
>+ovsActionStats.rxGre++;
>+break;
> }
>-break;
> }
> }
> 
>diff --git a/datapath-windows/ovsext/Tunnel.c
>b/datapath-windows/ovsext/Tunnel.c
>index 97d2020..c5aae1a 100644
>--- a/datapath-windows/ovsext/Tunnel.c
>+++ b/datapath-windows/ovsext/Tunnel.c
>@@ -285,9 +285,9 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl,
> 
> SendFlags |= NDIS_SEND_FLAGS_DISPATCH_LEVEL;
> 
>-vport = OvsFindTunnelVportByDstPort(gOvsSwitchContext,
>-htons(tunnelKey.dst_port),
>-OVS_VPORT_TYPE_VXLAN);
>+vport = OvsFindTunnelVportByDstPortAndType(gOvsSwitchContext,
>+ 
>htons(tunnelKey.dst_port),
>+   OVS_VPORT_TYPE_VXLAN);
> 
> if (vport == NULL){
> status = STATUS_UNSUCCESSFUL;
>diff --git a/datapath-windows/ovsext/Vport.c
>b/datapath-windows/ovsext/Vport.c
>index 222b2c1..ed14553 100644
>--- a/datapath-windows/ovsext/Vport.c
>+++ b/datapath-windows/ovsext/Vport.c
>@@ -691,9 +691,9 @@ OvsFindVportByPortNo(POVS_SWITCH_CONTEXT
>switchContext,
> 
> 
> POVS_VPORT_ENTRY
>-OvsFindTunnelVportByDstPort(POVS_SWITCH_CONTEXT switchContext,
>-UINT16 dstPort,
>-OVS_VPORT_TYPE ovsPortType)
>+OvsFindTunnelVportByDstPortAndType(POVS_SWITCH_CONTEXT switchContext,
>+   UINT16 dstPort,
>+   OVS_VPORT_TYPE ovsPortType)
> {
> POVS_VPORT_ENTRY vport;
> PLIST_ENTRY head, link;
>@@ -711,18 +711,34 @@ OvsFindTunnelVportByDstPort(POVS_SWITC

[ovs-dev] [PATCH 0/5] Windows: Add support for conntrack-flush command

2016-06-13 Thread Sairam Venugopal
Conntrack module is part of OVS datapath on Windows and lacks support netlink 
support. The following patches adds support in Windows datapath for accepting 
netfilter-netlink messages from userspace and executing the command. The 
current version adds support for flushing conntrack entries by parsing the new 
message format.

Netfilter's conntrack related header files have been added to Windows to limit 
the userspace changes. Some of them have been intentionally left empty since 
Windows datapath does not support them.

Sairam Venugopal (5):
  Windows: Add netfilter-conntrack header files to Include folder
  datapath-windows: Add support for Netfilter netlink message
  datapath-windows: Add support for flushing conntrack entries
  datapath-windows: Add support for Conntrack IPCTNL_MSG_CT_DELETE cmd
in Datapath.c
  Windows: Add conntrack-flush support in userspace

 datapath-windows/include/OvsDpInterfaceExt.h   |  17 ++
 datapath-windows/ovsext/Conntrack.c|  75 +++
 datapath-windows/ovsext/Datapath.c |  80 ++-
 datapath-windows/ovsext/Netlink/Netlink.c  |  11 +
 datapath-windows/ovsext/Netlink/Netlink.h  |   8 +-
 datapath-windows/ovsext/Netlink/NetlinkProto.h |   9 +
 include/windows/automake.mk|   6 +
 .../windows/linux/netfilter/nf_conntrack_common.h  | 113 ++
 include/windows/linux/netfilter/nf_conntrack_ftp.h |   0
 .../windows/linux/netfilter/nf_conntrack_sctp.h|   0
 include/windows/linux/netfilter/nf_conntrack_tcp.h |  49 
 include/windows/linux/netfilter/nfnetlink.h|  63 ++
 .../windows/linux/netfilter/nfnetlink_conntrack.h  | 249 +
 lib/automake.mk|   2 +
 lib/dpif-netlink.c |  15 +-
 lib/netlink-conntrack.c|  33 ++-
 16 files changed, 703 insertions(+), 27 deletions(-)
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_common.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_ftp.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_sctp.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_tcp.h
 create mode 100644 include/windows/linux/netfilter/nfnetlink.h
 create mode 100644 include/windows/linux/netfilter/nfnetlink_conntrack.h

-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 1/5] Windows: Add netfilter-conntrack header files to Include folder

2016-06-13 Thread Sairam Venugopal
Include netfilter-conntrack header files in user-space. This will be used
by Windows userspace for adding debugging support in Conntrack. Some of these 
files
are intentionally left blank and will be updated once relevant support is
added in Windows datapath.

Signed-off-by: Sairam Venugopal 
---
 include/windows/automake.mk|   6 +
 .../windows/linux/netfilter/nf_conntrack_common.h  | 113 ++
 include/windows/linux/netfilter/nf_conntrack_ftp.h |   0
 .../windows/linux/netfilter/nf_conntrack_sctp.h|   0
 include/windows/linux/netfilter/nf_conntrack_tcp.h |  49 
 include/windows/linux/netfilter/nfnetlink.h|  63 ++
 .../windows/linux/netfilter/nfnetlink_conntrack.h  | 249 +
 7 files changed, 480 insertions(+)
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_common.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_ftp.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_sctp.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_tcp.h
 create mode 100644 include/windows/linux/netfilter/nfnetlink.h
 create mode 100644 include/windows/linux/netfilter/nfnetlink_conntrack.h

diff --git a/include/windows/automake.mk b/include/windows/automake.mk
index 58b52f1..382627b 100644
--- a/include/windows/automake.mk
+++ b/include/windows/automake.mk
@@ -9,6 +9,12 @@ noinst_HEADERS += \
include/windows/arpa/inet.h \
include/windows/dirent.h \
include/windows/getopt.h \
+   include/windows/linux/netfilter/nf_conntrack_common.h \
+   include/windows/linux/netfilter/nf_conntrack_ftp.h \
+   include/windows/linux/netfilter/nf_conntrack_sctp.h \
+   include/windows/linux/netfilter/nf_conntrack_tcp.h \
+   include/windows/linux/netfilter/nfnetlink.h \
+   include/windows/linux/netfilter/nfnetlink_conntrack.h \
include/windows/linux/pkt_sched.h \
include/windows/linux/types.h \
include/windows/net/if.h \
diff --git a/include/windows/linux/netfilter/nf_conntrack_common.h 
b/include/windows/linux/netfilter/nf_conntrack_common.h
new file mode 100644
index 000..9904003
--- /dev/null
+++ b/include/windows/linux/netfilter/nf_conntrack_common.h
@@ -0,0 +1,113 @@
+#ifndef _NF_CONNTRACK_COMMON_H
+#define _NF_CONNTRACK_COMMON_H
+/* Connection state tracking for netfilter.  This is separated from,
+   but required by, the NAT layer; it can also be used by an iptables
+   extension. */
+enum ip_conntrack_info {
+/* Part of an established connection (either direction). */
+IP_CT_ESTABLISHED,
+
+/* Like NEW, but related to an existing connection, or ICMP error
+   (in either direction). */
+IP_CT_RELATED,
+
+/* Started a new connection to track (only
+   IP_CT_DIR_ORIGINAL); may be a retransmission. */
+IP_CT_NEW,
+
+/* >= this indicates reply direction */
+IP_CT_IS_REPLY,
+
+IP_CT_ESTABLISHED_REPLY = IP_CT_ESTABLISHED + IP_CT_IS_REPLY,
+IP_CT_RELATED_REPLY = IP_CT_RELATED + IP_CT_IS_REPLY,
+IP_CT_NEW_REPLY = IP_CT_NEW + IP_CT_IS_REPLY,
+/* Number of distinct IP_CT types (no NEW in reply dirn). */
+IP_CT_NUMBER = IP_CT_IS_REPLY * 2 - 1
+};
+
+/* Bitset representing status of connection. */
+enum ip_conntrack_status {
+/* It's an expected connection: bit 0 set.  This bit never changed */
+IPS_EXPECTED_BIT = 0,
+IPS_EXPECTED = (1 << IPS_EXPECTED_BIT),
+
+/* We've seen packets both ways: bit 1 set.  Can be set, not unset. */
+IPS_SEEN_REPLY_BIT = 1,
+IPS_SEEN_REPLY = (1 << IPS_SEEN_REPLY_BIT),
+
+/* Conntrack should never be early-expired. */
+IPS_ASSURED_BIT = 2,
+IPS_ASSURED = (1 << IPS_ASSURED_BIT),
+
+/* Connection is confirmed: originating packet has left box */
+IPS_CONFIRMED_BIT = 3,
+IPS_CONFIRMED = (1 << IPS_CONFIRMED_BIT),
+
+/* Connection needs src nat in orig dir.  This bit never changed. */
+IPS_SRC_NAT_BIT = 4,
+IPS_SRC_NAT = (1 << IPS_SRC_NAT_BIT),
+
+/* Connection needs dst nat in orig dir.  This bit never changed. */
+IPS_DST_NAT_BIT = 5,
+IPS_DST_NAT = (1 << IPS_DST_NAT_BIT),
+
+/* Both together. */
+IPS_NAT_MASK = (IPS_DST_NAT | IPS_SRC_NAT),
+
+/* Connection needs TCP sequence adjusted. */
+IPS_SEQ_ADJUST_BIT = 6,
+IPS_SEQ_ADJUST = (1 << IPS_SEQ_ADJUST_BIT),
+
+/* NAT initialization bits. */
+IPS_SRC_NAT_DONE_BIT = 7,
+IPS_SRC_NAT_DONE = (1 << IPS_SRC_NAT_DONE_BIT),
+
+IPS_DST_NAT_DONE_BIT = 8,
+IPS_DST_NAT_DONE = (1 << IPS_DST_NAT_DONE_BIT),
+
+/* Both together */
+IPS_NAT_DONE_MASK = (IPS_DST_NAT_DONE | IPS_SRC_NAT_DONE),
+
+/* Connection is dying (removed from lists), can not be unset. */
+IPS_DYING_BIT = 9,
+IPS_DYING = (1 << IPS_DYING_BIT),
+
+/* Connection has fixed timeout. */
+IPS_FIXED_TIMEOUT_BIT = 10,
+IPS_FIXED_TIMEOUT = (1 << IPS

[ovs-dev] [PATCH 2/5] datapath-windows: Add support for Netfilter netlink message

2016-06-13 Thread Sairam Venugopal
Introduce NF_GEN_MSG_HDR similar to GENL_MSG_HDR that will be used for
communicating via netfilter-netlink channel. This will be used by
userspace to retrieve and modify Conntrack data in Windows.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Netlink/Netlink.c  | 11 +++
 datapath-windows/ovsext/Netlink/Netlink.h  |  8 ++--
 datapath-windows/ovsext/Netlink/NetlinkProto.h |  9 +
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/datapath-windows/ovsext/Netlink/Netlink.c 
b/datapath-windows/ovsext/Netlink/Netlink.c
index 1eec320..a25a22a 100644
--- a/datapath-windows/ovsext/Netlink/Netlink.c
+++ b/datapath-windows/ovsext/Netlink/Netlink.c
@@ -672,6 +672,17 @@ NlMsgAttrsLen(const PNL_MSG_HDR nlh)
 return NlHdrPayloadLen(nlh) - GENL_HDRLEN - OVS_HDRLEN;
 }
 
+/*
+ * ---
+ * Returns size of to nfnlmsg attributes.
+ * ---
+ */
+UINT32
+NfNlMsgAttrsLen(const PNL_MSG_HDR nlh)
+{
+return NlHdrPayloadLen(nlh) - NF_GEN_MSG_HDRLEN - OVS_HDRLEN;
+}
+
 /* Netlink message parse. */
 
 /*
diff --git a/datapath-windows/ovsext/Netlink/Netlink.h 
b/datapath-windows/ovsext/Netlink/Netlink.h
index b1b3bed..cce7ec3 100644
--- a/datapath-windows/ovsext/Netlink/Netlink.h
+++ b/datapath-windows/ovsext/Netlink/Netlink.h
@@ -27,7 +27,10 @@
  */
 typedef struct _OVS_MESSAGE {
 NL_MSG_HDR nlMsg;
-GENL_MSG_HDR genlMsg;
+union {
+GENL_MSG_HDR genlMsg;
+NF_GEN_MSG_HDR nfGenMsg;
+};
 OVS_HDR ovsHdr;
 /* Variable length nl_attrs follow. */
 } OVS_MESSAGE, *POVS_MESSAGE;
@@ -107,6 +110,7 @@ PCHAR NlHdrPayload(const PNL_MSG_HDR nlh);
 UINT32 NlHdrPayloadLen(const PNL_MSG_HDR nlh);
 PNL_ATTR NlMsgAttrs(const PNL_MSG_HDR nlh);
 UINT32 NlMsgAttrsLen(const PNL_MSG_HDR nlh);
+UINT32 NfNlMsgAttrsLen(const PNL_MSG_HDR nlh);
 
 /* Netlink message parse */
 PNL_MSG_HDR NlMsgNext(const PNL_MSG_HDR nlh);
@@ -135,7 +139,7 @@ const PNL_ATTR NlAttrFindNested(const PNL_ATTR nla,
 UINT16 type);
 BOOLEAN NlAttrParse(const PNL_MSG_HDR nlMsg, UINT32 attrOffset,
 UINT32 totalAttrLen, const NL_POLICY policy[],
-const UINT32 numPolicy, PNL_ATTR attrs[], 
+const UINT32 numPolicy, PNL_ATTR attrs[],
 UINT32 numAttrs);
 BOOLEAN NlAttrParseNested(const PNL_MSG_HDR nlMsg, UINT32 attrOffset,
   UINT32 totalAttrLen, const NL_POLICY policy[],
diff --git a/datapath-windows/ovsext/Netlink/NetlinkProto.h 
b/datapath-windows/ovsext/Netlink/NetlinkProto.h
index f2e9aee..beb14d5 100644
--- a/datapath-windows/ovsext/Netlink/NetlinkProto.h
+++ b/datapath-windows/ovsext/Netlink/NetlinkProto.h
@@ -98,6 +98,14 @@ typedef struct _GENL_MSG_HDR {
 } GENL_MSG_HDR, *PGENL_MSG_HDR;
 BUILD_ASSERT_DECL(sizeof(GENL_MSG_HDR) == 4);
 
+/* Netfilter Generic Message */
+typedef struct _NF_GEN_MSG_HDR {
+UINT8 nfgenFamily;   /* AF_xxx */
+UINT8 version;   /* nfnetlink version */
+UINT16 resId;/* resource id */
+} NF_GEN_MSG_HDR, *PNF_GEN_MSG_HDR;
+BUILD_ASSERT_DECL(sizeof(NF_GEN_MSG_HDR) == 4);
+
 /* Netlink attributes */
 typedef struct _NL_ATTR {
 UINT16 nlaLen;
@@ -113,6 +121,7 @@ BUILD_ASSERT_DECL(sizeof(NL_ATTR) == 4);
 
 #define NLMSG_HDRLEN ((INT) NLMSG_ALIGN(sizeof(NL_MSG_HDR)))
 #define GENL_HDRLEN NLMSG_ALIGN(sizeof(GENL_MSG_HDR))
+#define NF_GEN_MSG_HDRLEN NLMSG_ALIGN(sizeof(NF_GEN_MSG_HDR))
 #define OVS_HDRLEN NLMSG_ALIGN(sizeof(OVS_HDR))
 #define NLA_HDRLEN ((INT) NLA_ALIGN(sizeof(NL_ATTR)))
 
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 3/5] datapath-windows: Add support for flushing conntrack entries

2016-06-13 Thread Sairam Venugopal
Flush out all conntrack entries or those that match a given zone. Since
the conntrack module is internal to OVS in Windows, this functionality
needs to be added in.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Conntrack.c | 75 +
 1 file changed, 75 insertions(+)

diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 7316442..81c70d6 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -619,3 +619,78 @@ ovsConntrackEntryCleaner(PVOID data)
 
 PsTerminateSystemThread(STATUS_SUCCESS);
 }
+
+/*
+ *
+ * OvsCtFlush
+ * Flushes out all Conntrack Entries that match the given zone
+ *
+ */
+static __inline NDIS_STATUS
+OvsCtFlush(UINT16 zone)
+{
+PLIST_ENTRY link, next;
+POVS_CT_ENTRY entry;
+
+LOCK_STATE_EX lockState;
+NdisAcquireRWLockWrite(ovsConntrackLockObj, &lockState, 0);
+
+for (int i = 0; i < CT_HASH_TABLE_SIZE; i++) {
+LIST_FORALL_SAFE(&ovsConntrackTable[i], link, next) {
+entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
+if (!zone || zone == entry->key.zone)
+OvsCtEntryDelete(entry);
+}
+}
+
+NdisReleaseRWLock(ovsConntrackLockObj, &lockState);
+return NDIS_STATUS_SUCCESS;
+}
+
+NTSTATUS
+OvsCtDeleteCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
+  UINT32 *replyLen)
+{
+POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
+PNL_MSG_HDR nlMsgHdr = &(msgIn->nlMsg);
+PNL_ATTR ctAttrs[__CTA_MAX];
+UINT32 attrOffset = NLMSG_HDRLEN + NF_GEN_MSG_HDRLEN + OVS_HDRLEN;
+NL_ERROR nlError = NL_ERROR_SUCCESS;
+NTSTATUS status;
+UINT16 zone = 0;
+
+static const NL_POLICY ctZonePolicy[] = {
+[CTA_ZONE] = { .type = NL_A_BE16, .optional = TRUE },
+};
+
+if ((NlAttrParse(nlMsgHdr, attrOffset, NfNlMsgAttrsLen(nlMsgHdr),
+ctZonePolicy, ARRAY_SIZE(ctZonePolicy),
+ctAttrs, ARRAY_SIZE(ctAttrs)))
+!= TRUE) {
+OVS_LOG_ERROR("Zone attr parsing failed for msg: %p", nlMsgHdr);
+status = STATUS_INVALID_PARAMETER;
+goto done;
+}
+
+if (ctAttrs[CTA_ZONE]) {
+zone = NlAttrGetU16(ctAttrs[CTA_ZONE]);
+}
+
+status = OvsCtFlush(zone);
+
+done:
+if (status) {
+nlError = NlMapStatusToNlErr(status);
+}
+if (nlError != NL_ERROR_SUCCESS) {
+POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR)
+   usrParamsCtx->outputBuffer;
+
+ASSERT(msgError);
+NlBuildErrorMsg(msgIn, msgError, nlError, replyLen);
+ASSERT(*replyLen != 0);
+status = STATUS_SUCCESS;
+}
+
+return status;
+}
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 5/5] Windows: Add conntrack-flush support in userspace

2016-06-13 Thread Sairam Venugopal
Modify dpif-netlink.c and netlink-conntrack.c to send down 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 
---
 lib/automake.mk |  2 ++
 lib/dpif-netlink.c  | 15 +++
 lib/netlink-conntrack.c | 33 +
 3 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/lib/automake.mk b/lib/automake.mk
index eabc0e7..4d4ee01 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -372,6 +372,8 @@ lib_libopenvswitch_la_SOURCES += \
lib/dpif-netlink.c \
lib/dpif-netlink.h \
lib/netdev-windows.c \
+   lib/netlink-conntrack.c \
+   lib/netlink-conntrack.h \
lib/netlink-notifier.c \
lib/netlink-notifier.h \
lib/netlink-protocol.h \
diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index 9bff3a8..e2bea23 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -2274,7 +2274,6 @@ dpif_netlink_get_datapath_version(void)
 return version_str;
 }
 
-#ifdef __linux__
 struct dpif_netlink_ct_dump_state {
 struct ct_dpif_dump_state up;
 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();
 }
 }
-#endif
 
 const struct dpif_class dpif_netlink_class = {
 "system",
@@ -2377,17 +2375,10 @@ const struct dpif_class dpif_netlink_class = {
 NULL,   /* enable_upcall */
 NULL,   /* disable_upcall */
 dpif_netlink_get_datapath_version, /* get_datapath_version */
-#ifdef __linux__
 dpif_netlink_ct_dump_start,
 dpif_netlink_ct_dump_next,
 dpif_netlink_ct_dump_done,
-dpif_netlink_ct_flush,
-#else
-NULL,   /* ct_dump_start */
-NULL,   /* ct_dump_next */
-NULL,   /* ct_dump_done */
-NULL,   /* ct_flush */
-#endif
+dpif_netlink_ct_flush
 };
 
 static int
@@ -2442,7 +2433,7 @@ dpif_netlink_is_internal_device(const char *name)
 
 return reply.type == OVS_VPORT_TYPE_INTERNAL;
 }
-
+
 /* Parses the contents of 'buf', which contains a "struct ovs_header" followed
  * by Netlink attributes, into 'vport'.  Returns 0 if successful, otherwise a
  * 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->tcp_flags = flow->tcp_flags ? *flow->tcp_flags : 0;
 }
-
+
 /* Logs information about a packet that was recently lost in 'ch' (in
  * 'dpif_'). */
 static void
diff --git a/lib/netlink-conntrack.c b/lib/netlink-conntrack.c
index 47a3c62..bc31391 100644
--- a/lib/netlink-conntrack.c
+++ b/lib/netlink-conntrack.c
@@ -75,6 +75,10 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 
5);
 #define IPS_UNTRACKED_BIT 12
 #define IPS_UNTRACKED (1 << IPS_UNTRACKED_BIT)
 
+#ifdef _WIN32
+#define NETLINK_NETFILTER   NETLINK_GENERIC //Override for Windowss
+#endif
+
 static const struct nl_policy nfnlgrp_conntrack_policy[] = {
 [CTA_TUPLE_ORIG] = { .type = NL_A_NESTED, .optional = false },
 [CTA_TUPLE_REPLY] = { .type = NL_A_NESTED, .optional = false },
@@ -118,7 +122,7 @@ struct nl_ct_dump_state {
 bool filter_zone;
 uint16_t zone;
 };
-
+
 /* Conntrack netlink dumping. */
 
 /* Initialize a conntrack netlink dump. */
@@ -200,7 +204,7 @@ nl_ct_dump_done(struct nl_ct_dump_state *state)
 free(state);
 return error;
 }
-
+
 /* Format conntrack event 'entry' of 'type' to 'ds'. */
 void
 nl_ct_format_event_entry(const struct ct_dpif_entry *entry,
@@ -235,6 +239,26 @@ nl_ct_flush(void)
 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
 nl_ct_flush_zone(uint16_t flush_zone)
 {
@@ -299,7 +323,8 @@ nl_ct_flush_zone(uint16_t flush_zone)
  * have a master connection anymore */
 return 0;
 }
-
+#endif
+
 /* Conntrack netlink parsing. */
 
 static bool
@@ -788,7 +813,7 @@ nl_ct_parse_entry(struct ofpbuf *buf, struct ct_dpif_entry 
*entry,
 
 return true;
 }

[ovs-dev] [PATCH 4/5] datapath-windows: Add support for Conntrack IPCTNL_MSG_CT_DELETE cmd in Datapath.c

2016-06-13 Thread Sairam Venugopal
Create new NETLINK_CMD and NETLINK_FAMILY to assist in flushing conntrack 
entries. Modify
Datapath.c to now support netfilter-netlink messages apart from the
existing netfilter-generic messages. Also hookup the command handler to
execute the OvsCtFlush in Conntrack.c

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/include/OvsDpInterfaceExt.h | 17 ++
 datapath-windows/ovsext/Datapath.c   | 80 
 2 files changed, 88 insertions(+), 9 deletions(-)

diff --git a/datapath-windows/include/OvsDpInterfaceExt.h 
b/datapath-windows/include/OvsDpInterfaceExt.h
index e235376..1044de7 100644
--- a/datapath-windows/include/OvsDpInterfaceExt.h
+++ b/datapath-windows/include/OvsDpInterfaceExt.h
@@ -17,6 +17,9 @@
 #ifndef __OVS_DP_INTERFACE_EXT_H_
 #define __OVS_DP_INTERFACE_EXT_H_ 1
 
+#include "include/windows/linux/netfilter/nfnetlink.h"
+#include "include/windows/linux/netfilter/nfnetlink_conntrack.h"
+
 /* Windows kernel datapath extensions to the standard datapath interface. */
 
 /* Version number of the datapath interface extensions. */
@@ -65,6 +68,7 @@
 #define OVS_WIN_NL_VPORT_FAMILY_ID   (NLMSG_MIN_TYPE + 4)
 #define OVS_WIN_NL_FLOW_FAMILY_ID(NLMSG_MIN_TYPE + 5)
 #define OVS_WIN_NL_NETDEV_FAMILY_ID  (NLMSG_MIN_TYPE + 6)
+#define OVS_WIN_NL_CT_FAMILY_ID  (NLMSG_MIN_TYPE + 7)
 
 #define OVS_WIN_NL_INVALID_MCGRP_ID  0
 #define OVS_WIN_NL_MCGRP_START_ID100
@@ -156,4 +160,17 @@ enum ovs_win_netdev_attr {
 typedef struct ovs_dp_stats OVS_DP_STATS;
 typedef enum ovs_vport_type OVS_VPORT_TYPE;
 
+/* Conntrack Netlink */
+#define NFNL_TYPE_CT_GET (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_GET)
+#define NFNL_TYPE_CT_DEL (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_DELETE)
+#define NFNL_SUBSYSTEM_TYPE(nlmsgType) (nlmsgType >> 8)
+#define NFNL_CT_CMD(nlmsgType) (nlmsgType & 0xff)
+#define IS_NFNL_CMD(nlmsgType) ((nlmsgType == NFNL_TYPE_CT_GET) || (nlmsgType 
== NFNL_TYPE_CT_DEL))
+#define OVS_NL_CT_ATTR_MAX (IPCTNL_MSG_MAX - 1)
+
+#define OVS_CT_FAMILY  "ovs_ct"
+#define OVS_CT_MCGROUP "ovs_ct"
+#define OVS_CT_VERSION 1
+
+
 #endif /* __OVS_DP_INTERFACE_EXT_H_ */
diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index b2c7020..802f0b1 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -103,7 +103,8 @@ NetlinkCmdHandlerOvsGetNetdevCmdHandler,
  OvsDeleteVportCmdHandler,
  OvsPendPacketCmdHandler,
  OvsSubscribePacketCmdHandler,
- OvsReadPacketCmdHandler;
+ OvsReadPacketCmdHandler,
+ OvsCtDeleteCmdHandler;
 
 static NTSTATUS HandleGetDpTransaction(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
UINT32 *replyLen);
@@ -282,6 +283,24 @@ NETLINK_FAMILY nlFLowFamilyOps = {
 .opsCount = ARRAY_SIZE(nlFlowFamilyCmdOps)
 };
 
+/* Netlink Ct family. */
+NETLINK_CMD nlCtFamilyCmdOps[] = {
+{ .cmd  = IPCTNL_MSG_CT_DELETE,
+  .handler  = OvsCtDeleteCmdHandler,
+  .supportedDevOp   = OVS_TRANSACTION_DEV_OP,
+  .validateDpIndex  = TRUE
+}
+};
+
+NETLINK_FAMILY nlCtFamilyOps = {
+.name = OVS_CT_FAMILY, /* Keep this for consistency*/
+.id   = OVS_WIN_NL_CT_FAMILY_ID, /* Keep this for consistency*/
+.version  = OVS_CT_VERSION, /* Keep this for consistency*/
+.maxAttr  = OVS_NL_CT_ATTR_MAX,
+.cmds = nlCtFamilyCmdOps,
+.opsCount = ARRAY_SIZE(nlCtFamilyCmdOps)
+};
+
 /* Netlink netdev family. */
 NETLINK_CMD nlNetdevFamilyCmdOps[] = {
 { .cmd = OVS_WIN_NETDEV_CMD_GET,
@@ -885,6 +904,9 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject,
 
 ASSERT(ovsMsg);
 switch (ovsMsg->nlMsg.nlmsgType) {
+case NFNL_TYPE_CT_DEL:
+nlFamilyOps = &nlCtFamilyOps;
+break;
 case OVS_WIN_NL_CTRL_FAMILY_ID:
 nlFamilyOps = &nlControlFamilyOps;
 break;
@@ -961,6 +983,30 @@ ValidateNetlinkCmd(UINT32 devOp,
 goto done;
 }
 
+/*
+Verify if the Netlink message is part of Netfilter Netlink
+This is currently used by Conntrack
+*/
+if (IS_NFNL_CMD(ovsMsg->nlMsg.nlmsgType)) {
+
+/* Validate Netfilter Netlink version is 0 */
+if (ovsMsg->nfGenMsg.version != NFNETLINK_V0) {
+status = STATUS_INVALID_PARAMETER;
+goto done;
+}
+
+/* Validate Netfilter Netlink Subsystem */
+if (NFNL_SUBSYSTEM_TYPE(ovsMsg->nlMsg.nlmsgType)
+!= NFNL_SUBSYS_CTNETLINK) {
+status = STATUS_INVALID_PARAMETER;
+goto done;
+}
+
+/* Exit the function because there aren't any other validations */
+status = STATUS_SUCCESS;
+goto done;
+}
+
 for (i = 0; i < 

Re: [ovs-dev] [PATCH 4/5] datapath-windows: Add support for Conntrack IPCTNL_MSG_CT_DELETE cmd in Datapath.c

2016-06-13 Thread Sairam Venugopal
I missed out () in:

if (!IS_NFNL_CMD(usrParamsCtx->ovsMsg->nlMsg.nlmsgType) &&
(usrParamsCtx->ovsMsg->genlMsg.cmd ==
OVS_CTRL_CMD_EVENT_NOTIFY ||
usrParamsCtx->ovsMsg->genlMsg.cmd ==
OVS_CTRL_CMD_READ_NOTIFY))


I have addressed this in an updated version. I will send the one out after
addressing other review comments across the patch series.

Thanks,
Sairam

On 6/13/16, 3:37 PM, "Sairam Venugopal"  wrote:

>Create new NETLINK_CMD and NETLINK_FAMILY to assist in flushing conntrack
>entries. Modify
>Datapath.c to now support netfilter-netlink messages apart from the
>existing netfilter-generic messages. Also hookup the command handler to
>execute the OvsCtFlush in Conntrack.c
>
>Signed-off-by: Sairam Venugopal 
>---
> datapath-windows/include/OvsDpInterfaceExt.h | 17 ++
> datapath-windows/ovsext/Datapath.c   | 80
>
> 2 files changed, 88 insertions(+), 9 deletions(-)
>
>diff --git a/datapath-windows/include/OvsDpInterfaceExt.h
>b/datapath-windows/include/OvsDpInterfaceExt.h
>index e235376..1044de7 100644
>--- a/datapath-windows/include/OvsDpInterfaceExt.h
>+++ b/datapath-windows/include/OvsDpInterfaceExt.h
>@@ -17,6 +17,9 @@
> #ifndef __OVS_DP_INTERFACE_EXT_H_
> #define __OVS_DP_INTERFACE_EXT_H_ 1
> 
>+#include "include/windows/linux/netfilter/nfnetlink.h"
>+#include "include/windows/linux/netfilter/nfnetlink_conntrack.h"
>+
> /* Windows kernel datapath extensions to the standard datapath
>interface. */
> 
> /* Version number of the datapath interface extensions. */
>@@ -65,6 +68,7 @@
> #define OVS_WIN_NL_VPORT_FAMILY_ID   (NLMSG_MIN_TYPE + 4)
> #define OVS_WIN_NL_FLOW_FAMILY_ID(NLMSG_MIN_TYPE + 5)
> #define OVS_WIN_NL_NETDEV_FAMILY_ID  (NLMSG_MIN_TYPE + 6)
>+#define OVS_WIN_NL_CT_FAMILY_ID  (NLMSG_MIN_TYPE + 7)
> 
> #define OVS_WIN_NL_INVALID_MCGRP_ID  0
> #define OVS_WIN_NL_MCGRP_START_ID100
>@@ -156,4 +160,17 @@ enum ovs_win_netdev_attr {
> typedef struct ovs_dp_stats OVS_DP_STATS;
> typedef enum ovs_vport_type OVS_VPORT_TYPE;
> 
>+/* Conntrack Netlink */
>+#define NFNL_TYPE_CT_GET (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_GET)
>+#define NFNL_TYPE_CT_DEL (NFNL_SUBSYS_CTNETLINK << 8 |
>IPCTNL_MSG_CT_DELETE)
>+#define NFNL_SUBSYSTEM_TYPE(nlmsgType) (nlmsgType >> 8)
>+#define NFNL_CT_CMD(nlmsgType) (nlmsgType & 0xff)
>+#define IS_NFNL_CMD(nlmsgType) ((nlmsgType == NFNL_TYPE_CT_GET) ||
>(nlmsgType == NFNL_TYPE_CT_DEL))
>+#define OVS_NL_CT_ATTR_MAX (IPCTNL_MSG_MAX - 1)
>+
>+#define OVS_CT_FAMILY  "ovs_ct"
>+#define OVS_CT_MCGROUP "ovs_ct"
>+#define OVS_CT_VERSION 1
>+
>+
> #endif /* __OVS_DP_INTERFACE_EXT_H_ */
>diff --git a/datapath-windows/ovsext/Datapath.c
>b/datapath-windows/ovsext/Datapath.c
>index b2c7020..802f0b1 100644
>--- a/datapath-windows/ovsext/Datapath.c
>+++ b/datapath-windows/ovsext/Datapath.c
>@@ -103,7 +103,8 @@ NetlinkCmdHandlerOvsGetNetdevCmdHandler,
>  OvsDeleteVportCmdHandler,
>  OvsPendPacketCmdHandler,
>  OvsSubscribePacketCmdHandler,
>- OvsReadPacketCmdHandler;
>+ OvsReadPacketCmdHandler,
>+ OvsCtDeleteCmdHandler;
> 
> static NTSTATUS HandleGetDpTransaction(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
>UINT32 *replyLen);
>@@ -282,6 +283,24 @@ NETLINK_FAMILY nlFLowFamilyOps = {
> .opsCount = ARRAY_SIZE(nlFlowFamilyCmdOps)
> };
> 
>+/* Netlink Ct family. */
>+NETLINK_CMD nlCtFamilyCmdOps[] = {
>+{ .cmd  = IPCTNL_MSG_CT_DELETE,
>+  .handler  = OvsCtDeleteCmdHandler,
>+  .supportedDevOp   = OVS_TRANSACTION_DEV_OP,
>+  .validateDpIndex  = TRUE
>+}
>+};
>+
>+NETLINK_FAMILY nlCtFamilyOps = {
>+.name = OVS_CT_FAMILY, /* Keep this for consistency*/
>+.id   = OVS_WIN_NL_CT_FAMILY_ID, /* Keep this for consistency*/
>+.version  = OVS_CT_VERSION, /* Keep this for consistency*/
>+.maxAttr  = OVS_NL_CT_ATTR_MAX,
>+.cmds = nlCtFamilyCmdOps,
>+.opsCount = ARRAY_SIZE(nlCtFamilyCmdOps)
>+};
>+
> /* Netlink netdev family. */
> NETLINK_CMD nlNetdevFamilyCmdOps[] = {
> { .cmd = OVS_WIN_NETDEV_CMD_GET,
>@@ -885,6 +904,9 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject,
> 
> ASSERT(ovsMsg);
> switch (ovsMsg->nlMsg.nlmsgType) {
>+case NFNL_TYPE_CT_DEL:
>+nlFamilyOps = &nlCtFamilyOps;
>+break;
> case OVS_WIN_NL_CTRL_FAMILY_ID:
> nlFamilyO

[ovs-dev] [PATCH v6] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-06-15 Thread Sairam Venugopal
Enable support for UDP and ICMP in the connection tracking module on
Hyper-V. Define 1s as variable and reuse it.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/automake.mk  |   1 +
 datapath-windows/ovsext/Conntrack-other.c |  82 +
 datapath-windows/ovsext/Conntrack-tcp.c   |  10 +-
 datapath-windows/ovsext/Conntrack.c   | 185 ++
 datapath-windows/ovsext/Conntrack.h   |  13 ++-
 datapath-windows/ovsext/ovsext.vcxproj|   1 +
 6 files changed, 239 insertions(+), 53 deletions(-)
 create mode 100644 datapath-windows/ovsext/Conntrack-other.c

diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index c9af806..668cf2c 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -13,6 +13,7 @@ EXTRA_DIST += \
datapath-windows/ovsext/Atomic.h \
datapath-windows/ovsext/BufferMgmt.c \
datapath-windows/ovsext/BufferMgmt.h \
+   datapath-windows/ovsext/Conntrack-other.c \
datapath-windows/ovsext/Conntrack-tcp.c \
datapath-windows/ovsext/Conntrack.c \
datapath-windows/ovsext/Conntrack.h \
diff --git a/datapath-windows/ovsext/Conntrack-other.c 
b/datapath-windows/ovsext/Conntrack-other.c
new file mode 100644
index 000..5d39389
--- /dev/null
+++ b/datapath-windows/ovsext/Conntrack-other.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015, 2016 VMware, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Conntrack.h"
+#include 
+
+enum other_state {
+OTHERS_FIRST,
+OTHERS_MULTIPLE,
+OTHERS_BIDIR,
+};
+
+struct conn_other {
+struct OVS_CT_ENTRY up;
+enum other_state state;
+};
+
+static const long long other_timeouts[] = {
+[OTHERS_FIRST] = 60 * CT_INTERVAL_SEC,
+[OTHERS_MULTIPLE] = 60 * CT_INTERVAL_SEC,
+[OTHERS_BIDIR] = 30 * CT_INTERVAL_SEC,
+};
+
+static __inline struct conn_other*
+OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
+{
+ASSERT(conn);
+return CONTAINER_OF(conn, struct conn_other, up);
+}
+
+static __inline VOID
+OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
+{
+ASSERT(conn);
+conn->up.expiration = now + other_timeouts[conn->state];
+}
+
+enum ct_update_res
+OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
+ BOOLEAN reply,
+ UINT64 now)
+{
+ASSERT(conn_);
+struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
+
+if (reply && conn->state != OTHERS_BIDIR) {
+conn->state = OTHERS_BIDIR;
+} else if (conn->state == OTHERS_FIRST) {
+conn->state = OTHERS_MULTIPLE;
+}
+
+OvsConntrackUpdateExpiration(conn, now);
+
+return CT_UPDATE_VALID;
+}
+
+OVS_CT_ENTRY *
+OvsConntrackCreateOtherEntry(UINT64 now)
+{
+struct conn_other *conn;
+conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
+OVS_CT_POOL_TAG);
+/* XXX Handle memory allocation error (by returning a status) */
+ASSERT(conn);
+conn->up = (OVS_CT_ENTRY) {0};
+conn->state = OTHERS_FIRST;
+OvsConntrackUpdateExpiration(conn, now);
+return &conn->up;
+}
diff --git a/datapath-windows/ovsext/Conntrack-tcp.c 
b/datapath-windows/ovsext/Conntrack-tcp.c
index 24f5e7c..19925c3 100644
--- a/datapath-windows/ovsext/Conntrack-tcp.c
+++ b/datapath-windows/ovsext/Conntrack-tcp.c
@@ -389,18 +389,18 @@ OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
 
 if (src->state >= CT_DPIF_TCPS_FIN_WAIT_2
 && dst->state >= CT_DPIF_TCPS_FIN_WAIT_2) {
-OvsConntrackUpdateExpiration(conn, now, 30 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 30 * CT_INTERVAL_SEC);
 } else if (src->state >= CT_DPIF_TCPS_CLOSING
&& dst->state >= CT_DPIF_TCPS_CLOSING) {
-OvsConntrackUpdateExpiration(conn, now, 45 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 45 * CT_INTERVAL_SEC);
 } else if (src->state < CT_DPIF_TCPS_ESTABLISHED
|| dst->state < CT_DPIF_TCPS_ESTABLISHED) {
-OvsConntrackUpdateExpiration(conn, now, 30 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 30 * CT_INTERVAL_SEC);
 } else if (src->state >= CT_DPIF_TCPS_CLOSING
   

Re: [ovs-dev] [PATCH v5] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-06-15 Thread Sairam Venugopal
Alin,

Thanks for the review. I have sent a v6. I realized that the 2nd comment
was previously addressed in v2, but not reflected in the v5 of the patch.

Thanks,
Sairam

On 6/13/16, 10:31 PM, "Alin Serdean" 
wrote:

>Hi Sai,
>
>Thanks for incorporating the comments so far. It looks good but we need
>to treat corner cases like no valid resource allocations and NULL checks
>for parameter.
>
>
>
>A few small nits inlined.
>
>
>
>Thanks,
>
>Alin.
>
><---cut>
>
>>  ctx->key.src.port = flowKey->ipKey.l4.tpSrc;
>
>>  ctx->key.dst.port = flowKey->ipKey.l4.tpDst;
>
>> +if (flowKey->ipKey.nwProto == IPPROTO_ICMP) {
>
>> +ICMPHdr icmpStorage;
>
>> +const ICMPHdr *icmp;
>
>> +icmp = OvsGetIcmp(curNbl, l4Offset, &icmpStorage);
>
>> +ASSERT(icmp);
>
>> +ctx->key.src.port = ctx->key.dst.port =
>
>> + icmp->fields.echo.id;
>
>> +
>
>> +/* Related bit is set when ICMP has an error */
>
>> +/* XXX parse out the appropriate src and dst from inner
>>pkt */
>
>> +switch (icmp->type) {
>
>> +   case ICMP4_DEST_UNREACH:
>
>> +   case ICMP4_TIME_EXCEEDED:
>
>> +   case ICMP4_PARAM_PROB:
>
>> +   case ICMP4_SOURCE_QUENCH:
>
>> +   case ICMP4_REDIRECT: {
>
>> +   ctx->related = TRUE;
>
>> +   }
>
>[Alin Gabriel Serdean: ] break;
>
>> +   default:
>
>> +   ctx->related = FALSE;
>
>[Alin Gabriel Serdean: ] break; Without breaks ctx->related will always
>be false;
>
>> +}
>
>> +}
>
>
>
><---cut>
>
>>  //Delete and update the Conntrack
>
>>  OvsCtEntryDelete(ctx->entry);
>
>>  ctx->entry = NULL;
>
>> -entry = OvsCtEntryCreate(tcp, curNbl, ctx, key,
>
>> - commit, currentTime);
>
>> +entry = OvsCtEntryCreate(curNbl, key->ipKey.nwProto,
>>l4Offset,
>
>> + ctx, key, commit, currentTime);
>
>[Alin Gabriel Serdean: ] entry can be null, if for example the tcp packet
>was invalid. We need to treat that case because the following code will
>run after.
>
>/* Copy mark and label from entry into flowKey. If actions specify
>
>   different mark and label, update the flowKey. */
>
>OvsCtUpdateFlowKey(key, state, zone, entry->mark, &entry->labels);
>
>
>
>>  break;
>
>>  }
>
>>  }
>
>> @@ -401,15 +493,12 @@ OvsCtExecute_(PNET_BUFFER_LIST curNbl,
>
>>  NDIS_STATUS status = NDIS_STATUS_SUCCESS;
>
>>  POVS_CT_ENTRY entry = NULL;
>
>>  OvsConntrackKeyLookupCtx ctx = { 0 };
>
>> -TCPHdr tcpStorage;
>
>> -UINT64 currentTime;
>
>>  LOCK_STATE_EX lockState;
>
>> -const TCPHdr *tcp;
>
>> -tcp = OvsGetTcp(curNbl, layers->l4Offset, &tcpStorage);
>
>> +UINT64 currentTime;
>
>>  NdisGetCurrentSystemTime((LARGE_INTEGER *) ¤tTime);
>
>> 
>
>>  /* Retrieve the Conntrack Key related fields from packet */
>
>> -OvsCtSetupLookupCtx(key, zone, &ctx);
>
>> +OvsCtSetupLookupCtx(key, zone, &ctx, curNbl, layers->l4Offset);
>
>> 
>
>>  NdisAcquireRWLockWrite(ovsConntrackLockObj, &lockState, 0);
>
>> 
>
>> @@ -418,11 +507,12 @@ OvsCtExecute_(PNET_BUFFER_LIST curNbl,
>
>> 
>
>>  if (!entry) {
>
>>  /* If no matching entry was found, create one and add New
>>state */
>
>> -entry = OvsCtEntryCreate(tcp, curNbl, &ctx,
>
>> +entry = OvsCtEntryCreate(curNbl, key->ipKey.nwProto,
>
>> + layers->l4Offset, &ctx,
>
>>   key, commit, currentTime);
>
>>  } else {
>
>>  /* Process the entry and update CT flags */
>
>> -entry = OvsProcessConntrackEntry(curNbl, tcp, &ctx, key,
>
>> +entry = OvsProcessConntrackEntry(curNbl, layers->l4Offset,
>
>> + &ctx, key,
>
>>   zone, commit, currentTime);
>
>>  }
>
>> 
>
>> diff --git a/datapath-windows/ovsext/Conntrack.h b/datapath-
>
>> windows/ovsext/Conntrack.h
>
>> index a754544..883ac57 100644
>
>> --- a/datapath-windows/ovsext/Conntrack.h
>
>> +++ b/datapath-windows/ovsext/Conntrack.h
>
>> @@ -80,8 +80,11 @@ typedef struct OvsConntrackKeyLookupCtx {
>
>> 
>
>>  #define CT_HASH_TABLE_SIZE ((UINT32)1 << 10)  #define
>
>> CT_HASH_TABLE_MASK (CT_HASH_TABLE_SIZE - 1)
>
>> -#define CT_ENTRY_TIMEOUT (2 * 6)   // 2m
>
>> -#define CT_CLEANUP_INTERVAL (2 * 6) // 2m
>
>> +#define CT_INTERVAL_SEC 1000LL //1s
>
>> +#define CT_ENTRY_TIMEOUT (2 * 60 * CT_INTERVAL_SEC)   // 2m
>
>> +#define CT_CLEANUP_INTERVAL (2 * 60 * CT_INTERVAL_SEC) // 2m
>
>> +
>
>> +
>
>>  /* Given POINTER, the address of the given MEMBER in a STRUCT object,
>
>> returns
>
>> the STRUCT object. */
>
>>  #define CONTAINER_OF(POINTER, STRUCT, MEMBER)
>> \
>
>> @@ -99,9 +102,13 @@ BOOLEAN OvsConntrackVali

Re: [ovs-dev] [PATCH] datapath-windows: comment cleanup and indentation

2016-06-16 Thread Sairam Venugopal
Acked-by: Sairam Venugopal 


On 6/16/16, 10:15 AM, "Nithin Raju"  wrote:

>Signed-off-by: Nithin Raju 
>---
> datapath-windows/ovsext/Vxlan.c | 5 -
> 1 file changed, 5 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Vxlan.c
>b/datapath-windows/ovsext/Vxlan.c
>index f6a55f0..ddd8d8e 100644
>--- a/datapath-windows/ovsext/Vxlan.c
>+++ b/datapath-windows/ovsext/Vxlan.c
>@@ -194,11 +194,6 @@ OvsDoEncapVxlan(POVS_VPORT_ENTRY vport,
> ULONG mss = 0;
> NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
> 
>-/*
>- * XXX: the assumption currently is that the NBL is owned by OVS, and
>- * headroom has already been allocated as part of allocating the NBL
>and
>- * MDL.
>- */
> curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
> packetLength = NET_BUFFER_DATA_LENGTH(curNb);
> 
>-- 
>2.6.2
>
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=ZHWDRgM-n_JrN6VSVZIEe6H2qt8qv_
>Q-ar_ZSr6mtiQ&s=SYqJXUQmSi39mji6GIR2Gs1e23qZGP31E8a6CvPyfDk&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH] datapath-windows: comment cleanup and indentation

2016-06-16 Thread Sairam Venugopal
Think this is v2.

Acked-by: Sairam Venugopal 


On 6/16/16, 10:17 AM, "Nithin Raju"  wrote:

>Signed-off-by: Nithin Raju 
>---
> datapath-windows/ovsext/Flow.c  | 20 ++--
> datapath-windows/ovsext/Vxlan.c |  5 -
> 2 files changed, 10 insertions(+), 15 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Flow.c
>b/datapath-windows/ovsext/Flow.c
>index 2a91855..595518f 100644
>--- a/datapath-windows/ovsext/Flow.c
>+++ b/datapath-windows/ovsext/Flow.c
>@@ -1650,19 +1650,19 @@ MapTunAttrToFlowPut(PNL_ATTR *keyAttrs,
> if (keyAttrs[OVS_KEY_ATTR_TUNNEL]) {
> 
> if (tunAttrs[OVS_TUNNEL_KEY_ATTR_ID]) {
>-destKey->tunKey.tunnelId = NlAttrGetU64
>- 
>(tunAttrs[OVS_TUNNEL_KEY_ATTR_ID]);
>+destKey->tunKey.tunnelId =
>+NlAttrGetU64(tunAttrs[OVS_TUNNEL_KEY_ATTR_ID]);
> destKey->tunKey.flags |= OVS_TNL_F_KEY;
> }
> 
> if (tunAttrs[OVS_TUNNEL_KEY_ATTR_IPV4_DST]) {
>-destKey->tunKey.dst = NlAttrGetU32
>-  (tunAttrs[OVS_TUNNEL_KEY_ATTR_IPV4_DST]);
>+destKey->tunKey.dst =
>+NlAttrGetU32(tunAttrs[OVS_TUNNEL_KEY_ATTR_IPV4_DST]);
> }
> 
> if (tunAttrs[OVS_TUNNEL_KEY_ATTR_IPV4_SRC]) {
>-destKey->tunKey.src = NlAttrGetU32
>-  (tunAttrs[OVS_TUNNEL_KEY_ATTR_IPV4_SRC]);
>+destKey->tunKey.src =
>+NlAttrGetU32(tunAttrs[OVS_TUNNEL_KEY_ATTR_IPV4_SRC]);
> }
> 
> if (tunAttrs[OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT]) {
>@@ -1674,13 +1674,13 @@ MapTunAttrToFlowPut(PNL_ATTR *keyAttrs,
> }
> 
> if (tunAttrs[OVS_TUNNEL_KEY_ATTR_TOS]) {
>-destKey->tunKey.tos = NlAttrGetU8
>-  (tunAttrs[OVS_TUNNEL_KEY_ATTR_TOS]);
>+destKey->tunKey.tos =
>+NlAttrGetU8(tunAttrs[OVS_TUNNEL_KEY_ATTR_TOS]);
> }
> 
> if (tunAttrs[OVS_TUNNEL_KEY_ATTR_TTL]) {
>-destKey->tunKey.ttl = NlAttrGetU8
>-  (tunAttrs[OVS_TUNNEL_KEY_ATTR_TTL]);
>+destKey->tunKey.ttl =
>+NlAttrGetU8(tunAttrs[OVS_TUNNEL_KEY_ATTR_TTL]);
> }
> 
> destKey->tunKey.pad = 0;
>diff --git a/datapath-windows/ovsext/Vxlan.c
>b/datapath-windows/ovsext/Vxlan.c
>index f6a55f0..ddd8d8e 100644
>--- a/datapath-windows/ovsext/Vxlan.c
>+++ b/datapath-windows/ovsext/Vxlan.c
>@@ -194,11 +194,6 @@ OvsDoEncapVxlan(POVS_VPORT_ENTRY vport,
> ULONG mss = 0;
> NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
> 
>-/*
>- * XXX: the assumption currently is that the NBL is owned by OVS, and
>- * headroom has already been allocated as part of allocating the NBL
>and
>- * MDL.
>- */
> curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
> packetLength = NET_BUFFER_DATA_LENGTH(curNb);
> 
>-- 
>2.6.2
>
>___
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=bc6sSnD7Mv5r05oom_tecGkcn45Sq9
>ULnfvPTE5tO3c&s=pA91KBhhFkWDUlYvHSWqmJIGQA2xfeLllnpDN4lEImk&e= 

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH v6] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-06-16 Thread Sairam Venugopal
Disregard this patch. I will send a consolidated patch with changes.

On 6/15/16, 4:13 PM, "Sairam Venugopal"  wrote:

>Enable support for UDP and ICMP in the connection tracking module on
>Hyper-V. Define 1s as variable and reuse it.
>
>Signed-off-by: Sairam Venugopal 
>---
> datapath-windows/automake.mk  |   1 +
> datapath-windows/ovsext/Conntrack-other.c |  82 +
> datapath-windows/ovsext/Conntrack-tcp.c   |  10 +-
> datapath-windows/ovsext/Conntrack.c   | 185
>++
> datapath-windows/ovsext/Conntrack.h   |  13 ++-
> datapath-windows/ovsext/ovsext.vcxproj|   1 +
> 6 files changed, 239 insertions(+), 53 deletions(-)
> create mode 100644 datapath-windows/ovsext/Conntrack-other.c
>
>diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
>index c9af806..668cf2c 100644
>--- a/datapath-windows/automake.mk
>+++ b/datapath-windows/automake.mk
>@@ -13,6 +13,7 @@ EXTRA_DIST += \
>   datapath-windows/ovsext/Atomic.h \
>   datapath-windows/ovsext/BufferMgmt.c \
>   datapath-windows/ovsext/BufferMgmt.h \
>+  datapath-windows/ovsext/Conntrack-other.c \
>   datapath-windows/ovsext/Conntrack-tcp.c \
>   datapath-windows/ovsext/Conntrack.c \
>   datapath-windows/ovsext/Conntrack.h \
>diff --git a/datapath-windows/ovsext/Conntrack-other.c
>b/datapath-windows/ovsext/Conntrack-other.c
>new file mode 100644
>index 000..5d39389
>--- /dev/null
>+++ b/datapath-windows/ovsext/Conntrack-other.c
>@@ -0,0 +1,82 @@
>+/*
>+ * Copyright (c) 2015, 2016 VMware, Inc.
>+ *
>+ * Licensed under the Apache License, Version 2.0 (the "License");
>+ * you may not use this file except in compliance with the License.
>+ * You may obtain a copy of the License at:
>+ *
>+ * http://www.apache.org/licenses/LICENSE-2.0
>+ *
>+ * Unless required by applicable law or agreed to in writing, software
>+ * distributed under the License is distributed on an "AS IS" BASIS,
>+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>implied.
>+ * See the License for the specific language governing permissions and
>+ * limitations under the License.
>+ */
>+
>+#include "Conntrack.h"
>+#include 
>+
>+enum other_state {
>+OTHERS_FIRST,
>+OTHERS_MULTIPLE,
>+OTHERS_BIDIR,
>+};
>+
>+struct conn_other {
>+struct OVS_CT_ENTRY up;
>+enum other_state state;
>+};
>+
>+static const long long other_timeouts[] = {
>+[OTHERS_FIRST] = 60 * CT_INTERVAL_SEC,
>+[OTHERS_MULTIPLE] = 60 * CT_INTERVAL_SEC,
>+[OTHERS_BIDIR] = 30 * CT_INTERVAL_SEC,
>+};
>+
>+static __inline struct conn_other*
>+OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
>+{
>+ASSERT(conn);
>+return CONTAINER_OF(conn, struct conn_other, up);
>+}
>+
>+static __inline VOID
>+OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
>+{
>+ASSERT(conn);
>+conn->up.expiration = now + other_timeouts[conn->state];
>+}
>+
>+enum ct_update_res
>+OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
>+ BOOLEAN reply,
>+ UINT64 now)
>+{
>+ASSERT(conn_);
>+struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
>+
>+if (reply && conn->state != OTHERS_BIDIR) {
>+conn->state = OTHERS_BIDIR;
>+} else if (conn->state == OTHERS_FIRST) {
>+conn->state = OTHERS_MULTIPLE;
>+}
>+
>+OvsConntrackUpdateExpiration(conn, now);
>+
>+return CT_UPDATE_VALID;
>+}
>+
>+OVS_CT_ENTRY *
>+OvsConntrackCreateOtherEntry(UINT64 now)
>+{
>+struct conn_other *conn;
>+conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
>+OVS_CT_POOL_TAG);
>+/* XXX Handle memory allocation error (by returning a status) */
>+ASSERT(conn);
>+conn->up = (OVS_CT_ENTRY) {0};
>+conn->state = OTHERS_FIRST;
>+OvsConntrackUpdateExpiration(conn, now);
>+return &conn->up;
>+}
>diff --git a/datapath-windows/ovsext/Conntrack-tcp.c
>b/datapath-windows/ovsext/Conntrack-tcp.c
>index 24f5e7c..19925c3 100644
>--- a/datapath-windows/ovsext/Conntrack-tcp.c
>+++ b/datapath-windows/ovsext/Conntrack-tcp.c
>@@ -389,18 +389,18 @@ OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
> 
> if (src->state >= CT_DPIF_TCPS_FIN_WAIT_2
> && dst->state >= CT_DPIF_TCPS_FIN_WAIT_2) {
>-OvsConntrackUpdateExpiration(conn, now, 30 * 1000LL);
>+OvsConntrackUpdateExpiration(conn, now, 30

Re: [ovs-dev] [PATCH v4 09/17] dpif-netdev: Implement conntrack dump functions.

2016-06-16 Thread Sairam Venugopal
Hi Daniele,

I was trying to add conntrack dump support based on this patch and found a
discrepancy in
conntrack-tcp.c. 

Can you confirm if this is intended? I have inlined the comment.

Thanks,
Sairam



On 6/10/16, 3:47 PM, "Daniele Di Proietto"  wrote:

>New functions are implemented in the conntrack module to support this.
>
>Signed-off-by: Daniele Di Proietto 
>Acked-by: Flavio Leitner 
>---
> lib/conntrack-private.h |   3 ++
> lib/conntrack-tcp.c |  34 +
> lib/conntrack.c | 123
>
> lib/conntrack.h |  15 ++
> lib/dpif-netdev.c   |  60 +--
> 5 files changed, 232 insertions(+), 3 deletions(-)
>
>diff --git a/lib/conntrack-private.h b/lib/conntrack-private.h
>index 4743dc6..d5d5e52 100644
>--- a/lib/conntrack-private.h
>+++ b/lib/conntrack-private.h
>@@ -22,6 +22,7 @@
> #include 
> 
> #include "conntrack.h"
>+#include "ct-dpif.h"
> #include "hmap.h"
> #include "openvswitch/list.h"
> #include "openvswitch/types.h"
>@@ -75,6 +76,8 @@ struct ct_l4_proto {
>   struct conntrack_bucket *,
>   struct dp_packet *pkt, bool reply,
>   long long now);
>+void (*conn_get_protoinfo)(const struct conn *,
>+   struct ct_dpif_protoinfo *);
> };
> 
> extern struct ct_l4_proto ct_proto_tcp;
>diff --git a/lib/conntrack-tcp.c b/lib/conntrack-tcp.c
>index 71eadc1..947e1c9 100644
>--- a/lib/conntrack-tcp.c
>+++ b/lib/conntrack-tcp.c
>@@ -457,8 +457,42 @@ tcp_new_conn(struct conntrack_bucket *ctb, struct
>dp_packet *pkt,
> return &newconn->up;
> }
> 
>+static uint8_t
>+tcp_peer_to_protoinfo_flags(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;
>+}
>+
>+static void
>+tcp_conn_get_protoinfo(const struct conn *conn_,
>+   struct ct_dpif_protoinfo *protoinfo)
>+{
>+const struct conn_tcp *conn = conn_tcp_cast(conn_);
>+
>+protoinfo->proto = IPPROTO_TCP;
>+protoinfo->tcp.state_orig = conn->peer[0].state;
>+protoinfo->tcp.state_reply = conn->peer[1].state;
>+
>+protoinfo->tcp.wscale_orig = conn->peer[0].wscale & CT_WSCALE_MASK;
>+protoinfo->tcp.wscale_reply = conn->peer[1].wscale & CT_WSCALE_MASK;
>+
>+protoinfo->tcp.flags_orig =
>tcp_peer_to_protoinfo_flags(&conn->peer[0]);
>+protoinfo->tcp.flags_reply =
>tcp_peer_to_protoinfo_flags(&conn->peer[0]);

Sai: Shouldn¹t the reply be tcp_peer_to_protoinfo_flags(&conn->peer[1]);


>+}
>+
> struct ct_l4_proto ct_proto_tcp = {
> .new_conn = tcp_new_conn,
> .valid_new = tcp_valid_new,
> .conn_update = tcp_conn_update,
>+.conn_get_protoinfo = tcp_conn_get_protoinfo,
> };
>diff --git a/lib/conntrack.c b/lib/conntrack.c
>index 5376550..6e59375 100644
>--- a/lib/conntrack.c
>+++ b/lib/conntrack.c
>@@ -26,6 +26,7 @@
> #include "conntrack-private.h"
> #include "coverage.h"
> #include "csum.h"
>+#include "ct-dpif.h"
> #include "dp-packet.h"
> #include "flow.h"
> #include "hmap.h"
>@@ -1048,3 +1049,125 @@ delete_conn(struct conn *conn)
> {
> free(conn);
> }
>+?
>+static void
>+ct_endpoint_to_ct_dpif_inet_addr(const struct ct_addr *a,
>+ union ct_dpif_inet_addr *b,
>+ ovs_be16 dl_type)
>+{
>+if (dl_type == htons(ETH_TYPE_IP)) {
>+b->ip = a->ipv4_aligned;
>+} else if (dl_type == htons(ETH_TYPE_IPV6)){
>+b->in6 = a->ipv6_aligned;
>+}
>+}
>+
>+static void
>+conn_key_to_tuple(const struct conn_key *key, struct ct_dpif_tuple
>*tuple)
>+{
>+if (key->dl_type == htons(ETH_TYPE_IP)) {
>+tuple->l3_type = AF_INET;
>+} else if (key->dl_type == htons(ETH_TYPE_IPV6)) {
>+tuple->l3_type = AF_INET6;
>+}
>+tuple->ip_proto = key->nw_proto;
>+ct_endpoint_to_ct_dpif_inet_addr(&key->src.addr, &tuple->src,
>+ key->dl_type);
>+ct_endpoint_to_ct_dpif_inet_addr(&key->dst.addr, &tuple->dst,
>+ key->dl_type);
>+
>+if (key->nw_proto == IPPROTO_ICMP || key->nw_proto ==
>IPPROTO_ICMPV6) {
>+tuple->icmp_id = key->src.port;
>+/* ICMP type and code are not tracked */
>+tuple->icmp_type = 0;
>+tuple->icmp_code = 0;
>+} else {
>+tuple->src_port = key->src.port;
>+tuple->dst_port = key->dst.port;
>+}
>+}
>+
>+static void
>+conn_to_ct_dpif_entry(const struct conn *conn, struct ct_dpif_entry
>*entry,
>+  long long now)
>+{
>+struct ct_l4_proto *class;
>+long long expiration;
>+memset(entry, 0, sizeof *entry);
>+conn_key_to_tuple(&conn->key, &entry->tuple_orig);
>+conn_key_to_tuple(&conn->rev_key, &ent

[ovs-dev] [PATCH v8] datapath-windows: Add support for UDP and ICMP to Conntrack Module

2016-06-20 Thread Sairam Venugopal
Enable support for UDP and ICMP in the connection tracking module on
Hyper-V. Define 1s as variable and reuse it.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/automake.mk  |   1 +
 datapath-windows/ovsext/Conntrack-other.c |  82 +
 datapath-windows/ovsext/Conntrack-tcp.c   |  10 +-
 datapath-windows/ovsext/Conntrack.c   | 185 ++
 datapath-windows/ovsext/Conntrack.h   |  13 ++-
 datapath-windows/ovsext/ovsext.vcxproj|   1 +
 6 files changed, 239 insertions(+), 53 deletions(-)
 create mode 100644 datapath-windows/ovsext/Conntrack-other.c

diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index c9af806..668cf2c 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -13,6 +13,7 @@ EXTRA_DIST += \
datapath-windows/ovsext/Atomic.h \
datapath-windows/ovsext/BufferMgmt.c \
datapath-windows/ovsext/BufferMgmt.h \
+   datapath-windows/ovsext/Conntrack-other.c \
datapath-windows/ovsext/Conntrack-tcp.c \
datapath-windows/ovsext/Conntrack.c \
datapath-windows/ovsext/Conntrack.h \
diff --git a/datapath-windows/ovsext/Conntrack-other.c 
b/datapath-windows/ovsext/Conntrack-other.c
new file mode 100644
index 000..5d39389
--- /dev/null
+++ b/datapath-windows/ovsext/Conntrack-other.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015, 2016 VMware, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Conntrack.h"
+#include 
+
+enum other_state {
+OTHERS_FIRST,
+OTHERS_MULTIPLE,
+OTHERS_BIDIR,
+};
+
+struct conn_other {
+struct OVS_CT_ENTRY up;
+enum other_state state;
+};
+
+static const long long other_timeouts[] = {
+[OTHERS_FIRST] = 60 * CT_INTERVAL_SEC,
+[OTHERS_MULTIPLE] = 60 * CT_INTERVAL_SEC,
+[OTHERS_BIDIR] = 30 * CT_INTERVAL_SEC,
+};
+
+static __inline struct conn_other*
+OvsCastConntrackEntryToOtherEntry(OVS_CT_ENTRY *conn)
+{
+ASSERT(conn);
+return CONTAINER_OF(conn, struct conn_other, up);
+}
+
+static __inline VOID
+OvsConntrackUpdateExpiration(struct conn_other *conn, long long now)
+{
+ASSERT(conn);
+conn->up.expiration = now + other_timeouts[conn->state];
+}
+
+enum ct_update_res
+OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY *conn_,
+ BOOLEAN reply,
+ UINT64 now)
+{
+ASSERT(conn_);
+struct conn_other *conn = OvsCastConntrackEntryToOtherEntry(conn_);
+
+if (reply && conn->state != OTHERS_BIDIR) {
+conn->state = OTHERS_BIDIR;
+} else if (conn->state == OTHERS_FIRST) {
+conn->state = OTHERS_MULTIPLE;
+}
+
+OvsConntrackUpdateExpiration(conn, now);
+
+return CT_UPDATE_VALID;
+}
+
+OVS_CT_ENTRY *
+OvsConntrackCreateOtherEntry(UINT64 now)
+{
+struct conn_other *conn;
+conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
+OVS_CT_POOL_TAG);
+/* XXX Handle memory allocation error (by returning a status) */
+ASSERT(conn);
+conn->up = (OVS_CT_ENTRY) {0};
+conn->state = OTHERS_FIRST;
+OvsConntrackUpdateExpiration(conn, now);
+return &conn->up;
+}
diff --git a/datapath-windows/ovsext/Conntrack-tcp.c 
b/datapath-windows/ovsext/Conntrack-tcp.c
index 24f5e7c..19925c3 100644
--- a/datapath-windows/ovsext/Conntrack-tcp.c
+++ b/datapath-windows/ovsext/Conntrack-tcp.c
@@ -389,18 +389,18 @@ OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY* conn_,
 
 if (src->state >= CT_DPIF_TCPS_FIN_WAIT_2
 && dst->state >= CT_DPIF_TCPS_FIN_WAIT_2) {
-OvsConntrackUpdateExpiration(conn, now, 30 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 30 * CT_INTERVAL_SEC);
 } else if (src->state >= CT_DPIF_TCPS_CLOSING
&& dst->state >= CT_DPIF_TCPS_CLOSING) {
-OvsConntrackUpdateExpiration(conn, now, 45 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 45 * CT_INTERVAL_SEC);
 } else if (src->state < CT_DPIF_TCPS_ESTABLISHED
|| dst->state < CT_DPIF_TCPS_ESTABLISHED) {
-OvsConntrackUpdateExpiration(conn, now, 30 * 1000LL);
+OvsConntrackUpdateExpiration(conn, now, 30 * CT_INTERVAL_SEC);
 } else if (src->state >= CT_DPIF_TCPS_CLOSING
   

[ovs-dev] [PATCH 0/9] Windows: Add support for debugging conntrack

2016-06-20 Thread Sairam Venugopal
Conntrack module is part of OVS datapath on Windows and lacks netlink support. 
The following patches adds support in Windows datapath for accepting 
netfilter-netlink messages from userspace and executing the command. The 
supported commands include flushing conntrack entries and dumping them. 

Netfilter's conntrack related header files have been added to Windows to limit 
the userspace changes. Some of them have been intentionally left empty since 
Windows datapath does not support them.


Sairam Venugopal (9):
  Windows: Add netfilter-conntrack header files to Include folder
  datapath-windows: Add support for Netfilter netlink message
  datapath-windows: Add support for flushing conntrack entries
  datapath-windows: Add support for Conntrack IPCTNL_MSG_CT_DELETE cmd
in Datapath.c
  Windows: Add conntrack-flush support in userspace
  datapath-windows: Add new NlFillOvsMsgForNfGenMsg method in Netlink.c
  datapath-windows: Add support for dump-conntrack in datapath
  datapath-windows: Conntrack - Handle memory allocation failure
  datapath-windows: Add support for Conntrack IPCTNL_MSG_CT_GET cmd in  
  Datapath.c

 datapath-windows/include/OvsDpInterfaceExt.h   |  17 +
 datapath-windows/ovsext/Conntrack-other.c  |   5 +-
 datapath-windows/ovsext/Conntrack-tcp.c|  63 +++
 datapath-windows/ovsext/Conntrack.c| 522 -
 datapath-windows/ovsext/Conntrack.h|   5 +
 datapath-windows/ovsext/Datapath.c |  90 +++-
 datapath-windows/ovsext/Netlink/Netlink.c  |  50 ++
 datapath-windows/ovsext/Netlink/Netlink.h  |  12 +-
 datapath-windows/ovsext/Netlink/NetlinkProto.h |   9 +
 datapath-windows/ovsext/Util.h |   4 +
 include/windows/automake.mk|   6 +
 .../windows/linux/netfilter/nf_conntrack_common.h  | 113 +
 include/windows/linux/netfilter/nf_conntrack_ftp.h |   0
 .../windows/linux/netfilter/nf_conntrack_sctp.h|   0
 include/windows/linux/netfilter/nf_conntrack_tcp.h |  49 ++
 include/windows/linux/netfilter/nfnetlink.h|  63 +++
 .../windows/linux/netfilter/nfnetlink_conntrack.h  | 249 ++
 lib/automake.mk|   2 +
 lib/dpif-netlink.c |  15 +-
 lib/netlink-conntrack.c|  33 +-
 20 files changed, 1274 insertions(+), 33 deletions(-)
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_common.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_ftp.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_sctp.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_tcp.h
 create mode 100644 include/windows/linux/netfilter/nfnetlink.h
 create mode 100644 include/windows/linux/netfilter/nfnetlink_conntrack.h

-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 2/9] datapath-windows: Add support for Netfilter netlink message

2016-06-20 Thread Sairam Venugopal
Introduce NF_GEN_MSG_HDR similar to GENL_MSG_HDR that will be used for
communicating via netfilter-netlink channel. This will be used by
userspace to retrieve and modify Conntrack data in Windows.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Netlink/Netlink.c  | 11 +++
 datapath-windows/ovsext/Netlink/Netlink.h  |  8 ++--
 datapath-windows/ovsext/Netlink/NetlinkProto.h |  9 +
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/datapath-windows/ovsext/Netlink/Netlink.c 
b/datapath-windows/ovsext/Netlink/Netlink.c
index 1eec320..a25a22a 100644
--- a/datapath-windows/ovsext/Netlink/Netlink.c
+++ b/datapath-windows/ovsext/Netlink/Netlink.c
@@ -672,6 +672,17 @@ NlMsgAttrsLen(const PNL_MSG_HDR nlh)
 return NlHdrPayloadLen(nlh) - GENL_HDRLEN - OVS_HDRLEN;
 }
 
+/*
+ * ---
+ * Returns size of to nfnlmsg attributes.
+ * ---
+ */
+UINT32
+NfNlMsgAttrsLen(const PNL_MSG_HDR nlh)
+{
+return NlHdrPayloadLen(nlh) - NF_GEN_MSG_HDRLEN - OVS_HDRLEN;
+}
+
 /* Netlink message parse. */
 
 /*
diff --git a/datapath-windows/ovsext/Netlink/Netlink.h 
b/datapath-windows/ovsext/Netlink/Netlink.h
index b1b3bed..cce7ec3 100644
--- a/datapath-windows/ovsext/Netlink/Netlink.h
+++ b/datapath-windows/ovsext/Netlink/Netlink.h
@@ -27,7 +27,10 @@
  */
 typedef struct _OVS_MESSAGE {
 NL_MSG_HDR nlMsg;
-GENL_MSG_HDR genlMsg;
+union {
+GENL_MSG_HDR genlMsg;
+NF_GEN_MSG_HDR nfGenMsg;
+};
 OVS_HDR ovsHdr;
 /* Variable length nl_attrs follow. */
 } OVS_MESSAGE, *POVS_MESSAGE;
@@ -107,6 +110,7 @@ PCHAR NlHdrPayload(const PNL_MSG_HDR nlh);
 UINT32 NlHdrPayloadLen(const PNL_MSG_HDR nlh);
 PNL_ATTR NlMsgAttrs(const PNL_MSG_HDR nlh);
 UINT32 NlMsgAttrsLen(const PNL_MSG_HDR nlh);
+UINT32 NfNlMsgAttrsLen(const PNL_MSG_HDR nlh);
 
 /* Netlink message parse */
 PNL_MSG_HDR NlMsgNext(const PNL_MSG_HDR nlh);
@@ -135,7 +139,7 @@ const PNL_ATTR NlAttrFindNested(const PNL_ATTR nla,
 UINT16 type);
 BOOLEAN NlAttrParse(const PNL_MSG_HDR nlMsg, UINT32 attrOffset,
 UINT32 totalAttrLen, const NL_POLICY policy[],
-const UINT32 numPolicy, PNL_ATTR attrs[], 
+const UINT32 numPolicy, PNL_ATTR attrs[],
 UINT32 numAttrs);
 BOOLEAN NlAttrParseNested(const PNL_MSG_HDR nlMsg, UINT32 attrOffset,
   UINT32 totalAttrLen, const NL_POLICY policy[],
diff --git a/datapath-windows/ovsext/Netlink/NetlinkProto.h 
b/datapath-windows/ovsext/Netlink/NetlinkProto.h
index f2e9aee..beb14d5 100644
--- a/datapath-windows/ovsext/Netlink/NetlinkProto.h
+++ b/datapath-windows/ovsext/Netlink/NetlinkProto.h
@@ -98,6 +98,14 @@ typedef struct _GENL_MSG_HDR {
 } GENL_MSG_HDR, *PGENL_MSG_HDR;
 BUILD_ASSERT_DECL(sizeof(GENL_MSG_HDR) == 4);
 
+/* Netfilter Generic Message */
+typedef struct _NF_GEN_MSG_HDR {
+UINT8 nfgenFamily;   /* AF_xxx */
+UINT8 version;   /* nfnetlink version */
+UINT16 resId;/* resource id */
+} NF_GEN_MSG_HDR, *PNF_GEN_MSG_HDR;
+BUILD_ASSERT_DECL(sizeof(NF_GEN_MSG_HDR) == 4);
+
 /* Netlink attributes */
 typedef struct _NL_ATTR {
 UINT16 nlaLen;
@@ -113,6 +121,7 @@ BUILD_ASSERT_DECL(sizeof(NL_ATTR) == 4);
 
 #define NLMSG_HDRLEN ((INT) NLMSG_ALIGN(sizeof(NL_MSG_HDR)))
 #define GENL_HDRLEN NLMSG_ALIGN(sizeof(GENL_MSG_HDR))
+#define NF_GEN_MSG_HDRLEN NLMSG_ALIGN(sizeof(NF_GEN_MSG_HDR))
 #define OVS_HDRLEN NLMSG_ALIGN(sizeof(OVS_HDR))
 #define NLA_HDRLEN ((INT) NLA_ALIGN(sizeof(NL_ATTR)))
 
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 4/9] datapath-windows: Add support for Conntrack IPCTNL_MSG_CT_DELETE cmd in Datapath.c

2016-06-20 Thread Sairam Venugopal
Create new NETLINK_CMD and NETLINK_FAMILY to assist in flushing conntrack 
entries. Modify
Datapath.c to now support netfilter-netlink messages apart from the
existing netfilter-generic messages. Also hookup the command handler to
execute the OvsCtFlush in Conntrack.c

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/include/OvsDpInterfaceExt.h | 17 ++
 datapath-windows/ovsext/Datapath.c   | 82 
 2 files changed, 89 insertions(+), 10 deletions(-)

diff --git a/datapath-windows/include/OvsDpInterfaceExt.h 
b/datapath-windows/include/OvsDpInterfaceExt.h
index e235376..1044de7 100644
--- a/datapath-windows/include/OvsDpInterfaceExt.h
+++ b/datapath-windows/include/OvsDpInterfaceExt.h
@@ -17,6 +17,9 @@
 #ifndef __OVS_DP_INTERFACE_EXT_H_
 #define __OVS_DP_INTERFACE_EXT_H_ 1
 
+#include "include/windows/linux/netfilter/nfnetlink.h"
+#include "include/windows/linux/netfilter/nfnetlink_conntrack.h"
+
 /* Windows kernel datapath extensions to the standard datapath interface. */
 
 /* Version number of the datapath interface extensions. */
@@ -65,6 +68,7 @@
 #define OVS_WIN_NL_VPORT_FAMILY_ID   (NLMSG_MIN_TYPE + 4)
 #define OVS_WIN_NL_FLOW_FAMILY_ID(NLMSG_MIN_TYPE + 5)
 #define OVS_WIN_NL_NETDEV_FAMILY_ID  (NLMSG_MIN_TYPE + 6)
+#define OVS_WIN_NL_CT_FAMILY_ID  (NLMSG_MIN_TYPE + 7)
 
 #define OVS_WIN_NL_INVALID_MCGRP_ID  0
 #define OVS_WIN_NL_MCGRP_START_ID100
@@ -156,4 +160,17 @@ enum ovs_win_netdev_attr {
 typedef struct ovs_dp_stats OVS_DP_STATS;
 typedef enum ovs_vport_type OVS_VPORT_TYPE;
 
+/* Conntrack Netlink */
+#define NFNL_TYPE_CT_GET (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_GET)
+#define NFNL_TYPE_CT_DEL (NFNL_SUBSYS_CTNETLINK << 8 | IPCTNL_MSG_CT_DELETE)
+#define NFNL_SUBSYSTEM_TYPE(nlmsgType) (nlmsgType >> 8)
+#define NFNL_CT_CMD(nlmsgType) (nlmsgType & 0xff)
+#define IS_NFNL_CMD(nlmsgType) ((nlmsgType == NFNL_TYPE_CT_GET) || (nlmsgType 
== NFNL_TYPE_CT_DEL))
+#define OVS_NL_CT_ATTR_MAX (IPCTNL_MSG_MAX - 1)
+
+#define OVS_CT_FAMILY  "ovs_ct"
+#define OVS_CT_MCGROUP "ovs_ct"
+#define OVS_CT_VERSION 1
+
+
 #endif /* __OVS_DP_INTERFACE_EXT_H_ */
diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index b2c7020..7cc8390 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -103,7 +103,8 @@ NetlinkCmdHandlerOvsGetNetdevCmdHandler,
  OvsDeleteVportCmdHandler,
  OvsPendPacketCmdHandler,
  OvsSubscribePacketCmdHandler,
- OvsReadPacketCmdHandler;
+ OvsReadPacketCmdHandler,
+ OvsCtDeleteCmdHandler;
 
 static NTSTATUS HandleGetDpTransaction(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
UINT32 *replyLen);
@@ -282,6 +283,24 @@ NETLINK_FAMILY nlFLowFamilyOps = {
 .opsCount = ARRAY_SIZE(nlFlowFamilyCmdOps)
 };
 
+/* Netlink Ct family. */
+NETLINK_CMD nlCtFamilyCmdOps[] = {
+{ .cmd  = IPCTNL_MSG_CT_DELETE,
+  .handler  = OvsCtDeleteCmdHandler,
+  .supportedDevOp   = OVS_TRANSACTION_DEV_OP,
+  .validateDpIndex  = TRUE
+}
+};
+
+NETLINK_FAMILY nlCtFamilyOps = {
+.name = OVS_CT_FAMILY, /* Keep this for consistency*/
+.id   = OVS_WIN_NL_CT_FAMILY_ID, /* Keep this for consistency*/
+.version  = OVS_CT_VERSION, /* Keep this for consistency*/
+.maxAttr  = OVS_NL_CT_ATTR_MAX,
+.cmds = nlCtFamilyCmdOps,
+.opsCount = ARRAY_SIZE(nlCtFamilyCmdOps)
+};
+
 /* Netlink netdev family. */
 NETLINK_CMD nlNetdevFamilyCmdOps[] = {
 { .cmd = OVS_WIN_NETDEV_CMD_GET,
@@ -885,6 +904,9 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject,
 
 ASSERT(ovsMsg);
 switch (ovsMsg->nlMsg.nlmsgType) {
+case NFNL_TYPE_CT_DEL:
+nlFamilyOps = &nlCtFamilyOps;
+break;
 case OVS_WIN_NL_CTRL_FAMILY_ID:
 nlFamilyOps = &nlControlFamilyOps;
 break;
@@ -961,6 +983,30 @@ ValidateNetlinkCmd(UINT32 devOp,
 goto done;
 }
 
+/*
+Verify if the Netlink message is part of Netfilter Netlink
+This is currently used by Conntrack
+*/
+if (IS_NFNL_CMD(ovsMsg->nlMsg.nlmsgType)) {
+
+/* Validate Netfilter Netlink version is 0 */
+if (ovsMsg->nfGenMsg.version != NFNETLINK_V0) {
+status = STATUS_INVALID_PARAMETER;
+goto done;
+}
+
+/* Validate Netfilter Netlink Subsystem */
+if (NFNL_SUBSYSTEM_TYPE(ovsMsg->nlMsg.nlmsgType)
+!= NFNL_SUBSYS_CTNETLINK) {
+status = STATUS_INVALID_PARAMETER;
+goto done;
+}
+
+/* Exit the function because there aren't any other validations */
+status = STATUS_SUCCESS;
+goto done;
+}
+
 for (i = 0; i < 

[ovs-dev] [PATCH 8/9] datapath-windows: Conntrack - Handle memory allocation failure

2016-06-20 Thread Sairam Venugopal
Return null if Windows fails to allocate memory for the conntrack entry.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Conntrack-other.c | 5 +++--
 datapath-windows/ovsext/Conntrack-tcp.c   | 4 
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/datapath-windows/ovsext/Conntrack-other.c 
b/datapath-windows/ovsext/Conntrack-other.c
index 5d39389..b853020 100644
--- a/datapath-windows/ovsext/Conntrack-other.c
+++ b/datapath-windows/ovsext/Conntrack-other.c
@@ -73,8 +73,9 @@ OvsConntrackCreateOtherEntry(UINT64 now)
 struct conn_other *conn;
 conn = OvsAllocateMemoryWithTag(sizeof(struct conn_other),
 OVS_CT_POOL_TAG);
-/* XXX Handle memory allocation error (by returning a status) */
-ASSERT(conn);
+if (!conn) {
+return NULL;
+}
 conn->up = (OVS_CT_ENTRY) {0};
 conn->state = OTHERS_FIRST;
 OvsConntrackUpdateExpiration(conn, now);
diff --git a/datapath-windows/ovsext/Conntrack-tcp.c 
b/datapath-windows/ovsext/Conntrack-tcp.c
index 1d60323..a0ee791 100644
--- a/datapath-windows/ovsext/Conntrack-tcp.c
+++ b/datapath-windows/ovsext/Conntrack-tcp.c
@@ -490,6 +490,10 @@ OvsConntrackCreateTcpEntry(const TCPHdr *tcp,
 
 newconn = OvsAllocateMemoryWithTag(sizeof(struct conn_tcp),
OVS_CT_POOL_TAG);
+if (!newconn) {
+return NULL;
+}
+
 newconn->up = (OVS_CT_ENTRY) {0};
 src = &newconn->peer[0];
 dst = &newconn->peer[1];
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 1/9] Windows: Add netfilter-conntrack header files to Include folder

2016-06-20 Thread Sairam Venugopal
Include netfilter-conntrack header files in user-space. This will be used
by Windows userspace for adding debugging support in Conntrack. Some of these 
files
are intentionally left blank and will be updated once relevant support is
added in Windows datapath.

Signed-off-by: Sairam Venugopal 
---
 include/windows/automake.mk|   6 +
 .../windows/linux/netfilter/nf_conntrack_common.h  | 113 ++
 include/windows/linux/netfilter/nf_conntrack_ftp.h |   0
 .../windows/linux/netfilter/nf_conntrack_sctp.h|   0
 include/windows/linux/netfilter/nf_conntrack_tcp.h |  49 
 include/windows/linux/netfilter/nfnetlink.h|  63 ++
 .../windows/linux/netfilter/nfnetlink_conntrack.h  | 249 +
 7 files changed, 480 insertions(+)
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_common.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_ftp.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_sctp.h
 create mode 100644 include/windows/linux/netfilter/nf_conntrack_tcp.h
 create mode 100644 include/windows/linux/netfilter/nfnetlink.h
 create mode 100644 include/windows/linux/netfilter/nfnetlink_conntrack.h

diff --git a/include/windows/automake.mk b/include/windows/automake.mk
index 58b52f1..382627b 100644
--- a/include/windows/automake.mk
+++ b/include/windows/automake.mk
@@ -9,6 +9,12 @@ noinst_HEADERS += \
include/windows/arpa/inet.h \
include/windows/dirent.h \
include/windows/getopt.h \
+   include/windows/linux/netfilter/nf_conntrack_common.h \
+   include/windows/linux/netfilter/nf_conntrack_ftp.h \
+   include/windows/linux/netfilter/nf_conntrack_sctp.h \
+   include/windows/linux/netfilter/nf_conntrack_tcp.h \
+   include/windows/linux/netfilter/nfnetlink.h \
+   include/windows/linux/netfilter/nfnetlink_conntrack.h \
include/windows/linux/pkt_sched.h \
include/windows/linux/types.h \
include/windows/net/if.h \
diff --git a/include/windows/linux/netfilter/nf_conntrack_common.h 
b/include/windows/linux/netfilter/nf_conntrack_common.h
new file mode 100644
index 000..9904003
--- /dev/null
+++ b/include/windows/linux/netfilter/nf_conntrack_common.h
@@ -0,0 +1,113 @@
+#ifndef _NF_CONNTRACK_COMMON_H
+#define _NF_CONNTRACK_COMMON_H
+/* Connection state tracking for netfilter.  This is separated from,
+   but required by, the NAT layer; it can also be used by an iptables
+   extension. */
+enum ip_conntrack_info {
+/* Part of an established connection (either direction). */
+IP_CT_ESTABLISHED,
+
+/* Like NEW, but related to an existing connection, or ICMP error
+   (in either direction). */
+IP_CT_RELATED,
+
+/* Started a new connection to track (only
+   IP_CT_DIR_ORIGINAL); may be a retransmission. */
+IP_CT_NEW,
+
+/* >= this indicates reply direction */
+IP_CT_IS_REPLY,
+
+IP_CT_ESTABLISHED_REPLY = IP_CT_ESTABLISHED + IP_CT_IS_REPLY,
+IP_CT_RELATED_REPLY = IP_CT_RELATED + IP_CT_IS_REPLY,
+IP_CT_NEW_REPLY = IP_CT_NEW + IP_CT_IS_REPLY,
+/* Number of distinct IP_CT types (no NEW in reply dirn). */
+IP_CT_NUMBER = IP_CT_IS_REPLY * 2 - 1
+};
+
+/* Bitset representing status of connection. */
+enum ip_conntrack_status {
+/* It's an expected connection: bit 0 set.  This bit never changed */
+IPS_EXPECTED_BIT = 0,
+IPS_EXPECTED = (1 << IPS_EXPECTED_BIT),
+
+/* We've seen packets both ways: bit 1 set.  Can be set, not unset. */
+IPS_SEEN_REPLY_BIT = 1,
+IPS_SEEN_REPLY = (1 << IPS_SEEN_REPLY_BIT),
+
+/* Conntrack should never be early-expired. */
+IPS_ASSURED_BIT = 2,
+IPS_ASSURED = (1 << IPS_ASSURED_BIT),
+
+/* Connection is confirmed: originating packet has left box */
+IPS_CONFIRMED_BIT = 3,
+IPS_CONFIRMED = (1 << IPS_CONFIRMED_BIT),
+
+/* Connection needs src nat in orig dir.  This bit never changed. */
+IPS_SRC_NAT_BIT = 4,
+IPS_SRC_NAT = (1 << IPS_SRC_NAT_BIT),
+
+/* Connection needs dst nat in orig dir.  This bit never changed. */
+IPS_DST_NAT_BIT = 5,
+IPS_DST_NAT = (1 << IPS_DST_NAT_BIT),
+
+/* Both together. */
+IPS_NAT_MASK = (IPS_DST_NAT | IPS_SRC_NAT),
+
+/* Connection needs TCP sequence adjusted. */
+IPS_SEQ_ADJUST_BIT = 6,
+IPS_SEQ_ADJUST = (1 << IPS_SEQ_ADJUST_BIT),
+
+/* NAT initialization bits. */
+IPS_SRC_NAT_DONE_BIT = 7,
+IPS_SRC_NAT_DONE = (1 << IPS_SRC_NAT_DONE_BIT),
+
+IPS_DST_NAT_DONE_BIT = 8,
+IPS_DST_NAT_DONE = (1 << IPS_DST_NAT_DONE_BIT),
+
+/* Both together */
+IPS_NAT_DONE_MASK = (IPS_DST_NAT_DONE | IPS_SRC_NAT_DONE),
+
+/* Connection is dying (removed from lists), can not be unset. */
+IPS_DYING_BIT = 9,
+IPS_DYING = (1 << IPS_DYING_BIT),
+
+/* Connection has fixed timeout. */
+IPS_FIXED_TIMEOUT_BIT = 10,
+IPS_FIXED_TIMEOUT = (1 << IPS

[ovs-dev] [PATCH 3/9] datapath-windows: Add support for flushing conntrack entries

2016-06-20 Thread Sairam Venugopal
Flush out all conntrack entries or those that match a given zone. Since
the conntrack module is internal to OVS in Windows, this functionality
needs to be added in.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Conntrack.c | 75 +
 1 file changed, 75 insertions(+)

diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 5fc9282..15c495d 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -624,3 +624,78 @@ ovsConntrackEntryCleaner(PVOID data)
 
 PsTerminateSystemThread(STATUS_SUCCESS);
 }
+
+/*
+ *
+ * OvsCtFlush
+ * Flushes out all Conntrack Entries that match the given zone
+ *
+ */
+static __inline NDIS_STATUS
+OvsCtFlush(UINT16 zone)
+{
+PLIST_ENTRY link, next;
+POVS_CT_ENTRY entry;
+
+LOCK_STATE_EX lockState;
+NdisAcquireRWLockWrite(ovsConntrackLockObj, &lockState, 0);
+
+for (int i = 0; i < CT_HASH_TABLE_SIZE; i++) {
+LIST_FORALL_SAFE(&ovsConntrackTable[i], link, next) {
+entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link);
+if (!zone || zone == entry->key.zone)
+OvsCtEntryDelete(entry);
+}
+}
+
+NdisReleaseRWLock(ovsConntrackLockObj, &lockState);
+return NDIS_STATUS_SUCCESS;
+}
+
+NTSTATUS
+OvsCtDeleteCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
+  UINT32 *replyLen)
+{
+POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
+PNL_MSG_HDR nlMsgHdr = &(msgIn->nlMsg);
+PNL_ATTR ctAttrs[__CTA_MAX];
+UINT32 attrOffset = NLMSG_HDRLEN + NF_GEN_MSG_HDRLEN + OVS_HDRLEN;
+NL_ERROR nlError = NL_ERROR_SUCCESS;
+NTSTATUS status;
+UINT16 zone = 0;
+
+static const NL_POLICY ctZonePolicy[] = {
+[CTA_ZONE] = { .type = NL_A_BE16, .optional = TRUE },
+};
+
+if ((NlAttrParse(nlMsgHdr, attrOffset, NfNlMsgAttrsLen(nlMsgHdr),
+ctZonePolicy, ARRAY_SIZE(ctZonePolicy),
+ctAttrs, ARRAY_SIZE(ctAttrs)))
+!= TRUE) {
+OVS_LOG_ERROR("Zone attr parsing failed for msg: %p", nlMsgHdr);
+status = STATUS_INVALID_PARAMETER;
+goto done;
+}
+
+if (ctAttrs[CTA_ZONE]) {
+zone = NlAttrGetU16(ctAttrs[CTA_ZONE]);
+}
+
+status = OvsCtFlush(zone);
+
+done:
+if (status) {
+nlError = NlMapStatusToNlErr(status);
+}
+if (nlError != NL_ERROR_SUCCESS) {
+POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR)
+   usrParamsCtx->outputBuffer;
+
+ASSERT(msgError);
+NlBuildErrorMsg(msgIn, msgError, nlError, replyLen);
+ASSERT(*replyLen != 0);
+status = STATUS_SUCCESS;
+}
+
+return status;
+}
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 6/9] datapath-windows: Add new NlFillOvsMsgForNfGenMsg method in Netlink.c

2016-06-20 Thread Sairam Venugopal
Create a new method to create and fill OvsMessage with NfGenMsg. This will
be used for sending Netfilter based Netlink messages.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Netlink/Netlink.c | 39 +++
 datapath-windows/ovsext/Netlink/Netlink.h |  4 
 2 files changed, 43 insertions(+)

diff --git a/datapath-windows/ovsext/Netlink/Netlink.c 
b/datapath-windows/ovsext/Netlink/Netlink.c
index a25a22a..6717dd1 100644
--- a/datapath-windows/ovsext/Netlink/Netlink.c
+++ b/datapath-windows/ovsext/Netlink/Netlink.c
@@ -73,6 +73,45 @@ NlFillOvsMsg(PNL_BUFFER nlBuf, UINT16 nlmsgType,
 
 /*
  * ---
+ * Prepare netlink message headers. This API adds
+ * NL_MSG_HDR + GENL_HDR + OVS_HDR to the tail of input NLBuf.
+ * Attributes should be added by caller.
+ * ---
+ */
+BOOLEAN
+NlFillOvsMsgForNfGenMsg(PNL_BUFFER nlBuf, UINT16 nlmsgType,
+UINT16 nlmsgFlags, UINT32 nlmsgSeq,
+UINT32 nlmsgPid, UINT8 nfgenFamily,
+UINT8 nfGenVersion, UINT32 dpNo)
+{
+BOOLEAN writeOk;
+OVS_MESSAGE msgOut;
+UINT32 offset = NlBufSize(nlBuf);
+
+/* To keep compiler happy for release build. */
+UNREFERENCED_PARAMETER(offset);
+ASSERT(NlBufAt(nlBuf, offset, 0) != 0);
+
+msgOut.nlMsg.nlmsgType = nlmsgType;
+msgOut.nlMsg.nlmsgFlags = nlmsgFlags;
+msgOut.nlMsg.nlmsgSeq = nlmsgSeq;
+msgOut.nlMsg.nlmsgPid = nlmsgPid;
+msgOut.nlMsg.nlmsgLen = sizeof(struct _OVS_MESSAGE);
+
+msgOut.nfGenMsg.nfgenFamily = nfgenFamily;
+msgOut.nfGenMsg.version = nfGenVersion;
+msgOut.nfGenMsg.resId = 0;
+
+msgOut.ovsHdr.dp_ifindex = dpNo;
+
+writeOk = NlMsgPutTail(nlBuf, (PCHAR)(&msgOut),
+   sizeof (struct _OVS_MESSAGE));
+
+return writeOk;
+}
+
+/*
+ * ---
  * Prepare NL_MSG_HDR only. This API appends a NL_MSG_HDR to the tail of
  * input NlBuf.
  * ---
diff --git a/datapath-windows/ovsext/Netlink/Netlink.h 
b/datapath-windows/ovsext/Netlink/Netlink.h
index cce7ec3..9d31641 100644
--- a/datapath-windows/ovsext/Netlink/Netlink.h
+++ b/datapath-windows/ovsext/Netlink/Netlink.h
@@ -94,6 +94,10 @@ BOOLEAN NlFillOvsMsg(PNL_BUFFER nlBuf,
  UINT16 nlmsgType, UINT16 nlmsgFlags,
  UINT32 nlmsgSeq, UINT32 nlmsgPid,
  UINT8 genlCmd, UINT8 genlVer, UINT32 dpNo);
+BOOLEAN NlFillOvsMsgForNfGenMsg(PNL_BUFFER nlBuf, UINT16 nlmsgType,
+UINT16 nlmsgFlags, UINT32 nlmsgSeq,
+UINT32 nlmsgPid, UINT8 nfgenFamily,
+UINT8 nfGenVersion, UINT32 dpNo);
 BOOLEAN NlFillNlHdr(PNL_BUFFER nlBuf,
 UINT16 nlmsgType, UINT16 nlmsgFlags,
 UINT32 nlmsgSeq, UINT32 nlmsgPid);
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 5/9] Windows: Add conntrack-flush support in userspace

2016-06-20 Thread Sairam Venugopal
Modify dpif-netlink.c and netlink-conntrack.c to send down 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 
---
 lib/automake.mk |  2 ++
 lib/dpif-netlink.c  | 15 +++
 lib/netlink-conntrack.c | 33 +
 3 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/lib/automake.mk b/lib/automake.mk
index eabc0e7..4d4ee01 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -372,6 +372,8 @@ lib_libopenvswitch_la_SOURCES += \
lib/dpif-netlink.c \
lib/dpif-netlink.h \
lib/netdev-windows.c \
+   lib/netlink-conntrack.c \
+   lib/netlink-conntrack.h \
lib/netlink-notifier.c \
lib/netlink-notifier.h \
lib/netlink-protocol.h \
diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index 9bff3a8..e2bea23 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -2274,7 +2274,6 @@ dpif_netlink_get_datapath_version(void)
 return version_str;
 }
 
-#ifdef __linux__
 struct dpif_netlink_ct_dump_state {
 struct ct_dpif_dump_state up;
 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();
 }
 }
-#endif
 
 const struct dpif_class dpif_netlink_class = {
 "system",
@@ -2377,17 +2375,10 @@ const struct dpif_class dpif_netlink_class = {
 NULL,   /* enable_upcall */
 NULL,   /* disable_upcall */
 dpif_netlink_get_datapath_version, /* get_datapath_version */
-#ifdef __linux__
 dpif_netlink_ct_dump_start,
 dpif_netlink_ct_dump_next,
 dpif_netlink_ct_dump_done,
-dpif_netlink_ct_flush,
-#else
-NULL,   /* ct_dump_start */
-NULL,   /* ct_dump_next */
-NULL,   /* ct_dump_done */
-NULL,   /* ct_flush */
-#endif
+dpif_netlink_ct_flush
 };
 
 static int
@@ -2442,7 +2433,7 @@ dpif_netlink_is_internal_device(const char *name)
 
 return reply.type == OVS_VPORT_TYPE_INTERNAL;
 }
-
+
 /* Parses the contents of 'buf', which contains a "struct ovs_header" followed
  * by Netlink attributes, into 'vport'.  Returns 0 if successful, otherwise a
  * 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->tcp_flags = flow->tcp_flags ? *flow->tcp_flags : 0;
 }
-
+
 /* Logs information about a packet that was recently lost in 'ch' (in
  * 'dpif_'). */
 static void
diff --git a/lib/netlink-conntrack.c b/lib/netlink-conntrack.c
index 47a3c62..bc31391 100644
--- a/lib/netlink-conntrack.c
+++ b/lib/netlink-conntrack.c
@@ -75,6 +75,10 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 
5);
 #define IPS_UNTRACKED_BIT 12
 #define IPS_UNTRACKED (1 << IPS_UNTRACKED_BIT)
 
+#ifdef _WIN32
+#define NETLINK_NETFILTER   NETLINK_GENERIC //Override for Windowss
+#endif
+
 static const struct nl_policy nfnlgrp_conntrack_policy[] = {
 [CTA_TUPLE_ORIG] = { .type = NL_A_NESTED, .optional = false },
 [CTA_TUPLE_REPLY] = { .type = NL_A_NESTED, .optional = false },
@@ -118,7 +122,7 @@ struct nl_ct_dump_state {
 bool filter_zone;
 uint16_t zone;
 };
-
+
 /* Conntrack netlink dumping. */
 
 /* Initialize a conntrack netlink dump. */
@@ -200,7 +204,7 @@ nl_ct_dump_done(struct nl_ct_dump_state *state)
 free(state);
 return error;
 }
-
+
 /* Format conntrack event 'entry' of 'type' to 'ds'. */
 void
 nl_ct_format_event_entry(const struct ct_dpif_entry *entry,
@@ -235,6 +239,26 @@ nl_ct_flush(void)
 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
 nl_ct_flush_zone(uint16_t flush_zone)
 {
@@ -299,7 +323,8 @@ nl_ct_flush_zone(uint16_t flush_zone)
  * have a master connection anymore */
 return 0;
 }
-
+#endif
+
 /* Conntrack netlink parsing. */
 
 static bool
@@ -788,7 +813,7 @@ nl_ct_parse_entry(struct ofpbuf *buf, struct ct_dpif_entry 
*entry,
 
 return true;
 }

[ovs-dev] [PATCH 9/9] datapath-windows: Add support for Conntrack IPCTNL_MSG_CT_GET cmd in Datapath.c

2016-06-20 Thread Sairam Venugopal
This will be used by userspace for dumping conntrack entries - "ovs-dpctl
dump-conntrack".

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Datapath.c | 12 ++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index 7cc8390..5cc0614 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -104,7 +104,8 @@ NetlinkCmdHandlerOvsGetNetdevCmdHandler,
  OvsPendPacketCmdHandler,
  OvsSubscribePacketCmdHandler,
  OvsReadPacketCmdHandler,
- OvsCtDeleteCmdHandler;
+ OvsCtDeleteCmdHandler,
+ OvsCtDumpCmdHandler;
 
 static NTSTATUS HandleGetDpTransaction(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
UINT32 *replyLen);
@@ -288,7 +289,13 @@ NETLINK_CMD nlCtFamilyCmdOps[] = {
 { .cmd  = IPCTNL_MSG_CT_DELETE,
   .handler  = OvsCtDeleteCmdHandler,
   .supportedDevOp   = OVS_TRANSACTION_DEV_OP,
-  .validateDpIndex  = TRUE
+  .validateDpIndex  = FALSE
+},
+{ .cmd  = IPCTNL_MSG_CT_GET,
+  .handler  = OvsCtDumpCmdHandler,
+  .supportedDevOp   = OVS_TRANSACTION_DEV_OP |
+  OVS_WRITE_DEV_OP | OVS_READ_DEV_OP,
+  .validateDpIndex  = FALSE
 }
 };
 
@@ -904,6 +911,7 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject,
 
 ASSERT(ovsMsg);
 switch (ovsMsg->nlMsg.nlmsgType) {
+case NFNL_TYPE_CT_GET:
 case NFNL_TYPE_CT_DEL:
 nlFamilyOps = &nlCtFamilyOps;
 break;
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH 7/9] datapath-windows: Add support for dump-conntrack in datapath

2016-06-20 Thread Sairam Venugopal
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 
---
 datapath-windows/ovsext/Conntrack-tcp.c |  59 +
 datapath-windows/ovsext/Conntrack.c | 447 +++-
 datapath-windows/ovsext/Conntrack.h |   5 +
 datapath-windows/ovsext/Util.h  |   4 +
 4 files changed, 512 insertions(+), 3 deletions(-)

diff --git a/datapath-windows/ovsext/Conntrack-tcp.c 
b/datapath-windows/ovsext/Conntrack-tcp.c
index 19925c3..1d60323 100644
--- a/datapath-windows/ovsext/Conntrack-tcp.c
+++ b/datapath-windows/ovsext/Conntrack-tcp.c
@@ -523,3 +523,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;
+}
diff --git a/datapath-windows/ovsext/Conntrack.c 
b/datapath-windows/ovsext/Conntrack.c
index 15c495d..2e628e5 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -24,6 +24,10 @@
 #include "PacketParser.h"
 #include "Debug.h"
 
+#define WINDOWS_TICK 1000
+#define SEC_TO_UNIX_EPOCH 11644473600LL
+#define SEC_TO_NANOSEC 10LL
+
 typedef struct _OVS_CT_THREAD_CTX {
 KEVENT  event;
 PVOID   threadObject;
@@ -34,6 +38,7 @@ KSTART_ROUTINE ovsConntrackEntryCleaner;
 static PLIST_ENTRY ovsConntrackTable;
 static OVS_CT_THREAD_CTX ctThreadCtx;
 static PNDIS_RW_LOCK_EX ovsConntrackLockObj;
+extern POVS_SWITCH_CONTEXT gOvsSwitchContext;
 
 /*
  *
@@ -147,11 +152,12 @@ OvsCtUpdateFlowKey(struct OvsFlowKey *key,
 }
 
 static __inline VOID
-OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx)
+OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx, UINT64 now)
 {
 NdisMoveMemory(&entry->key, &ctx->key, sizeof (OVS_CT_KEY));
 NdisMoveMemory(&entry->rev_key, &ctx->key, sizeof (OVS_CT_KEY));
 OvsCtKeyReverse(&entry->rev_key);
+entry->timestampStart = now;
 InsertHeadList(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],
&entry->link);
 }
@@ -181,7 +187,10 @@ OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
 state |= OVS_CS_F_NEW;
 if (commit) {
 entry = OvsConntrackCreateTcpEntry(tcp, curNbl, currentTime);
-OvsCtAddEntry(entry, ctx);
+if (!entry) {
+return NULL;
+}
+OvsCtAddEntry(entry, ctx, currentTime);
 }
 
 OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
@@ -192,7 +201,10 @@ OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
 state |= OVS_CS_F_NEW;
 if (commit) {
 entry = OvsConntrackCreateOtherEntry(currentTime);
-OvsCtAddEntry(entry, ctx);
+if (!entry) {
+return NULL;
+}
+OvsCtAddEntry(entry, ctx, currentTime);
 }
 
 OvsCtUpdateFlowKey(key, state, ctx->k

[ovs-dev] [PATCH] datapath-windows: Remove unused headers from Datapath.c

2016-06-21 Thread Sairam Venugopal
Clean up unused headers in Datapath.c. Found by inspection.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Datapath.c | 7 ---
 1 file changed, 7 deletions(-)

diff --git a/datapath-windows/ovsext/Datapath.c 
b/datapath-windows/ovsext/Datapath.c
index 5cc0614..39a4c42 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -25,16 +25,9 @@
 #include "Switch.h"
 #include "User.h"
 #include "Datapath.h"
-#include "Jhash.h"
-#include "Vport.h"
 #include "Event.h"
-#include "User.h"
-#include "PacketIO.h"
-#include "Recirc.h"
 #include "NetProto.h"
 #include "Flow.h"
-#include "User.h"
-#include "Vxlan.h"
 
 #ifdef OVS_DBG_MOD
 #undef OVS_DBG_MOD
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


Re: [ovs-dev] [PATCH V2] datapath-windows: Handle possible NULL pointer dereference in STT

2016-06-21 Thread Sairam Venugopal
Hi Paul,

Please find the comments inlined.

Thanks,
Sairam

On 6/21/16, 9:51 AM, "Paul Boca"  wrote:

>Check if OvsAllocatememoryWithTag succeeded or not.
>In case of failure propagate cleanup and return.
>---
>V2: Checked also NdisGetDataBuffer and MmGetSystemAddressForMdlSafe
>if they return NULL and handle the error
>---
> datapath-windows/ovsext/Stt.c | 55
>++-
> 1 file changed, 44 insertions(+), 11 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c
>index 86a719d..498d340 100644
>--- a/datapath-windows/ovsext/Stt.c
>+++ b/datapath-windows/ovsext/Stt.c
>@@ -191,6 +191,10 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport,
> 
> bufferStart = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl,
>LowPagePriority);
>+if (bufferStart == NULL) {
>+status = NDIS_STATUS_RESOURCES;
>+goto ret_error;
>+}
> bufferStart += NET_BUFFER_CURRENT_MDL_OFFSET(curNb);
> 
> if (layers->isIPv4) {
>@@ -402,6 +406,9 @@ OvsValidateTCPChecksum(PNET_BUFFER_LIST curNbl,
>PNET_BUFFER curNb)
> 
> EthHdr *eth = (EthHdr *)NdisGetDataBuffer(curNb, sizeof(EthHdr),
>   NULL, 1, 0);
>+if (eth == NULL) {
>+return NDIS_STATUS_RESOURCES;
>+}
> 
> if (eth->Type == ntohs(NDIS_ETH_TYPE_IPV4)) {
> IPHdr *ip = (IPHdr *)((PCHAR)eth + sizeof *eth);
>@@ -641,7 +648,7 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> POVS_STT_PKT_ENTRY entry;
> entry = OvsAllocateMemoryWithTag(sizeof(OVS_STT_PKT_ENTRY),
>  OVS_STT_POOL_TAG);
>-if (NULL == entry) {
>+if (entry == NULL) {
> goto handle_error;
> }
> RtlZeroMemory(entry, sizeof (OVS_STT_PKT_ENTRY));
>@@ -666,13 +673,15 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> entry->allocatedLen = innerPacketLen;
> entry->packetBuf = OvsAllocateMemoryWithTag(innerPacketLen,
> OVS_STT_POOL_TAG);
>-if (NULL == entry->packetBuf) {
>+if (entry->packetBuf == NULL) {
> OvsFreeMemoryWithTag(entry, OVS_STT_POOL_TAG);
> goto handle_error;
> }
> if (OvsGetPacketBytes(curNbl, fragmentLength, startOffset,
>   entry->packetBuf + offset) == NULL) {
> OVS_LOG_ERROR("Error when obtaining bytes from Packet");
Sai - Do we really need to discard other packets and entry if 1 packet
fails to contain data?
I think we should wait for retransmission to send the right packet. Also,
the cleanup thread will flush this entry on expiry.
 


>+OvsFreeMemoryWithTag(entry->packetBuf, OVS_STT_POOL_TAG);
>+OvsFreeMemoryWithTag(entry, OVS_STT_POOL_TAG);
> goto handle_error;
> }
> 
>@@ -684,9 +693,6 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> // don't copy more than it is allocated
> goto handle_error;
> }
>-/* Add to recieved length to identify if this is the last
>fragment */
>-pktFragEntry->recvdLen += fragmentLength;
>-lastPacket = (pktFragEntry->recvdLen == innerPacketLen);
> 
> if (segOffset == 0) {
> pktFragEntry->sttHdr = *sttHdr;
>@@ -699,8 +705,16 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT switchContext,
> if (OvsGetPacketBytes(curNbl, fragmentLength, startOffset,
>   pktFragEntry->packetBuf + offset) == NULL)
>{
> OVS_LOG_ERROR("Error when obtaining bytes from Packet");

Sai - Same as above.
 

>+/* Remove from list and free the allocate buffers */
>+RemoveEntryList(&pktFragEntry->link);
>+OvsFreeMemoryWithTag(pktFragEntry->packetBuf,
>OVS_STT_POOL_TAG);
>+OvsFreeMemoryWithTag(pktFragEntry, OVS_STT_POOL_TAG);
> goto handle_error;
> }
>+
>+/* Add to received length to identify if this is the last
>fragment */
>+pktFragEntry->recvdLen += fragmentLength;
>+lastPacket = (pktFragEntry->recvdLen == innerPacketLen);
> }
> 
> handle_error:
>@@ -744,7 +758,7 @@ handle_error:
> 
>*-
>---
> */
> NDIS_STATUS
>-OvsDecapSetOffloads(PNET_BUFFER_LIST *curNbl,
>+OvsDecapSetOffloads(PNET_BUFFER_LIST *curNbl,
> SttHdr *sttHdr,
> OVS_PACKET_HDR_INFO *layers)
> {
>@@ -804,6 +818,9 @@ OvsDecapSetOffloads(PNET_BUFFER_LIST *curNbl,
> 
> buf = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl,
> LowPagePriority);
>+if (buf == NULL) {
>+return NDIS_STATUS_RESOURCES;
>+}
> buf += NET_BUFFER_CURRENT_MDL_OFFSET(curNb);
> 
> // apply pseudo checksum on extracted packet
>@@ -883,7 +900,9 @@ OvsDecapStt(POVS_SWITCH_CONTEXT switch

[ovs-dev] [PATCH] datapath-windows: Remove unused headers in Event.c

2016-06-21 Thread Sairam Venugopal
Cleanup unused headers. Found by inspection.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Event.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index c210da3..abf8f0d 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -16,8 +16,6 @@
 
 #include "precomp.h"
 
-#include "Switch.h"
-#include "User.h"
 #include "Datapath.h"
 #include "Vport.h"
 #include "Event.h"
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


[ovs-dev] [PATCH] datapath-windows: Handle memory allocation failure for event creation

2016-06-21 Thread Sairam Venugopal
Release the lock and return if an event entry fails to get allocated.

Signed-off-by: Sairam Venugopal 
---
 datapath-windows/ovsext/Event.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/datapath-windows/ovsext/Event.c b/datapath-windows/ovsext/Event.c
index abf8f0d..f9bea7f 100644
--- a/datapath-windows/ovsext/Event.c
+++ b/datapath-windows/ovsext/Event.c
@@ -134,6 +134,13 @@ OvsPostEvent(POVS_EVENT_ENTRY event)
 
 elem = (POVS_EVENT_QUEUE_ELEM)OvsAllocateMemoryWithTag(
 sizeof(*elem), OVS_EVENT_POOL_TAG);
+
+if (elem == NULL) {
+OVS_LOG_WARN("Fail to allocate memory for event");
+OvsReleaseEventQueueLock();
+return;
+}
+
 RtlCopyMemory(&elem->event, event, sizeof elem->event);
 InsertTailList(&queue->elemList, &elem->link);
 queue->numElems++;
-- 
2.5.0.windows.1

___
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


  1   2   3   >