]> git.proxmox.com Git - ovs.git/commitdiff
datapath-windows: Conntrack - Fix OvsGetTcpPayloadLength()
authorSairam Venugopal <vsairam@vmware.com>
Fri, 16 Dec 2016 22:28:09 +0000 (14:28 -0800)
committerGurucharan Shetty <guru@ovn.org>
Tue, 20 Dec 2016 17:32:05 +0000 (09:32 -0800)
Move the OvsGetTcpPayloadLength() to common header. Update the code to
check for null references and the correct size of the TCP header.

Signed-off-by: Sairam Venugopal <vsairam@vmware.com>
Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Signed-off-by: Gurucharan Shetty <guru@ovn.org>
datapath-windows/ovsext/Conntrack-tcp.c
datapath-windows/ovsext/Conntrack.h

index 1c46bb015d55d8c30cc9b744c1df5cf6dfb33a51..f533b935f802cd48390d1904fff28f0579733f5c 100644 (file)
@@ -184,21 +184,6 @@ OvsTcpGetWscale(const TCPHdr *tcp)
     return wscale;
 }
 
-static __inline uint32_t
-OvsGetTcpPayloadLength(PNET_BUFFER_LIST nbl)
-{
-    IPHdr *ipHdr;
-    char *ipBuf[sizeof(IPHdr)];
-    PNET_BUFFER curNb;
-    curNb = NET_BUFFER_LIST_FIRST_NB(nbl);
-    ipHdr = NdisGetDataBuffer(curNb, sizeof *ipHdr, (PVOID) &ipBuf,
-                                                    1 /*no align*/, 0);
-    TCPHdr *tcp = (TCPHdr *)((PCHAR)ipHdr + ipHdr->ihl * 4);
-    return (UINT16)ntohs(ipHdr->tot_len)
-                        - (ipHdr->ihl * 4)
-                        - (sizeof * tcp);
-}
-
 static __inline struct conn_tcp*
 OvsCastConntrackEntryToTcpEntry(OVS_CT_ENTRY* conn)
 {
index 270e2dd15e34e0ded764c2712870978488320eca..733596df8bd01f17fe7c61bc9f23bcbc95b7a683 100644 (file)
@@ -109,6 +109,28 @@ OvsConntrackUpdateExpiration(OVS_CT_ENTRY *ctEntry,
     ctEntry->expiration = now + interval;
 }
 
+static __inline UINT32
+OvsGetTcpPayloadLength(PNET_BUFFER_LIST nbl)
+{
+    IPHdr *ipHdr;
+    char *ipBuf[sizeof(IPHdr)];
+    PNET_BUFFER curNb;
+    curNb = NET_BUFFER_LIST_FIRST_NB(nbl);
+    UINT32 hdrLen = sizeof(EthHdr);
+    NdisAdvanceNetBufferDataStart(curNb, hdrLen, FALSE, NULL);
+    ipHdr = NdisGetDataBuffer(curNb, sizeof *ipHdr, (PVOID) &ipBuf,
+                              1 /*no align*/, 0);
+    if (ipHdr == NULL) {
+        NdisRetreatNetBufferDataStart(curNb, hdrLen, 0, NULL);
+        return 0;
+    }
+
+    TCPHdr *tcp = (TCPHdr *)((PCHAR)ipHdr + ipHdr->ihl * 4);
+    NdisRetreatNetBufferDataStart(curNb, hdrLen, 0, NULL);
+
+    return (ntohs(ipHdr->tot_len) - (ipHdr->ihl * 4) - (TCP_HDR_LEN(tcp)));
+}
+
 VOID OvsCleanupConntrack(VOID);
 NTSTATUS OvsInitConntrack(POVS_SWITCH_CONTEXT context);