|
@@ -2609,17 +2609,13 @@ static void qeth_l3_fill_af_iucv_hdr(struct qeth_card *card,
|
|
|
char daddr[16];
|
|
|
struct af_iucv_trans_hdr *iucv_hdr;
|
|
|
|
|
|
- skb_pull(skb, 14);
|
|
|
- card->dev->header_ops->create(skb, card->dev, 0,
|
|
|
- card->dev->dev_addr, card->dev->dev_addr,
|
|
|
- card->dev->addr_len);
|
|
|
- skb_pull(skb, 14);
|
|
|
- iucv_hdr = (struct af_iucv_trans_hdr *)skb->data;
|
|
|
memset(hdr, 0, sizeof(struct qeth_hdr));
|
|
|
hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3;
|
|
|
hdr->hdr.l3.ext_flags = 0;
|
|
|
- hdr->hdr.l3.length = skb->len;
|
|
|
+ hdr->hdr.l3.length = skb->len - ETH_HLEN;
|
|
|
hdr->hdr.l3.flags = QETH_HDR_IPV6 | QETH_CAST_UNICAST;
|
|
|
+
|
|
|
+ iucv_hdr = (struct af_iucv_trans_hdr *) (skb->data + ETH_HLEN);
|
|
|
memset(daddr, 0, sizeof(daddr));
|
|
|
daddr[0] = 0xfe;
|
|
|
daddr[1] = 0x80;
|
|
@@ -2823,10 +2819,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
if ((card->info.type == QETH_CARD_TYPE_IQD) &&
|
|
|
!skb_is_nonlinear(skb)) {
|
|
|
new_skb = skb;
|
|
|
- if (new_skb->protocol == ETH_P_AF_IUCV)
|
|
|
- data_offset = 0;
|
|
|
- else
|
|
|
- data_offset = ETH_HLEN;
|
|
|
+ data_offset = ETH_HLEN;
|
|
|
hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC);
|
|
|
if (!hdr)
|
|
|
goto tx_drop;
|
|
@@ -2867,7 +2860,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
*/
|
|
|
if ((card->info.type != QETH_CARD_TYPE_IQD) &&
|
|
|
((use_tso && !qeth_l3_get_elements_no_tso(card, new_skb, 1)) ||
|
|
|
- (!use_tso && !qeth_get_elements_no(card, new_skb, 0)))) {
|
|
|
+ (!use_tso && !qeth_get_elements_no(card, new_skb, 0, 0)))) {
|
|
|
int lin_rc = skb_linearize(new_skb);
|
|
|
|
|
|
if (card->options.performance_stats) {
|
|
@@ -2909,7 +2902,8 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
|
|
|
elements = use_tso ?
|
|
|
qeth_l3_get_elements_no_tso(card, new_skb, hdr_elements) :
|
|
|
- qeth_get_elements_no(card, new_skb, hdr_elements);
|
|
|
+ qeth_get_elements_no(card, new_skb, hdr_elements,
|
|
|
+ (data_offset > 0) ? data_offset : 0);
|
|
|
if (!elements) {
|
|
|
if (data_offset >= 0)
|
|
|
kmem_cache_free(qeth_core_header_cache, hdr);
|