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