[ovs-dev] [PATCH 3/4] datapath-windows: Add support for OVS_KEY_ATTR_UDP set action

Alin Serdean aserdean at cloudbasesolutions.com
Thu Jan 26 23:42:29 UTC 2017


Forgot to add version number.

Please ignore this patch.

Alin.

> -----Original Message-----
> From: Alin Serdean
> Sent: Friday, January 27, 2017 1:40 AM
> To: dev at openvswitch.org
> Cc: Alin Serdean <aserdean at cloudbasesolutions.com>
> Subject: [PATCH 3/4] datapath-windows: Add support for
> OVS_KEY_ATTR_UDP set action
> 
> From: Alin Serdean <aserdean at cloudbasesolutions.com>
> 
> This patch adds support for set action with OVS_KEY_ATTR_UDP attribute
> (change UDP source or destination port).
> 
> If the source or destination UDP port was changed, update the UDP
> checksum.
> 
> A sample flow can look like the following:
> set(udp(src=67,dst=68))
> 
> Signed-off-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
> ---
> v3: check if udp checksum is 0
> v2: no change
> ---
>  datapath-windows/ovsext/Actions.c | 52
> ++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 51 insertions(+), 1 deletion(-)
> 
> diff --git a/datapath-windows/ovsext/Actions.c b/datapath-
> windows/ovsext/Actions.c
> index 467bfbc..3dfcc68 100644
> --- a/datapath-windows/ovsext/Actions.c
> +++ b/datapath-windows/ovsext/Actions.c
> @@ -1306,7 +1306,6 @@ OvsUpdateEthHeader(OvsForwardingContext
> *ovsFwdCtx,
>      return NDIS_STATUS_SUCCESS;
>  }
> 
> -
>  /*
>   *----------------------------------------------------------------------------
>   * OvsGetHeaderBySize --
> @@ -1382,6 +1381,52 @@ PUINT8
> OvsGetHeaderBySize(OvsForwardingContext *ovsFwdCtx,
>      return start + curMdlOffset;
>  }
> 
> +/*
> +
> +*----------------------------------------------------------------------
> +------
> + * OvsUpdateUdpPorts --
> + *      Updates the UDP source or destination port in ovsFwdCtx.curNbl inline
> + *      based on the specified key.
> +
> +*----------------------------------------------------------------------
> +------
> + */
> +static __inline NDIS_STATUS
> +OvsUpdateUdpPorts(OvsForwardingContext *ovsFwdCtx,
> +                  const struct ovs_key_udp *udpAttr) {
> +    PUINT8 bufferStart;
> +    OVS_PACKET_HDR_INFO *layers = &ovsFwdCtx->layers;
> +    UDPHdr *udpHdr = NULL;
> +
> +    ASSERT(layers->value != 0);
> +
> +    if (!layers->isUdp) {
> +        ovsActionStats.noCopiedNbl++;
> +        return NDIS_STATUS_FAILURE;
> +    }
> +
> +    bufferStart = OvsGetHeaderBySize(ovsFwdCtx, layers->l7Offset);
> +    if (!bufferStart) {
> +        return NDIS_STATUS_RESOURCES;
> +    }
> +
> +    udpHdr = (UDPHdr *)(bufferStart + layers->l4Offset);
> +    if (udpHdr->check) {
> +        if (udpHdr->source != udpAttr->udp_src) {
> +            udpHdr->check = ChecksumUpdate16(udpHdr->check, udpHdr-
> >source,
> +                                             udpAttr->udp_src);
> +            udpHdr->source = udpAttr->udp_src;
> +        }
> +        if (udpHdr->dest != udpAttr->udp_dst) {
> +            udpHdr->check = ChecksumUpdate16(udpHdr->check, udpHdr-
> >dest,
> +                                             udpAttr->udp_dst);
> +            udpHdr->dest = udpAttr->udp_dst;
> +        }
> +    } else {
> +        udpHdr->source = udpAttr->udp_src;
> +        udpHdr->dest = udpAttr->udp_dst;
> +    }
> +
> +    return NDIS_STATUS_SUCCESS;
> +}
> 
>  /*
>   *----------------------------------------------------------------------------
> @@ -1525,6 +1570,11 @@ OvsExecuteSetAction(OvsForwardingContext
> *ovsFwdCtx,
>          break;
>      }
> 
> +    case OVS_KEY_ATTR_UDP:
> +        status = OvsUpdateUdpPorts(ovsFwdCtx,
> +            NlAttrGetUnspec(a, sizeof(struct ovs_key_udp)));
> +        break;
> +
>      default:
>          OVS_LOG_INFO("Unhandled attribute %#x", type);
>          break;
> --
> 2.10.2.windows.1


More information about the dev mailing list