lkml.org 
[lkml]   [2003]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH][ATM] get minimum frame size right in lec.c
the minimum frame size for token ring (802.5) pdus is 16 octets.  also,
count the pdus that failed to copy as dropped. also, skb_copy_expand()
now seems to be the right way to do this.

Index: linux/net/atm/lec.c
===================================================================
RCS file: /home/chas/CVSROOT/linux/net/atm/lec.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -b -w -r1.5 -r1.6
--- linux/net/atm/lec.c 22 Feb 2003 19:23:22 -0000 1.5
+++ linux/net/atm/lec.c 24 Feb 2003 13:24:45 -0000 1.6
@@ -223,7 +223,8 @@
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 @@
#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 */
Index: linux/net/atm/lec.h
===================================================================
RCS file: /home/chas/CVSROOT/linux/net/atm/lec.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -b -w -r1.2 -r1.3
--- linux/net/atm/lec.h 22 Feb 2003 19:29:27 -0000 1.2
+++ linux/net/atm/lec.h 24 Feb 2003 13:24:46 -0000 1.3
@@ -38,6 +38,9 @@
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.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 13:33    [W:0.023 / U:0.176 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site