mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-20 17:52:52 +00:00
nic/ipxe: batch packets on receive path
Use batching feature of Uplink client base header. Issue #5149
This commit is contained in:
parent
d0d9cb6a73
commit
feba5a138e
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user