qeth: l3 send dhcp in non pass thru mode
authorFrank Blaschka <frank.blaschka@de.ibm.com>
Mon, 8 Mar 2010 20:36:54 +0000 (20:36 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 10 Mar 2010 15:32:25 +0000 (07:32 -0800)
dhcp frames are valid IPv4 packets so there is no need to send them
in pass thru mode. This allows dhcp packets to pass HiperSockets.
Also the dhcp release frame is send out correctly with this patch.

Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.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 a3ac4456e0b1ee9f00f86ba97c385099053400e4..fcd005aad98919897f09051e3c461f92f9fa0c2e 100644 (file)
@@ -763,7 +763,8 @@ static inline int qeth_get_micros(void)
 
 static inline int qeth_get_ip_version(struct sk_buff *skb)
 {
-       switch (skb->protocol) {
+       struct ethhdr *ehdr = (struct ethhdr *)skb->data;
+       switch (ehdr->h_proto) {
        case ETH_P_IPV6:
                return 6;
        case ETH_P_IP:
index 5475834ab916ba6dd08868bf3506877c17b55bee..42fe92c08c29eab841c9f0705a3eacd30b1e6f15 100644 (file)
@@ -2900,10 +2900,8 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        int data_offset = -1;
        int nr_frags;
 
-       if ((card->info.type == QETH_CARD_TYPE_IQD) &&
-           (((skb->protocol != htons(ETH_P_IPV6)) &&
-             (skb->protocol != htons(ETH_P_IP))) ||
-            card->options.sniffer))
+       if (((card->info.type == QETH_CARD_TYPE_IQD) && (!ipv)) ||
+            card->options.sniffer)
                        goto tx_drop;
 
        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)
                if (data_offset < 0)
                        skb_pull(new_skb, ETH_HLEN);
        } else {
-               if (new_skb->protocol == htons(ETH_P_IP)) {
+               if (ipv == 4) {
                        if (card->dev->type == ARPHRD_IEEE802_TR)
                                skb_pull(new_skb, TR_HLEN);
                        else
                                skb_pull(new_skb, ETH_HLEN);
                }
 
-               if (new_skb->protocol == ETH_P_IPV6 && card->vlangrp &&
+               if (ipv == 6 && card->vlangrp &&
                                vlan_tx_tag_present(new_skb)) {
                        skb_push(new_skb, VLAN_HLEN);
                        skb_copy_to_linear_data(new_skb, new_skb->data + 4, 4);