diff options
Diffstat (limited to 'net/ethernet/eth.c')
| -rw-r--r-- | net/ethernet/eth.c | 35 | 
1 files changed, 14 insertions, 21 deletions
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index be1f64d3535..5dc638cad2e 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c @@ -58,7 +58,7 @@  #include <net/ipv6.h>  #include <net/ip.h>  #include <net/dsa.h> -#include <asm/uaccess.h> +#include <linux/uaccess.h>  __setup("ether=", netdev_boot_setup); @@ -133,7 +133,7 @@ int eth_rebuild_header(struct sk_buff *skb)  		return arp_find(eth->h_dest, skb);  #endif  	default: -		printk(KERN_DEBUG +		netdev_dbg(dev,  		       "%s: unable to resolve type %X addresses.\n",  		       dev->name, ntohs(eth->h_proto)); @@ -156,7 +156,9 @@ EXPORT_SYMBOL(eth_rebuild_header);   */  __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)  { -	struct ethhdr *eth; +	unsigned short _service_access_point; +	const unsigned short *sap; +	const struct ethhdr *eth;  	skb->dev = dev;  	skb_reset_mac_header(skb); @@ -169,20 +171,9 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)  		else  			skb->pkt_type = PACKET_MULTICAST;  	} - -	/* -	 *      This ALLMULTI check should be redundant by 1.4 -	 *      so don't forget to remove it. -	 * -	 *      Seems, you forgot to remove it. All silly devices -	 *      seems to set IFF_PROMISC. -	 */ - -	else if (1 /*dev->flags&IFF_PROMISC */ ) { -		if (unlikely(!ether_addr_equal_64bits(eth->h_dest, -						      dev->dev_addr))) -			skb->pkt_type = PACKET_OTHERHOST; -	} +	else if (unlikely(!ether_addr_equal_64bits(eth->h_dest, +						   dev->dev_addr))) +		skb->pkt_type = PACKET_OTHERHOST;  	/*  	 * Some variants of DSA tagging don't have an ethertype field @@ -190,12 +181,13 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)  	 * variants has been configured on the receiving interface,  	 * and if so, set skb->protocol without looking at the packet.  	 */ -	if (netdev_uses_dsa_tags(dev)) +	if (unlikely(netdev_uses_dsa_tags(dev)))  		return htons(ETH_P_DSA); -	if (netdev_uses_trailer_tags(dev)) + +	if (unlikely(netdev_uses_trailer_tags(dev)))  		return htons(ETH_P_TRAILER); -	if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN) +	if (likely(ntohs(eth->h_proto) >= ETH_P_802_3_MIN))  		return eth->h_proto;  	/* @@ -204,7 +196,8 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)  	 *      layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This  	 *      won't work for fault tolerant netware but does for the rest.  	 */ -	if (skb->len >= 2 && *(unsigned short *)(skb->data) == 0xFFFF) +	sap = skb_header_pointer(skb, 0, sizeof(*sap), &_service_access_point); +	if (sap && *sap == 0xFFFF)  		return htons(ETH_P_802_3);  	/*  | 
