s390/qeth: recognize non-IP multicast on L3 transmit
authorJulian Wiedmann <jwi@linux.vnet.ibm.com>
Wed, 20 Dec 2017 19:11:05 +0000 (20:11 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 20 Dec 2017 20:23:45 +0000 (15:23 -0500)
When
1. an skb has no neighbour, and
2. skb->protocol is not IP[V6],

we select the skb's cast type based on its destination MAC address.

The multicast check is currently restricted to Multicast IP-mapped MACs.
Extend it to also cover non-IP Multicast MACs.

Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_core.h
drivers/s390/net/qeth_l3_main.c

index 146e2df..100f7cc 100644 (file)
@@ -505,9 +505,6 @@ struct qeth_qdio_info {
        int default_out_queue;
 };
 
-#define QETH_ETH_MAC_V4      0x0100 /* like v4 */
-#define QETH_ETH_MAC_V6      0x3333 /* like v6 */
-
 /**
  * buffer stuff for read channel
  */
index d9d944d..e168719 100644 (file)
@@ -2353,7 +2353,6 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 
 static int qeth_l3_get_cast_type(struct sk_buff *skb)
 {
-       u16 hdr_mac = *((u16 *)skb->data);
        struct neighbour *n = NULL;
        struct dst_entry *dst;
 
@@ -2385,7 +2384,7 @@ static int qeth_l3_get_cast_type(struct sk_buff *skb)
        /* ... and MAC address */
        if (ether_addr_equal_64bits(eth_hdr(skb)->h_dest, skb->dev->broadcast))
                return RTN_BROADCAST;
-       if (hdr_mac == QETH_ETH_MAC_V4 || hdr_mac == QETH_ETH_MAC_V6)
+       if (is_multicast_ether_addr(eth_hdr(skb)->h_dest))
                return RTN_MULTICAST;
 
        /* default to unicast */