Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / drivers / net / bareudp.c
index 44eb2b1..3b6664c 100644 (file)
@@ -406,19 +406,34 @@ free_dst:
        return err;
 }
 
+static bool bareudp_proto_valid(struct bareudp_dev *bareudp, __be16 proto)
+{
+       if (bareudp->ethertype == proto)
+               return true;
+
+       if (!bareudp->multi_proto_mode)
+               return false;
+
+       if (bareudp->ethertype == htons(ETH_P_MPLS_UC) &&
+           proto == htons(ETH_P_MPLS_MC))
+               return true;
+
+       if (bareudp->ethertype == htons(ETH_P_IP) &&
+           proto == htons(ETH_P_IPV6))
+               return true;
+
+       return false;
+}
+
 static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct bareudp_dev *bareudp = netdev_priv(dev);
        struct ip_tunnel_info *info = NULL;
        int err;
 
-       if (skb->protocol != bareudp->ethertype) {
-               if (!bareudp->multi_proto_mode ||
-                   (skb->protocol !=  htons(ETH_P_MPLS_MC) &&
-                    skb->protocol !=  htons(ETH_P_IPV6))) {
-                       err = -EINVAL;
-                       goto tx_error;
-               }
+       if (!bareudp_proto_valid(bareudp, skb->protocol)) {
+               err = -EINVAL;
+               goto tx_error;
        }
 
        info = skb_tunnel_info(skb);