[ovs-dev] [PATCH] Allow processing of RARP packets.

Mehak Mahajan mmahajan at nicira.com
Tue Oct 23 20:39:47 UTC 2012


With this commit, the datapath will process the ARP header for
RARP packets, both request and reply.

Signed-off-by: Mehak Mahajan <mmahajan at nicira.com>
---
 datapath/flow.c |   23 +++++++++++------------
 lib/flow.c      |   11 ++++-------
 2 files changed, 15 insertions(+), 19 deletions(-)

diff --git a/datapath/flow.c b/datapath/flow.c
index b6efd35..4142027 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -735,18 +735,17 @@ int ovs_flow_extract(struct sk_buff *skb, u16 in_port, struct sw_flow_key *key,
 				&& arp->ar_hln == ETH_ALEN
 				&& arp->ar_pln == 4) {
 
-			/* We only match on the lower 8 bits of the opcode. */
-			if (ntohs(arp->ar_op) <= 0xff)
-				key->ip.proto = ntohs(arp->ar_op);
-
-			if (key->ip.proto == ARPOP_REQUEST
-					|| key->ip.proto == ARPOP_REPLY) {
-				memcpy(&key->ipv4.addr.src, arp->ar_sip, sizeof(key->ipv4.addr.src));
-				memcpy(&key->ipv4.addr.dst, arp->ar_tip, sizeof(key->ipv4.addr.dst));
-				memcpy(key->ipv4.arp.sha, arp->ar_sha, ETH_ALEN);
-				memcpy(key->ipv4.arp.tha, arp->ar_tha, ETH_ALEN);
-				key_len = SW_FLOW_KEY_OFFSET(ipv4.arp);
-			}
+            /* We only match on the lower 8 bits of the opcode. */
+            if (ntohs(arp->ar_op) <= 0xff)
+                key->ip.proto = ntohs(arp->ar_op);
+
+            memcpy(&key->ipv4.addr.src, arp->ar_sip,
+                   sizeof(key->ipv4.addr.src));
+            memcpy(&key->ipv4.addr.dst, arp->ar_tip,
+                   sizeof(key->ipv4.addr.dst));
+            memcpy(key->ipv4.arp.sha, arp->ar_sha, ETH_ALEN);
+            memcpy(key->ipv4.arp.tha, arp->ar_tha, ETH_ALEN);
+            key_len = SW_FLOW_KEY_OFFSET(ipv4.arp);
 		}
 	} else if (key->eth.type == htons(ETH_P_IPV6)) {
 		int nh_len;             /* IPv6 Header + Extensions */
diff --git a/lib/flow.c b/lib/flow.c
index 0c9aa36..06478da 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -435,13 +435,10 @@ flow_extract(struct ofpbuf *packet, uint32_t skb_priority,
                 flow->nw_proto = ntohs(arp->ar_op);
             }
 
-            if ((flow->nw_proto == ARP_OP_REQUEST)
-                || (flow->nw_proto == ARP_OP_REPLY)) {
-                flow->nw_src = arp->ar_spa;
-                flow->nw_dst = arp->ar_tpa;
-                memcpy(flow->arp_sha, arp->ar_sha, ETH_ADDR_LEN);
-                memcpy(flow->arp_tha, arp->ar_tha, ETH_ADDR_LEN);
-            }
+            flow->nw_src = arp->ar_spa;
+            flow->nw_dst = arp->ar_tpa;
+            memcpy(flow->arp_sha, arp->ar_sha, ETH_ADDR_LEN);
+            memcpy(flow->arp_tha, arp->ar_tha, ETH_ADDR_LEN);
         }
     }
 }
-- 
1.7.2.5




More information about the dev mailing list