[ovs-dev] [PATCH 4/4] Upcall NL packet format: Call NL missed packet function

Eitan Eliahu eliahue at vmware.com
Fri Oct 10 18:08:31 UTC 2014


Remove hard coded queue is, pass the key rather the tunnel key,
remove the none NL implementation

Signed-off-by: Eitan Eliahu <eliahue at vmware.com>
---
 datapath-windows/ovsext/Actions.c  |  29 ++---
 datapath-windows/ovsext/PacketIO.c |   7 +-
 datapath-windows/ovsext/Tunnel.c   |   4 +-
 datapath-windows/ovsext/User.c     | 250 +------------------------------------
 datapath-windows/ovsext/User.h     |  22 ++--
 5 files changed, 30 insertions(+), 282 deletions(-)

diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
index ab8b673..23de67e 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -558,14 +558,11 @@ OvsDoFlowLookupOutput(OvsForwardingContext *ovsFwdCtx)
         UINT32 num = 0;
         ovsFwdCtx->switchContext->datapath.misses++;
         InitializeListHead(&missedPackets);
-        status = OvsCreateAndAddPackets(
-                OVS_DEFAULT_PACKET_QUEUE, NULL, 0, OVS_PACKET_CMD_MISS,
-                ovsFwdCtx->srcVportNo,
-                key.tunKey.dst != 0 ?
-                    (OvsIPv4TunnelKey *)&key.tunKey : NULL,
-                ovsFwdCtx->curNbl,
-                ovsFwdCtx->tunnelRxNic != NULL, &ovsFwdCtx->layers,
-                ovsFwdCtx->switchContext, &missedPackets, &num);
+        status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS,
+                          ovsFwdCtx->srcVportNo,
+                          &key,ovsFwdCtx->curNbl,
+                          ovsFwdCtx->tunnelRxNic != NULL, &ovsFwdCtx->layers,
+                          ovsFwdCtx->switchContext, &missedPackets, &num);
         if (num) {
             OvsQueuePackets(OVS_DEFAULT_PACKET_QUEUE, &missedPackets, num);
         }
@@ -1472,7 +1469,6 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
             PNL_ATTR userdataAttr;
             PNL_ATTR queueAttr;
             POVS_PACKET_QUEUE_ELEM elem;
-            UINT32 queueId = OVS_DEFAULT_PACKET_QUEUE;
             BOOLEAN isRecv = FALSE;
 
             POVS_VPORT_ENTRY vport = OvsFindVportByPortNo(switchContext,
@@ -1488,14 +1484,13 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
             queueAttr = NlAttrFindNested(a, OVS_USERSPACE_ATTR_PID);
             userdataAttr = NlAttrFindNested(a, OVS_USERSPACE_ATTR_USERDATA);
 
-            elem = OvsCreateQueuePacket(queueId, (PVOID)userdataAttr,
-                                        userdataAttr->nlaLen,
-                                        OVS_PACKET_CMD_ACTION,
-                                        portNo, (OvsIPv4TunnelKey *)&key->tunKey,
-                                        ovsFwdCtx.curNbl,
-                                        NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx.curNbl),
-                                        isRecv,
-                                        layers);
+            elem = OvsCreateQueueNlPacket((PVOID)userdataAttr,
+                                    userdataAttr->nlaLen,
+                                    OVS_PACKET_CMD_ACTION,
+                                    portNo, key,ovsFwdCtx.curNbl,
+                                    NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx.curNbl),
+                                    isRecv,
+                                    layers);
             if (elem) {
                 LIST_ENTRY missedPackets;
                 InitializeListHead(&missedPackets);
diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c
index 87d7037..493c8cb 100644
--- a/datapath-windows/ovsext/PacketIO.c
+++ b/datapath-windows/ovsext/PacketIO.c
@@ -287,12 +287,9 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext,
                 OvsReleaseDatapath(datapath, &dpLockState);
 
                 datapath->misses++;
-                status = OvsCreateAndAddPackets(OVS_DEFAULT_PACKET_QUEUE,
-                                                NULL, 0, OVS_PACKET_CMD_MISS,
+                status = OvsCreateAndAddPackets(NULL, 0, OVS_PACKET_CMD_MISS,
                                                 portNo,
-                                                key.tunKey.dst != 0 ?
-                                                (OvsIPv4TunnelKey *)&key.tunKey :
-                                                NULL, curNbl,
+                                                &key, curNbl,
                                                 sourcePort ==
                                                 switchContext->externalPortId,
                                                 &layers, switchContext,
diff --git a/datapath-windows/ovsext/Tunnel.c b/datapath-windows/ovsext/Tunnel.c
index 64e279c..eb45454 100644
--- a/datapath-windows/ovsext/Tunnel.c
+++ b/datapath-windows/ovsext/Tunnel.c
@@ -314,8 +314,8 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl,
             POVS_PACKET_QUEUE_ELEM elem;
 
             datapath->misses++;
-            elem = OvsCreateQueuePacket(1, NULL, 0, OVS_PACKET_CMD_MISS,
-                                        portNo, &key.tunKey, pNbl, curNb,
+            elem = OvsCreateQueueNlPacket(NULL, 0, OVS_PACKET_CMD_MISS,
+                                        portNo, &key, pNbl, curNb,
                                         TRUE, &layers);
             if (elem) {
                 /* Complete the packet since it was copied to user buffer. */
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
index 5037b42..859d499 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -517,247 +517,6 @@ OvsGetQueue(UINT32 queueId)
     return queue->instance != NULL ? queue : NULL;
 }
 
-/*
- *----------------------------------------------------------------------------
- * OvsCreateQueuePacket --
- *
- *  Create a packet which will be forwarded to user space.
- *
- * InputParameter:
- *   queueId Identify the queue the packet to be inserted
- *      This will be used when multiple queues is supported
- *      in userspace
- *   userData: when cmd is user action, this field contain
- *      user action data.
- *   userDataLen: as name indicated
- *   cmd: either miss or user action
- *   inPort: datapath port id from which the packet is received.
- *   tunnelKey: tunnelKey for tunneled packet
- *   nbl:  the NET_BUFFER_LIST which contain the packet
- *   nb: the packet
- *   isRecv: This is used to decide how to interprete the csum info
- *   hdrInfo: include hdr info initialized during flow extraction.
- *
- * Results:
- *    NULL if fail to create the packet
- *    The packet element otherwise
- *----------------------------------------------------------------------------
- */
-POVS_PACKET_QUEUE_ELEM
-OvsCreateQueuePacket(UINT32 queueId,
-                     PVOID userData,
-                     UINT32 userDataLen,
-                     UINT32 cmd,
-                     UINT32 inPort,
-                     OvsIPv4TunnelKey *tunnelKey,
-                     PNET_BUFFER_LIST nbl,
-                     PNET_BUFFER nb,
-                     BOOLEAN isRecv,
-                     POVS_PACKET_HDR_INFO hdrInfo)
-{
-#define VLAN_TAG_SIZE 4
-    UINT32 allocLen, dataLen, extraLen = 0;
-    POVS_PACKET_QUEUE_ELEM elem;
-    PMDL mdl;
-    UINT8 *src, *dst;
-    NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
-    NDIS_NET_BUFFER_LIST_8021Q_INFO vlanInfo;
-
-    if (!OvsGetQueue(queueId)) {
-        /*
-         * There is no userspace queue created yet, so there is no point for
-         * creating a new packet to be queued.
-         */
-        return NULL;
-    }
-
-    csumInfo.Value = NET_BUFFER_LIST_INFO(nbl, TcpIpChecksumNetBufferListInfo);
-
-    if (isRecv && (csumInfo.Receive.TcpChecksumFailed ||
-                   (csumInfo.Receive.UdpChecksumFailed &&
-                    !hdrInfo->udpCsumZero) ||
-                   csumInfo.Receive.IpChecksumFailed)) {
-        OVS_LOG_INFO("Packet dropped due to checksum failure.");
-        ovsUserStats.dropDuetoChecksum++;
-        return NULL;
-    }
-
-    vlanInfo.Value = NET_BUFFER_LIST_INFO(nbl, Ieee8021QNetBufferListInfo);
-    if (vlanInfo.TagHeader.VlanId) {
-        /*
-         * We may also need to check priority XXX
-         */
-        extraLen = VLAN_TAG_SIZE;
-    }
-
-    dataLen = NET_BUFFER_DATA_LENGTH(nb);
-    allocLen = sizeof (OVS_PACKET_QUEUE_ELEM) + userDataLen + dataLen +
-           extraLen;
-
-    elem = (POVS_PACKET_QUEUE_ELEM)OvsAllocateMemory(allocLen);
-    if (elem == NULL) {
-        ovsUserStats.dropDuetoResource++;
-        return NULL;
-    }
-    elem->hdrInfo.value = hdrInfo->value;
-    elem->packet.totalLen = sizeof (OVS_PACKET_INFO) + userDataLen + dataLen +
-       extraLen;
-    elem->packet.queue = queueId;
-    elem->packet.userDataLen = userDataLen;
-    elem->packet.inPort = inPort;
-    elem->packet.cmd = cmd;
-    if (cmd == (UINT32)OVS_PACKET_CMD_MISS) {
-        ovsUserStats.miss++;
-    } else {
-        ovsUserStats.action++;
-    }
-    elem->packet.packetLen = dataLen + extraLen;
-    if (tunnelKey) {
-        RtlCopyMemory(&elem->packet.tunnelKey, tunnelKey,
-                      sizeof (*tunnelKey));
-    } else {
-        RtlZeroMemory(&elem->packet.tunnelKey,
-                      sizeof (elem->packet.tunnelKey));
-    }
-
-    dst = elem->packet.data;
-    if (userDataLen) {
-        RtlCopyMemory(dst, userData, userDataLen);
-        dst = dst + userDataLen;
-    }
-    dst += extraLen;
-
-    mdl = NET_BUFFER_CURRENT_MDL(nb);
-    src = NdisGetDataBuffer(nb, dataLen, dst, 1, 0);
-    if (src == NULL) {
-        OvsFreeMemory(elem);
-        ovsUserStats.dropDuetoResource++;
-        return NULL;
-    } else if (src != dst) {
-        /* Copy the data from the NDIS buffer to dst. */
-        RtlCopyMemory(dst, src, dataLen);
-    }
-
-    dst =  elem->packet.data + userDataLen + extraLen;
-    /*
-     * Fix IP hdr if necessary
-     */
-    if ((isRecv && csumInfo.Receive.IpChecksumValueInvalid) ||
-        (!isRecv && csumInfo.Transmit.IsIPv4 &&
-         csumInfo.Transmit.IpHeaderChecksum)) {
-        PIPV4_HEADER ipHdr = (PIPV4_HEADER)(dst + hdrInfo->l3Offset);
-        ASSERT(elem->hdrInfo.isIPv4);
-        ASSERT(ipHdr->Version == 4);
-        ipHdr->HeaderChecksum = IPChecksum((UINT8 *)ipHdr,
-                                           ipHdr->HeaderLength << 2,
-                                           (UINT16)~ipHdr->HeaderChecksum);
-        ovsUserStats.ipCsum++;
-    }
-    ASSERT(elem->hdrInfo.tcpCsumNeeded == 0 &&
-           elem->hdrInfo.udpCsumNeeded == 0);
-    /*
-     * Fow now, we will not do verification
-     * There is no correctness issue here.
-     * XXX
-     */
-    /*
-     * calculate TCP/UDP pseudo checksum
-     */
-    if (isRecv && csumInfo.Receive.TcpChecksumValueInvalid) {
-        /*
-         * Only this case, we need to reclaculate pseudo checksum
-         * all other cases, it is assumed the pseudo checksum is
-         * filled already.
-         *
-         */
-        PTCP_HDR tcpHdr = (PTCP_HDR)(dst + hdrInfo->l4Offset);
-        if (hdrInfo->isIPv4) {
-            PIPV4_HEADER ipHdr = (PIPV4_HEADER)(dst + hdrInfo->l3Offset);
-            elem->hdrInfo.l4PayLoad = (UINT16)(ntohs(ipHdr->TotalLength) -
-                                               (ipHdr->HeaderLength << 2));
-            tcpHdr->th_sum =
-                 IPPseudoChecksum((UINT32 *)&ipHdr->SourceAddress,
-                                  (UINT32 *)&ipHdr->DestinationAddress,
-                                  IPPROTO_TCP, elem->hdrInfo.l4PayLoad);
-        } else {
-            PIPV6_HEADER ipv6Hdr = (PIPV6_HEADER)(dst + hdrInfo->l3Offset);
-            elem->hdrInfo.l4PayLoad =
-                  (UINT16)(ntohs(ipv6Hdr->PayloadLength) +
-                           hdrInfo->l3Offset + sizeof(IPV6_HEADER) -
-                           hdrInfo->l4Offset);
-            ASSERT(hdrInfo->isIPv6);
-            tcpHdr->th_sum =
-                IPv6PseudoChecksum((UINT32 *)&ipv6Hdr->SourceAddress,
-                                   (UINT32 *)&ipv6Hdr->DestinationAddress,
-                                   IPPROTO_TCP, elem->hdrInfo.l4PayLoad);
-        }
-        elem->hdrInfo.tcpCsumNeeded = 1;
-        ovsUserStats.recalTcpCsum++;
-    } else if (!isRecv) {
-        if (csumInfo.Transmit.TcpChecksum) {
-            elem->hdrInfo.tcpCsumNeeded = 1;
-        } else if (csumInfo.Transmit.UdpChecksum) {
-            elem->hdrInfo.udpCsumNeeded = 1;
-        }
-        if (elem->hdrInfo.tcpCsumNeeded || elem->hdrInfo.udpCsumNeeded) {
-#ifdef DBG
-            UINT16 sum, *ptr;
-            UINT8 proto =
-               elem->hdrInfo.tcpCsumNeeded ? IPPROTO_TCP : IPPROTO_UDP;
-#endif
-            if (hdrInfo->isIPv4) {
-                PIPV4_HEADER ipHdr = (PIPV4_HEADER)(dst + hdrInfo->l3Offset);
-                elem->hdrInfo.l4PayLoad = (UINT16)(ntohs(ipHdr->TotalLength) -
-                                                   (ipHdr->HeaderLength << 2));
-#ifdef DBG
-                sum = IPPseudoChecksum((UINT32 *)&ipHdr->SourceAddress,
-                                       (UINT32 *)&ipHdr->DestinationAddress,
-                                       proto, elem->hdrInfo.l4PayLoad);
-#endif
-            } else {
-                PIPV6_HEADER ipv6Hdr = (PIPV6_HEADER)(dst +
-                                                      hdrInfo->l3Offset);
-                elem->hdrInfo.l4PayLoad =
-                       (UINT16)(ntohs(ipv6Hdr->PayloadLength) +
-                                hdrInfo->l3Offset + sizeof(IPV6_HEADER) -
-                                hdrInfo->l4Offset);
-                ASSERT(hdrInfo->isIPv6);
-#ifdef DBG
-                sum = IPv6PseudoChecksum((UINT32 *)&ipv6Hdr->SourceAddress,
-                                         (UINT32 *)&ipv6Hdr->DestinationAddress,
-                                         proto, elem->hdrInfo.l4PayLoad);
-#endif
-            }
-#ifdef DBG
-            ptr = (UINT16 *)(dst + hdrInfo->l4Offset +
-                             (elem->hdrInfo.tcpCsumNeeded ?
-                              TCP_CSUM_OFFSET : UDP_CSUM_OFFSET));
-            ASSERT(*ptr == sum);
-#endif
-        }
-    }
-    /*
-     * Finally insert VLAN tag
-     */
-    if (extraLen) {
-        dst = elem->packet.data + userDataLen;
-        src = dst + extraLen;
-        ((UINT32 *)dst)[0] = ((UINT32 *)src)[0];
-        ((UINT32 *)dst)[1] = ((UINT32 *)src)[1];
-        ((UINT32 *)dst)[2] = ((UINT32 *)src)[2];
-        dst += 12;
-        ((UINT16 *)dst)[0] = htons(0x8100);
-        ((UINT16 *)dst)[1] = htons(vlanInfo.TagHeader.VlanId |
-                                   (vlanInfo.TagHeader.UserPriority << 13));
-        elem->hdrInfo.l3Offset += VLAN_TAG_SIZE;
-        elem->hdrInfo.l4Offset += VLAN_TAG_SIZE;
-        ovsUserStats.vlanInsert++;
-    }
-
-    return elem;
-}
-
-
 VOID
 OvsQueuePackets(UINT32 queueId,
                 PLIST_ENTRY packetList,
@@ -819,12 +578,11 @@ cleanup:
  *----------------------------------------------------------------------------
  */
 NTSTATUS
-OvsCreateAndAddPackets(UINT32 queueId,
-                       PVOID userData,
+OvsCreateAndAddPackets(PVOID userData,
                        UINT32 userDataLen,
                        UINT32 cmd,
                        UINT32 inPort,
-                       OvsIPv4TunnelKey *tunnelKey,
+                       OvsFlowKey *key,
                        PNET_BUFFER_LIST nbl,
                        BOOLEAN isRecv,
                        POVS_PACKET_HDR_INFO hdrInfo,
@@ -859,8 +617,8 @@ OvsCreateAndAddPackets(UINT32 queueId,
 
     nb = NET_BUFFER_LIST_FIRST_NB(nbl);
     while (nb) {
-        elem = OvsCreateQueuePacket(queueId, userData, userDataLen,
-                                    cmd, inPort, tunnelKey, nbl, nb,
+        elem = OvsCreateQueueNlPacket(userData, userDataLen,
+                                    cmd, inPort, key, nbl, nb,
                                     isRecv, hdrInfo);
         if (elem) {
             InsertTailList(list, &elem->link);
diff --git a/datapath-windows/ovsext/User.h b/datapath-windows/ovsext/User.h
index ed41f14..e1b1a90 100644
--- a/datapath-windows/ovsext/User.h
+++ b/datapath-windows/ovsext/User.h
@@ -71,24 +71,22 @@ VOID OvsUserCleanup();
 
 VOID OvsCleanupPacketQueue(struct _OVS_OPEN_INSTANCE *instance);
 
-POVS_PACKET_QUEUE_ELEM OvsCreateQueuePacket(UINT32 queueId,
-                                            PVOID userData,
-                                            UINT32 userDataLen,
-                                            UINT32 cmd, UINT32 inPort,
-                                            OvsIPv4TunnelKey *tunnelKey,
-                                            PNET_BUFFER_LIST nbl,
-                                            PNET_BUFFER nb,
-                                            BOOLEAN isRecv,
-                                            POVS_PACKET_HDR_INFO hdrInfo);
+POVS_PACKET_QUEUE_ELEM OvsCreateQueueNlPacket(PVOID userData,
+                                              UINT32 userDataLen,
+                                              UINT32 cmd, UINT32 inPort,
+                                              OvsFlowKey *key,
+                                              PNET_BUFFER_LIST nbl,
+                                              PNET_BUFFER nb,
+                                              BOOLEAN isRecv,
+                                              POVS_PACKET_HDR_INFO hdrInfo);
 
 VOID OvsQueuePackets(UINT32 queueId, PLIST_ENTRY packetList,
                      UINT32 numElems);
-NTSTATUS OvsCreateAndAddPackets(UINT32 queueId,
-                                PVOID userData,
+NTSTATUS OvsCreateAndAddPackets(PVOID userData,
                                 UINT32 userDataLen,
                                 UINT32 cmd,
                                 UINT32 inPort,
-                                OvsIPv4TunnelKey *tunnelKey,
+                                OvsFlowKey *key,
                                 PNET_BUFFER_LIST nbl,
                                 BOOLEAN isRecv,
                                 POVS_PACKET_HDR_INFO hdrInfo,
-- 
1.9.4.msysgit.0




More information about the dev mailing list