Acked-by: Yin Lin <li...@vmware.com>

On Tue, Jun 7, 2016 at 11:20 AM, Sairam Venugopal <vsai...@vmware.com>
wrote:

> 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
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to