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); 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 * Register packet reception callback
* *
* \param rx_cb packet-reception callback function * \param rx_cb packet-reception callback function
* \param link_cb link-state change 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 * This registers a function pointer as rx callback. Incoming ethernet packets
* are passed to this function. * are passed to this function.
*/ */
extern void dde_ipxe_nic_register_callbacks(dde_ipxe_nic_rx_cb rx_cb, extern void dde_ipxe_nic_register_callbacks(dde_ipxe_nic_rx_cb,
dde_ipxe_nic_link_cb link_cb); dde_ipxe_nic_link_cb,
dde_ipxe_nic_rx_done);
/** /**
* Clear callbacks * Clear callbacks

View File

@ -43,7 +43,7 @@ class Uplink_client : public Uplink_client_base
{ {
instance = this; instance = this;
dde_ipxe_nic_register_callbacks( 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 { }; Net::Mac_address mac_addr { };
dde_ipxe_nic_get_mac_addr(1, mac_addr.addr); dde_ipxe_nic_get_mac_addr(1, mac_addr.addr);
@ -55,12 +55,16 @@ class Uplink_client : public Uplink_client_base
** Interface towards iPXE driver ** ** Interface towards iPXE driver **
***********************************/ ***********************************/
static void _drv_rx_done()
{
instance->_rx_done();
}
static void _drv_rx_callback(unsigned interface_idx, static void _drv_rx_callback(unsigned interface_idx,
const char *drv_rx_pkt_base, const char *drv_rx_pkt_base,
unsigned drv_rx_pkt_size) unsigned drv_rx_pkt_size)
{ {
instance->_drv_rx_handle_pkt( instance->_drv_rx_handle_pkt_try(drv_rx_pkt_size,
drv_rx_pkt_size,
[&] (void *conn_tx_pkt_base, [&] (void *conn_tx_pkt_base,
size_t &) size_t &)
{ {

View File

@ -33,6 +33,7 @@ static struct net_device *net_dev;
*/ */
static dde_ipxe_nic_link_cb link_callback; static dde_ipxe_nic_link_cb link_callback;
static dde_ipxe_nic_rx_cb rx_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) * Known iPXE driver structures (located in the driver binaries)
@ -149,6 +150,10 @@ int process_rx_data()
free_iob(iobuf); free_iob(iobuf);
} }
/* notify about all requests done */
if (received && rx_done)
rx_done();
return received; 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, 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(); dde_lock_enter();
rx_callback = rx_cb; rx_callback = rx_cb;
link_callback = link_cb; link_callback = link_cb;
rx_done = done;
dde_lock_leave(); dde_lock_leave();
} }
@ -212,6 +219,7 @@ void dde_ipxe_nic_unregister_callbacks(void)
rx_callback = (dde_ipxe_nic_rx_cb)0; rx_callback = (dde_ipxe_nic_rx_cb)0;
link_callback = (dde_ipxe_nic_link_cb)0; link_callback = (dde_ipxe_nic_link_cb)0;
rx_done = (dde_ipxe_nic_rx_done)0;
dde_lock_leave(); dde_lock_leave();
} }