From 061af2502147b6a9aef24bf77455dd59914b8b51 Mon Sep 17 00:00:00 2001 From: Chas Williams <chas@locutus.cmf.nrl.navy.mil> Date: Sun, 2 Mar 2003 09:13:53 -0800 Subject: [PATCH] [ATM]: Get minimum frame size right in lec.c --- net/atm/lec.c | 33 ++++++++++++++++----------------- net/atm/lec.h | 3 +++ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/net/atm/lec.c b/net/atm/lec.c index ddb8b8a40925..467bf29d4916 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c @@ -223,7 +223,8 @@ lec_send_packet(struct sk_buff *skb, struct net_device *dev) struct lecdatahdr_8023 *lec_h; struct atm_vcc *send_vcc; struct lec_arp_table *entry; - unsigned char *nb, *dst; + unsigned char *dst; + int min_frame_size; #ifdef CONFIG_TR unsigned char rdesc[ETH_ALEN]; /* Token Ring route descriptor */ #endif @@ -294,26 +295,24 @@ lec_send_packet(struct sk_buff *skb, struct net_device *dev) #endif /* DUMP_PACKETS > 0 */ /* Minimum ethernet-frame size */ - if (skb->len <62) { - if (skb->truesize < 62) { - printk("%s:data packet %d / %d\n", - dev->name, - skb->len,skb->truesize); - nb=(unsigned char*)kmalloc(64, GFP_ATOMIC); - if (nb == NULL) { +#ifdef CONFIG_TR + if (priv->is_trdev) + min_frame_size = LEC_MINIMUM_8025_SIZE; + else +#endif + min_frame_size = LEC_MINIMUM_8023_SIZE; + if (skb->len < min_frame_size) { + if (skb->truesize < min_frame_size) { + skb2 = skb_copy_expand(skb, 0, + min_frame_size - skb->truesize, GFP_ATOMIC); dev_kfree_skb(skb); + if (skb2 == NULL) { + priv->stats.tx_dropped++; return 0; } - memcpy(nb,skb->data,skb->len); - kfree(skb->head); - skb->head = skb->data = nb; - skb->tail = nb+62; - skb->end = nb+64; - skb->len=62; - skb->truesize = 64; - } else { - skb->len = 62; + skb = skb2; } + skb_put(skb, min_frame_size - skb->len); } /* Send to right vcc */ diff --git a/net/atm/lec.h b/net/atm/lec.h index d44a4656fd84..f0c0eccd0cae 100644 --- a/net/atm/lec.h +++ b/net/atm/lec.h @@ -38,6 +38,9 @@ struct lecdatahdr_8025 { unsigned char h_source[ETH_ALEN]; }; +#define LEC_MINIMUM_8023_SIZE 62 +#define LEC_MINIMUM_8025_SIZE 16 + /* * Operations that LANE2 capable device can do. Two first functions * are used to make the device do things. See spec 3.1.3 and 3.1.4. -- 2.30.9