mirror of
https://github.com/ipxe/ipxe
synced 2026-01-21 09:57:23 +03:00
[ncm] Reserve headroom in received packets
Some protocols (such as ARP) may modify the received packet and re-use the same I/O buffer for transmission of a reply. To allow this, reserve sufficient headroom at the start of each received packet buffer for our transmit datapath headers. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -390,6 +390,7 @@ static void ncm_in_complete ( struct usb_endpoint *ep, struct io_buffer *iobuf,
|
|||||||
size_t ndp_len;
|
size_t ndp_len;
|
||||||
size_t pkt_offset;
|
size_t pkt_offset;
|
||||||
size_t pkt_len;
|
size_t pkt_len;
|
||||||
|
size_t headroom;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
/* Profile overall bulk IN completion */
|
/* Profile overall bulk IN completion */
|
||||||
@@ -460,13 +461,22 @@ static void ncm_in_complete ( struct usb_endpoint *ep, struct io_buffer *iobuf,
|
|||||||
* while the device is running. We therefore copy the
|
* while the device is running. We therefore copy the
|
||||||
* data to a new I/O buffer even if this is the only
|
* data to a new I/O buffer even if this is the only
|
||||||
* (or last) packet within the buffer.
|
* (or last) packet within the buffer.
|
||||||
|
*
|
||||||
|
* We reserve enough space at the start of each buffer
|
||||||
|
* to allow for our own transmission header, to
|
||||||
|
* support protocols such as ARP which may modify the
|
||||||
|
* received packet and reuse the same I/O buffer for
|
||||||
|
* transmission.
|
||||||
*/
|
*/
|
||||||
pkt = alloc_iob ( pkt_len );
|
headroom = ( sizeof ( struct ncm_ntb_header ) +
|
||||||
|
ncm->out.padding );
|
||||||
|
pkt = alloc_iob ( headroom + pkt_len );
|
||||||
if ( ! pkt ) {
|
if ( ! pkt ) {
|
||||||
/* Record error and continue */
|
/* Record error and continue */
|
||||||
netdev_rx_err ( netdev, NULL, -ENOMEM );
|
netdev_rx_err ( netdev, NULL, -ENOMEM );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
iob_reserve ( pkt, headroom );
|
||||||
memcpy ( iob_put ( pkt, pkt_len ),
|
memcpy ( iob_put ( pkt, pkt_len ),
|
||||||
( iobuf->data + pkt_offset ), pkt_len );
|
( iobuf->data + pkt_offset ), pkt_len );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user