diff options
| author | Michael Brown | 2012-09-14 18:49:53 +0200 |
|---|---|---|
| committer | Michael Brown | 2012-09-14 18:49:53 +0200 |
| commit | 09cc63fc8bd083c58d7276a01675612dbd6a3cfb (patch) | |
| tree | 5eaa3f421ffb84326f0c28243cab438c4ef0436d /src | |
| parent | [int13] Zero all possible registers when jumping to a boot sector (diff) | |
| download | ipxe-09cc63fc8bd083c58d7276a01675612dbd6a3cfb.tar.gz ipxe-09cc63fc8bd083c58d7276a01675612dbd6a3cfb.tar.xz ipxe-09cc63fc8bd083c58d7276a01675612dbd6a3cfb.zip | |
[efi] Provide guaranteed space in transmitted packets
eIPoIB requires space to expand a transmitted ARP packet. This
guarantee is met by ensuring that a transmitted packet consists of at
least MAX_LL_HEADER_LEN bytes from the start of the I/O buffer up to
the end of the link-layer header, and at least IOB_ZLEN bytes
thereafter.
Adjust the I/O buffer allocation for SNP transmitted packets to ensure
that this guarantee is met.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/interface/efi/efi_snp.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/interface/efi/efi_snp.c b/src/interface/efi/efi_snp.c index 6d7865dd2..b4ae5113d 100644 --- a/src/interface/efi/efi_snp.c +++ b/src/interface/efi/efi_snp.c @@ -536,7 +536,7 @@ efi_snp_transmit ( EFI_SIMPLE_NETWORK_PROTOCOL *snp, container_of ( snp, struct efi_snp_device, snp ); struct ll_protocol *ll_protocol = snpdev->netdev->ll_protocol; struct io_buffer *iobuf; - size_t ll_headroom; + size_t payload_len; int rc; EFI_STATUS efirc; @@ -589,21 +589,22 @@ efi_snp_transmit ( EFI_SIMPLE_NETWORK_PROTOCOL *snp, } /* Allocate buffer */ - ll_headroom = ( MAX_LL_HEADER_LEN - ll_header_len ); - iobuf = alloc_iob ( ll_headroom + - ( ( len > IOB_ZLEN ) ? len : IOB_ZLEN ) ); + payload_len = ( len - ll_protocol->ll_header_len ); + iobuf = alloc_iob ( MAX_LL_HEADER_LEN + ( ( payload_len > IOB_ZLEN ) ? + payload_len : IOB_ZLEN ) ); if ( ! iobuf ) { DBGC ( snpdev, "SNPDEV %p TX could not allocate %ld-byte " "buffer\n", snpdev, ( ( unsigned long ) len ) ); efirc = EFI_DEVICE_ERROR; goto err_alloc_iob; } - iob_reserve ( iobuf, ll_headroom ); + iob_reserve ( iobuf, ( MAX_LL_HEADER_LEN - + ll_protocol->ll_header_len ) ); memcpy ( iob_put ( iobuf, len ), data, len ); /* Create link-layer header, if specified */ if ( ll_header_len ) { - iob_pull ( iobuf, ll_header_len ); + iob_pull ( iobuf, ll_protocol->ll_header_len ); if ( ( rc = ll_protocol->push ( snpdev->netdev, iobuf, ll_dest, ll_src, htons ( *net_proto ) )) != 0 ){ |
