Browse Source

Extract packet-padding login from rtl8139.c to a separate pkbpad.c file.

tags/v0.9.3
Michael Brown 18 years ago
parent
commit
a3ed0cbbc7
3 changed files with 69 additions and 21 deletions
  1. 2
    21
      src/drivers/net/rtl8139.c
  2. 1
    0
      src/include/gpxe/pkbuff.h
  3. 66
    0
      src/net/pkbpad.c

+ 2
- 21
src/drivers/net/rtl8139.c View File

@@ -367,10 +367,6 @@ static void rtl_close ( struct net_device *netdev ) {
367 367
  */
368 368
 static int rtl_transmit ( struct net_device *netdev, struct pk_buff *pkb ) {
369 369
 	struct rtl8139_nic *rtl = netdev->priv;
370
-	void *data;
371
-	size_t len;
372
-	size_t headroom;
373
-	signed int pad_len;
374 370
 
375 371
 	/* Check for space in TX ring */
376 372
 	if ( rtl->tx.pkb[rtl->tx.next] != NULL ) {
@@ -378,23 +374,8 @@ static int rtl_transmit ( struct net_device *netdev, struct pk_buff *pkb ) {
378 374
 		return -ENOBUFS;
379 375
 	}
380 376
 
381
-	/* Move packet data to start of packet buffer.  This will both
382
-	 * align the data (since packet buffers are aligned to
383
-	 * PKB_ALIGN) and give us sufficient space for the
384
-	 * zero-padding
385
-	 */
386
-	data = pkb->data;
387
-	len = pkb_len ( pkb );
388
-	headroom = pkb_headroom ( pkb );
389
-	pkb_push ( pkb, headroom );
390
-	memmove ( pkb->data, data, len );
391
-	pkb_unput ( pkb, headroom );
392
-	assert ( ( virt_to_bus ( pkb->data ) & 0x3 ) == 0 );
393
-
394
-	/* Pad to minimum packet length */
395
-	pad_len = ( ETH_ZLEN - pkb_len ( pkb ) );
396
-	if ( pad_len > 0 )
397
-		memset ( pkb_put ( pkb, pad_len ), 0, pad_len );
377
+	/* Pad and align packet */
378
+	pkb_pad ( pkb, ETH_ZLEN );
398 379
 
399 380
 	/* Add to TX ring */
400 381
 	DBG ( "TX id %d at %lx+%x\n", rtl->tx.next,

+ 1
- 0
src/include/gpxe/pkbuff.h View File

@@ -158,5 +158,6 @@ static inline size_t pkb_tailroom ( struct pk_buff *pkb ) {
158 158
 
159 159
 extern struct pk_buff * alloc_pkb ( size_t len );
160 160
 extern void free_pkb ( struct pk_buff *pkb );
161
+extern void pkb_pad ( struct pk_buff *pkb, size_t min_len );
161 162
 
162 163
 #endif /* _GPXE_PKBUFF_H */

+ 66
- 0
src/net/pkbpad.c View File

@@ -0,0 +1,66 @@
1
+/*
2
+ * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
3
+ *
4
+ * This program is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public License as
6
+ * published by the Free Software Foundation; either version 2 of the
7
+ * License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful, but
10
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
+ * General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with this program; if not, write to the Free Software
16
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
+ */
18
+
19
+/**
20
+ * @file
21
+ *
22
+ * Packet buffer padding
23
+ *
24
+ */
25
+
26
+#include <string.h>
27
+#include <gpxe/pkbuff.h>
28
+
29
+/**
30
+ * Pad packet buffer
31
+ *
32
+ * @v pkb		Packet buffer
33
+ * @v min_len		Minimum length
34
+ *
35
+ * This function pads and aligns packet buffers, for devices that
36
+ * aren't capable of padding in hardware, or that require specific
37
+ * alignment in TX buffers.  The packet data will end up aligned to a
38
+ * multiple of @c PKB_ALIGN.
39
+ *
40
+ * @c min_len must not exceed @v PKB_ZLEN.
41
+ */
42
+void pkb_pad ( struct pk_buff *pkb, size_t min_len ) {
43
+	void *data;
44
+	size_t len;
45
+	size_t headroom;
46
+	signed int pad_len;
47
+
48
+	assert ( min_len <= PKB_ZLEN );
49
+
50
+	/* Move packet data to start of packet buffer.  This will both
51
+	 * align the data (since packet buffers are aligned to
52
+	 * PKB_ALIGN) and give us sufficient space for the
53
+	 * zero-padding
54
+	 */
55
+	data = pkb->data;
56
+	len = pkb_len ( pkb );
57
+	headroom = pkb_headroom ( pkb );
58
+	pkb_push ( pkb, headroom );
59
+	memmove ( pkb->data, data, len );
60
+	pkb_unput ( pkb, headroom );
61
+
62
+	/* Pad to minimum packet length */
63
+	pad_len = ( min_len - pkb_len ( pkb ) );
64
+	if ( pad_len > 0 )
65
+		memset ( pkb_put ( pkb, pad_len ), 0, pad_len );
66
+}

Loading…
Cancel
Save