Please disregard this review I it was intended for the V2 (https://patchwork.ozlabs.org/patch/629912/)
Thanks, Alin. > -----Mesaj original----- > De la: dev [mailto:dev-boun...@openvswitch.org] În numele Alin Serdean > Trimis: Tuesday, June 14, 2016 7:01 AM > Către: Nithin Raju <nit...@vmware.com>; dev@openvswitch.org > Subiect: Re: [ovs-dev] [PATCH] datapath-windows: use ip proto for tunnel > port lookup > > Hi Nithin, > > Thanks for the patch. Beside a few small nits regarding whitespace and extra > comments, please see considerations to GRE tunnels in inlined comments. > > Alin. > > - if (tunnelVport) { > > + break; > > + case OVS_VPORT_TYPE_VXLAN: > > ovsActionStats.rxVxlan++; > > + break; > > +#if 0 > > + case OVS_VPORT_TYPE_GENEVE: > > + ovsActionStats.rxGeneve++; > > + break; > > +#endif > [Alin Gabriel Serdean: ] I think you can fan out the ifdef and Yin can add > them > later > > + 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..f5eeaa5 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,6 +711,41 @@ > > OvsFindTunnelVportByDstPort(POVS_SWITCH_CONTEXT switchContext, } > > > > POVS_VPORT_ENTRY > > +OvsFindTunnelVportByDstPortAndNWProto(POVS_SWITCH_CONTEXT > > switchContext, > > + UINT16 dstPort, > > + UINT8 nwProto) { > > + POVS_VPORT_ENTRY vport; > > + PLIST_ENTRY head, link; > > + 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 (GetPortFromPriv(vport) == dstPort) { > > + switch (nwProto) { > [Alin Gabriel Serdean: ] This will break in case we have a GRE tunnel set up. > They rely only on the IP protocol; their destination port will be always set > to > zero. We can have packets which have l4 port zero and a gre tunnel which will > result in a misinterpreted patcket. Please leave the function > OvsFindTunnelVportByPortType the way it was and create a new one. > > + case IPPROTO_UDP: > > + if (/* nwProto != OVS_VPORT_TYPE_GENEVE || */ > [Alin Gabriel Serdean: ] I think you can fan out the comment and Yin can add > them later > > + 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; > > + } > > + } > > + return NULL; > > +} > > + > > +POVS_VPORT_ENTRY > > OvsFindTunnelVportByPortType(POVS_SWITCH_CONTEXT switchContext, > > OVS_VPORT_TYPE ovsPortType) { @@ > > -2222,15 +2257,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 +2285,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); > [Alin Gabriel Serdean: ] Please skip this check in the case of GRE( it relies > only > on the IP protocol). > > + if (dupVport) { > > + OVS_LOG_ERROR("Vport for N/W proto and port already > > exists," > [Alin Gabriel Serdean: ] ../ovs-dev-v2-datapath-windows-use-ip-proto-for- > tunnel-port-lookup.patch:162: trailing whitespace. > > + " type: %u, dst port: %u, name: %s", dupVport->ovsType, > > + transportPortDest, dupVport->ovsName); > > + goto Cleanup; > > + } > > + > > status = OvsInitTunnelVport(usrParamsCtx, > > vport, > > portType, @@ -2319,6 +2375,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..f0a9acd 100644 > > --- a/datapath-windows/ovsext/Vport.h > > +++ b/datapath-windows/ovsext/Vport.h > > @@ -145,9 +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 > > OvsFindTunnelVportByDstPortAndType(POVS_SWITCH_CONTEXT > > switchContext, > > + UINT16 dstPort, > > + OVS_VPORT_TYPE > > +ovsPortType); POVS_VPORT_ENTRY > > OvsFindTunnelVportByDstPortAndNWProto(POVS_SWITCH_CONTEXT > > switchContext, > > + UINT16 dstPort, > > + UINT8 > > + nwProto); > > POVS_VPORT_ENTRY > > OvsFindTunnelVportByPortType(POVS_SWITCH_CONTEXT switchContext, > > OVS_VPORT_TYPE > > ovsPortType); > > > > -- > > 2.7.1.windows.1 > > > > _______________________________________________ > > dev mailing list > > dev@openvswitch.org > > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev