mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-06 01:11:46 +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);
|
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
|
||||||
|
@ -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 &)
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user