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