Annotation of qemu/roms/ipxe/src/net/iobpad.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.