[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