etherdev: Process is_multicast_ether_addr at same size as other operations
This change makes it so that we process the address in is_multicast_ether_addr at the same size as the other calls. This allows us to avoid duplicate reads when used with other calls such as is_zero_ether_addr or eth_addr_copy. In addition I have added a 64 bit version of the function so in eth_type_trans we can process the destination address as a 64 bit value throughout. Signed-off-by: Alexander Duyck <alexander.h.duyck@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
849b920e17
commit
d54385ce68
@@ -110,7 +110,29 @@ static inline bool is_zero_ether_addr(const u8 *addr)
|
|||||||
*/
|
*/
|
||||||
static inline bool is_multicast_ether_addr(const u8 *addr)
|
static inline bool is_multicast_ether_addr(const u8 *addr)
|
||||||
{
|
{
|
||||||
return 0x01 & addr[0];
|
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||||
|
u32 a = *(const u32 *)addr;
|
||||||
|
#else
|
||||||
|
u16 a = *(const u16 *)addr;
|
||||||
|
#endif
|
||||||
|
#ifdef __BIG_ENDIAN
|
||||||
|
return 0x01 & (a >> ((sizeof(a) * 8) - 8));
|
||||||
|
#else
|
||||||
|
return 0x01 & a;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool is_multicast_ether_addr_64bits(const u8 addr[6+2])
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
|
||||||
|
#ifdef __BIG_ENDIAN
|
||||||
|
return 0x01 & ((*(const u64 *)addr) >> 56);
|
||||||
|
#else
|
||||||
|
return 0x01 & (*(const u64 *)addr);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
return is_multicast_ether_addr(addr);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -159,7 +159,7 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
|
|||||||
skb_pull_inline(skb, ETH_HLEN);
|
skb_pull_inline(skb, ETH_HLEN);
|
||||||
eth = eth_hdr(skb);
|
eth = eth_hdr(skb);
|
||||||
|
|
||||||
if (unlikely(is_multicast_ether_addr(eth->h_dest))) {
|
if (unlikely(is_multicast_ether_addr_64bits(eth->h_dest))) {
|
||||||
if (ether_addr_equal_64bits(eth->h_dest, dev->broadcast))
|
if (ether_addr_equal_64bits(eth->h_dest, dev->broadcast))
|
||||||
skb->pkt_type = PACKET_BROADCAST;
|
skb->pkt_type = PACKET_BROADCAST;
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user