diff options
author | Alin Serdean <aserdean@cloudbasesolutions.com> | 2017-01-26 23:43:39 +0000 |
---|---|---|
committer | Gurucharan Shetty <guru@ovn.org> | 2017-01-27 13:53:11 -0800 |
commit | a9fee2f826b79507b60a9cf2c8eced6095a22e58 (patch) | |
tree | f8c476604c42a6d3f3a838db350368e6e0a820f9 /datapath-windows/ovsext/Actions.c | |
parent | dd71a1dd979fd68ea53adfd92f367d88894c6311 (diff) | |
download | openvswitch-a9fee2f826b79507b60a9cf2c8eced6095a22e58.tar.gz |
datapath-windows: Add support for OVS_KEY_ATTR_TCP set action
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 <aserdean@cloudbasesolutions.com>
Acked-by: Sairam Venugopal <vsairam@vmware.com>
Signed-off-by: Gurucharan Shetty <guru@ovn.org>
Diffstat (limited to 'datapath-windows/ovsext/Actions.c')
-rw-r--r-- | datapath-windows/ovsext/Actions.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c index 3dfcc6827..bce37f8dc 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; |