diff options
author | YOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org> | 2013-03-25 08:25:48 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-03-26 12:32:13 -0400 |
commit | 021b97e469714b31b9e808c91b49543a8766c342 (patch) | |
tree | 890f1b391286de8ebba81273c0d8232122b97008 /drivers/firewire | |
parent | 18406d7e42a67d7b3a3b3ed17be6626a51d8c715 (diff) | |
download | linux-stable-021b97e469714b31b9e808c91b49543a8766c342.tar.gz linux-stable-021b97e469714b31b9e808c91b49543a8766c342.tar.bz2 linux-stable-021b97e469714b31b9e808c91b49543a8766c342.zip |
firewire net: Send L2 multicast via GASP.
Send L2 multicast packet via GASP (Global asynchronous stream packet) by
seeing the multicast bit in the L2 hardware address, not by seeing upper-
layer protocol address.
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/firewire')
-rw-r--r-- | drivers/firewire/net.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c index d438c5be8c21..7c2e16a1db4f 100644 --- a/drivers/firewire/net.c +++ b/drivers/firewire/net.c @@ -84,6 +84,11 @@ struct fwnet_header { __be16 h_proto; /* packet type ID field */ } __packed; +static bool fwnet_hwaddr_is_multicast(u8 *ha) +{ + return !!(*ha & 1); +} + /* IPv4 and IPv6 encapsulation header */ struct rfc2734_header { u32 w0; @@ -626,7 +631,7 @@ static int fwnet_finish_incoming_packet(struct net_device *net, skb_reset_mac_header(skb); skb_pull(skb, sizeof(*eth)); eth = (struct fwnet_header *)skb_mac_header(skb); - if (*eth->h_dest & 1) { + if (fwnet_hwaddr_is_multicast(eth->h_dest)) { if (memcmp(eth->h_dest, net->broadcast, net->addr_len) == 0) skb->pkt_type = PACKET_BROADCAST; @@ -1366,10 +1371,7 @@ static netdev_tx_t fwnet_tx(struct sk_buff *skb, struct net_device *net) * Set the transmission type for the packet. ARP packets and IP * broadcast packets are sent via GASP. */ - if (memcmp(hdr_buf.h_dest, net->broadcast, FWNET_ALEN) == 0 - || proto == htons(ETH_P_ARP) - || (proto == htons(ETH_P_IP) - && IN_MULTICAST(ntohl(ip_hdr(skb)->daddr)))) { + if (fwnet_hwaddr_is_multicast(hdr_buf.h_dest)) { max_payload = dev->broadcast_xmt_max_payload; datagram_label_ptr = &dev->broadcast_xmt_datagramlabel; |