iPXE
netdevice.c File Reference

Network device management. More...

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <byteswap.h>
#include <string.h>
#include <errno.h>
#include <config/general.h>
#include <ipxe/if_ether.h>
#include <ipxe/iobuf.h>
#include <ipxe/tables.h>
#include <ipxe/process.h>
#include <ipxe/init.h>
#include <ipxe/malloc.h>
#include <ipxe/device.h>
#include <ipxe/errortab.h>
#include <ipxe/profile.h>
#include <ipxe/fault.h>
#include <ipxe/vlan.h>
#include <ipxe/netdevice.h>

Go to the source code of this file.

Macros

#define EUNKNOWN_LINK_STATUS   __einfo_error ( EINFO_EUNKNOWN_LINK_STATUS )
 Default unknown link status code.
#define EINFO_EUNKNOWN_LINK_STATUS    __einfo_uniqify ( EINFO_EINPROGRESS, 0x01, "Unknown" )
#define EUNUSED_CONFIG   __einfo_error ( EINFO_EUNUSED_CONFIG )
 Default not-yet-attempted-configuration status code.
#define EINFO_EUNUSED_CONFIG    __einfo_uniqify ( EINFO_EINPROGRESS, 0x02, "Unused" )
#define EINPROGRESS_CONFIG   __einfo_error ( EINFO_EINPROGRESS_CONFIG )
 Default configuration-in-progress status code.
#define EINFO_EINPROGRESS_CONFIG    __einfo_uniqify ( EINFO_EINPROGRESS, 0x03, "Incomplete" )
#define ENOTCONN_LINK_DOWN   __einfo_error ( EINFO_ENOTCONN_LINK_DOWN )
 Default link-down status code.
#define EINFO_ENOTCONN_LINK_DOWN    __einfo_uniqify ( EINFO_ENOTCONN, 0x01, "Down" )

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static int netdev_has_ll_addr (struct net_device *netdev)
 Check whether or not network device has a link-layer address.
static size_t netdev_priv_offset (struct net_driver *driver)
 Get offset of network device driver private data.
void * netdev_priv (struct net_device *netdev, struct net_driver *driver)
 Get network device driver private data.
static void netdev_notify (struct net_device *netdev)
 Notify drivers of network device or link state change.
void netdev_rx_freeze (struct net_device *netdev)
 Freeze network device receive queue processing.
void netdev_rx_unfreeze (struct net_device *netdev)
 Unfreeze network device receive queue processing.
void netdev_link_err (struct net_device *netdev, int rc)
 Mark network device as having a specific link state.
void netdev_link_down (struct net_device *netdev)
 Mark network device as having link down.
void netdev_link_block (struct net_device *netdev, unsigned long timeout)
 Mark network device link as being blocked.
void netdev_link_unblock (struct net_device *netdev)
 Mark network device link as being unblocked.
static void netdev_link_block_expired (struct retry_timer *timer, int fail __unused)
 Handle network device link block timer expiry.
static void netdev_record_stat (struct net_device_stats *stats, int rc)
 Record network device statistic.
int netdev_tx (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit raw packet via network device.
void netdev_tx_defer (struct net_device *netdev, struct io_buffer *iobuf)
 Defer transmitted packet.
void netdev_tx_err (struct net_device *netdev, struct io_buffer *iobuf, int rc)
 Discard transmitted packet.
void netdev_tx_complete_err (struct net_device *netdev, struct io_buffer *iobuf, int rc)
 Complete network transmission.
void netdev_tx_complete_next_err (struct net_device *netdev, int rc)
 Complete network transmission.
static void netdev_tx_flush (struct net_device *netdev)
 Flush device's transmit queue.
void netdev_rx (struct net_device *netdev, struct io_buffer *iobuf)
 Add packet to receive queue.
void netdev_rx_err (struct net_device *netdev, struct io_buffer *iobuf, int rc)
 Discard received packet.
void netdev_poll (struct net_device *netdev)
 Poll for completed and received packets on network device.
struct io_buffernetdev_rx_dequeue (struct net_device *netdev)
 Remove packet from device's receive queue.
static void netdev_rx_flush (struct net_device *netdev)
 Flush device's receive queue.
static void netdev_config_close (struct net_device_configuration *config, int rc)
 Finish network device configuration.
static void free_netdev (struct refcnt *refcnt)
 Free network device.
struct net_devicealloc_netdev (size_t priv_len)
 Allocate network device.
int register_netdev (struct net_device *netdev)
 Register network device.
int netdev_open (struct net_device *netdev)
 Open network device.
void netdev_close (struct net_device *netdev)
 Close network device.
void unregister_netdev (struct net_device *netdev)
 Unregister network device.
void netdev_irq (struct net_device *netdev, int enable)
 Enable or disable interrupts.
struct net_devicefind_netdev (const char *name)
 Get network device by name.
struct net_devicefind_netdev_by_scope_id (unsigned int scope_id)
 Get network device by scope ID.
struct net_devicefind_netdev_by_location (unsigned int bus_type, unsigned int location)
 Get network device by PCI bus:dev.fn address.
struct net_devicelast_opened_netdev (void)
 Get most recently opened network device.
int net_tx (struct io_buffer *iobuf, struct net_device *netdev, struct net_protocol *net_protocol, const void *ll_dest, const void *ll_source)
 Transmit network-layer packet.
int net_rx (struct io_buffer *iobuf, struct net_device *netdev, uint16_t net_proto, const void *ll_dest, const void *ll_source, unsigned int flags)
 Process received network-layer packet.
void net_poll (void)
 Poll the network stack.
static void net_step (struct process *process __unused)
 Single-step the network stack.
__weak unsigned int vlan_tci (struct net_device *netdev __unused)
 Get the VLAN tag control information (when VLAN support is not present)
__weak void vlan_netdev_rx (struct net_device *netdev, unsigned int tag, struct io_buffer *iobuf)
 Add VLAN tag-stripped packet to queue (when VLAN support is not present)
__weak void vlan_netdev_rx_err (struct net_device *netdev, unsigned int tag __unused, struct io_buffer *iobuf, int rc)
 Discard received VLAN tag-stripped packet (when VLAN support is not present)
 PERMANENT_PROCESS (net_process, net_step)
 Networking stack process.
static unsigned int net_discard (void)
 Discard some cached network device data.
struct cache_discarder net_discarder __cache_discarder (CACHE_NORMAL)
 Network device cache discarder.
struct net_device_configuratorfind_netdev_configurator (const char *name)
 Find network device configurator.
int netdev_configure (struct net_device *netdev, struct net_device_configurator *configurator)
 Start network device configuration.
int netdev_configure_all (struct net_device *netdev)
 Start network device configuration via all supported configurators.
static int netdev_has_configuration_rc (struct net_device *netdev, int rc)
 Check if network device has a configuration with a specified status code.
int netdev_configuration_in_progress (struct net_device *netdev)
 Check if network device configuration is in progress.
int netdev_configuration_ok (struct net_device *netdev)
 Check if network device has at least one successful configuration.

Variables

struct list_head net_devices = LIST_HEAD_INIT ( net_devices )
 List of network devices.
static struct list_head open_net_devices = LIST_HEAD_INIT ( open_net_devices )
 List of open network devices, in reverse order of opening.
static struct profiler net_poll_profiler __profiler = { .name = "net.poll" }
 Network polling profiler.
struct errortab netdev_errors[] __errortab
 Human-readable message for the default link statuses.
static struct interface_operation netdev_config_ops []
 Network device configuration interface operations.
static struct interface_descriptor netdev_config_desc
 Network device configuration interface descriptor.

Detailed Description

Network device management.

Definition in file netdevice.c.

Macro Definition Documentation

◆ EUNKNOWN_LINK_STATUS

#define EUNKNOWN_LINK_STATUS   __einfo_error ( EINFO_EUNKNOWN_LINK_STATUS )

Default unknown link status code.

Definition at line 69 of file netdevice.c.

◆ EINFO_EUNKNOWN_LINK_STATUS

#define EINFO_EUNKNOWN_LINK_STATUS    __einfo_uniqify ( EINFO_EINPROGRESS, 0x01, "Unknown" )

Definition at line 70 of file netdevice.c.

70#define EINFO_EUNKNOWN_LINK_STATUS \
71 __einfo_uniqify ( EINFO_EINPROGRESS, 0x01, "Unknown" )

◆ EUNUSED_CONFIG

#define EUNUSED_CONFIG   __einfo_error ( EINFO_EUNUSED_CONFIG )

Default not-yet-attempted-configuration status code.

Definition at line 74 of file netdevice.c.

Referenced by alloc_netdev().

◆ EINFO_EUNUSED_CONFIG

#define EINFO_EUNUSED_CONFIG    __einfo_uniqify ( EINFO_EINPROGRESS, 0x02, "Unused" )

Definition at line 75 of file netdevice.c.

75#define EINFO_EUNUSED_CONFIG \
76 __einfo_uniqify ( EINFO_EINPROGRESS, 0x02, "Unused" )

◆ EINPROGRESS_CONFIG

#define EINPROGRESS_CONFIG   __einfo_error ( EINFO_EINPROGRESS_CONFIG )

Default configuration-in-progress status code.

Definition at line 79 of file netdevice.c.

Referenced by netdev_configuration_in_progress(), and netdev_configure().

◆ EINFO_EINPROGRESS_CONFIG

#define EINFO_EINPROGRESS_CONFIG    __einfo_uniqify ( EINFO_EINPROGRESS, 0x03, "Incomplete" )

Definition at line 80 of file netdevice.c.

80#define EINFO_EINPROGRESS_CONFIG \
81 __einfo_uniqify ( EINFO_EINPROGRESS, 0x03, "Incomplete" )

◆ ENOTCONN_LINK_DOWN

#define ENOTCONN_LINK_DOWN   __einfo_error ( EINFO_ENOTCONN_LINK_DOWN )

Default link-down status code.

Definition at line 84 of file netdevice.c.

Referenced by netdev_link_down().

◆ EINFO_ENOTCONN_LINK_DOWN

#define EINFO_ENOTCONN_LINK_DOWN    __einfo_uniqify ( EINFO_ENOTCONN, 0x01, "Down" )

Definition at line 85 of file netdevice.c.

85#define EINFO_ENOTCONN_LINK_DOWN \
86 __einfo_uniqify ( EINFO_ENOTCONN, 0x01, "Down" )

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ netdev_has_ll_addr()

int netdev_has_ll_addr ( struct net_device * netdev)
static

Check whether or not network device has a link-layer address.

Parameters
netdevNetwork device
Return values
has_ll_addrNetwork device has a link-layer address

Definition at line 102 of file netdevice.c.

102 {
103 uint8_t *ll_addr = netdev->ll_addr;
104 size_t remaining = sizeof ( netdev->ll_addr );
105
106 while ( remaining-- ) {
107 if ( *(ll_addr++) != 0 )
108 return 1;
109 }
110 return 0;
111}
unsigned char uint8_t
Definition stdint.h:10
static struct net_device * netdev
Definition gdbudp.c:53

References netdev.

Referenced by register_netdev().

◆ netdev_priv_offset()

size_t netdev_priv_offset ( struct net_driver * driver)
static

Get offset of network device driver private data.

Parameters
driverUpper-layer driver, or NULL for device driver
Return values
offsetOffset of driver private data

Definition at line 119 of file netdevice.c.

119 {
120 struct net_device *netdev;
121 unsigned int num_configs;
122 size_t offset;
123
124 /* Allow space for network device */
125 offset = sizeof ( *netdev );
126
127 /* Allow space for configurations */
129 offset += ( num_configs * sizeof ( netdev->configs[0] ) );
130
131 /* Place variable-length device driver private data at end */
132 if ( ! driver )
133 driver = table_end ( NET_DRIVERS );
134
135 /* Allow space for preceding upper-layer drivers' private data */
137 offset += driver->priv_len;
138 }
139
140 /* Sanity check */
141 assert ( ( offset & ( sizeof ( void * ) - 1 ) ) == 0 );
142
143 return offset;
144}
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
uint16_t offset
Offset to command line.
Definition bzimage.h:3
#define NET_DRIVERS
Network driver table.
Definition netdevice.h:507
#define NET_DEVICE_CONFIGURATORS
Network device configurator table.
Definition netdevice.h:333
A network device.
Definition netdevice.h:353
size_t priv_len
Size of private data.
Definition netdevice.h:484
#define for_each_table_entry_continue_reverse(pointer, table)
Iterate through all remaining entries within a linker table in reverse order.
Definition tables.h:470
#define table_end(table)
Get end of linker table.
Definition tables.h:309
#define table_num_entries(table)
Get number of entries in linker table.
Definition tables.h:336

References assert, for_each_table_entry_continue_reverse, NET_DEVICE_CONFIGURATORS, NET_DRIVERS, netdev, offset, net_driver::priv_len, table_end, and table_num_entries.

Referenced by alloc_netdev(), and netdev_priv().

◆ netdev_priv()

void * netdev_priv ( struct net_device * netdev,
struct net_driver * driver )

Get network device driver private data.

Parameters
netdevNetwork device
driverUpper-layer driver, or NULL for device driver
Return values
privDriver private data

Definition at line 153 of file netdevice.c.

153 {
154
155 return ( ( ( void * ) netdev ) + netdev_priv_offset ( driver ) );
156}
static size_t netdev_priv_offset(struct net_driver *driver)
Get offset of network device driver private data.
Definition netdevice.c:119

References netdev, and netdev_priv_offset().

Referenced by alloc_netdev(), eapol_rx(), fcoe_fip_rx(), fcoe_rx(), lldp_rx(), netdev_notify(), register_netdev(), and unregister_netdev().

◆ netdev_notify()

void netdev_notify ( struct net_device * netdev)
static

Notify drivers of network device or link state change.

Parameters
netdevNetwork device

Definition at line 163 of file netdevice.c.

163 {
164 struct net_driver *driver;
165 void *priv;
166
168 priv = netdev_priv ( netdev, driver );
169 if ( driver->notify )
170 driver->notify ( netdev, priv );
171 }
172}
void * netdev_priv(struct net_device *netdev, struct net_driver *driver)
Get network device driver private data.
Definition netdevice.c:153
A network upper-layer driver.
Definition netdevice.h:480
void(* notify)(struct net_device *netdev, void *priv)
Notify of device or link state change.
Definition netdevice.h:497
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition tables.h:386
static struct tlan_private * priv
Definition tlan.c:225

References for_each_table_entry, NET_DRIVERS, netdev, netdev_priv(), net_driver::notify, and priv.

Referenced by netdev_close(), netdev_link_err(), netdev_open(), netdev_rx_freeze(), and netdev_rx_unfreeze().

◆ netdev_rx_freeze()

void netdev_rx_freeze ( struct net_device * netdev)

Freeze network device receive queue processing.

Parameters
netdevNetwork device

Definition at line 179 of file netdevice.c.

179 {
180
181 /* Mark receive queue processing as frozen */
182 netdev->state |= NETDEV_RX_FROZEN;
183
184 /* Notify drivers of change */
186}
static void netdev_notify(struct net_device *netdev)
Notify drivers of network device or link state change.
Definition netdevice.c:163
#define NETDEV_RX_FROZEN
Network device receive queue processing is frozen.
Definition netdevice.h:445

References netdev, netdev_notify(), and NETDEV_RX_FROZEN.

Referenced by pxe_netdev_open(), and pxenv_undi_transmit().

◆ netdev_rx_unfreeze()

void netdev_rx_unfreeze ( struct net_device * netdev)

Unfreeze network device receive queue processing.

Parameters
netdevNetwork device

Definition at line 193 of file netdevice.c.

193 {
194
195 /* Mark receive queue processing as not frozen */
196 netdev->state &= ~NETDEV_RX_FROZEN;
197
198 /* Notify drivers of change */
200}

References netdev, netdev_notify(), and NETDEV_RX_FROZEN.

Referenced by pxe_netdev_close(), and pxe_set_netdev().

◆ netdev_link_err()

void netdev_link_err ( struct net_device * netdev,
int rc )

Mark network device as having a specific link state.

Parameters
netdevNetwork device
rcLink status code

Definition at line 208 of file netdevice.c.

208 {
209
210 /* Stop link block timer */
211 stop_timer ( &netdev->link_block );
212
213 /* Record link state */
214 netdev->link_rc = rc;
215 if ( netdev->link_rc == 0 ) {
216 DBGC ( netdev, "NETDEV %s link is up\n", netdev->name );
217 } else {
218 DBGC ( netdev, "NETDEV %s link is down: %s\n",
219 netdev->name, strerror ( netdev->link_rc ) );
220 }
221
222 /* Notify drivers of link state change */
224}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
#define DBGC(...)
Definition compiler.h:505
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition retry.c:118
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79

References DBGC, netdev, netdev_notify(), rc, stop_timer(), and strerror().

Referenced by eoib_join_complete(), eoib_link_state_changed(), gve_startup(), iphone_check_link(), ipoib_join_complete(), ipoib_link_state_changed(), net80211_deauthenticate(), net80211_set_state(), net80211_step_associate(), netdev_link_down(), netdev_link_up(), netfront_close(), rhine_check_link(), skeleton_check_link(), and vlan_sync().

◆ netdev_link_down()

void netdev_link_down ( struct net_device * netdev)

Mark network device as having link down.

Parameters
netdevNetwork device

Definition at line 231 of file netdevice.c.

231 {
232
233 /* Avoid clobbering a more detailed link status code, if one
234 * is already set.
235 */
236 if ( ( netdev->link_rc == 0 ) ||
237 ( netdev->link_rc == -EUNKNOWN_LINK_STATUS ) ) {
239 }
240}
#define EUNKNOWN_LINK_STATUS
Default link status code.
Definition fc.c:186
void netdev_link_err(struct net_device *netdev, int rc)
Mark network device as having a specific link state.
Definition netdevice.c:208
#define ENOTCONN_LINK_DOWN
Default link-down status code.
Definition netdevice.c:84

References ENOTCONN_LINK_DOWN, EUNKNOWN_LINK_STATUS, netdev, and netdev_link_err().

Referenced by __vxge_hw_vpath_alarm_process(), atl1e_check_link(), atl1e_down(), atl_check_link(), atl_probe(), axge_check_link(), bnxt_set_link(), dm96xx_link_nsr(), dwmac_check_link(), ecm_intr_complete(), exanic_check_link(), flexboot_nodnic_state_change_netdev(), forcedeth_link_status(), gve_restart(), hermon_state_change_netdev(), hunt_check_link(), hunt_open(), ice_admin_link(), icplus_check_link(), intel_check_link(), intelx_check_link(), intelxl_admin_link(), intelxlvf_admin_link(), intelxvf_check_link(), jme_check_link(), jme_close(), jme_link_change(), mii_check_link(), myri10ge_interrupt_handler(), natsemi_check_link(), ncm_intr_complete(), net80211_netdev_close(), net80211_set_state(), netfront_close(), netfront_probe(), nii_poll_link(), phantom_poll_link_state(), realtek_check_link(), rhine_check_link(), rndis_rx_query_oid(), rndis_rx_status(), sis190_phy_task(), skge_down(), skge_link_down(), sky2_link_down(), sky2_up(), snpnet_check_link(), tg3_phy_reset(), tg3_setup_copper_phy(), tg3_setup_fiber_mii_phy(), tg3_test_and_report_link_chg(), txnic_lmac_update_link(), velocity_check_link(), vmxnet3_check_link(), vxge_close(), and vxge_open().

◆ netdev_link_block()

void netdev_link_block ( struct net_device * netdev,
unsigned long timeout )

Mark network device link as being blocked.

Parameters
netdevNetwork device
timeoutTimeout (in ticks)

Definition at line 248 of file netdevice.c.

248 {
249
250 /* Start link block timer */
251 if ( ! netdev_link_blocked ( netdev ) ) {
252 DBGC ( netdev, "NETDEV %s link blocked for %ld ticks\n",
253 netdev->name, timeout );
254 }
255 start_timer_fixed ( &netdev->link_block, timeout );
256}
void timeout(int)
static int netdev_link_blocked(struct net_device *netdev)
Check link block state of network device.
Definition netdevice.h:654
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition retry.c:65

References DBGC, netdev, netdev_link_blocked(), start_timer_fixed(), and timeout().

Referenced by eap_rx_identity(), eth_slow_lacp_rx(), and stp_rx().

◆ netdev_link_unblock()

void netdev_link_unblock ( struct net_device * netdev)

Mark network device link as being unblocked.

Parameters
netdevNetwork device

Definition at line 263 of file netdevice.c.

263 {
264
265 /* Stop link block timer */
266 if ( netdev_link_blocked ( netdev ) )
267 DBGC ( netdev, "NETDEV %s link unblocked\n", netdev->name );
268 stop_timer ( &netdev->link_block );
269}

References DBGC, netdev, netdev_link_blocked(), and stop_timer().

Referenced by eap_rx_success(), eth_slow_lacp_rx(), and stp_rx().

◆ netdev_link_block_expired()

void netdev_link_block_expired ( struct retry_timer * timer,
int fail __unused )
static

Handle network device link block timer expiry.

Parameters
timerLink block timer
failFailure indicator

Definition at line 277 of file netdevice.c.

278 {
279 struct net_device *netdev =
281
282 /* Assume link is no longer blocked */
283 DBGC ( netdev, "NETDEV %s link block expired\n", netdev->name );
284}
#define container_of(ptr, type, field)
Get containing structure.
Definition stddef.h:36
struct retry_timer link_block
Link block timer.
Definition netdevice.h:404
A timer.
Definition timer.h:29

References __unused, container_of, DBGC, net_device::link_block, and netdev.

Referenced by alloc_netdev().

◆ netdev_record_stat()

void netdev_record_stat ( struct net_device_stats * stats,
int rc )
static

Record network device statistic.

Parameters
statsNetwork device statistics
rcStatus code

Definition at line 292 of file netdevice.c.

292 {
293 struct net_device_error *error;
294 struct net_device_error *least_common_error;
295 unsigned int i;
296
297 /* If this is not an error, just update the good counter */
298 if ( rc == 0 ) {
299 stats->good++;
300 return;
301 }
302
303 /* Update the bad counter */
304 stats->bad++;
305
306 /* Locate the appropriate error record */
307 least_common_error = &stats->errors[0];
308 for ( i = 0 ; i < ( sizeof ( stats->errors ) /
309 sizeof ( stats->errors[0] ) ) ; i++ ) {
310 error = &stats->errors[i];
311 /* Update matching record, if found */
312 if ( error->rc == rc ) {
313 error->count++;
314 return;
315 }
316 if ( error->count < least_common_error->count )
317 least_common_error = error;
318 }
319
320 /* Overwrite the least common error record */
321 least_common_error->rc = rc;
322 least_common_error->count = 1;
323}
struct arbelprm_completion_with_error error
Definition arbel.h:1
Network device error.
Definition netdevice.h:281
int rc
Error status code.
Definition netdevice.h:283
unsigned int count
Error count.
Definition netdevice.h:285
unsigned int good
Count of successful completions.
Definition netdevice.h:294
struct net_device_error errors[NETDEV_MAX_UNIQUE_ERRORS]
Error breakdowns.
Definition netdevice.h:298
unsigned int bad
Count of error completions.
Definition netdevice.h:296

References net_device_stats::bad, net_device_error::count, error, net_device_stats::errors, net_device_stats::good, net_device_error::rc, and rc.

Referenced by netdev_rx(), netdev_rx_err(), and netdev_tx_err().

◆ netdev_tx()

int netdev_tx ( struct net_device * netdev,
struct io_buffer * iobuf )

Transmit raw packet via network device.

Parameters
netdevNetwork device
iobufI/O buffer
Return values
rcReturn status code

Transmits the packet via the specified network device. This function takes ownership of the I/O buffer.

Definition at line 335 of file netdevice.c.

335 {
336 int rc;
337
338 DBGC2 ( netdev, "NETDEV %s transmitting %p (%p+%zx)\n",
339 netdev->name, iobuf, iobuf->data, iob_len ( iobuf ) );
340 profile_start ( &net_tx_profiler );
341
342 /* Enqueue packet */
343 list_add_tail ( &iobuf->list, &netdev->tx_queue );
344
345 /* Guard against re-entry */
346 if ( netdev->state & NETDEV_TX_IN_PROGRESS ) {
347 rc = -EBUSY;
348 goto err_busy;
349 }
351
352 /* Avoid calling transmit() on unopened network devices */
353 if ( ! netdev_is_open ( netdev ) ) {
354 rc = -ENETUNREACH;
355 goto err_closed;
356 }
357
358 /* Discard packet (for test purposes) if applicable */
359 if ( ( rc = inject_fault ( NETDEV_DISCARD_RATE ) ) != 0 )
360 goto err_fault;
361
362 /* Map for DMA, if required */
363 if ( netdev->dma && ( ! dma_mapped ( &iobuf->map ) ) ) {
364 if ( ( rc = iob_map_tx ( iobuf, netdev->dma ) ) != 0 )
365 goto err_map;
366 }
367
368 /* Transmit packet */
369 if ( ( rc = netdev->op->transmit ( netdev, iobuf ) ) != 0 )
370 goto err_transmit;
371
372 /* Clear in-progress flag */
374
375 profile_stop ( &net_tx_profiler );
376 return 0;
377
378 err_transmit:
379 err_map:
380 err_fault:
381 err_closed:
383 err_busy:
384 netdev_tx_complete_err ( netdev, iobuf, rc );
385 return rc;
386}
#define NETDEV_DISCARD_RATE
Definition fault.h:16
#define DBGC2(...)
Definition compiler.h:522
#define ENETUNREACH
Network unreachable.
Definition errno.h:489
#define EBUSY
Device or resource busy.
Definition errno.h:339
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition profile.h:174
static void profile_start(struct profiler *profiler)
Start profiling.
Definition profile.h:161
static __always_inline int iob_map_tx(struct io_buffer *iobuf, struct dma_device *dma)
Map I/O buffer for transmit DMA.
Definition iobuf.h:244
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
static __always_inline int dma_mapped(struct dma_mapping *map)
Check if DMA unmapping is required.
Definition dma.h:442
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition list.h:94
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition netdevice.c:471
#define NETDEV_TX_IN_PROGRESS
Network device transmission is in progress.
Definition netdevice.h:456
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition netdevice.h:665
void * data
Start of data.
Definition iobuf.h:53
struct list_head list
List of which this buffer is a member.
Definition iobuf.h:45
struct dma_mapping map
DMA mapping.
Definition iobuf.h:48

References io_buffer::data, DBGC2, dma_mapped(), EBUSY, ENETUNREACH, iob_len(), iob_map_tx(), io_buffer::list, list_add_tail, io_buffer::map, netdev, NETDEV_DISCARD_RATE, netdev_is_open(), netdev_tx_complete_err(), NETDEV_TX_IN_PROGRESS, profile_start(), profile_stop(), and rc.

Referenced by efi_snp_transmit(), gdbudp_recv(), gdbudp_send(), net80211_handle_auth(), net80211_netdev_transmit(), net80211_tx_mgmt(), net_tx(), netdev_tx_complete_err(), and pxenv_undi_transmit().

◆ netdev_tx_defer()

void netdev_tx_defer ( struct net_device * netdev,
struct io_buffer * iobuf )

Defer transmitted packet.

Parameters
netdevNetwork device
iobufI/O buffer

Drivers may call netdev_tx_defer() if there is insufficient space in the transmit descriptor ring. Any packets deferred in this way will be automatically retransmitted as soon as space becomes available (i.e. as soon as the driver calls netdev_tx_complete()).

The packet must currently be in the network device's TX queue.

Drivers utilising netdev_tx_defer() must ensure that space in the transmit descriptor ring is freed up before calling netdev_tx_complete(). For example, if the ring is modelled using a producer counter and a consumer counter, then the consumer counter must be incremented before the call to netdev_tx_complete(). Failure to do this will cause the retransmitted packet to be immediately redeferred (which will result in out-of-order transmissions and other nastiness).

I/O buffers that have been mapped for DMA will remain mapped while present in the deferred transmit queue.

Definition at line 413 of file netdevice.c.

413 {
414
415 /* Catch data corruption as early as possible */
416 list_check_contains_entry ( iobuf, &netdev->tx_queue, list );
417
418 /* Remove from transmit queue */
419 list_del ( &iobuf->list );
420
421 /* Add to deferred transmit queue */
422 list_add_tail ( &iobuf->list, &netdev->tx_deferred );
423
424 /* Record "out of space" statistic */
426}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define ENOBUFS
No buffer space available.
Definition errno.h:499
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
#define list_check_contains_entry(entry, head, member)
Check list contains a specified entry.
Definition list.h:550
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition netdevice.c:441

References ENOBUFS, io_buffer::list, list_add_tail, list_check_contains_entry, list_del, netdev, netdev_tx_err(), and NULL.

Referenced by gve_transmit(), mnpnet_transmit(), nii_transmit(), realtek_transmit(), rndis_tx_defer(), and snpnet_transmit().

◆ netdev_tx_err()

void netdev_tx_err ( struct net_device * netdev,
struct io_buffer * iobuf,
int rc )

Discard transmitted packet.

Parameters
netdevNetwork device
iobufI/O buffer, or NULL
rcPacket status code

The packet is discarded and a TX error is recorded. This function takes ownership of the I/O buffer.

The I/O buffer will be automatically unmapped for DMA, if applicable.

Definition at line 441 of file netdevice.c.

442 {
443
444 /* Update statistics counter */
445 netdev_record_stat ( &netdev->tx_stats, rc );
446 if ( rc == 0 ) {
447 DBGC2 ( netdev, "NETDEV %s transmission %p complete\n",
448 netdev->name, iobuf );
449 } else {
450 DBGC ( netdev, "NETDEV %s transmission %p failed: %s\n",
451 netdev->name, iobuf, strerror ( rc ) );
452 }
453
454 /* Unmap I/O buffer, if required */
455 if ( iobuf && dma_mapped ( &iobuf->map ) )
456 iob_unmap ( iobuf );
457
458 /* Discard packet */
459 free_iob ( iobuf );
460}
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153
static __always_inline void iob_unmap(struct io_buffer *iobuf)
Unmap I/O buffer for DMA.
Definition iobuf.h:279
static void netdev_record_stat(struct net_device_stats *stats, int rc)
Record network device statistic.
Definition netdevice.c:292

References DBGC, DBGC2, dma_mapped(), free_iob(), iob_unmap(), io_buffer::map, netdev, netdev_record_stat(), rc, and strerror().

Referenced by eoib_duplicate(), intel_poll(), neighbour_destroy(), net_tx(), netdev_tx_complete_err(), netdev_tx_defer(), rdc_poll(), rhine_poll(), rndis_tx_complete_err(), snpnet_poll_tx(), vmxnet3_poll_events(), and vmxnet3_poll_tx().

◆ netdev_tx_complete_err()

void netdev_tx_complete_err ( struct net_device * netdev,
struct io_buffer * iobuf,
int rc )

Complete network transmission.

Parameters
netdevNetwork device
iobufI/O buffer
rcPacket status code

The packet must currently be in the network device's TX queue.

Definition at line 471 of file netdevice.c.

472 {
473
474 /* Catch data corruption as early as possible */
475 list_check_contains_entry ( iobuf, &netdev->tx_queue, list );
476
477 /* Dequeue and free I/O buffer */
478 list_del ( &iobuf->list );
479 netdev_tx_err ( netdev, iobuf, rc );
480
481 /* Handle pending transmit queue */
482 while ( ( iobuf = list_first_entry ( &netdev->tx_deferred,
483 struct io_buffer, list ) ) ) {
484
485 /* Remove from pending transmit queue */
486 list_del ( &iobuf->list );
487
488 /* When any transmit completion fails, cancel all
489 * pending transmissions.
490 */
491 if ( rc != 0 ) {
492 netdev_tx_err ( netdev, iobuf, -ECANCELED );
493 continue;
494 }
495
496 /* Otherwise, attempt to transmit the first pending packet */
497 netdev_tx ( netdev, iobuf );
498 break;
499 }
500}
#define ECANCELED
Operation canceled.
Definition errno.h:344
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition list.h:334
int netdev_tx(struct net_device *netdev, struct io_buffer *iobuf)
Transmit raw packet via network device.
Definition netdevice.c:335
A persistent I/O buffer.
Definition iobuf.h:38

References ECANCELED, io_buffer::list, list_check_contains_entry, list_del, list_first_entry, netdev, netdev_tx(), netdev_tx_err(), and rc.

Referenced by axge_out_complete(), dm96xx_out_complete(), ecm_out_complete(), ena_cancel_tx(), eoib_complete_send(), flexboot_nodnic_eth_complete_send(), gve_cancel_tx(), hermon_eth_complete_send(), ifec_tx_process(), iphone_out_complete(), ipoib_complete_send(), jme_free_tx_buffers(), jme_tx_clean(), mnpnet_close(), mnpnet_poll_tx(), ncm_out_complete(), net80211_tx_complete(), netdev_tx(), netdev_tx_complete(), netdev_tx_complete_next_err(), netfront_poll_tx(), nii_close(), phantom_close(), rndis_tx_complete_err(), sis190_process_tx(), smscusb_out_complete(), snpnet_close(), vmxnet3_flush_tx(), and vxge_xmit_compl().

◆ netdev_tx_complete_next_err()

void netdev_tx_complete_next_err ( struct net_device * netdev,
int rc )

Complete network transmission.

Parameters
netdevNetwork device
rcPacket status code

Completes the oldest outstanding packet in the TX queue.

Definition at line 510 of file netdevice.c.

510 {
511 struct io_buffer *iobuf;
512
513 if ( ( iobuf = list_first_entry ( &netdev->tx_queue, struct io_buffer,
514 list ) ) != NULL ) {
515 netdev_tx_complete_err ( netdev, iobuf, rc );
516 }
517}

References io_buffer::list, list_first_entry, netdev, netdev_tx_complete_err(), NULL, and rc.

Referenced by dwmac_poll_tx(), myson_poll_tx(), natsemi_poll_tx(), netdev_tx_complete_next(), netdev_tx_flush(), rhine_poll_tx(), txnic_complete_sqe(), and velocity_poll_tx().

◆ netdev_tx_flush()

void netdev_tx_flush ( struct net_device * netdev)
static

Flush device's transmit queue.

Parameters
netdevNetwork device

Definition at line 524 of file netdevice.c.

524 {
525
526 /* Discard any packets in the TX queue. This will also cause
527 * any packets in the deferred TX queue to be discarded
528 * automatically.
529 */
530 while ( ! list_empty ( &netdev->tx_queue ) ) {
532 }
533 assert ( list_empty ( &netdev->tx_queue ) );
534 assert ( list_empty ( &netdev->tx_deferred ) );
535}
#define list_empty(list)
Test whether a list is empty.
Definition list.h:137
void netdev_tx_complete_next_err(struct net_device *netdev, int rc)
Complete network transmission.
Definition netdevice.c:510

References assert, ECANCELED, list_empty, netdev, and netdev_tx_complete_next_err().

Referenced by free_netdev(), and netdev_close().

◆ netdev_rx()

void netdev_rx ( struct net_device * netdev,
struct io_buffer * iobuf )

Add packet to receive queue.

Parameters
netdevNetwork device
iobufI/O buffer

The packet is added to the network device's RX queue. This function takes ownership of the I/O buffer.

The I/O buffer will be automatically unmapped for DMA, if applicable.

Definition at line 549 of file netdevice.c.

549 {
550 int rc;
551
552 DBGC2 ( netdev, "NETDEV %s received %p (%p+%zx)\n",
553 netdev->name, iobuf, iobuf->data, iob_len ( iobuf ) );
554
555 /* Discard packet (for test purposes) if applicable */
556 if ( ( rc = inject_fault ( NETDEV_DISCARD_RATE ) ) != 0 ) {
557 netdev_rx_err ( netdev, iobuf, rc );
558 return;
559 }
560
561 /* Unmap I/O buffer, if required */
562 if ( dma_mapped ( &iobuf->map ) )
563 iob_unmap ( iobuf );
564
565 /* Enqueue packet */
566 list_add_tail ( &iobuf->list, &netdev->rx_queue );
567
568 /* Update statistics counter */
569 netdev_record_stat ( &netdev->rx_stats, 0 );
570}
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition netdevice.c:587

References io_buffer::data, DBGC2, dma_mapped(), iob_len(), iob_unmap(), io_buffer::list, list_add_tail, io_buffer::map, netdev, NETDEV_DISCARD_RATE, netdev_record_stat(), netdev_rx_err(), and rc.

Referenced by a3c90x_process_rx_packets(), af_packet_nic_poll(), atl1e_clean_rx_irq(), atl_poll_rx(), axge_in_complete(), b44_process_rx_packets(), bnxt_rx_process(), cgem_poll_rx(), dm96xx_in_complete(), dwmac_poll_rx(), ecm_in_complete(), efab_receive(), efx_hunt_receive(), ena_poll_rx(), eoib_complete_recv(), exanic_poll_rx(), flexboot_nodnic_eth_complete_recv(), gve_poll_rx(), icplus_poll_rx(), ifec_rx_process(), igbvf_process_rx_packets(), intel_poll_rx(), iphone_in_complete(), ipoib_complete_recv(), jme_alloc_and_feed_iob(), legacy_poll(), mnpnet_poll_rx(), myri10ge_net_poll(), myson_poll_rx(), natsemi_poll_rx(), ncm_in_complete(), net80211_rx(), netfront_poll_rx(), nii_poll_rx(), nv_process_rx_packets(), pcnet32_process_rx_packets(), phantom_poll(), pnic_poll(), rdc_poll_rx(), realtek_legacy_poll_rx(), realtek_poll_rx(), rhine_poll_rx(), rndis_rx_data(), sis190_process_rx(), skge_rx_done(), sky2_status_intr(), slirp_send_packet(), smsc75xx_in_complete(), smsc95xx_in_complete(), snpnet_poll_rx(), tap_poll(), tg3_rx_complete(), txnic_complete_rqe(), undinet_poll(), velocity_poll_rx(), virtnet_process_rx_packets(), vlan_netdev_rx(), vlan_rx(), vmxnet3_poll_rx(), and vxge_hw_vpath_poll_rx().

◆ netdev_rx_err()

void netdev_rx_err ( struct net_device * netdev,
struct io_buffer * iobuf,
int rc )

Discard received packet.

Parameters
netdevNetwork device
iobufI/O buffer, or NULL
rcPacket status code

The packet is discarded and an RX error is recorded. This function takes ownership of the I/O buffer. iobuf may be NULL if, for example, the net device wishes to report an error due to being unable to allocate an I/O buffer.

The I/O buffer will be automatically unmapped for DMA, if applicable.

Definition at line 587 of file netdevice.c.

588 {
589
590 DBGC ( netdev, "NETDEV %s failed to receive %p: %s\n",
591 netdev->name, iobuf, strerror ( rc ) );
592
593 /* Unmap I/O buffer, if required */
594 if ( iobuf && dma_mapped ( &iobuf->map ) )
595 iob_unmap ( iobuf );
596
597 /* Discard packet */
598 free_iob ( iobuf );
599
600 /* Update statistics counter */
601 netdev_record_stat ( &netdev->rx_stats, rc );
602}

References DBGC, dma_mapped(), free_iob(), iob_unmap(), io_buffer::map, netdev, netdev_record_stat(), rc, and strerror().

Referenced by a3c90x_process_rx_packets(), atl1e_clean_rx_irq(), axge_in_complete(), axge_intr_complete(), axge_poll(), b44_process_rx_packets(), bnxt_rx_process(), dm96xx_in_complete(), dm96xx_intr_complete(), dm96xx_poll(), dwmac_poll_rx(), ecm_in_complete(), ecm_intr_complete(), ecm_poll(), efx_hunt_receive(), eoib_complete_recv(), exanic_close(), exanic_poll_rx(), flexboot_nodnic_eth_complete_recv(), gve_poll_rx(), icplus_poll_rx(), ifec_rx_process(), igbvf_process_rx_packets(), intel_poll(), intel_poll_rx(), intelx_poll(), intelxvf_poll(), iphone_in_complete(), iphone_poll(), ipoib_complete_recv(), jme_process_receive(), mnpnet_poll_rx(), myson_poll_rx(), myson_refill_rx(), natsemi_poll_rx(), natsemi_refill_rx(), ncm_in_complete(), ncm_intr_complete(), ncm_poll(), net80211_rx(), net80211_rx_err(), net_poll(), netdev_rx(), netdev_rx_flush(), netfront_poll_rx(), netfront_refill_rx(), nii_poll_rx(), nv_process_rx_packets(), pcnet32_process_rx_packets(), phantom_refill_rx_ring(), pnic_poll(), rdc_poll_rx(), realtek_legacy_poll_rx(), realtek_poll_rx(), rhine_poll(), rhine_poll_rx(), rndis_rx(), rndis_rx_data(), rndis_rx_err(), rndis_rx_message(), rndis_rx_status(), skge_rx_done(), sky2_receive(), sky2_status_intr(), slirp_poll(), smsc75xx_in_complete(), smsc75xx_poll(), smsc95xx_in_complete(), smsc95xx_poll(), smscusb_intr_complete(), snpnet_poll_rx(), snpnet_poll_tx(), tg3_rx_complete(), txnic_complete_rqe(), undinet_poll(), velocity_poll_rx(), vlan_netdev_rx(), vlan_netdev_rx_err(), vlan_netdev_rx_err(), vmxnet3_flush_rx(), vmxnet3_poll_events(), vmxnet3_poll_rx(), and vxge_hw_vpath_poll_rx().

◆ netdev_poll()

void netdev_poll ( struct net_device * netdev)

Poll for completed and received packets on network device.

Parameters
netdevNetwork device

Polls the network device for completed transmissions and received packets. Any received packets will be added to the RX packet queue via netdev_rx().

Definition at line 613 of file netdevice.c.

613 {
614
615 /* Call poll() only on open (or insomniac) network devices */
616 if ( ! ( netdev->state & ( NETDEV_OPEN | NETDEV_INSOMNIAC ) ) )
617 return;
618
619 /* Guard against re-entry */
620 if ( netdev->state & NETDEV_POLL_IN_PROGRESS )
621 return;
622
623 /* Poll device */
625 netdev->op->poll ( netdev );
627}
#define NETDEV_INSOMNIAC
Network device must be polled even when closed.
Definition netdevice.h:462
#define NETDEV_POLL_IN_PROGRESS
Network device poll is in progress.
Definition netdevice.h:459
#define NETDEV_OPEN
Network device is open.
Definition netdevice.h:439

References netdev, NETDEV_INSOMNIAC, NETDEV_OPEN, and NETDEV_POLL_IN_PROGRESS.

Referenced by efi_snp_poll(), gdbudp_recv(), iflinkwait(), net_poll(), and vlan_poll().

◆ netdev_rx_dequeue()

struct io_buffer * netdev_rx_dequeue ( struct net_device * netdev)

Remove packet from device's receive queue.

Parameters
netdevNetwork device
Return values
iobufI/O buffer, or NULL

Removes the first packet from the device's RX queue and returns it. Ownership of the packet is transferred to the caller.

Definition at line 638 of file netdevice.c.

638 {
639 struct io_buffer *iobuf;
640
641 iobuf = list_first_entry ( &netdev->rx_queue, struct io_buffer, list );
642 if ( ! iobuf )
643 return NULL;
644
645 list_del ( &iobuf->list );
646 return iobuf;
647}

References io_buffer::list, list_del, list_first_entry, netdev, and NULL.

Referenced by efi_snp_poll(), gdbudp_recv(), net_poll(), netdev_rx_flush(), and pxenv_undi_isr().

◆ netdev_rx_flush()

void netdev_rx_flush ( struct net_device * netdev)
static

Flush device's receive queue.

Parameters
netdevNetwork device

Definition at line 654 of file netdevice.c.

654 {
655 struct io_buffer *iobuf;
656
657 /* Discard any packets in the RX queue */
658 while ( ( iobuf = netdev_rx_dequeue ( netdev ) ) ) {
659 netdev_rx_err ( netdev, iobuf, -ECANCELED );
660 }
661}
struct io_buffer * netdev_rx_dequeue(struct net_device *netdev)
Remove packet from device's receive queue.
Definition netdevice.c:638

References ECANCELED, netdev, netdev_rx_dequeue(), and netdev_rx_err().

Referenced by free_netdev(), and netdev_close().

◆ netdev_config_close()

void netdev_config_close ( struct net_device_configuration * config,
int rc )
static

Finish network device configuration.

Parameters
configNetwork device configuration
rcReason for completion

Definition at line 669 of file netdevice.c.

670 {
671 struct net_device_configurator *configurator = config->configurator;
672 struct net_device *netdev = config->netdev;
673
674 /* Restart interface */
675 intf_restart ( &config->job, rc );
676
677 /* Record configuration result */
678 config->rc = rc;
679 if ( rc == 0 ) {
680 DBGC ( netdev, "NETDEV %s configured via %s\n",
681 netdev->name, configurator->name );
682 } else {
683 DBGC ( netdev, "NETDEV %s configuration via %s failed: %s\n",
684 netdev->name, configurator->name, strerror ( rc ) );
685 }
686}
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition interface.c:344
int rc
Configuration status.
Definition netdevice.h:308
struct net_device_configurator * configurator
Network device configurator.
Definition netdevice.h:306
struct net_device * netdev
Network device.
Definition netdevice.h:304
struct interface job
Job control interface.
Definition netdevice.h:310
A network device configurator.
Definition netdevice.h:314
const char * name
Name.
Definition netdevice.h:316

References net_device_configuration::configurator, DBGC, intf_restart(), net_device_configuration::job, net_device_configurator::name, net_device_configuration::netdev, netdev, net_device_configuration::rc, rc, and strerror().

◆ free_netdev()

void free_netdev ( struct refcnt * refcnt)
static

Free network device.

Parameters
refcntNetwork device reference counter

Definition at line 703 of file netdevice.c.

703 {
704 struct net_device *netdev =
706
707 assert ( ! timer_running ( &netdev->link_block ) );
711 free ( netdev );
712}
static void netdev_tx_flush(struct net_device *netdev)
Flush device's transmit queue.
Definition netdevice.c:524
static void netdev_rx_flush(struct net_device *netdev)
Flush device's receive queue.
Definition netdevice.c:654
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition netdevice.h:590
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
void clear_settings(struct settings *settings)
Clear settings block.
Definition settings.c:1103
A reference counter.
Definition refcnt.h:27

References assert, clear_settings(), container_of, free, netdev, netdev_rx_flush(), netdev_settings(), and netdev_tx_flush().

Referenced by alloc_netdev().

◆ alloc_netdev()

struct net_device * alloc_netdev ( size_t priv_len)

Allocate network device.

Parameters
priv_lenLength of private data area (net_device::priv)
Return values
netdevNetwork device, or NULL

Allocates space for a network device and its private data area.

Definition at line 722 of file netdevice.c.

722 {
723 struct net_device *netdev;
724 struct net_device_configurator *configurator;
725 struct net_device_configuration *config;
726
727 netdev = zalloc ( netdev_priv_offset ( NULL ) + priv_len );
728 if ( netdev ) {
729 ref_init ( &netdev->refcnt, free_netdev );
730 netdev->link_rc = -EUNKNOWN_LINK_STATUS;
731 timer_init ( &netdev->link_block, netdev_link_block_expired,
732 &netdev->refcnt );
733 INIT_LIST_HEAD ( &netdev->tx_queue );
734 INIT_LIST_HEAD ( &netdev->tx_deferred );
735 INIT_LIST_HEAD ( &netdev->rx_queue );
737 config = netdev->configs;
739 config->netdev = netdev;
740 config->configurator = configurator;
741 config->rc = -EUNUSED_CONFIG;
742 intf_init ( &config->job, &netdev_config_desc,
743 &netdev->refcnt );
744 config++;
745 }
746 netdev->priv = netdev_priv ( netdev, NULL );
747 }
748 return netdev;
749}
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition interface.h:204
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
static void netdev_link_block_expired(struct retry_timer *timer, int fail __unused)
Handle network device link block timer expiry.
Definition netdevice.c:277
static void free_netdev(struct refcnt *refcnt)
Free network device.
Definition netdevice.c:703
static struct interface_descriptor netdev_config_desc
Network device configuration interface descriptor.
Definition netdevice.c:695
#define EUNUSED_CONFIG
Default not-yet-attempted-configuration status code.
Definition netdevice.c:74
static void netdev_settings_init(struct net_device *netdev)
Initialise a per-netdevice configuration settings block.
Definition netdevice.h:602
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition refcnt.h:65
A network device configuration.
Definition netdevice.h:302

References net_device_configuration::configurator, EUNKNOWN_LINK_STATUS, EUNUSED_CONFIG, for_each_table_entry, free_netdev(), INIT_LIST_HEAD, intf_init(), net_device_configuration::job, NET_DEVICE_CONFIGURATORS, net_device_configuration::netdev, netdev, netdev_config_desc, netdev_link_block_expired(), netdev_priv(), netdev_priv_offset(), netdev_settings_init(), NULL, net_device_configuration::rc, ref_init, and zalloc().

Referenced by alloc_etherdev(), alloc_ipoibdev(), net80211_alloc(), and nii_start().

◆ register_netdev()

int register_netdev ( struct net_device * netdev)

Register network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Gives the network device a name and adds it to the list of network devices.

Definition at line 760 of file netdevice.c.

760 {
761 struct ll_protocol *ll_protocol = netdev->ll_protocol;
762 struct net_driver *driver;
763 struct net_device *duplicate;
764 unsigned int i;
765 uint32_t seed;
766 void *priv;
767 int rc;
768
769 /* Set initial link-layer address, if not already set */
770 if ( ! netdev_has_ll_addr ( netdev ) ) {
771 ll_protocol->init_addr ( netdev->hw_addr, netdev->ll_addr );
772 }
773
774 /* Set MTU, if not already set */
775 if ( ! netdev->mtu ) {
776 netdev->mtu = ( netdev->max_pkt_len -
778 }
779
780 /* Reject named network devices that already exist */
781 if ( netdev->name[0] && ( duplicate = find_netdev ( netdev->name ) ) ) {
782 DBGC ( netdev, "NETDEV rejecting duplicate name %s\n",
783 duplicate->name );
784 rc = -EEXIST;
785 goto err_duplicate;
786 }
787
788 /* Assign a unique device name, if not already set */
789 if ( netdev->name[0] == '\0' ) {
790 for ( i = 0 ; ; i++ ) {
791 snprintf ( netdev->name, sizeof ( netdev->name ),
792 "net%d", i );
793 if ( find_netdev ( netdev->name ) == NULL )
794 break;
795 }
796 }
797
798 /* Assign a unique non-zero scope ID */
799 for ( netdev->scope_id = 1 ; ; netdev->scope_id++ ) {
800 if ( find_netdev_by_scope_id ( netdev->scope_id ) == NULL )
801 break;
802 }
803
804 /* Use least significant bits of the link-layer address to
805 * improve the randomness of the (non-cryptographic) random
806 * number generator.
807 */
808 memcpy ( &seed, ( netdev->ll_addr + ll_protocol->ll_addr_len
809 - sizeof ( seed ) ), sizeof ( seed ) );
810 srand ( rand() ^ seed );
811
812 /* Add to device list */
813 netdev_get ( netdev );
814 list_add_tail ( &netdev->list, &net_devices );
815 DBGC ( netdev, "NETDEV %s registered (phys %s hwaddr %s)\n",
816 netdev->name, netdev->dev->name,
817 netdev_addr ( netdev ) );
818
819 /* Register per-netdev configuration settings */
821 NULL, netdev->name ) ) != 0 ) {
822 DBGC ( netdev, "NETDEV %s could not register settings: %s\n",
823 netdev->name, strerror ( rc ) );
824 goto err_register_settings;
825 }
826
827 /* Probe device */
829 priv = netdev_priv ( netdev, driver );
830 if ( driver->probe &&
831 ( rc = driver->probe ( netdev, priv ) ) != 0 ) {
832 DBGC ( netdev, "NETDEV %s could not add %s device: "
833 "%s\n", netdev->name, driver->name,
834 strerror ( rc ) );
835 goto err_probe;
836 }
837 }
838
839 /* Attempt to open device automatically, if applicable */
840 if ( netdev->state & NETDEV_AUTO_OPEN )
842
843 return 0;
844
845 err_probe:
847 priv = netdev_priv ( netdev, driver );
848 if ( driver->remove )
849 driver->remove ( netdev, priv );
850 }
853 err_register_settings:
854 list_del ( &netdev->list );
855 netdev_put ( netdev );
856 err_duplicate:
857 return rc;
858}
unsigned int uint32_t
Definition stdint.h:12
#define EEXIST
File exists.
Definition errno.h:389
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct net_device * find_netdev_by_scope_id(unsigned int scope_id)
Get network device by scope ID.
Definition netdevice.c:1015
struct list_head net_devices
List of network devices.
Definition netdevice.c:54
int netdev_open(struct net_device *netdev)
Open network device.
Definition netdevice.c:866
static int netdev_has_ll_addr(struct net_device *netdev)
Check whether or not network device has a link-layer address.
Definition netdevice.c:102
struct net_device * find_netdev(const char *name)
Get network device by name.
Definition netdevice.c:993
static struct net_device * netdev_get(struct net_device *netdev)
Get reference to network device.
Definition netdevice.h:568
#define NETDEV_AUTO_OPEN
Network device should be opened automatically.
Definition netdevice.h:465
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition netdevice.h:579
static const char * netdev_addr(struct net_device *netdev)
Get printable network device link-layer address.
Definition netdevice.h:545
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition settings.c:476
void unregister_settings(struct settings *settings)
Unregister settings block.
Definition settings.c:515
static void srand(unsigned int seed)
Definition stdlib.h:64
static int rand(void)
Definition stdlib.h:60
A link-layer protocol.
Definition netdevice.h:115
void(* init_addr)(const void *hw_addr, void *ll_addr)
Initialise link-layer address.
Definition netdevice.h:151
uint8_t ll_addr_len
Link-layer address length.
Definition netdevice.h:199
uint8_t ll_header_len
Link-layer header length.
Definition netdevice.h:201
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition netdevice.h:363
int(* probe)(struct net_device *netdev, void *priv)
Probe device.
Definition netdevice.h:491
void(* remove)(struct net_device *netdev, void *priv)
Remove device.
Definition netdevice.h:503
const char * name
Name.
Definition netdevice.h:482
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition vsprintf.c:383

References clear_settings(), DBGC, EEXIST, find_netdev(), find_netdev_by_scope_id(), for_each_table_entry, for_each_table_entry_continue_reverse, ll_protocol::init_addr, list_add_tail, list_del, ll_protocol::ll_addr_len, ll_protocol::ll_header_len, memcpy(), net_device::name, net_driver::name, net_devices, NET_DRIVERS, netdev, netdev_addr(), NETDEV_AUTO_OPEN, netdev_get(), netdev_has_ll_addr(), netdev_open(), netdev_priv(), netdev_put(), netdev_settings(), NULL, priv, net_driver::probe, rand(), rc, register_settings(), net_driver::remove, snprintf(), srand(), strerror(), and unregister_settings().

Referenced by a3c90x_probe(), af_packet_nic_probe(), atl1e_probe(), atl_probe(), axge_probe(), b44_probe(), bnxt_init_one(), cgem_probe(), dm96xx_probe(), dwmac_probe(), ecm_probe(), efab_probe(), ena_probe(), eoib_create(), exanic_probe_port(), flexboot_nodnic_register_netdev(), forcedeth_probe(), gve_probe(), hermon_register_netdev(), hunt_probe(), ice_probe(), icplus_probe(), ifec_pci_probe(), igbvf_probe(), intel_probe(), intelx_probe(), intelxl_probe(), intelxlvf_probe(), intelxvf_probe(), iphone_probe(), ipoib_probe(), jme_probe(), lan78xx_probe(), legacy_probe(), mnpnet_start(), myri10ge_pci_probe(), myson_probe(), natsemi_probe(), ncm_probe(), net80211_register(), netfront_probe(), nii_start(), pcnet32_probe(), phantom_probe(), pnic_probe(), rdc_probe(), realtek_probe(), register_rndis(), rhine_probe(), sis190_probe(), skeleton_probe(), skge_probe(), sky2_probe(), slirp_probe(), smsc75xx_probe(), smsc95xx_probe(), snpnet_start(), tap_probe(), testnet_okx(), tg3_init_one(), txnic_lmac_probe(), undinet_probe(), velocity_probe(), virtnet_probe_legacy(), virtnet_probe_modern(), vlan_create(), vmxnet3_probe(), and vxge_device_register().

◆ netdev_open()

int netdev_open ( struct net_device * netdev)

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 866 of file netdevice.c.

866 {
867 int rc;
868
869 /* Do nothing if device is already open */
870 if ( netdev->state & NETDEV_OPEN )
871 return 0;
872
873 DBGC ( netdev, "NETDEV %s opening\n", netdev->name );
874
875 /* Mark as opened */
876 netdev->state |= NETDEV_OPEN;
877
878 /* Open the device */
879 if ( ( rc = netdev->op->open ( netdev ) ) != 0 )
880 goto err;
881
882 /* Add to head of open devices list */
883 list_add ( &netdev->open_list, &open_net_devices );
884
885 /* Notify drivers of device state change */
887
888 return 0;
889
890 err:
891 netdev->state &= ~NETDEV_OPEN;
892 return rc;
893}
#define list_add(new, head)
Add a new entry to the head of a list.
Definition list.h:70
static struct list_head open_net_devices
List of open network devices, in reverse order of opening.
Definition netdevice.c:57

References DBGC, list_add, netdev, netdev_notify(), NETDEV_OPEN, open_net_devices, and rc.

Referenced by apply_netdev_settings(), efi_autoexec_network(), efi_snp_initialize(), efi_snp_reset(), gdbudp_ensure_netdev_open(), ifopen(), iwlist(), netvsc_reset(), pxe_exec(), pxe_netdev_open(), pxenv_udp_open(), register_netdev(), testnet_open_okx(), vlan_open(), vlan_sync(), and xve_open().

◆ netdev_close()

void netdev_close ( struct net_device * netdev)

Close network device.

Parameters
netdevNetwork device

Definition at line 900 of file netdevice.c.

900 {
901 unsigned int num_configs;
902 unsigned int i;
903
904 /* Do nothing if device is already closed */
905 if ( ! ( netdev->state & NETDEV_OPEN ) )
906 return;
907
908 DBGC ( netdev, "NETDEV %s closing\n", netdev->name );
909
910 /* Terminate any ongoing configurations. Use intf_close()
911 * rather than intf_restart() to allow the cancellation to be
912 * reported back to us if a configuration is actually in
913 * progress.
914 */
916 for ( i = 0 ; i < num_configs ; i++ )
917 intf_close ( &netdev->configs[i].job, -ECANCELED );
918
919 /* Remove from open devices list */
920 list_del ( &netdev->open_list );
921
922 /* Mark as closed */
923 netdev->state &= ~NETDEV_OPEN;
924
925 /* Notify drivers of device state change */
927
928 /* Close the device */
929 netdev->op->close ( netdev );
930
931 /* Stop link block timer */
932 stop_timer ( &netdev->link_block );
933
934 /* Flush TX and RX queues */
937}
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition interface.c:250

References DBGC, ECANCELED, intf_close(), list_del, NET_DEVICE_CONFIGURATORS, netdev, netdev_notify(), NETDEV_OPEN, netdev_rx_flush(), netdev_tx_flush(), stop_timer(), and table_num_entries.

Referenced by apply_netdev_settings(), efi_snp_reset(), efi_snp_shutdown(), ifclose(), ifconf_payload(), iflinkwait_payload(), iwlist(), netvsc_reset(), pxe_netdev_close(), testnet_close_okx(), unregister_netdev(), vlan_close(), vlan_sync(), and xve_close().

◆ unregister_netdev()

void unregister_netdev ( struct net_device * netdev)

Unregister network device.

Parameters
netdevNetwork device

Removes the network device from the list of network devices.

Definition at line 946 of file netdevice.c.

946 {
947 struct net_driver *driver;
948 void *priv;
949
950 /* Ensure device is closed */
952
953 /* Remove device */
955 priv = netdev_priv ( netdev, driver );
956 if ( driver->remove )
957 driver->remove ( netdev, priv );
958 }
959
960 /* Unregister per-netdev configuration settings */
963
964 /* Remove from device list */
965 DBGC ( netdev, "NETDEV %s unregistered\n", netdev->name );
966 list_del ( &netdev->list );
967 netdev_put ( netdev );
968}
void netdev_close(struct net_device *netdev)
Close network device.
Definition netdevice.c:900
#define for_each_table_entry_reverse(pointer, table)
Iterate through all entries within a linker table in reverse order.
Definition tables.h:441

References clear_settings(), DBGC, for_each_table_entry_reverse, list_del, NET_DRIVERS, netdev, netdev_close(), netdev_priv(), netdev_put(), netdev_settings(), priv, net_driver::remove, and unregister_settings().

Referenced by a3c90x_remove(), af_packet_nic_probe(), af_packet_nic_remove(), atl1e_remove(), atl_remove(), axge_probe(), axge_remove(), b44_remove(), bnxt_init_one(), bnxt_remove_one(), cgem_probe(), cgem_remove(), dm96xx_probe(), dm96xx_remove(), dwmac_probe(), dwmac_remove(), ecm_probe(), ecm_remove(), efab_probe(), efab_remove(), ena_probe(), ena_remove(), eoib_create(), eoib_destroy(), exanic_probe_port(), exanic_remove_port(), flexboot_nodnic_unregister_netdev(), forcedeth_remove(), gve_probe(), gve_remove(), hermon_register_netdev(), hermon_unregister_netdev(), hunt_remove(), ice_probe(), ice_remove(), icplus_probe(), icplus_remove(), ifec_pci_remove(), igbvf_remove(), intel_probe(), intel_remove(), intelx_probe(), intelx_remove(), intelxl_probe(), intelxl_remove(), intelxlvf_probe(), intelxlvf_remove(), intelxvf_probe(), intelxvf_remove(), iphone_probe(), iphone_remove(), ipoib_probe(), ipoib_remove(), jme_remove(), lan78xx_probe(), lan78xx_remove(), legacy_remove(), mnpnet_start(), mnpnet_stop(), myri10ge_pci_probe(), myri10ge_pci_remove(), myson_probe(), myson_remove(), natsemi_probe(), natsemi_remove(), ncm_probe(), ncm_remove(), net80211_unregister(), netfront_probe(), netfront_remove(), nii_start(), nii_stop(), pcnet32_remove(), phantom_probe(), phantom_remove(), pnic_remove(), rdc_probe(), rdc_remove(), realtek_probe(), realtek_remove(), register_rndis(), rhine_remove(), sis190_remove(), skeleton_probe(), skeleton_remove(), skge_remove(), sky2_remove(), slirp_probe(), slirp_remove(), smsc75xx_probe(), smsc75xx_remove(), smsc95xx_probe(), smsc95xx_remove(), snpnet_start(), snpnet_stop(), tap_probe(), tap_remove(), testnet_remove_okx(), tg3_remove_one(), txnic_lmac_probe(), txnic_lmac_remove(), undinet_remove(), unregister_rndis(), velocity_remove(), virtnet_probe_legacy(), virtnet_probe_modern(), virtnet_remove(), vlan_create(), vlan_destroy(), vmxnet3_probe(), vmxnet3_remove(), and vxge_device_unregister().

◆ netdev_irq()

void netdev_irq ( struct net_device * netdev,
int enable )

Enable or disable interrupts.

Parameters
netdevNetwork device
enableInterrupts should be enabled

Definition at line 975 of file netdevice.c.

975 {
976
977 /* Enable or disable device interrupts, if applicable */
979 netdev->op->irq ( netdev, enable );
980
981 /* Record interrupt enabled state */
982 netdev->state &= ~NETDEV_IRQ_ENABLED;
983 if ( enable )
984 netdev->state |= NETDEV_IRQ_ENABLED;
985}
static int netdev_irq_supported(struct net_device *netdev)
Check whether or not network device supports interrupts.
Definition netdevice.h:676
#define NETDEV_IRQ_ENABLED
Network device interrupts are enabled.
Definition netdevice.h:442

References netdev, NETDEV_IRQ_ENABLED, and netdev_irq_supported().

Referenced by pxe_netdev_close(), pxe_netdev_open(), pxenv_undi_isr(), pxenv_undi_transmit(), virtnet_open_legacy(), virtnet_open_modern(), and vlan_irq().

◆ find_netdev()

struct net_device * find_netdev ( const char * name)

Get network device by name.

Parameters
nameNetwork device name
Return values
netdevNetwork device, or NULL

Definition at line 993 of file netdevice.c.

993 {
994 struct net_device *netdev;
995
996 /* Allow "netX" shortcut */
997 if ( strcmp ( name, "netX" ) == 0 )
998 return last_opened_netdev();
999
1000 /* Identify network device by name */
1002 if ( strcmp ( netdev->name, name ) == 0 )
1003 return netdev;
1004 }
1005
1006 return NULL;
1007}
const char * name
Definition ath9k_hw.c:1986
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
struct net_device * last_opened_netdev(void)
Get most recently opened network device.
Definition netdevice.c:1052
int strcmp(const char *first, const char *second)
Compare strings.
Definition string.c:174
struct list_head list
List of network devices.
Definition netdevice.h:357

References last_opened_netdev(), net_device::list, list_for_each_entry, name, net_devices, netdev, NULL, and strcmp().

Referenced by gdbudp_configure(), ipv6_sock_aton(), netdev_redirect(), parse_netdev(), and register_netdev().

◆ find_netdev_by_scope_id()

struct net_device * find_netdev_by_scope_id ( unsigned int scope_id)

Get network device by scope ID.

Parameters
indexNetwork device index
Return values
netdevNetwork device, or NULL

Definition at line 1015 of file netdevice.c.

1015 {
1016 struct net_device *netdev;
1017
1018 /* Identify network device by index */
1020 if ( netdev->scope_id == scope_id )
1021 return netdev;
1022 }
1023
1024 return NULL;
1025}
unsigned int scope_id
Scope ID.
Definition netdevice.h:361

References net_device::list, list_for_each_entry, net_devices, netdev, NULL, and net_device::scope_id.

Referenced by ipv6_sock_ntoa(), and register_netdev().

◆ find_netdev_by_location()

struct net_device * find_netdev_by_location ( unsigned int bus_type,
unsigned int location )

Get network device by PCI bus:dev.fn address.

Parameters
bus_typeBus type
locationBus location
Return values
netdevNetwork device, or NULL

Definition at line 1034 of file netdevice.c.

1035 {
1036 struct net_device *netdev;
1037
1039 if ( ( netdev->dev->desc.bus_type == bus_type ) &&
1040 ( netdev->dev->desc.location == location ) )
1041 return netdev;
1042 }
1043
1044 return NULL;
1045}

References net_device::list, list_for_each_entry, net_devices, netdev, and NULL.

Referenced by pxenv_start_undi().

◆ last_opened_netdev()

struct net_device * last_opened_netdev ( void )

Get most recently opened network device.

Return values
netdevMost recently opened network device, or NULL

Definition at line 1052 of file netdevice.c.

1052 {
1053 struct net_device *netdev;
1054
1056 open_list );
1057 if ( ! netdev )
1058 return NULL;
1059
1061 return netdev;
1062}
struct list_head open_list
List of open network devices.
Definition netdevice.h:359

References assert, list_first_entry, netdev, netdev_is_open(), NULL, net_device::open_list, and open_net_devices.

Referenced by aoe_open(), find_netdev(), ipv6_sock_aton(), last_opened_snpdev(), nbi_prepare_dhcp(), and pxe_exec().

◆ net_tx()

int net_tx ( struct io_buffer * iobuf,
struct net_device * netdev,
struct net_protocol * net_protocol,
const void * ll_dest,
const void * ll_source )

Transmit network-layer packet.

Parameters
iobufI/O buffer
netdevNetwork device
net_protocolNetwork-layer protocol
ll_destDestination link-layer address
ll_sourceSource link-layer address
Return values
rcReturn status code

Prepends link-layer headers to the I/O buffer and transmits the packet via the specified network device. This function takes ownership of the I/O buffer.

Definition at line 1078 of file netdevice.c.

1080 {
1081 struct ll_protocol *ll_protocol = netdev->ll_protocol;
1082 int rc;
1083
1084 /* Add link-layer header */
1085 if ( ( rc = ll_protocol->push ( netdev, iobuf, ll_dest, ll_source,
1086 net_protocol->net_proto ) ) != 0 ) {
1087 /* Record error for diagnosis */
1088 netdev_tx_err ( netdev, iobuf, rc );
1089 return rc;
1090 }
1091
1092 /* Transmit packet */
1093 return netdev_tx ( netdev, iobuf );
1094}
int(* push)(struct net_device *netdev, struct io_buffer *iobuf, const void *ll_dest, const void *ll_source, uint16_t net_proto)
Add link-layer header.
Definition netdevice.h:128
A network-layer protocol.
Definition netdevice.h:65
uint16_t net_proto
Network-layer protocol.
Definition netdevice.h:100

References net_protocol::net_proto, netdev, netdev_tx(), netdev_tx_err(), ll_protocol::push, and rc.

Referenced by aoecmd_tx(), arp_rx(), arp_tx_request(), eapol_tx(), eth_slow_lacp_rx(), eth_slow_marker_rx(), fcoe_deliver(), fcoe_fip_tx_keepalive(), fcoe_fip_tx_solicitation(), fcoe_fip_tx_vlan(), ipv4_tx(), ipv6_tx(), loopback_test(), neighbour_tx(), neighbour_tx_queue(), vlan_transmit(), and wpa_send_eapol().

◆ net_rx()

int net_rx ( struct io_buffer * iobuf,
struct net_device * netdev,
uint16_t net_proto,
const void * ll_dest,
const void * ll_source,
unsigned int flags )

Process received network-layer packet.

Parameters
iobufI/O buffer
netdevNetwork device
net_protoNetwork-layer protocol, in network-byte order
ll_destDestination link-layer address
ll_sourceSource link-layer address
flagsPacket flags
Return values
rcReturn status code

Definition at line 1107 of file netdevice.c.

1109 {
1110 struct net_protocol *net_protocol;
1111
1112 /* Hand off to network-layer protocol, if any */
1115 return net_protocol->rx ( iobuf, netdev, ll_dest,
1116 ll_source, flags );
1117 }
1118
1119 DBGC ( netdev, "NETDEV %s unknown network protocol %04x\n",
1120 netdev->name, ntohs ( net_proto ) );
1121 free_iob ( iobuf );
1122 return -ENOTSUP;
1123}
uint8_t flags
Flags.
Definition ena.h:7
#define ENOTSUP
Operation not supported.
Definition errno.h:590
#define ntohs(value)
Definition byteswap.h:137
#define NET_PROTOCOLS
Network-layer protocol table.
Definition netdevice.h:474
int(* rx)(struct io_buffer *iobuf, struct net_device *netdev, const void *ll_dest, const void *ll_source, unsigned int flags)
Process received packet.
Definition netdevice.h:80

References DBGC, ENOTSUP, flags, for_each_table_entry, free_iob(), net_protocol::net_proto, NET_PROTOCOLS, netdev, ntohs, and net_protocol::rx.

Referenced by net_poll().

◆ net_poll()

void net_poll ( void )

Poll the network stack.

This polls all interfaces for received packets, and processes packets from the RX queue.

Definition at line 1131 of file netdevice.c.

1131 {
1132 struct net_device *netdev;
1133 struct io_buffer *iobuf;
1134 struct ll_protocol *ll_protocol;
1135 const void *ll_dest;
1136 const void *ll_source;
1137 uint16_t net_proto;
1138 unsigned int flags;
1139 int rc;
1140
1141 /* Poll and process each network device */
1143
1144 /* Poll for new packets */
1145 profile_start ( &net_poll_profiler );
1146 netdev_poll ( netdev );
1147 profile_stop ( &net_poll_profiler );
1148
1149 /* Leave received packets on the queue if receive
1150 * queue processing is currently frozen. This will
1151 * happen when the raw packets are to be manually
1152 * dequeued using netdev_rx_dequeue(), rather than
1153 * processed via the usual networking stack.
1154 */
1155 if ( netdev_rx_frozen ( netdev ) )
1156 continue;
1157
1158 /* Process all received packets */
1159 while ( ( iobuf = netdev_rx_dequeue ( netdev ) ) ) {
1160
1161 DBGC2 ( netdev, "NETDEV %s processing %p (%p+%zx)\n",
1162 netdev->name, iobuf, iobuf->data,
1163 iob_len ( iobuf ) );
1164 profile_start ( &net_rx_profiler );
1165
1166 /* Remove link-layer header */
1167 ll_protocol = netdev->ll_protocol;
1168 if ( ( rc = ll_protocol->pull ( netdev, iobuf,
1169 &ll_dest, &ll_source,
1170 &net_proto,
1171 &flags ) ) != 0 ) {
1172 free_iob ( iobuf );
1173 continue;
1174 }
1175
1176 /* Hand packet to network layer */
1177 if ( ( rc = net_rx ( iob_disown ( iobuf ), netdev,
1178 net_proto, ll_dest,
1179 ll_source, flags ) ) != 0 ) {
1180 /* Record error for diagnosis */
1182 }
1183 profile_stop ( &net_rx_profiler );
1184 }
1185 }
1186}
unsigned short uint16_t
Definition stdint.h:11
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition iobuf.h:217
int net_rx(struct io_buffer *iobuf, struct net_device *netdev, uint16_t net_proto, const void *ll_dest, const void *ll_source, unsigned int flags)
Process received network-layer packet.
Definition netdevice.c:1107
void netdev_poll(struct net_device *netdev)
Poll for completed and received packets on network device.
Definition netdevice.c:613
static int netdev_rx_frozen(struct net_device *netdev)
Check whether or not network device receive queue processing is frozen.
Definition netdevice.h:699
int(* pull)(struct net_device *netdev, struct io_buffer *iobuf, const void **ll_dest, const void **ll_source, uint16_t *net_proto, unsigned int *flags)
Remove link-layer header.
Definition netdevice.h:142

References io_buffer::data, DBGC2, flags, free_iob(), iob_disown, iob_len(), list_for_each_entry, net_devices, net_rx(), netdev, netdev_poll(), netdev_rx_dequeue(), netdev_rx_err(), netdev_rx_frozen(), NULL, profile_start(), profile_stop(), ll_protocol::pull, and rc.

Referenced by loopback_wait(), net_step(), and pxenv_undi_isr().

◆ net_step()

void net_step ( struct process *process __unused)
static

Single-step the network stack.

Parameters
processNetwork stack process

Definition at line 1193 of file netdevice.c.

1193 {
1194 net_poll();
1195}
void net_poll(void)
Poll the network stack.
Definition netdevice.c:1131

References __unused, and net_poll().

Referenced by PERMANENT_PROCESS().

◆ vlan_tci()

__weak unsigned int vlan_tci ( struct net_device *netdev __unused)

Get the VLAN tag control information (when VLAN support is not present)

Parameters
netdevNetwork device
Return values
tag0, indicating that device is not a VLAN device

Definition at line 1203 of file netdevice.c.

1203 {
1204 return 0;
1205}

References __unused, __weak, and netdev.

Referenced by efi_snp_probe(), efi_vlan_find(), and vlan_tag().

◆ vlan_netdev_rx()

__weak void vlan_netdev_rx ( struct net_device * netdev,
unsigned int tag,
struct io_buffer * iobuf )

Add VLAN tag-stripped packet to queue (when VLAN support is not present)

Parameters
netdevNetwork device
tagVLAN tag, or zero
iobufI/O buffer

Definition at line 1214 of file netdevice.c.

1215 {
1216
1217 if ( tag == 0 ) {
1218 netdev_rx ( netdev, iobuf );
1219 } else {
1220 netdev_rx_err ( netdev, iobuf, -ENODEV );
1221 }
1222}
uint64_t tag
Identity tag.
Definition edd.h:1
#define ENODEV
No such device.
Definition errno.h:510
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition netdevice.c:549

References __weak, ENODEV, netdev, netdev_rx(), netdev_rx_err(), and tag.

Referenced by hermon_eth_complete_recv(), and intelxl_poll_rx().

◆ vlan_netdev_rx_err()

__weak void vlan_netdev_rx_err ( struct net_device * netdev,
unsigned int tag __unused,
struct io_buffer * iobuf,
int rc )

Discard received VLAN tag-stripped packet (when VLAN support is not present)

Parameters
netdevNetwork device
tagVLAN tag, or zero
iobufI/O buffer, or NULL
rcPacket status code

Definition at line 1232 of file netdevice.c.

1234 {
1235
1236 netdev_rx_err ( netdev, iobuf, rc );
1237}

References __unused, __weak, netdev, netdev_rx_err(), rc, and tag.

Referenced by hermon_eth_complete_recv(), and intelxl_poll_rx().

◆ PERMANENT_PROCESS()

PERMANENT_PROCESS ( net_process ,
net_step  )

Networking stack process.

References net_step().

◆ net_discard()

unsigned int net_discard ( void )
static

Discard some cached network device data.

Return values
discardedNumber of cached items discarded

Definition at line 1247 of file netdevice.c.

1247 {
1248 struct net_device *netdev;
1249 struct io_buffer *iobuf;
1250 unsigned int discarded = 0;
1251
1252 /* Try to drop one deferred TX packet from each network device */
1254 if ( ( iobuf = list_first_entry ( &netdev->tx_deferred,
1255 struct io_buffer,
1256 list ) ) != NULL ) {
1257
1258 /* Discard first deferred packet */
1259 list_del ( &iobuf->list );
1260 if ( dma_mapped ( &iobuf->map ) )
1261 iob_unmap ( iobuf );
1262 free_iob ( iobuf );
1263
1264 /* Report discard */
1265 discarded++;
1266 }
1267 }
1268
1269 return discarded;
1270}
#define for_each_netdev(netdev)
Iterate over all network devices.
Definition netdevice.h:550

References dma_mapped(), for_each_netdev, free_iob(), iob_unmap(), io_buffer::list, list_del, list_first_entry, io_buffer::map, netdev, and NULL.

Referenced by __cache_discarder().

◆ __cache_discarder()

struct cache_discarder net_discarder __cache_discarder ( CACHE_NORMAL )

Network device cache discarder.

References __cache_discarder, CACHE_NORMAL, and net_discard().

◆ find_netdev_configurator()

struct net_device_configurator * find_netdev_configurator ( const char * name)

Find network device configurator.

Parameters
nameName
Return values
configuratorNetwork device configurator, or NULL

Definition at line 1283 of file netdevice.c.

1283 {
1284 struct net_device_configurator *configurator;
1285
1287 if ( strcmp ( configurator->name, name ) == 0 )
1288 return configurator;
1289 }
1290 return NULL;
1291}

References for_each_table_entry, name, net_device_configurator::name, NET_DEVICE_CONFIGURATORS, NULL, and strcmp().

Referenced by parse_netdev_configurator().

◆ netdev_configure()

int netdev_configure ( struct net_device * netdev,
struct net_device_configurator * configurator )

Start network device configuration.

Parameters
netdevNetwork device
configuratorNetwork device configurator
Return values
rcReturn status code

Definition at line 1300 of file netdevice.c.

1301 {
1302 struct net_device_configuration *config =
1304 int rc;
1305
1306 /* Check applicability of configurator */
1308 DBGC ( netdev, "NETDEV %s does not support configuration via "
1309 "%s\n", netdev->name, configurator->name );
1310 return -ENOTSUP;
1311 }
1312
1313 /* Terminate any ongoing configuration */
1314 intf_restart ( &config->job, -ECANCELED );
1315
1316 /* Mark configuration as being in progress */
1317 config->rc = -EINPROGRESS_CONFIG;
1318
1319 DBGC ( netdev, "NETDEV %s starting configuration via %s\n",
1320 netdev->name, configurator->name );
1321
1322 /* Start configuration */
1323 if ( ( rc = configurator->start ( &config->job, netdev ) ) != 0 ) {
1324 DBGC ( netdev, "NETDEV %s could not start configuration via "
1325 "%s: %s\n", netdev->name, configurator->name,
1326 strerror ( rc ) );
1327 config->rc = rc;
1328 return rc;
1329 }
1330
1331 return 0;
1332}
#define EINPROGRESS_CONFIG
Default configuration-in-progress status code.
Definition netdevice.c:79
static struct net_device_configuration * netdev_configuration(struct net_device *netdev, struct net_device_configurator *configurator)
Get network device configuration.
Definition netdevice.h:615
static int netdev_configurator_applies(struct net_device *netdev, struct net_device_configurator *configurator)
Check if configurator applies to network device.
Definition netdevice.h:630
int(* start)(struct interface *job, struct net_device *netdev)
Start configuring network device.
Definition netdevice.h:329

References net_device_configuration::configurator, DBGC, ECANCELED, EINPROGRESS_CONFIG, ENOTSUP, intf_restart(), net_device_configuration::job, net_device_configurator::name, netdev, netdev_configuration(), netdev_configurator_applies(), net_device_configuration::rc, rc, net_device_configurator::start, and strerror().

Referenced by ifconf(), and netdev_configure_all().

◆ netdev_configure_all()

int netdev_configure_all ( struct net_device * netdev)

Start network device configuration via all supported configurators.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 1340 of file netdevice.c.

1340 {
1341 struct net_device_configurator *configurator;
1342 int rc;
1343
1344 /* Start configuration for each configurator */
1346
1347 /* Skip any inapplicable configurators */
1348 if ( ! netdev_configurator_applies ( netdev, configurator ) )
1349 continue;
1350
1351 /* Start configuration */
1352 if ( ( rc = netdev_configure ( netdev, configurator ) ) != 0 )
1353 return rc;
1354 }
1355
1356 return 0;
1357}
int netdev_configure(struct net_device *netdev, struct net_device_configurator *configurator)
Start network device configuration.
Definition netdevice.c:1300

References for_each_table_entry, NET_DEVICE_CONFIGURATORS, netdev, netdev_configurator_applies(), netdev_configure(), and rc.

Referenced by efi_pxe_dhcp(), and ifconf().

◆ netdev_has_configuration_rc()

int netdev_has_configuration_rc ( struct net_device * netdev,
int rc )
static

Check if network device has a configuration with a specified status code.

Parameters
netdevNetwork device
rcStatus code
Return values
has_rcNetwork device has a configuration with this status code

Definition at line 1366 of file netdevice.c.

1366 {
1367 unsigned int num_configs;
1368 unsigned int i;
1369
1371 for ( i = 0 ; i < num_configs ; i++ ) {
1372 if ( netdev->configs[i].rc == rc )
1373 return 1;
1374 }
1375 return 0;
1376}

References NET_DEVICE_CONFIGURATORS, netdev, rc, and table_num_entries.

Referenced by netdev_configuration_in_progress(), and netdev_configuration_ok().

◆ netdev_configuration_in_progress()

int netdev_configuration_in_progress ( struct net_device * netdev)

Check if network device configuration is in progress.

Parameters
netdevNetwork device
Return values
is_in_progressNetwork device configuration is in progress

Definition at line 1384 of file netdevice.c.

1384 {
1385
1387}
static int netdev_has_configuration_rc(struct net_device *netdev, int rc)
Check if network device has a configuration with a specified status code.
Definition netdevice.c:1366

References EINPROGRESS_CONFIG, netdev, and netdev_has_configuration_rc().

Referenced by efi_pxe_dhcp(), and ifconf_progress().

◆ netdev_configuration_ok()

int netdev_configuration_ok ( struct net_device * netdev)

Check if network device has at least one successful configuration.

Parameters
netdevNetwork device
configuratorConfigurator
Return values
rcReturn status code

Definition at line 1396 of file netdevice.c.

1396 {
1397
1398 return netdev_has_configuration_rc ( netdev, 0 );
1399}

References netdev, and netdev_has_configuration_rc().

Referenced by efi_pxe_dhcp(), and ifconf_progress().

Variable Documentation

◆ net_devices

struct list_head net_devices = LIST_HEAD_INIT ( net_devices )

List of network devices.

Definition at line 54 of file netdevice.c.

Referenced by find_netdev(), find_netdev_by_location(), find_netdev_by_scope_id(), have_netdevs(), net_poll(), and register_netdev().

◆ open_net_devices

struct list_head open_net_devices = LIST_HEAD_INIT ( open_net_devices )
static

List of open network devices, in reverse order of opening.

Definition at line 57 of file netdevice.c.

Referenced by last_opened_netdev(), and netdev_open().

◆ __profiler

struct profiler net_tx_profiler __profiler = { .name = "net.poll" }
static

Network polling profiler.

Network transmit profiler.

Network receive profiler.

Definition at line 60 of file netdevice.c.

60{ .name = "net.poll" };

◆ __errortab

struct errortab netdev_errors [] __errortab
Initial value:
= {
}
#define __einfo_errortab(einfo)
Definition errortab.h:24
#define EINFO_EUNKNOWN_LINK_STATUS
Definition fc.c:187
#define EINFO_EUNUSED_CONFIG
Definition netdevice.c:75
#define EINFO_ENOTCONN_LINK_DOWN
Definition netdevice.c:85
#define EINFO_EINPROGRESS_CONFIG
Definition netdevice.c:80

Human-readable message for the default link statuses.

Definition at line 89 of file netdevice.c.

◆ netdev_config_ops

struct interface_operation netdev_config_ops[]
static
Initial value:
= {
}
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition interface.h:33
static void netdev_config_close(struct net_device_configuration *config, int rc)
Finish network device configuration.
Definition netdevice.c:669

Network device configuration interface operations.

Definition at line 689 of file netdevice.c.

689 {
692};

◆ netdev_config_desc

struct interface_descriptor netdev_config_desc
static
Initial value:
=
#define INTF_DESC(object_type, intf, operations)
Define an object interface descriptor.
Definition interface.h:81
static struct interface_operation netdev_config_ops[]
Network device configuration interface operations.
Definition netdevice.c:689

Network device configuration interface descriptor.

Definition at line 695 of file netdevice.c.

Referenced by alloc_netdev().