|
|
1.1 root 1: /*
2: * Copyright (C) 2007 Michael Brown <[email protected]>.
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: FILE_LICENCE ( GPL2_OR_LATER );
20:
21: /**
22: * @file
23: *
24: * I/O buffer padding
25: *
26: */
27:
28: #include <string.h>
29: #include <ipxe/iobuf.h>
30:
31: /**
32: * Pad I/O buffer
33: *
34: * @v iobuf I/O buffer
35: * @v min_len Minimum length
36: *
37: * This function pads and aligns I/O buffers, for devices that
38: * aren't capable of padding in hardware, or that require specific
39: * alignment in TX buffers. The packet data will end up aligned to a
40: * multiple of @c IOB_ALIGN.
41: *
42: * @c min_len must not exceed @v IOB_ZLEN.
43: */
44: void iob_pad ( struct io_buffer *iobuf, size_t min_len ) {
45: void *data;
46: size_t len;
47: size_t headroom;
48: signed int pad_len;
49:
50: assert ( min_len <= IOB_ZLEN );
51:
52: /* Move packet data to start of I/O buffer. This will both
53: * align the data (since I/O buffers are aligned to
54: * IOB_ALIGN) and give us sufficient space for the
55: * zero-padding
56: */
57: data = iobuf->data;
58: len = iob_len ( iobuf );
59: headroom = iob_headroom ( iobuf );
60: iob_push ( iobuf, headroom );
61: memmove ( iobuf->data, data, len );
62: iob_unput ( iobuf, headroom );
63:
64: /* Pad to minimum packet length */
65: pad_len = ( min_len - iob_len ( iobuf ) );
66: if ( pad_len > 0 )
67: memset ( iob_put ( iobuf, pad_len ), 0, pad_len );
68: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.