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