On 11/17/14 8:28 PM, Jesse Gross wrote:
On Mon, Nov 17, 2014 at 9:24 AM, Lorand Jakab <loja...@cisco.com> wrote:
diff --git a/datapath/flow.c b/datapath/flow.c
index 69b13b3..b01f7bd 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -459,28 +459,31 @@ static int key_extract(struct sk_buff *skb, struct 
sw_flow_key *key)

         skb_reset_mac_header(skb);

-       /* Link layer.  We are guaranteed to have at least the 14 byte Ethernet
-        * header in the linear data area.
-        */
-       eth = eth_hdr(skb);
-       ether_addr_copy(key->eth.src, eth->h_source);
-       ether_addr_copy(key->eth.dst, eth->h_dest);
+       /* Link layer. */
+       if (key->phy.is_layer3) {
+               key->eth.tci = 0;
+               key->eth.type = skb->protocol;
Were you going to drop setting the TCI here?

Yes, but then I figured it out why I needed to set it: validation code is relying on it in a few functions.


@@ -766,6 +790,18 @@ static int ovs_key_from_nlattrs(struct sw_flow_match 
*match, u64 attrs,
         if (attrs & (1ULL << OVS_KEY_ATTR_IPV6)) {
                 const struct ovs_key_ipv6 *ipv6_key;

+               /* Add eth.type value for layer 3 flows */
+               if (!(attrs & (1ULL << OVS_KEY_ATTR_ETHERTYPE))) {
+                       __be16 eth_type;
+
+                       if (is_mask) {
+                               eth_type = htons(0xffff);
+                       } else {
+                               eth_type = htons(ETH_P_IPV6);
+                       }
Can you make the same style change here (the curly braces) as you did with IPv4?

Oops, sorry about this.


diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c
index 41c025d..7732c47 100644
--- a/datapath/vport-gre.c
+++ b/datapath/vport-gre.c
@@ -289,6 +289,11 @@ static int gre_send(struct vport *vport, struct sk_buff 
*skb)
         if (unlikely(!OVS_CB(skb)->egress_tun_info))
                 return -EINVAL;

+       /* Reject layer 3 packets */
+       if (unlikely(skb->protocol == htons(ETH_P_IP) ||
+           skb->protocol == htons(ETH_P_IPV6)))
+               return -EINVAL;
Looking at this again, I think that this isn't sufficient by itself
(the same is true for other tunnel types and the converse for LISP as
well). skb->protocol always contains the L3 protocol so this won't
reject L3 only packets (and will reject non-IP over Ethernet packets).
A better way to do it might be to look at skb->mac_len.

Ok, I will update the patch to check for skb->mac_len.
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to