summaryrefslogtreecommitdiffstats
path: root/src/interface
diff options
context:
space:
mode:
authorMichael Brown2012-09-14 18:49:53 +0200
committerMichael Brown2012-09-14 18:49:53 +0200
commit09cc63fc8bd083c58d7276a01675612dbd6a3cfb (patch)
tree5eaa3f421ffb84326f0c28243cab438c4ef0436d /src/interface
parent[int13] Zero all possible registers when jumping to a boot sector (diff)
downloadipxe-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/interface')
-rw-r--r--src/interface/efi/efi_snp.c13
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 ){