[ovs-dev] [patch] datapath-windows: Append tunnel info to upcall for correct template
Ben Pfaff
blp at ovn.org
Tue Jan 21 17:59:05 UTC 2020
I expect that, of the OVS maintainers, Alin is most qualified to
review it. Alin, are you planning to take a look at it?
On Tue, Jan 21, 2020 at 02:52:54AM +0000, Amber Hu via dev wrote:
> Hi,
>
> May I ask the process of reviewing for the below patch https://patchwork.ozlabs.org/patch/1222463/
> Thanks for your time.
>
> BR/Amber
>
> From: Amber Hu <qhu at vmware.com>
> Date: Tuesday, January 14, 2020 at 13:49
> To: "dev at openvswitch.org" <dev at openvswitch.org>, Alin Serdean <aserdean at cloudbasesolutions.com>
> Cc: Qiong Wang <wqiong at vmware.com>, Wenyu Zhang <wenyuz at vmware.com>, Jinjun Gao <jinjung at vmware.com>
> Subject: [patch] datapath-windows: Append tunnel info to upcall for correct template
>
> Formerly, there is no tunnel information appended in the upcall’s
> packet data, which is expected by IPFIX in userspace to calculate
> the template for exporting the sampled flow record of on egress
> tunnel port.
> To fix this, during performing OvsOutputUserspaceAction(), we
> would check whether it is initiated by the sampling on egress
> tunnel which would be indicated by the attribute as
> OVS_USERSPACE_ATTR_EGRESS_TUN_PORT in the nested attribute
> list. If so, we would append the tunKey in OvsForwardingContext
> indexed by OVS_PACKET_ATTR_EGRESS_TUN_KEY to the upcall.
> Besides, at this point, the source transport port and source ip
> address are not available in the structure, so we have to fill it in the
> way how the packet would be capsulated during performing
> OvsEncapGeneve(), which is following the
> OvsOutputUserspaceAction() unfortunately.
> I have tested the IPFIX functionality with the change, we could see the
> template is correct and the expected tunnel information could be
> packed in the IPFIX packet finally. The traffic for test is generated by
> PING utility.
>
> Issue: 2449045
> Reported-by: Meng Yang <ymeng at vmware.com<mailto:ymeng at vmware.com>>
> Reported-at: https://bugzilla.eng.vmware.com/show_bug.cgi?id=2449045
> Signed-off-by: Amber Hu <qhu at vmware.com>
>
> From 8262494fb9a353c3adbe02cfc4c932231c34b3ed Mon Sep 17 00:00:00 2001
> From: Amber Hu <qhu at vmware.com>
> Date: Sun, 12 Jan 2020 22:40:05 -0800
> Subject: [PATCH] datapath-windows: Append tunnel info to upcall for correct
> template
>
> Issue: #2449045
> Signed-off-by: Amber Hu <qhu at vmware.com>
> ---
> datapath-windows/ovsext/Actions.c | 43 ++++++++++++++++++++++++++++++++++-----
> datapath-windows/ovsext/Flow.c | 12 +++++++++++
> datapath-windows/ovsext/User.c | 10 +++++++--
> datapath-windows/ovsext/User.h | 1 +
> 4 files changed, 59 insertions(+), 7 deletions(-)
>
> diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
> index 0c4d64b..936e68b 100644
> --- a/datapath-windows/ovsext/Actions.c
> +++ b/datapath-windows/ovsext/Actions.c
> @@ -1839,11 +1839,16 @@ OvsOutputUserspaceAction(OvsForwardingContext *ovsFwdCtx,
> const PNL_ATTR attr)
> {
> NTSTATUS status = NDIS_STATUS_SUCCESS;
> - PNL_ATTR userdataAttr;
> - PNL_ATTR queueAttr;
> + PNL_ATTR userdataAttr = NULL;
> + PNL_ATTR queueAttr = NULL;
> + PNL_ATTR egrTunAttr = NULL;
> + PNL_ATTR a = NULL;
> POVS_PACKET_QUEUE_ELEM elem;
> POVS_PACKET_HDR_INFO layers = &ovsFwdCtx->layers;
> BOOLEAN isRecv = FALSE;
> + INT rem = 0;
> + OVS_FWD_INFO fwdInfo;
> + OvsIPv4TunnelKey tunKey;
> POVS_VPORT_ENTRY vport = OvsFindVportByPortNo(ovsFwdCtx->switchContext,
> ovsFwdCtx->srcVportNo);
> @@ -1855,13 +1860,41 @@ OvsOutputUserspaceAction(OvsForwardingContext *ovsFwdCtx,
> }
> }
> - queueAttr = NlAttrFindNested(attr, OVS_USERSPACE_ATTR_PID);
> - userdataAttr = NlAttrFindNested(attr, OVS_USERSPACE_ATTR_USERDATA);
> + NL_ATTR_FOR_EACH_UNSAFE(a, rem, NlAttrData(attr), NlAttrGetSize(attr)) {
> + switch (NlAttrType(a)) {
> + case OVS_USERSPACE_ATTR_PID:
> + queueAttr = a;
> + break;
> + case OVS_USERSPACE_ATTR_USERDATA:
> + userdataAttr = a;
> + break;
> + case OVS_USERSPACE_ATTR_EGRESS_TUN_PORT:
> + /* Indicate the packet is from egress tunnel port */
> + egrTunAttr = a;
> + break;
> + default:
> + break;
> + }
> + }
> +
> + /* Fill tunnel key to export to usersspace to calculate the template id */
> + if (egrTunAttr) {
> + RtlCopyMemory(&tunKey, &ovsFwdCtx->tunKey, sizeof tunKey);
> + if (!tunKey.src) {
> + status = OvsLookupIPFwdInfo(tunKey.src, tunKey.dst, &fwdInfo);
> + if (status == NDIS_STATUS_SUCCESS && tunKey.dst == fwdInfo.dstIpAddr) {
> + tunKey.src = fwdInfo.srcIpAddr;
> + }
> + }
> + tunKey.flow_hash = tunKey.flow_hash?tunKey.flow_hash:MAXINT16;
> + }
> elem = OvsCreateQueueNlPacket(NlAttrData(userdataAttr),
> NlAttrGetSize(userdataAttr),
> OVS_PACKET_CMD_ACTION,
> - vport, key, ovsFwdCtx->curNbl,
> + vport, key,
> + egrTunAttr?&(tunKey):NULL,
> + ovsFwdCtx->curNbl,
> NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl),
> isRecv,
> layers);
> diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
> index fdb1010..ac0582c 100644
> --- a/datapath-windows/ovsext/Flow.c
> +++ b/datapath-windows/ovsext/Flow.c
> @@ -1094,6 +1094,18 @@ MapFlowTunKeyToNlKey(PNL_BUFFER nlBuf,
> goto done;
> }
> + if (!NlMsgPutTailU16(nlBuf, OVS_TUNNEL_KEY_ATTR_TP_SRC,
> + tunKey->flow_hash)) {
> + rc = STATUS_UNSUCCESSFUL;
> + goto done;
> + }
> +
> + if (!NlMsgPutTailU16(nlBuf, OVS_TUNNEL_KEY_ATTR_TP_DST,
> + tunKey->dst_port)) {
> + rc = STATUS_UNSUCCESSFUL;
> + goto done;
> + }
> +
> done:
> NlMsgEndNested(nlBuf, offset);
> error_nested_start:
> diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
> index 16d6fd2..a1d05e1 100644
> --- a/datapath-windows/ovsext/User.c
> +++ b/datapath-windows/ovsext/User.c
> @@ -833,7 +833,7 @@ OvsCreateAndAddPackets(PVOID userData,
> nb = NET_BUFFER_LIST_FIRST_NB(nbl);
> while (nb) {
> elem = OvsCreateQueueNlPacket(userData, userDataLen,
> - cmd, vport, key, nbl, nb,
> + cmd, vport, key, NULL, nbl, nb,
> isRecv, hdrInfo);
> if (elem) {
> InsertTailList(list, &elem->link);
> @@ -1016,6 +1016,7 @@ OvsCreateQueueNlPacket(PVOID userData,
> UINT32 cmd,
> POVS_VPORT_ENTRY vport,
> OvsFlowKey *key,
> + OvsIPv4TunnelKey *tunnelKey,
> PNET_BUFFER_LIST nbl,
> PNET_BUFFER nb,
> BOOLEAN isRecv,
> @@ -1028,7 +1029,6 @@ OvsCreateQueueNlPacket(PVOID userData,
> NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
> PNDIS_NET_BUFFER_LIST_8021Q_INFO vlanInfo = NULL;
> PVOID vlanTag;
> - OvsIPv4TunnelKey *tunnelKey = (OvsIPv4TunnelKey *)&key->tunKey;
> UINT32 pid;
> UINT32 nlMsgSize;
> NL_BUFFER nlBuf;
> @@ -1131,6 +1131,12 @@ OvsCreateQueueNlPacket(PVOID userData,
> }
> /* XXX must send OVS_PACKET_ATTR_EGRESS_TUN_KEY if set by vswtchd */
> + if (tunnelKey) {
> + if (MapFlowTunKeyToNlKey(&nlBuf, tunnelKey,
> + OVS_PACKET_ATTR_EGRESS_TUN_KEY) != STATUS_SUCCESS) {
> + goto fail;
> + }
> + }
> if (userData){
> if (!NlMsgPutTailUnspec(&nlBuf, OVS_PACKET_ATTR_USERDATA,
> userData, (UINT16)userDataLen)) {
> diff --git a/datapath-windows/ovsext/User.h b/datapath-windows/ovsext/User.h
> index 3a42888..ccca0ba 100644
> --- a/datapath-windows/ovsext/User.h
> +++ b/datapath-windows/ovsext/User.h
> @@ -75,6 +75,7 @@ POVS_PACKET_QUEUE_ELEM OvsCreateQueueNlPacket(PVOID userData,
> UINT32 cmd,
> POVS_VPORT_ENTRY vport,
> OvsFlowKey *key,
> + OvsIPv4TunnelKey *tunnelKey,
> PNET_BUFFER_LIST nbl,
> PNET_BUFFER nb,
> BOOLEAN isRecv,
> --
> 2.6.2
>
> BR/Amber
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
More information about the dev
mailing list