|
|
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.