[ovs-dev] [PATCH v2] datapath-windows: use ip proto for tunnel port lookup
Alin Serdean
aserdean at cloudbasesolutions.com
Tue Jun 14 04:53:57 UTC 2016
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 at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev at openvswitch.org
http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list