summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJinjun Gao <jinjung@vmware.com>2020-07-29 11:33:18 +0800
committerAlin Gabriel Serdean <aserdean@cloudbasesolutions.com>2020-07-31 23:27:53 +0300
commitbe66a50e35ea47eec0b92741e582733b81b1277a (patch)
treec9510c3bd1474f704289ecc4aef5063d4421e860
parent8bfe80df59d0aaf27a1b741702e1cf83f522a12c (diff)
downloadopenvswitch-be66a50e35ea47eec0b92741e582733b81b1277a.tar.gz
datapath-windows: Update flow key in SET action
The flow key is not updated when process OVS_ACTION_ATTR_SET action. It will impact follow-up actions, such as, conntrack module cannot find created conntrack entry if passing old flow key to it. Reported-by: Rui Cao <rcao@vmware.com> Signed-off-by: Jinjun Gao <jinjung@vmware.com> Signed-off-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
-rw-r--r--datapath-windows/ovsext/Actions.c31
-rw-r--r--datapath-windows/ovsext/Actions.h3
2 files changed, 27 insertions, 7 deletions
diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
index 0af4a660d..c982b4302 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -1258,6 +1258,7 @@ OvsActionMplsPush(OvsForwardingContext *ovsFwdCtx,
*/
static __inline NDIS_STATUS
OvsUpdateEthHeader(OvsForwardingContext *ovsFwdCtx,
+ OvsFlowKey *key,
const struct ovs_key_ethernet *ethAttr)
{
PNET_BUFFER curNb;
@@ -1284,9 +1285,11 @@ OvsUpdateEthHeader(OvsForwardingContext *ovsFwdCtx,
}
ethHdr = (EthHdr *)(bufferStart + NET_BUFFER_CURRENT_MDL_OFFSET(curNb));
- RtlCopyMemory(ethHdr->Destination, ethAttr->eth_dst,
- sizeof ethHdr->Destination);
- RtlCopyMemory(ethHdr->Source, ethAttr->eth_src, sizeof ethHdr->Source);
+ RtlCopyMemory(ethHdr->Destination, ethAttr->eth_dst, ETH_ADDR_LENGTH);
+ RtlCopyMemory(ethHdr->Source, ethAttr->eth_src, ETH_ADDR_LENGTH);
+ /* Update l2 flow key */
+ RtlCopyMemory(key->l2.dlDst, ethAttr->eth_dst, ETH_ADDR_LENGTH);
+ RtlCopyMemory(key->l2.dlSrc, ethAttr->eth_src, ETH_ADDR_LENGTH);
return NDIS_STATUS_SUCCESS;
}
@@ -1375,6 +1378,7 @@ PUINT8 OvsGetHeaderBySize(OvsForwardingContext *ovsFwdCtx,
*/
NDIS_STATUS
OvsUpdateUdpPorts(OvsForwardingContext *ovsFwdCtx,
+ OvsFlowKey *key,
const struct ovs_key_udp *udpAttr)
{
PUINT8 bufferStart;
@@ -1399,15 +1403,19 @@ OvsUpdateUdpPorts(OvsForwardingContext *ovsFwdCtx,
udpHdr->check = ChecksumUpdate16(udpHdr->check, udpHdr->source,
udpAttr->udp_src);
udpHdr->source = udpAttr->udp_src;
+ key->ipKey.l4.tpSrc = udpAttr->udp_src;
}
if (udpHdr->dest != udpAttr->udp_dst) {
udpHdr->check = ChecksumUpdate16(udpHdr->check, udpHdr->dest,
udpAttr->udp_dst);
udpHdr->dest = udpAttr->udp_dst;
+ key->ipKey.l4.tpDst = udpAttr->udp_dst;
}
} else {
udpHdr->source = udpAttr->udp_src;
+ key->ipKey.l4.tpSrc = udpAttr->udp_src;
udpHdr->dest = udpAttr->udp_dst;
+ key->ipKey.l4.tpDst = udpAttr->udp_dst;
}
return NDIS_STATUS_SUCCESS;
@@ -1422,6 +1430,7 @@ OvsUpdateUdpPorts(OvsForwardingContext *ovsFwdCtx,
*/
NDIS_STATUS
OvsUpdateTcpPorts(OvsForwardingContext *ovsFwdCtx,
+ OvsFlowKey *key,
const struct ovs_key_tcp *tcpAttr)
{
PUINT8 bufferStart;
@@ -1446,11 +1455,13 @@ OvsUpdateTcpPorts(OvsForwardingContext *ovsFwdCtx,
tcpHdr->check = ChecksumUpdate16(tcpHdr->check, tcpHdr->source,
tcpAttr->tcp_src);
tcpHdr->source = tcpAttr->tcp_src;
+ key->ipKey.l4.tpSrc = tcpAttr->tcp_src;
}
if (tcpHdr->dest != tcpAttr->tcp_dst) {
tcpHdr->check = ChecksumUpdate16(tcpHdr->check, tcpHdr->dest,
tcpAttr->tcp_dst);
tcpHdr->dest = tcpAttr->tcp_dst;
+ key->ipKey.l4.tpDst = tcpAttr->tcp_dst;
}
return NDIS_STATUS_SUCCESS;
@@ -1578,6 +1589,7 @@ OvsUpdateAddressAndPort(OvsForwardingContext *ovsFwdCtx,
*/
NDIS_STATUS
OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
+ OvsFlowKey *key,
const struct ovs_key_ipv4 *ipAttr)
{
PUINT8 bufferStart;
@@ -1631,6 +1643,7 @@ OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
ipAttr->ipv4_src);
}
ipHdr->saddr = ipAttr->ipv4_src;
+ key->ipKey.nwSrc = ipAttr->ipv4_src;
}
if (ipHdr->daddr != ipAttr->ipv4_dst) {
if (tcpHdr) {
@@ -1646,6 +1659,7 @@ OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
ipAttr->ipv4_dst);
}
ipHdr->daddr = ipAttr->ipv4_dst;
+ key->ipKey.nwDst = ipAttr->ipv4_dst;
}
if (ipHdr->protocol != ipAttr->ipv4_proto) {
UINT16 oldProto = (ipHdr->protocol << 16) & 0xff00;
@@ -1660,6 +1674,7 @@ OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
ipHdr->check = ChecksumUpdate16(ipHdr->check, oldProto, newProto);
}
ipHdr->protocol = ipAttr->ipv4_proto;
+ key->ipKey.nwProto = ipAttr->ipv4_proto;
}
if (ipHdr->ttl != ipAttr->ipv4_ttl) {
UINT16 oldTtl = (ipHdr->ttl) & 0xff;
@@ -1668,6 +1683,7 @@ OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
ipHdr->check = ChecksumUpdate16(ipHdr->check, oldTtl, newTtl);
}
ipHdr->ttl = ipAttr->ipv4_ttl;
+ key->ipKey.nwTtl = ipAttr->ipv4_ttl;
}
return NDIS_STATUS_SUCCESS;
@@ -1690,12 +1706,12 @@ OvsExecuteSetAction(OvsForwardingContext *ovsFwdCtx,
switch (type) {
case OVS_KEY_ATTR_ETHERNET:
- status = OvsUpdateEthHeader(ovsFwdCtx,
+ status = OvsUpdateEthHeader(ovsFwdCtx, key,
NlAttrGetUnspec(a, sizeof(struct ovs_key_ethernet)));
break;
case OVS_KEY_ATTR_IPV4:
- status = OvsUpdateIPv4Header(ovsFwdCtx,
+ status = OvsUpdateIPv4Header(ovsFwdCtx, key,
NlAttrGetUnspec(a, sizeof(struct ovs_key_ipv4)));
break;
@@ -1708,16 +1724,17 @@ OvsExecuteSetAction(OvsForwardingContext *ovsFwdCtx,
status = SUCCEEDED(convertStatus) ? NDIS_STATUS_SUCCESS : NDIS_STATUS_FAILURE;
ASSERT(status == NDIS_STATUS_SUCCESS);
RtlCopyMemory(&ovsFwdCtx->tunKey, &tunKey, sizeof ovsFwdCtx->tunKey);
+ RtlCopyMemory(&key->tunKey, &tunKey, sizeof key->tunKey);
break;
}
case OVS_KEY_ATTR_UDP:
- status = OvsUpdateUdpPorts(ovsFwdCtx,
+ status = OvsUpdateUdpPorts(ovsFwdCtx, key,
NlAttrGetUnspec(a, sizeof(struct ovs_key_udp)));
break;
case OVS_KEY_ATTR_TCP:
- status = OvsUpdateTcpPorts(ovsFwdCtx,
+ status = OvsUpdateTcpPorts(ovsFwdCtx, key,
NlAttrGetUnspec(a, sizeof(struct ovs_key_tcp)));
break;
diff --git a/datapath-windows/ovsext/Actions.h b/datapath-windows/ovsext/Actions.h
index fd050d5dd..bc12e1166 100644
--- a/datapath-windows/ovsext/Actions.h
+++ b/datapath-windows/ovsext/Actions.h
@@ -115,14 +115,17 @@ PUINT8 OvsGetHeaderBySize(OvsForwardingContext *ovsFwdCtx,
NDIS_STATUS
OvsUpdateUdpPorts(OvsForwardingContext *ovsFwdCtx,
+ OvsFlowKey *key,
const struct ovs_key_udp *udpAttr);
NDIS_STATUS
OvsUpdateTcpPorts(OvsForwardingContext *ovsFwdCtx,
+ OvsFlowKey *key,
const struct ovs_key_tcp *tcpAttr);
NDIS_STATUS
OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
+ OvsFlowKey *key,
const struct ovs_key_ipv4 *ipAttr);
NDIS_STATUS