qeth: Drop ARP packages on HiperSockets interface with NOARP attribute.

A network interface can get ARP packets even when the interface has
NOARP specified. In a HiperSockets environment this disturbs receiving
systems when packets are sent on the multicast queue. (E.g. TCP/IP on
z/VM issues messages reporting invalid data on the HiperSockets
interface.)
Qeth will no longer send ARP packets on HiperSockets interface when
interface has the NOARP attribute.

Signed-off-by: Klaus D. Wacker <kdwacker@de.ibm.com>
Signed-off-by: Ursula Braun <braunu@de.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Klaus D. Wacker and committed by Jeff Garzik 54d0f56e 6e55cab9

+8 -2
+8 -2
drivers/s390/net/qeth_main.c
··· 2505 2505 struct iphdr *ip_hdr; 2506 2506 2507 2507 QETH_DBF_TEXT(trace,5,"skbfktr"); 2508 - skb_set_mac_header(skb, -QETH_FAKE_LL_LEN_TR); 2508 + skb_set_mac_header(skb, (int)-QETH_FAKE_LL_LEN_TR); 2509 2509 /* this is a fake ethernet header */ 2510 2510 fake_hdr = tr_hdr(skb); 2511 2511 ··· 4710 4710 if (card->info.type != QETH_CARD_TYPE_IQD) 4711 4711 rc = qeth_do_send_packet(card, queue, new_skb, hdr, 4712 4712 elements_needed, ctx); 4713 - else 4713 + else { 4714 + if ((skb->protocol == htons(ETH_P_ARP)) && 4715 + (card->dev->flags & IFF_NOARP)) { 4716 + __qeth_free_new_skb(skb, new_skb); 4717 + return -EPERM; 4718 + } 4714 4719 rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr, 4715 4720 elements_needed, ctx); 4721 + } 4716 4722 if (!rc) { 4717 4723 card->stats.tx_packets++; 4718 4724 card->stats.tx_bytes += tx_bytes;