Acked-by: Sairam Venugopal <vsai...@vmware.com>






On 1/26/17, 3:43 PM, "ovs-dev-boun...@openvswitch.org on behalf of Alin 
Serdean" <ovs-dev-boun...@openvswitch.org on behalf of 
aserd...@cloudbasesolutions.com> wrote:

>From: Alin Serdean <aserd...@cloudbasesolutions.com>
>
>This patch adds support for set action with OVS_KEY_ATTR_TCP attribute
>(change TCP source or destination port).
>
>If the source or destination TCP port was changed, update the TCP checksum.
>
>A sample flow can look like the following:
>set(tcp(src=80,dst=443))
>
>Signed-off-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com>
>---
>v3: check for layers->isTcp as suggested by Sairam Venugopal 
><vsai...@vmware.com>
>v2: set action for tcp attribute changed to function: OvsUpdateTcpPorts
>---
> datapath-windows/ovsext/Actions.c | 48 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 48 insertions(+)
>
>diff --git a/datapath-windows/ovsext/Actions.c 
>b/datapath-windows/ovsext/Actions.c
>index 3dfcc68..bce37f8 100644
>--- a/datapath-windows/ovsext/Actions.c
>+++ b/datapath-windows/ovsext/Actions.c
>@@ -1430,6 +1430,49 @@ OvsUpdateUdpPorts(OvsForwardingContext *ovsFwdCtx,
> 
> /*
>  *----------------------------------------------------------------------------
>+ * OvsUpdateTcpPorts --
>+ *      Updates the TCP source or destination port in ovsFwdCtx.curNbl inline
>+ *      based on the specified key.
>+ *----------------------------------------------------------------------------
>+ */
>+static __inline NDIS_STATUS
>+OvsUpdateTcpPorts(OvsForwardingContext *ovsFwdCtx,
>+                  const struct ovs_key_tcp *tcpAttr)
>+{
>+    PUINT8 bufferStart;
>+    OVS_PACKET_HDR_INFO *layers = &ovsFwdCtx->layers;
>+    TCPHdr *tcpHdr = NULL;
>+
>+    ASSERT(layers->value != 0);
>+
>+    if (!layers->isTcp) {
>+        ovsActionStats.noCopiedNbl++;
>+        return NDIS_STATUS_FAILURE;
>+    }
>+
>+    bufferStart = OvsGetHeaderBySize(ovsFwdCtx, layers->l7Offset);
>+    if (!bufferStart) {
>+        return NDIS_STATUS_RESOURCES;
>+    }
>+
>+    tcpHdr = (TCPHdr *)(bufferStart + layers->l4Offset);
>+
>+    if (tcpHdr->source != tcpAttr->tcp_src) {
>+        tcpHdr->check = ChecksumUpdate16(tcpHdr->check, tcpHdr->source,
>+                                         tcpAttr->tcp_src);
>+        tcpHdr->source = tcpAttr->tcp_src;
>+    }
>+    if (tcpHdr->dest != tcpAttr->tcp_dst) {
>+        tcpHdr->check = ChecksumUpdate16(tcpHdr->check, tcpHdr->dest,
>+                                         tcpAttr->tcp_dst);
>+        tcpHdr->dest = tcpAttr->tcp_dst;
>+    }
>+
>+    return NDIS_STATUS_SUCCESS;
>+}
>+
>+/*
>+ *----------------------------------------------------------------------------
>  * OvsUpdateIPv4Header --
>  *      Updates the IPv4 header in ovsFwdCtx.curNbl inline based on the
>  *      specified key.
>@@ -1575,6 +1618,11 @@ OvsExecuteSetAction(OvsForwardingContext *ovsFwdCtx,
>             NlAttrGetUnspec(a, sizeof(struct ovs_key_udp)));
>         break;
> 
>+    case OVS_KEY_ATTR_TCP:
>+        status = OvsUpdateTcpPorts(ovsFwdCtx,
>+            NlAttrGetUnspec(a, sizeof(struct ovs_key_tcp)));
>+        break;
>+
>     default:
>         OVS_LOG_INFO("Unhandled attribute %#x", type);
>         break;
>-- 
>2.10.2.windows.1
>_______________________________________________
>dev mailing list
>d...@openvswitch.org
>https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to