Acked-by: Sairam Venugopal <vsai...@vmware.com>

On 6/3/16, 9:34 AM, "Nithin Raju" <nit...@vmware.com> 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 <nit...@vmware.com>
>---
> 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_SWITCH_CONTEXT
>switchContext,
> }
> 
> POVS_VPORT_ENTRY
>-OvsFindTunnelVportByPortType(POVS_SWITCH_CONTEXT switchContext,
>-                             OVS_VPORT_TYPE ovsPortType)
>+OvsFindTunnelVportByDstPortAndNWProto(POVS_SWITCH_CONTEXT switchContext,
>+                                      UINT16 dstPort,
>+                                      UINT8 nwProto)
> {
>     POVS_VPORT_ENTRY vport;
>     PLIST_ENTRY head, link;
>-    UINT16 dstPort = 0;
>     UINT32 hash = OvsJhashBytes((const VOID *)&dstPort, sizeof(dstPort),
>                                 OVS_HASH_BASIS);
>     head = &(switchContext->tunnelVportsArray[hash & OVS_VPORT_MASK]);
>     LIST_FORALL(head, link) {
>         vport = CONTAINING_RECORD(link, OVS_VPORT_ENTRY,
>tunnelVportLink);
>-        if (vport->ovsType == ovsPortType) {
>+        if (GetPortFromPriv(vport) == dstPort) {
>+            switch (nwProto) {
>+            case IPPROTO_UDP:
>+                if (/* nwProto != OVS_VPORT_TYPE_GENEVE || */
>+                    vport->ovsType != OVS_VPORT_TYPE_VXLAN) {
>+                    continue;
>+                }
>+                break;
>+            case IPPROTO_TCP:
>+                if (vport->ovsType != OVS_VPORT_TYPE_STT) {
>+                    continue;
>+                }
>+                break;
>+            case IPPROTO_GRE:
>+            default:
>+                break;
>+            }
>             return vport;
>         }
>     }
>@@ -2222,15 +2238,20 @@ OvsNewVportCmdHandler(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
> 
>         if (OvsIsTunnelVportType(portType)) {
>             UINT16 transportPortDest = 0;
>+            UINT8 nwProto;
>+            POVS_VPORT_ENTRY dupVport;
> 
>             switch (portType) {
>             case OVS_VPORT_TYPE_GRE:
>+                nwProto = IPPROTO_GRE;
>                 break;
>             case OVS_VPORT_TYPE_VXLAN:
>                 transportPortDest = VXLAN_UDP_PORT;
>+                nwProto = IPPROTO_UDP;
>                 break;
>             case OVS_VPORT_TYPE_STT:
>                 transportPortDest = STT_TCP_PORT;
>+                nwProto = IPPROTO_TCP;
>                 break;
>             default:
>                 nlError = NL_ERROR_INVAL;
>@@ -2245,6 +2266,22 @@ OvsNewVportCmdHandler(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
>                 }
>             }
> 
>+            /*
>+             * We don't allow two tunnel ports on identical N/W protocol
>and
>+             * L4 port number. This is applicable even if the two ports
>are of
>+             * different tunneling types.
>+             */
>+            dupVport =
>+                OvsFindTunnelVportByDstPortAndNWProto(gOvsSwitchContext,
>+                                                      transportPortDest,
>+                                                      nwProto);
>+            if (dupVport) {
>+                OVS_LOG_ERROR("Vport for N/W proto and port already
>exists," 
>+                    " type: %u, dst port: %u, name: %s",
>dupVport->ovsType,
>+                    transportPortDest, dupVport->ovsName);
>+                goto Cleanup;
>+            }
>+
>             status = OvsInitTunnelVport(usrParamsCtx,
>                                         vport,
>                                         portType,
>@@ -2319,6 +2356,8 @@ OvsNewVportCmdHandler(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
>                                    gOvsSwitchContext->dpNo);
> 
>     *replyLen = msgOut->nlMsg.nlmsgLen;
>+    OVS_LOG_INFO("Created new vport, name: %s, type: %u", vport->ovsName,
>+                 vport->ovsType);
> 
> Cleanup:
>     NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
>diff --git a/datapath-windows/ovsext/Vport.h
>b/datapath-windows/ovsext/Vport.h
>index 373896d..4d300b8 100644
>--- a/datapath-windows/ovsext/Vport.h
>+++ b/datapath-windows/ovsext/Vport.h
>@@ -145,11 +145,12 @@ POVS_VPORT_ENTRY
>OvsFindVportByHvNameA(POVS_SWITCH_CONTEXT switchContext,
> POVS_VPORT_ENTRY OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT
>switchContext,
>                                                  NDIS_SWITCH_PORT_ID
>portId,
>                                                  NDIS_SWITCH_NIC_INDEX
>index);
>-POVS_VPORT_ENTRY OvsFindTunnelVportByDstPort(POVS_SWITCH_CONTEXT
>switchContext,
>-                                             UINT16 dstPort,
>-                                             OVS_VPORT_TYPE
>ovsVportType);
>-POVS_VPORT_ENTRY OvsFindTunnelVportByPortType(POVS_SWITCH_CONTEXT
>switchContext,
>-                                              OVS_VPORT_TYPE
>ovsPortType);
>+POVS_VPORT_ENTRY OvsFindTunnelVportByDstPortAndType(POVS_SWITCH_CONTEXT
>switchContext,
>+                                                    UINT16 dstPort,
>+                                                    OVS_VPORT_TYPE
>ovsPortType);
>+POVS_VPORT_ENTRY 
>OvsFindTunnelVportByDstPortAndNWProto(POVS_SWITCH_CONTEXT switchContext,
>+                                                       UINT16 dstPort,
>+                                                       UINT8 nwProto);
> 
> NDIS_STATUS OvsAddConfiguredSwitchPorts(struct _OVS_SWITCH_CONTEXT
>*switchContext);
> NDIS_STATUS OvsInitConfiguredSwitchNics(struct _OVS_SWITCH_CONTEXT
>*switchContext);
>-- 
>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=reLqdovoY1CIFAMycRvtTzNuQQmz_u
>rP24wa69Z5Enc&s=PyhUnC-Gi71X5_5-6Vdgu-GZwnSN5mUndg_Vh_KPVTs&e= 

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

Reply via email to