nic/ipxe: batch packets on receive path

Use batching feature of Uplink client base header.

Issue #5149
This commit is contained in:
Alexander Boettcher 2024-02-07 09:45:42 +01:00 committed by Christian Helmuth
parent d0d9cb6a73
commit feba5a138e
3 changed files with 27 additions and 8 deletions

View File

@ -32,17 +32,24 @@ typedef void (*dde_ipxe_nic_link_cb)(void);
*/
typedef void (*dde_ipxe_nic_rx_cb)(unsigned if_index, const char *packet, unsigned packet_len);
/**
* Notification about that all packets have been received
*/
typedef void (*dde_ipxe_nic_rx_done)(void);
/**
* Register packet reception callback
*
* \param rx_cb packet-reception callback function
* \param link_cb link-state change callback function
* \param rx_done all packets are received callback function
*
* This registers a function pointer as rx callback. Incoming ethernet packets
* are passed to this function.
*/
extern void dde_ipxe_nic_register_callbacks(dde_ipxe_nic_rx_cb rx_cb,
dde_ipxe_nic_link_cb link_cb);
extern void dde_ipxe_nic_register_callbacks(dde_ipxe_nic_rx_cb,
dde_ipxe_nic_link_cb,
dde_ipxe_nic_rx_done);
/**
* Clear callbacks

View File

@ -43,7 +43,7 @@ class Uplink_client : public Uplink_client_base
{
instance = this;
dde_ipxe_nic_register_callbacks(
_drv_rx_callback, _drv_link_callback);
_drv_rx_callback, _drv_link_callback, _drv_rx_done);
Net::Mac_address mac_addr { };
dde_ipxe_nic_get_mac_addr(1, mac_addr.addr);
@ -55,14 +55,18 @@ class Uplink_client : public Uplink_client_base
** Interface towards iPXE driver **
***********************************/
static void _drv_rx_done()
{
instance->_rx_done();
}
static void _drv_rx_callback(unsigned interface_idx,
const char *drv_rx_pkt_base,
unsigned drv_rx_pkt_size)
{
instance->_drv_rx_handle_pkt(
drv_rx_pkt_size,
[&] (void *conn_tx_pkt_base,
size_t &)
instance->_drv_rx_handle_pkt_try(drv_rx_pkt_size,
[&] (void *conn_tx_pkt_base,
size_t &)
{
memcpy(conn_tx_pkt_base, drv_rx_pkt_base, drv_rx_pkt_size);
return Write_result::WRITE_SUCCEEDED;

View File

@ -33,6 +33,7 @@ static struct net_device *net_dev;
*/
static dde_ipxe_nic_link_cb link_callback;
static dde_ipxe_nic_rx_cb rx_callback;
static dde_ipxe_nic_rx_done rx_done;
/**
* Known iPXE driver structures (located in the driver binaries)
@ -149,6 +150,10 @@ int process_rx_data()
free_iob(iobuf);
}
/* notify about all requests done */
if (received && rx_done)
rx_done();
return received;
}
@ -195,12 +200,14 @@ static void irq_handler(void *p)
************************/
void dde_ipxe_nic_register_callbacks(dde_ipxe_nic_rx_cb rx_cb,
dde_ipxe_nic_link_cb link_cb)
dde_ipxe_nic_link_cb link_cb,
dde_ipxe_nic_rx_done done)
{
dde_lock_enter();
rx_callback = rx_cb;
link_callback = link_cb;
rx_done = done;
dde_lock_leave();
}
@ -212,6 +219,7 @@ void dde_ipxe_nic_unregister_callbacks(void)
rx_callback = (dde_ipxe_nic_rx_cb)0;
link_callback = (dde_ipxe_nic_link_cb)0;
rx_done = (dde_ipxe_nic_rx_done)0;
dde_lock_leave();
}