diff --git a/repos/dde_ipxe/include/dde_ipxe/nic.h b/repos/dde_ipxe/include/dde_ipxe/nic.h index f8e6ab8445..5d1d55cbc9 100644 --- a/repos/dde_ipxe/include/dde_ipxe/nic.h +++ b/repos/dde_ipxe/include/dde_ipxe/nic.h @@ -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 diff --git a/repos/dde_ipxe/src/drivers/nic/main.cc b/repos/dde_ipxe/src/drivers/nic/main.cc index 907a461853..2f3a59b4d0 100644 --- a/repos/dde_ipxe/src/drivers/nic/main.cc +++ b/repos/dde_ipxe/src/drivers/nic/main.cc @@ -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; diff --git a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c index b992d6bc40..ddf656deba 100644 --- a/repos/dde_ipxe/src/lib/dde_ipxe/nic.c +++ b/repos/dde_ipxe/src/lib/dde_ipxe/nic.c @@ -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(); }