|
@@ -536,7 +536,7 @@ efi_snp_transmit ( EFI_SIMPLE_NETWORK_PROTOCOL *snp,
|
536
|
536
|
container_of ( snp, struct efi_snp_device, snp );
|
537
|
537
|
struct ll_protocol *ll_protocol = snpdev->netdev->ll_protocol;
|
538
|
538
|
struct io_buffer *iobuf;
|
539
|
|
- size_t ll_headroom;
|
|
539
|
+ size_t payload_len;
|
540
|
540
|
int rc;
|
541
|
541
|
EFI_STATUS efirc;
|
542
|
542
|
|
|
@@ -589,21 +589,22 @@ efi_snp_transmit ( EFI_SIMPLE_NETWORK_PROTOCOL *snp,
|
589
|
589
|
}
|
590
|
590
|
|
591
|
591
|
/* Allocate buffer */
|
592
|
|
- ll_headroom = ( MAX_LL_HEADER_LEN - ll_header_len );
|
593
|
|
- iobuf = alloc_iob ( ll_headroom +
|
594
|
|
- ( ( len > IOB_ZLEN ) ? len : IOB_ZLEN ) );
|
|
592
|
+ payload_len = ( len - ll_protocol->ll_header_len );
|
|
593
|
+ iobuf = alloc_iob ( MAX_LL_HEADER_LEN + ( ( payload_len > IOB_ZLEN ) ?
|
|
594
|
+ payload_len : IOB_ZLEN ) );
|
595
|
595
|
if ( ! iobuf ) {
|
596
|
596
|
DBGC ( snpdev, "SNPDEV %p TX could not allocate %ld-byte "
|
597
|
597
|
"buffer\n", snpdev, ( ( unsigned long ) len ) );
|
598
|
598
|
efirc = EFI_DEVICE_ERROR;
|
599
|
599
|
goto err_alloc_iob;
|
600
|
600
|
}
|
601
|
|
- iob_reserve ( iobuf, ll_headroom );
|
|
601
|
+ iob_reserve ( iobuf, ( MAX_LL_HEADER_LEN -
|
|
602
|
+ ll_protocol->ll_header_len ) );
|
602
|
603
|
memcpy ( iob_put ( iobuf, len ), data, len );
|
603
|
604
|
|
604
|
605
|
/* Create link-layer header, if specified */
|
605
|
606
|
if ( ll_header_len ) {
|
606
|
|
- iob_pull ( iobuf, ll_header_len );
|
|
607
|
+ iob_pull ( iobuf, ll_protocol->ll_header_len );
|
607
|
608
|
if ( ( rc = ll_protocol->push ( snpdev->netdev,
|
608
|
609
|
iobuf, ll_dest, ll_src,
|
609
|
610
|
htons ( *net_proto ) )) != 0 ){
|