提交 ba645c16 编写于 作者: D David S. Miller

[NET]: Slightly optimize ethernet address comparison.

We know the thing is at least 2-byte aligned, so take
advantage of that instead of invoking memcmp() which
results in truly horrifically inefficient code because
it can't assume anything about alignment.
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 2fab35d7
...@@ -146,6 +146,19 @@ int eth_rebuild_header(struct sk_buff *skb) ...@@ -146,6 +146,19 @@ int eth_rebuild_header(struct sk_buff *skb)
return 0; return 0;
} }
static inline unsigned int compare_eth_addr(const unsigned char *__a, const unsigned char *__b)
{
const unsigned short *dest = (unsigned short *) __a;
const unsigned short *devaddr = (unsigned short *) __b;
unsigned int res;
BUILD_BUG_ON(ETH_ALEN != 6);
res = ((dest[0] ^ devaddr[0]) |
(dest[1] ^ devaddr[1]) |
(dest[2] ^ devaddr[2])) != 0;
return res;
}
/* /*
* Determine the packet's protocol ID. The rule here is that we * Determine the packet's protocol ID. The rule here is that we
...@@ -158,16 +171,15 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -158,16 +171,15 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
struct ethhdr *eth; struct ethhdr *eth;
unsigned char *rawp; unsigned char *rawp;
skb->mac.raw=skb->data; skb->mac.raw = skb->data;
skb_pull(skb,ETH_HLEN); skb_pull(skb,ETH_HLEN);
eth = eth_hdr(skb); eth = eth_hdr(skb);
if(*eth->h_dest&1) if (*eth->h_dest&1) {
{ if (!compare_eth_addr(eth->h_dest, dev->broadcast))
if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0) skb->pkt_type = PACKET_BROADCAST;
skb->pkt_type=PACKET_BROADCAST;
else else
skb->pkt_type=PACKET_MULTICAST; skb->pkt_type = PACKET_MULTICAST;
} }
/* /*
...@@ -178,10 +190,9 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -178,10 +190,9 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
* seems to set IFF_PROMISC. * seems to set IFF_PROMISC.
*/ */
else if(1 /*dev->flags&IFF_PROMISC*/) else if(1 /*dev->flags&IFF_PROMISC*/) {
{ if (unlikely(!compare_eth_addr(eth->h_dest, dev->dev_addr)))
if(memcmp(eth->h_dest,dev->dev_addr, ETH_ALEN)) skb->pkt_type = PACKET_OTHERHOST;
skb->pkt_type=PACKET_OTHERHOST;
} }
if (ntohs(eth->h_proto) >= 1536) if (ntohs(eth->h_proto) >= 1536)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册