aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/s390/net/qeth_core.h3
-rw-r--r--drivers/s390/net/qeth_l3_main.c10
2 files changed, 6 insertions, 7 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index a3ac4456e0b1..fcd005aad989 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -763,7 +763,8 @@ static inline int qeth_get_micros(void)
763 763
764static inline int qeth_get_ip_version(struct sk_buff *skb) 764static inline int qeth_get_ip_version(struct sk_buff *skb)
765{ 765{
766 switch (skb->protocol) { 766 struct ethhdr *ehdr = (struct ethhdr *)skb->data;
767 switch (ehdr->h_proto) {
767 case ETH_P_IPV6: 768 case ETH_P_IPV6:
768 return 6; 769 return 6;
769 case ETH_P_IP: 770 case ETH_P_IP:
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index 5475834ab916..42fe92c08c29 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -2900,10 +2900,8 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
2900 int data_offset = -1; 2900 int data_offset = -1;
2901 int nr_frags; 2901 int nr_frags;
2902 2902
2903 if ((card->info.type == QETH_CARD_TYPE_IQD) && 2903 if (((card->info.type == QETH_CARD_TYPE_IQD) && (!ipv)) ||
2904 (((skb->protocol != htons(ETH_P_IPV6)) && 2904 card->options.sniffer)
2905 (skb->protocol != htons(ETH_P_IP))) ||
2906 card->options.sniffer))
2907 goto tx_drop; 2905 goto tx_drop;
2908 2906
2909 if ((card->state != CARD_STATE_UP) || !card->lan_online) { 2907 if ((card->state != CARD_STATE_UP) || !card->lan_online) {
@@ -2949,14 +2947,14 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
2949 if (data_offset < 0) 2947 if (data_offset < 0)
2950 skb_pull(new_skb, ETH_HLEN); 2948 skb_pull(new_skb, ETH_HLEN);
2951 } else { 2949 } else {
2952 if (new_skb->protocol == htons(ETH_P_IP)) { 2950 if (ipv == 4) {
2953 if (card->dev->type == ARPHRD_IEEE802_TR) 2951 if (card->dev->type == ARPHRD_IEEE802_TR)
2954 skb_pull(new_skb, TR_HLEN); 2952 skb_pull(new_skb, TR_HLEN);
2955 else 2953 else
2956 skb_pull(new_skb, ETH_HLEN); 2954 skb_pull(new_skb, ETH_HLEN);
2957 } 2955 }
2958 2956
2959 if (new_skb->protocol == ETH_P_IPV6 && card->vlangrp && 2957 if (ipv == 6 && card->vlangrp &&
2960 vlan_tx_tag_present(new_skb)) { 2958 vlan_tx_tag_present(new_skb)) {
2961 skb_push(new_skb, VLAN_HLEN); 2959 skb_push(new_skb, VLAN_HLEN);
2962 skb_copy_to_linear_data(new_skb, new_skb->data + 4, 4); 2960 skb_copy_to_linear_data(new_skb, new_skb->data + 4, 4);