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 <aserd...@cloudbasesolutions.com> --- datapath-windows/ovsext/Actions.c | 48 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c index 467bfbc..a09afdd 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,48 @@ 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->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; + } + + return NDIS_STATUS_SUCCESS; +} /* *---------------------------------------------------------------------------- @@ -1525,6 +1566,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 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev