Skip to content

Commit

Permalink
datapath-windows: Append tunnel info to upcall for correct template
Browse files Browse the repository at this point in the history
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.

>From d727d051c9a44a4a93e5ee5f3da3ca9b125aad29 Mon Sep 17 00:00:00 2001
From: Amber Hu <qhu@vmware.com>
Date: Thu, 30 Jan 2020 18:01:32 -0800
Subject: [PATCH v3] datapath-windows: Append tunnel info to upcall for correct
 template

Signed-off-by: Amber Hu <qhu@vmware.com>
Acked-by: Alin Gabriel Serdean <aserdean@ovn.org>
Signed-off-by: Alin Gabriel Serdean <aserdean@ovn.org>
  • Loading branch information
Amber Hu via dev authored and aserdean committed Feb 10, 2020
1 parent cb943a7 commit e14fbdb
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 7 deletions.
24 changes: 21 additions & 3 deletions datapath-windows/ovsext/Actions.c
Expand Up @@ -1815,10 +1815,12 @@ OvsOutputUserspaceAction(OvsForwardingContext *ovsFwdCtx,
{
NTSTATUS status = NDIS_STATUS_SUCCESS;
PNL_ATTR userdataAttr;
PNL_ATTR queueAttr;
PNL_ATTR egrTunAttr = NULL;
POVS_PACKET_QUEUE_ELEM elem;
POVS_PACKET_HDR_INFO layers = &ovsFwdCtx->layers;
BOOLEAN isRecv = FALSE;
OVS_FWD_INFO fwdInfo;
OvsIPv4TunnelKey tunKey;

POVS_VPORT_ENTRY vport = OvsFindVportByPortNo(ovsFwdCtx->switchContext,
ovsFwdCtx->srcVportNo);
Expand All @@ -1830,13 +1832,29 @@ OvsOutputUserspaceAction(OvsForwardingContext *ovsFwdCtx,
}
}

queueAttr = NlAttrFindNested(attr, OVS_USERSPACE_ATTR_PID);
userdataAttr = NlAttrFindNested(attr, OVS_USERSPACE_ATTR_USERDATA);
/* Indicate the packet is from egress-tunnel direction */
egrTunAttr = NlAttrFindNested(attr, OVS_USERSPACE_ATTR_EGRESS_TUN_PORT);

/* Fill tunnel key to export to usersspace to calculate the template id */
if (egrTunAttr) {
RtlZeroMemory(&tunKey, sizeof tunKey);
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);
Expand Down
12 changes: 12 additions & 0 deletions datapath-windows/ovsext/Flow.c
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion datapath-windows/ovsext/Tunnel.c
Expand Up @@ -308,7 +308,7 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl,

datapath->misses++;
elem = OvsCreateQueueNlPacket(NULL, 0, OVS_PACKET_CMD_MISS,
vport, &key, pNbl, curNb,
vport, &key, NULL, pNbl, curNb,
TRUE, &layers);
if (elem) {
/* Complete the packet since it was copied to user buffer. */
Expand Down
12 changes: 9 additions & 3 deletions datapath-windows/ovsext/User.c
Expand Up @@ -830,7 +830,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);
Expand Down Expand Up @@ -1013,6 +1013,7 @@ OvsCreateQueueNlPacket(PVOID userData,
UINT32 cmd,
POVS_VPORT_ENTRY vport,
OvsFlowKey *key,
OvsIPv4TunnelKey *tunnelKey,
PNET_BUFFER_LIST nbl,
PNET_BUFFER nb,
BOOLEAN isRecv,
Expand All @@ -1025,7 +1026,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;
Expand Down Expand Up @@ -1127,7 +1127,13 @@ OvsCreateQueueNlPacket(PVOID userData,
}
}

/* XXX must send OVS_PACKET_ATTR_EGRESS_TUN_KEY if set by vswtchd */
/* Set OVS_PACKET_ATTR_EGRESS_TUN_KEY attribute */
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)) {
Expand Down
1 change: 1 addition & 0 deletions datapath-windows/ovsext/User.h
Expand Up @@ -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,
Expand Down

0 comments on commit e14fbdb

Please sign in to comment.