summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Flow.c
diff options
context:
space:
mode:
authorNithin Raju <nithin@vmware.com>2014-10-18 11:39:36 -0700
committerBen Pfaff <blp@nicira.com>2014-10-21 11:44:00 -0700
commit59e37200fbc8a271ac734e17584b9c0bc9863efe (patch)
treeb3a0d50a4c16aea033b1eb379696f09f29fe80f7 /datapath-windows/ovsext/Flow.c
parentdeda30a9995fc4adef87ef07f7e77b86b04fbfca (diff)
downloadopenvswitch-59e37200fbc8a271ac734e17584b9c0bc9863efe.tar.gz
datapath-windows: Fix key parsing in Flow.c.
Signed-off-by: Nithin Raju <nithin@vmware.com> Acked-by: Ankur Sharma <ankursharma@vmware.com> Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath-windows/ovsext/Flow.c')
-rw-r--r--datapath-windows/ovsext/Flow.c57
1 files changed, 36 insertions, 21 deletions
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index f3ee72638..bc9ef874c 100644
--- a/datapath-windows/ovsext/Flow.c
+++ b/datapath-windows/ovsext/Flow.c
@@ -791,7 +791,7 @@ MapFlowKeyToNlKey(PNL_BUFFER nlBuf,
}
if (!NlMsgPutTailU16(nlBuf, OVS_KEY_ATTR_ETHERTYPE,
- htons(flowKey->l2.dlType))) {
+ flowKey->l2.dlType)) {
rc = STATUS_UNSUCCESSFUL;
goto done;
}
@@ -805,7 +805,7 @@ MapFlowKeyToNlKey(PNL_BUFFER nlBuf,
}
/* ==== L3 + L4 ==== */
- switch (flowKey->l2.dlType) {
+ switch (ntohs(flowKey->l2.dlType)) {
case ETH_TYPE_IPV4: {
IpKey *ipv4FlowPutKey = &(flowKey->ipKey);
rc = _MapFlowIpv4KeyToNlKey(nlBuf, ipv4FlowPutKey);
@@ -1123,7 +1123,18 @@ _MapFlowArpKeyToNlKey(PNL_BUFFER nlBuf, ArpKey *arpFlowPutKey)
RtlCopyMemory(&(arpKey.arp_sha), arpFlowPutKey->arpSha, ETH_ADDR_LEN);
RtlCopyMemory(&(arpKey.arp_tha), arpFlowPutKey->arpTha, ETH_ADDR_LEN);
- arpKey.arp_op = arpFlowPutKey->nwProto;
+ /*
+ * Flow_Extract() stores 'nwProto' in host order for ARP since 'nwProto' is
+ * 1 byte field and the ARP opcode is 2 bytes, and all of the kernel code
+ * understand this while looking at an ARP key.
+ * While we pass up the ARP key to userspace, convert from host order to
+ * network order. Likewise, when processing an ARP key from userspace,
+ * convert from network order to host order.
+ *
+ * It is important to note that the flow table stores the ARP opcode field
+ * in host order.
+ */
+ arpKey.arp_op = htons(arpFlowPutKey->nwProto);
if (!NlMsgPutTailUnspec(nlBuf, OVS_KEY_ATTR_ARP,
(PCHAR)(&arpKey),
@@ -1267,20 +1278,19 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
* requests with no ETHERTYPE attributes.
* Need to verify this. */
if (keyAttrs[OVS_KEY_ATTR_ETHERTYPE]) {
- destKey->l2.dlType = ntohs((NlAttrGetU16(keyAttrs
- [OVS_KEY_ATTR_ETHERTYPE])));
+ destKey->l2.dlType = (NlAttrGetU16(keyAttrs
+ [OVS_KEY_ATTR_ETHERTYPE]));
}
if (keyAttrs[OVS_KEY_ATTR_VLAN]) {
- destKey->l2.vlanTci = NlAttrGetU16(keyAttrs
- [OVS_KEY_ATTR_VLAN]);
+ destKey->l2.vlanTci = NlAttrGetU16(keyAttrs[OVS_KEY_ATTR_VLAN]);
}
/* ==== L3 + L4. ==== */
destKey->l2.keyLen = OVS_WIN_TUNNEL_KEY_SIZE + OVS_L2_KEY_SIZE
- destKey->l2.offset;
- switch (destKey->l2.dlType) {
+ switch (ntohs(destKey->l2.dlType)) {
case ETH_TYPE_IPV4: {
if (keyAttrs[OVS_KEY_ATTR_IPV4]) {
@@ -1395,22 +1405,27 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
}
case ETH_TYPE_ARP:
case ETH_TYPE_RARP: {
- ArpKey *arpFlowPutKey = &destKey->arpKey;
- const struct ovs_key_arp *arpKey;
- arpKey = NlAttrGet(keyAttrs[OVS_KEY_ATTR_ARP]);
+ if (keyAttrs[OVS_KEY_ATTR_ARP]) {
+ ArpKey *arpFlowPutKey = &destKey->arpKey;
+ const struct ovs_key_arp *arpKey;
- arpFlowPutKey->nwSrc = arpKey->arp_sip;
- arpFlowPutKey->nwDst = arpKey->arp_tip;
+ arpKey = NlAttrGet(keyAttrs[OVS_KEY_ATTR_ARP]);
- RtlCopyMemory(arpFlowPutKey->arpSha, arpKey->arp_sha, ETH_ADDR_LEN);
- RtlCopyMemory(arpFlowPutKey->arpTha, arpKey->arp_tha, ETH_ADDR_LEN);
- arpFlowPutKey->nwProto = (UINT8)(arpKey->arp_op);
- arpFlowPutKey->pad[0] = 0;
- arpFlowPutKey->pad[1] = 0;
- arpFlowPutKey->pad[2] = 0;
- destKey->l2.keyLen += OVS_ARP_KEY_SIZE;
- break;
+ arpFlowPutKey->nwSrc = arpKey->arp_sip;
+ arpFlowPutKey->nwDst = arpKey->arp_tip;
+
+ RtlCopyMemory(arpFlowPutKey->arpSha, arpKey->arp_sha, ETH_ADDR_LEN);
+ RtlCopyMemory(arpFlowPutKey->arpTha, arpKey->arp_tha, ETH_ADDR_LEN);
+ /* Kernel datapath assumes 'arpFlowPutKey->nwProto' to be in host
+ * order. */
+ arpFlowPutKey->nwProto = (UINT8)ntohs((arpKey->arp_op));
+ arpFlowPutKey->pad[0] = 0;
+ arpFlowPutKey->pad[1] = 0;
+ arpFlowPutKey->pad[2] = 0;
+ destKey->l2.keyLen += OVS_ARP_KEY_SIZE;
+ break;
+ }
}
}
}