[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