iPXE
Macros | Functions | Variables
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. More...
 
#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. More...
 
#define EINFO_EUNUSED_CONFIG   __einfo_uniqify ( EINFO_EINPROGRESS, 0x02, "Unused" )
 
#define EINPROGRESS_CONFIG   __einfo_error ( EINFO_EINPROGRESS_CONFIG )
 Default configuration-in-progress status code. More...
 
#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. More...
 
#define EINFO_ENOTCONN_LINK_DOWN   __einfo_uniqify ( EINFO_ENOTCONN, 0x01, "Down" )
 

Functions

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

Variables

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

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 68 of file netdevice.c.

◆ EINFO_EUNKNOWN_LINK_STATUS

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

Definition at line 69 of file netdevice.c.

◆ EUNUSED_CONFIG

#define EUNUSED_CONFIG   __einfo_error ( EINFO_EUNUSED_CONFIG )

Default not-yet-attempted-configuration status code.

Definition at line 73 of file netdevice.c.

◆ EINFO_EUNUSED_CONFIG

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

Definition at line 74 of file netdevice.c.

◆ EINPROGRESS_CONFIG

#define EINPROGRESS_CONFIG   __einfo_error ( EINFO_EINPROGRESS_CONFIG )

Default configuration-in-progress status code.

Definition at line 78 of file netdevice.c.

◆ EINFO_EINPROGRESS_CONFIG

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

Definition at line 79 of file netdevice.c.

◆ ENOTCONN_LINK_DOWN

#define ENOTCONN_LINK_DOWN   __einfo_error ( EINFO_ENOTCONN_LINK_DOWN )

Default link-down status code.

Definition at line 83 of file netdevice.c.

◆ EINFO_ENOTCONN_LINK_DOWN

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

Definition at line 84 of file netdevice.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ netdev_has_ll_addr()

static 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 101 of file netdevice.c.

101  {
102  uint8_t *ll_addr = netdev->ll_addr;
103  size_t remaining = sizeof ( netdev->ll_addr );
104 
105  while ( remaining-- ) {
106  if ( *(ll_addr++) != 0 )
107  return 1;
108  }
109  return 0;
110 }
static struct net_device * netdev
Definition: gdbudp.c:52
unsigned char uint8_t
Definition: stdint.h:10
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387

References net_device::ll_addr, and netdev.

Referenced by register_netdev().

◆ netdev_priv_offset()

static 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 118 of file netdevice.c.

118  {
119  struct net_device *netdev;
120  unsigned int num_configs;
121  size_t offset;
122 
123  /* Allow space for network device */
124  offset = sizeof ( *netdev );
125 
126  /* Allow space for configurations */
128  offset += ( num_configs * sizeof ( netdev->configs[0] ) );
129 
130  /* Place variable-length device driver private data at end */
131  if ( ! driver )
132  driver = table_end ( NET_DRIVERS );
133 
134  /* Allow space for preceding upper-layer drivers' private data */
136  offset += driver->priv_len;
137  }
138 
139  /* Sanity check */
140  assert ( ( offset & ( sizeof ( void * ) - 1 ) ) == 0 );
141 
142  return offset;
143 }
size_t priv_len
Size of private data.
Definition: netdevice.h:477
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
struct net_device_configuration configs[0]
Network device configurations (variable length)
Definition: netdevice.h:434
static struct net_device * netdev
Definition: gdbudp.c:52
#define NET_DRIVERS
Network driver table.
Definition: netdevice.h:500
A network device.
Definition: netdevice.h:352
#define table_end(table)
Get end of linker table.
Definition: tables.h:308
#define NET_DEVICE_CONFIGURATORS
Network device configurator table.
Definition: netdevice.h:332
#define for_each_table_entry_continue_reverse(pointer, table)
Iterate through all remaining entries within a linker table in reverse order.
Definition: tables.h:469
#define table_num_entries(table)
Get number of entries in linker table.
Definition: tables.h:335

References assert(), net_device::configs, 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 152 of file netdevice.c.

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

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()

static void netdev_notify ( struct net_device netdev)
static

Notify drivers of network device or link state change.

Parameters
netdevNetwork device

Definition at line 162 of file netdevice.c.

162  {
163  struct net_driver *driver;
164  void *priv;
165 
166  for_each_table_entry ( driver, NET_DRIVERS ) {
167  priv = netdev_priv ( netdev, driver );
168  if ( driver->notify )
169  driver->notify ( netdev, priv );
170  }
171 }
A network upper-layer driver.
Definition: netdevice.h:473
void * netdev_priv(struct net_device *netdev, struct net_driver *driver)
Get network device driver private data.
Definition: netdevice.c:152
static struct net_device * netdev
Definition: gdbudp.c:52
#define NET_DRIVERS
Network driver table.
Definition: netdevice.h:500
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
void(* notify)(struct net_device *netdev, void *priv)
Notify of device or link state change.
Definition: netdevice.h:490
static struct tlan_private * priv
Definition: tlan.c:224

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 178 of file netdevice.c.

178  {
179 
180  /* Mark receive queue processing as frozen */
182 
183  /* Notify drivers of change */
184  netdev_notify ( netdev );
185 }
#define NETDEV_RX_FROZEN
Network device receive queue processing is frozen.
Definition: netdevice.h:444
unsigned int state
Current device state.
Definition: netdevice.h:395
static struct net_device * netdev
Definition: gdbudp.c:52
static void netdev_notify(struct net_device *netdev)
Notify drivers of network device or link state change.
Definition: netdevice.c:162

References netdev, netdev_notify(), NETDEV_RX_FROZEN, and net_device::state.

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 192 of file netdevice.c.

192  {
193 
194  /* Mark receive queue processing as not frozen */
196 
197  /* Notify drivers of change */
198  netdev_notify ( netdev );
199 }
#define NETDEV_RX_FROZEN
Network device receive queue processing is frozen.
Definition: netdevice.h:444
unsigned int state
Current device state.
Definition: netdevice.h:395
static struct net_device * netdev
Definition: gdbudp.c:52
static void netdev_notify(struct net_device *netdev)
Notify drivers of network device or link state change.
Definition: netdevice.c:162

References netdev, netdev_notify(), NETDEV_RX_FROZEN, and net_device::state.

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 207 of file netdevice.c.

207  {
208 
209  /* Stop link block timer */
211 
212  /* Record link state */
213  netdev->link_rc = rc;
214  if ( netdev->link_rc == 0 ) {
215  DBGC ( netdev, "NETDEV %s link is up\n", netdev->name );
216  } else {
217  DBGC ( netdev, "NETDEV %s link is down: %s\n",
218  netdev->name, strerror ( netdev->link_rc ) );
219  }
220 
221  /* Notify drivers of link state change */
222  netdev_notify ( netdev );
223 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct retry_timer link_block
Link block timer.
Definition: netdevice.h:403
#define DBGC(...)
Definition: compiler.h:505
int link_rc
Link status code.
Definition: netdevice.h:401
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:117
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
static void netdev_notify(struct net_device *netdev)
Notify drivers of network device or link state change.
Definition: netdevice.c:162

References DBGC, net_device::link_block, net_device::link_rc, net_device::name, netdev, netdev_notify(), rc, stop_timer(), and strerror().

Referenced by eoib_join_complete(), eoib_link_state_changed(), 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 230 of file netdevice.c.

230  {
231 
232  /* Avoid clobbering a more detailed link status code, if one
233  * is already set.
234  */
235  if ( ( netdev->link_rc == 0 ) ||
236  ( netdev->link_rc == -EUNKNOWN_LINK_STATUS ) ) {
238  }
239 }
#define EUNKNOWN_LINK_STATUS
Default unknown link status code.
Definition: netdevice.c:68
int link_rc
Link status code.
Definition: netdevice.h:401
static struct net_device * netdev
Definition: gdbudp.c:52
void netdev_link_err(struct net_device *netdev, int rc)
Mark network device as having a specific link state.
Definition: netdevice.c:207
#define ENOTCONN_LINK_DOWN
Default link-down status code.
Definition: netdevice.c:83

References ENOTCONN_LINK_DOWN, EUNKNOWN_LINK_STATUS, net_device::link_rc, netdev, and netdev_link_err().

Referenced by __vxge_hw_vpath_alarm_process(), atl1e_check_link(), atl1e_down(), axge_check_link(), bnxt_set_link(), dm96xx_link_nsr(), ecm_intr_complete(), exanic_check_link(), flexboot_nodnic_state_change_netdev(), forcedeth_link_status(), 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 247 of file netdevice.c.

247  {
248 
249  /* Start link block timer */
250  if ( ! netdev_link_blocked ( netdev ) ) {
251  DBGC ( netdev, "NETDEV %s link blocked for %ld ticks\n",
252  netdev->name, timeout );
253  }
255 }
struct retry_timer link_block
Link block timer.
Definition: netdevice.h:403
#define DBGC(...)
Definition: compiler.h:505
static int netdev_link_blocked(struct net_device *netdev)
Check link block state of network device.
Definition: netdevice.h:647
static struct net_device * netdev
Definition: gdbudp.c:52
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition: retry.c:64
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
void timeout(int)

References DBGC, net_device::link_block, net_device::name, 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 262 of file netdevice.c.

262  {
263 
264  /* Stop link block timer */
265  if ( netdev_link_blocked ( netdev ) )
266  DBGC ( netdev, "NETDEV %s link unblocked\n", netdev->name );
268 }
struct retry_timer link_block
Link block timer.
Definition: netdevice.h:403
#define DBGC(...)
Definition: compiler.h:505
static int netdev_link_blocked(struct net_device *netdev)
Check link block state of network device.
Definition: netdevice.h:647
static struct net_device * netdev
Definition: gdbudp.c:52
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:117
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362

References DBGC, net_device::link_block, net_device::name, netdev, netdev_link_blocked(), and stop_timer().

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

◆ netdev_link_block_expired()

static 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 276 of file netdevice.c.

277  {
278  struct net_device *netdev =
280 
281  /* Assume link is no longer blocked */
282  DBGC ( netdev, "NETDEV %s link block expired\n", netdev->name );
283 }
struct retry_timer link_block
Link block timer.
Definition: netdevice.h:403
#define DBGC(...)
Definition: compiler.h:505
A timer.
Definition: timer.h:28
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static struct net_device * netdev
Definition: gdbudp.c:52
A network device.
Definition: netdevice.h:352
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362

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

Referenced by alloc_netdev().

◆ netdev_record_stat()

static 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 291 of file netdevice.c.

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

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 334 of file netdevice.c.

334  {
335  int rc;
336 
337  DBGC2 ( netdev, "NETDEV %s transmitting %p (%p+%zx)\n",
338  netdev->name, iobuf, iobuf->data, iob_len ( iobuf ) );
339  profile_start ( &net_tx_profiler );
340 
341  /* Enqueue packet */
342  list_add_tail ( &iobuf->list, &netdev->tx_queue );
343 
344  /* Guard against re-entry */
346  rc = -EBUSY;
347  goto err_busy;
348  }
350 
351  /* Avoid calling transmit() on unopened network devices */
352  if ( ! netdev_is_open ( netdev ) ) {
353  rc = -ENETUNREACH;
354  goto err_closed;
355  }
356 
357  /* Discard packet (for test purposes) if applicable */
358  if ( ( rc = inject_fault ( NETDEV_DISCARD_RATE ) ) != 0 )
359  goto err_fault;
360 
361  /* Map for DMA, if required */
362  if ( netdev->dma && ( ! dma_mapped ( &iobuf->map ) ) ) {
363  if ( ( rc = iob_map_tx ( iobuf, netdev->dma ) ) != 0 )
364  goto err_map;
365  }
366 
367  /* Transmit packet */
368  if ( ( rc = netdev->op->transmit ( netdev, iobuf ) ) != 0 )
369  goto err_transmit;
370 
371  /* Clear in-progress flag */
373 
374  profile_stop ( &net_tx_profiler );
375  return 0;
376 
377  err_transmit:
378  err_map:
379  err_fault:
380  err_closed:
382  err_busy:
383  netdev_tx_complete_err ( netdev, iobuf, rc );
384  return rc;
385 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EBUSY
Device or resource busy.
Definition: errno.h:338
struct dma_mapping map
DMA mapping.
Definition: iobuf.h:43
#define NETDEV_DISCARD_RATE
Definition: fault.h:15
unsigned int state
Current device state.
Definition: netdevice.h:395
struct dma_device * dma
DMA device.
Definition: netdevice.h:366
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:369
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:240
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition: netdevice.h:658
static __always_inline int dma_mapped(struct dma_mapping *map)
Check if DMA unmapping is required.
Definition: dma.h:449
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
struct list_head tx_queue
TX packet queue.
Definition: netdevice.h:417
static struct net_device * netdev
Definition: gdbudp.c:52
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
int(* transmit)(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: netdevice.h:254
#define NETDEV_TX_IN_PROGRESS
Network device transmission is in progress.
Definition: netdevice.h:455
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition: netdevice.c:470
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:40
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:48
#define ENETUNREACH
Network unreachable.
Definition: errno.h:488

References io_buffer::data, DBGC2, net_device::dma, dma_mapped(), EBUSY, ENETUNREACH, iob_len(), iob_map_tx(), io_buffer::list, list_add_tail, io_buffer::map, net_device::name, netdev, NETDEV_DISCARD_RATE, netdev_is_open(), netdev_tx_complete_err(), NETDEV_TX_IN_PROGRESS, net_device::op, profile_start(), profile_stop(), rc, net_device::state, net_device_operations::transmit, and net_device::tx_queue.

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 412 of file netdevice.c.

412  {
413 
414  /* Catch data corruption as early as possible */
415  list_check_contains_entry ( iobuf, &netdev->tx_queue, list );
416 
417  /* Remove from transmit queue */
418  list_del ( &iobuf->list );
419 
420  /* Add to deferred transmit queue */
421  list_add_tail ( &iobuf->list, &netdev->tx_deferred );
422 
423  /* Record "out of space" statistic */
425 }
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition: netdevice.c:440
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
struct list_head tx_queue
TX packet queue.
Definition: netdevice.h:417
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head tx_deferred
Deferred TX packet queue.
Definition: netdevice.h:419
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:40
#define ENOBUFS
No buffer space available.
Definition: errno.h:498
#define list_check_contains_entry(entry, head, member)
Check list contains a specified entry.
Definition: list.h:549
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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

Referenced by 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 440 of file netdevice.c.

441  {
442 
443  /* Update statistics counter */
445  if ( rc == 0 ) {
446  DBGC2 ( netdev, "NETDEV %s transmission %p complete\n",
447  netdev->name, iobuf );
448  } else {
449  DBGC ( netdev, "NETDEV %s transmission %p failed: %s\n",
450  netdev->name, iobuf, strerror ( rc ) );
451  }
452 
453  /* Unmap I/O buffer, if required */
454  if ( iobuf && dma_mapped ( &iobuf->map ) )
455  iob_unmap ( iobuf );
456 
457  /* Discard packet */
458  free_iob ( iobuf );
459 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct dma_mapping map
DMA mapping.
Definition: iobuf.h:43
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
#define DBGC(...)
Definition: compiler.h:505
static void netdev_record_stat(struct net_device_stats *stats, int rc)
Record network device statistic.
Definition: netdevice.c:291
struct net_device_stats tx_stats
TX statistics.
Definition: netdevice.h:423
static __always_inline int dma_mapped(struct dma_mapping *map)
Check if DMA unmapping is required.
Definition: dma.h:449
static __always_inline void iob_unmap(struct io_buffer *iobuf)
Unmap I/O buffer for DMA.
Definition: iobuf.h:275
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
#define DBGC2(...)
Definition: compiler.h:522

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

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 470 of file netdevice.c.

471  {
472 
473  /* Catch data corruption as early as possible */
474  list_check_contains_entry ( iobuf, &netdev->tx_queue, list );
475 
476  /* Dequeue and free I/O buffer */
477  list_del ( &iobuf->list );
478  netdev_tx_err ( netdev, iobuf, rc );
479 
480  /* Handle pending transmit queue */
481  while ( ( iobuf = list_first_entry ( &netdev->tx_deferred,
482  struct io_buffer, list ) ) ) {
483 
484  /* Remove from pending transmit queue */
485  list_del ( &iobuf->list );
486 
487  /* When any transmit completion fails, cancel all
488  * pending transmissions.
489  */
490  if ( rc != 0 ) {
491  netdev_tx_err ( netdev, iobuf, -ECANCELED );
492  continue;
493  }
494 
495  /* Otherwise, attempt to transmit the first pending packet */
496  netdev_tx ( netdev, iobuf );
497  break;
498  }
499 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition: netdevice.c:440
#define ECANCELED
Operation canceled.
Definition: errno.h:343
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
struct list_head tx_queue
TX packet queue.
Definition: netdevice.h:417
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head tx_deferred
Deferred TX packet queue.
Definition: netdevice.h:419
int netdev_tx(struct net_device *netdev, struct io_buffer *iobuf)
Transmit raw packet via network device.
Definition: netdevice.c:334
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:40
#define list_check_contains_entry(entry, head, member)
Check list contains a specified entry.
Definition: list.h:549
A persistent I/O buffer.
Definition: iobuf.h:33

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

Referenced by axge_out_complete(), dm96xx_out_complete(), ecm_out_complete(), eoib_complete_send(), flexboot_nodnic_eth_complete_send(), hermon_eth_complete_send(), ifec_tx_process(), iphone_out_complete(), ipoib_complete_send(), jme_free_tx_buffers(), jme_tx_clean(), 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 509 of file netdevice.c.

509  {
510  struct io_buffer *iobuf;
511 
512  if ( ( iobuf = list_first_entry ( &netdev->tx_queue, struct io_buffer,
513  list ) ) != NULL ) {
514  netdev_tx_complete_err ( netdev, iobuf, rc );
515  }
516 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
struct list_head tx_queue
TX packet queue.
Definition: netdevice.h:417
static struct net_device * netdev
Definition: gdbudp.c:52
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition: netdevice.c:470
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:40
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A persistent I/O buffer.
Definition: iobuf.h:33

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

Referenced by 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()

static void netdev_tx_flush ( struct net_device netdev)
static

Flush device's transmit queue.

Parameters
netdevNetwork device

Definition at line 523 of file netdevice.c.

523  {
524 
525  /* Discard any packets in the TX queue. This will also cause
526  * any packets in the deferred TX queue to be discarded
527  * automatically.
528  */
529  while ( ! list_empty ( &netdev->tx_queue ) ) {
531  }
532  assert ( list_empty ( &netdev->tx_queue ) );
534 }
void netdev_tx_complete_next_err(struct net_device *netdev, int rc)
Complete network transmission.
Definition: netdevice.c:509
#define ECANCELED
Operation canceled.
Definition: errno.h:343
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
struct list_head tx_queue
TX packet queue.
Definition: netdevice.h:417
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head tx_deferred
Deferred TX packet queue.
Definition: netdevice.h:419

References assert(), ECANCELED, list_empty, netdev, netdev_tx_complete_next_err(), net_device::tx_deferred, and net_device::tx_queue.

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 548 of file netdevice.c.

548  {
549  int rc;
550 
551  DBGC2 ( netdev, "NETDEV %s received %p (%p+%zx)\n",
552  netdev->name, iobuf, iobuf->data, iob_len ( iobuf ) );
553 
554  /* Discard packet (for test purposes) if applicable */
555  if ( ( rc = inject_fault ( NETDEV_DISCARD_RATE ) ) != 0 ) {
556  netdev_rx_err ( netdev, iobuf, rc );
557  return;
558  }
559 
560  /* Unmap I/O buffer, if required */
561  if ( dma_mapped ( &iobuf->map ) )
562  iob_unmap ( iobuf );
563 
564  /* Enqueue packet */
565  list_add_tail ( &iobuf->list, &netdev->rx_queue );
566 
567  /* Update statistics counter */
569 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
struct dma_mapping map
DMA mapping.
Definition: iobuf.h:43
#define NETDEV_DISCARD_RATE
Definition: fault.h:15
static void netdev_record_stat(struct net_device_stats *stats, int rc)
Record network device statistic.
Definition: netdevice.c:291
struct list_head rx_queue
RX packet queue.
Definition: netdevice.h:421
static __always_inline int dma_mapped(struct dma_mapping *map)
Check if DMA unmapping is required.
Definition: dma.h:449
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
static __always_inline void iob_unmap(struct io_buffer *iobuf)
Unmap I/O buffer for DMA.
Definition: iobuf.h:275
static struct net_device * netdev
Definition: gdbudp.c:52
struct net_device_stats rx_stats
RX statistics.
Definition: netdevice.h:425
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:40
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:48

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

Referenced by a3c90x_process_rx_packets(), atl1e_clean_rx_irq(), axge_in_complete(), b44_process_rx_packets(), bnxt_rx_process(), dm96xx_in_complete(), ecm_in_complete(), efab_receive(), efx_hunt_receive(), ena_poll_rx(), eoib_complete_recv(), exanic_poll_rx(), flexboot_nodnic_eth_complete_recv(), 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(), 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(), smsc75xx_in_complete(), smsc95xx_in_complete(), snpnet_poll_rx(), 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 586 of file netdevice.c.

587  {
588 
589  DBGC ( netdev, "NETDEV %s failed to receive %p: %s\n",
590  netdev->name, iobuf, strerror ( rc ) );
591 
592  /* Unmap I/O buffer, if required */
593  if ( iobuf && dma_mapped ( &iobuf->map ) )
594  iob_unmap ( iobuf );
595 
596  /* Discard packet */
597  free_iob ( iobuf );
598 
599  /* Update statistics counter */
601 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct dma_mapping map
DMA mapping.
Definition: iobuf.h:43
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
#define DBGC(...)
Definition: compiler.h:505
static void netdev_record_stat(struct net_device_stats *stats, int rc)
Record network device statistic.
Definition: netdevice.c:291
static __always_inline int dma_mapped(struct dma_mapping *map)
Check if DMA unmapping is required.
Definition: dma.h:449
static __always_inline void iob_unmap(struct io_buffer *iobuf)
Unmap I/O buffer for DMA.
Definition: iobuf.h:275
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
struct net_device_stats rx_stats
RX statistics.
Definition: netdevice.h:425
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362

References DBGC, dma_mapped(), free_iob(), iob_unmap(), io_buffer::map, net_device::name, netdev, netdev_record_stat(), rc, net_device::rx_stats, 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(), ecm_in_complete(), ecm_intr_complete(), ecm_poll(), efx_hunt_receive(), eoib_complete_recv(), exanic_close(), exanic_poll_rx(), flexboot_nodnic_eth_complete_recv(), 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(), 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(), 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(), 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 612 of file netdevice.c.

612  {
613 
614  /* Avoid calling poll() on unopened network devices */
615  if ( ! netdev_is_open ( netdev ) )
616  return;
617 
618  /* Guard against re-entry */
620  return;
621 
622  /* Poll device */
624  netdev->op->poll ( netdev );
626 }
unsigned int state
Current device state.
Definition: netdevice.h:395
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:369
void(* poll)(struct net_device *netdev)
Poll for completed and received packets.
Definition: netdevice.h:267
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition: netdevice.h:658
static struct net_device * netdev
Definition: gdbudp.c:52
#define NETDEV_POLL_IN_PROGRESS
Network device poll is in progress.
Definition: netdevice.h:458

References netdev, netdev_is_open(), NETDEV_POLL_IN_PROGRESS, net_device::op, net_device_operations::poll, and net_device::state.

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 637 of file netdevice.c.

637  {
638  struct io_buffer *iobuf;
639 
640  iobuf = list_first_entry ( &netdev->rx_queue, struct io_buffer, list );
641  if ( ! iobuf )
642  return NULL;
643 
644  list_del ( &iobuf->list );
645  return iobuf;
646 }
struct list_head rx_queue
RX packet queue.
Definition: netdevice.h:421
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:40
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A persistent I/O buffer.
Definition: iobuf.h:33

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

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

◆ netdev_rx_flush()

static void netdev_rx_flush ( struct net_device netdev)
static

Flush device's receive queue.

Parameters
netdevNetwork device

Definition at line 653 of file netdevice.c.

653  {
654  struct io_buffer *iobuf;
655 
656  /* Discard any packets in the RX queue */
657  while ( ( iobuf = netdev_rx_dequeue ( netdev ) ) ) {
658  netdev_rx_err ( netdev, iobuf, -ECANCELED );
659  }
660 }
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
#define ECANCELED
Operation canceled.
Definition: errno.h:343
static struct net_device * netdev
Definition: gdbudp.c:52
struct io_buffer * netdev_rx_dequeue(struct net_device *netdev)
Remove packet from device's receive queue.
Definition: netdevice.c:637
A persistent I/O buffer.
Definition: iobuf.h:33

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

Referenced by free_netdev(), and netdev_close().

◆ netdev_config_close()

static 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 668 of file netdevice.c.

669  {
670  struct net_device_configurator *configurator = config->configurator;
671  struct net_device *netdev = config->netdev;
672 
673  /* Restart interface */
674  intf_restart ( &config->job, rc );
675 
676  /* Record configuration result */
677  config->rc = rc;
678  if ( rc == 0 ) {
679  DBGC ( netdev, "NETDEV %s configured via %s\n",
680  netdev->name, configurator->name );
681  } else {
682  DBGC ( netdev, "NETDEV %s configuration via %s failed: %s\n",
683  netdev->name, configurator->name, strerror ( rc ) );
684  }
685 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Name.
Definition: netdevice.h:315
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition: interface.c:343
struct interface job
Job control interface.
Definition: netdevice.h:309
#define DBGC(...)
Definition: compiler.h:505
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
A network device.
Definition: netdevice.h:352
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
struct net_device * netdev
Network device.
Definition: netdevice.h:303
int rc
Configuration status.
Definition: netdevice.h:307
A network device configurator.
Definition: netdevice.h:313
struct net_device_configurator * configurator
Network device configurator.
Definition: netdevice.h:305

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

◆ free_netdev()

static void free_netdev ( struct refcnt refcnt)
static

Free network device.

Parameters
refcntNetwork device reference counter

Definition at line 702 of file netdevice.c.

702  {
703  struct net_device *netdev =
704  container_of ( refcnt, struct net_device, refcnt );
705 
706  assert ( ! timer_running ( &netdev->link_block ) );
710  free ( netdev );
711 }
struct retry_timer link_block
Link block timer.
Definition: netdevice.h:403
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:583
A reference counter.
Definition: refcnt.h:26
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static struct net_device * netdev
Definition: gdbudp.c:52
static void netdev_rx_flush(struct net_device *netdev)
Flush device's receive queue.
Definition: netdevice.c:653
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
A network device.
Definition: netdevice.h:352
void clear_settings(struct settings *settings)
Clear settings block.
Definition: settings.c:1102
static void netdev_tx_flush(struct net_device *netdev)
Flush device's transmit queue.
Definition: netdevice.c:523

References assert(), clear_settings(), container_of, free, net_device::link_block, 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 721 of file netdevice.c.

721  {
722  struct net_device *netdev;
723  struct net_device_configurator *configurator;
724  struct net_device_configuration *config;
725 
726  netdev = zalloc ( netdev_priv_offset ( NULL ) + priv_len );
727  if ( netdev ) {
731  &netdev->refcnt );
736  config = netdev->configs;
738  config->netdev = netdev;
739  config->configurator = configurator;
740  config->rc = -EUNUSED_CONFIG;
741  intf_init ( &config->job, &netdev_config_desc,
742  &netdev->refcnt );
743  config++;
744  }
746  }
747  return netdev;
748 }
static void netdev_settings_init(struct net_device *netdev)
Initialise a per-netdevice configuration settings block.
Definition: netdevice.h:595
#define EUNKNOWN_LINK_STATUS
Default unknown link status code.
Definition: netdevice.c:68
struct interface job
Job control interface.
Definition: netdevice.h:309
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
struct retry_timer link_block
Link block timer.
Definition: netdevice.h:403
static size_t netdev_priv_offset(struct net_driver *driver)
Get offset of network device driver private data.
Definition: netdevice.c:118
struct list_head rx_queue
RX packet queue.
Definition: netdevice.h:421
#define EUNUSED_CONFIG
Default not-yet-attempted-configuration status code.
Definition: netdevice.c:73
int link_rc
Link status code.
Definition: netdevice.h:401
void * priv
Driver private data.
Definition: netdevice.h:431
void * netdev_priv(struct net_device *netdev, struct net_driver *driver)
Get network device driver private data.
Definition: netdevice.c:152
struct list_head tx_queue
TX packet queue.
Definition: netdevice.h:417
struct net_device_configuration configs[0]
Network device configurations (variable length)
Definition: netdevice.h:434
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head tx_deferred
Deferred TX packet queue.
Definition: netdevice.h:419
static struct interface_descriptor netdev_config_desc
Network device configuration interface descriptor.
Definition: netdevice.c:694
struct refcnt refcnt
Reference counter.
Definition: netdevice.h:354
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
A network device.
Definition: netdevice.h:352
static void netdev_link_block_expired(struct retry_timer *timer, int fail __unused)
Handle network device link block timer expiry.
Definition: netdevice.c:276
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
struct net_device * netdev
Network device.
Definition: netdevice.h:303
int rc
Configuration status.
Definition: netdevice.h:307
A network device configurator.
Definition: netdevice.h:313
struct net_device_configurator * configurator
Network device configurator.
Definition: netdevice.h:305
static void free_netdev(struct refcnt *refcnt)
Free network device.
Definition: netdevice.c:702
#define NET_DEVICE_CONFIGURATORS
Network device configurator table.
Definition: netdevice.h:332
A network device configuration.
Definition: netdevice.h:301
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:203
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References net_device::configs, 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::link_block, net_device::link_rc, NET_DEVICE_CONFIGURATORS, netdev, net_device_configuration::netdev, netdev_config_desc, netdev_link_block_expired(), netdev_priv(), netdev_priv_offset(), netdev_settings_init(), NULL, net_device::priv, net_device_configuration::rc, ref_init, net_device::refcnt, net_device::rx_queue, net_device::tx_deferred, net_device::tx_queue, 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 759 of file netdevice.c.

759  {
761  struct net_driver *driver;
762  struct net_device *duplicate;
763  unsigned int i;
764  uint32_t seed;
765  void *priv;
766  int rc;
767 
768  /* Set initial link-layer address, if not already set */
769  if ( ! netdev_has_ll_addr ( netdev ) ) {
771  }
772 
773  /* Set MTU, if not already set */
774  if ( ! netdev->mtu ) {
775  netdev->mtu = ( netdev->max_pkt_len -
777  }
778 
779  /* Reject named network devices that already exist */
780  if ( netdev->name[0] && ( duplicate = find_netdev ( netdev->name ) ) ) {
781  DBGC ( netdev, "NETDEV rejecting duplicate name %s\n",
782  duplicate->name );
783  rc = -EEXIST;
784  goto err_duplicate;
785  }
786 
787  /* Assign a unique device name, if not already set */
788  if ( netdev->name[0] == '\0' ) {
789  for ( i = 0 ; ; i++ ) {
790  snprintf ( netdev->name, sizeof ( netdev->name ),
791  "net%d", i );
792  if ( find_netdev ( netdev->name ) == NULL )
793  break;
794  }
795  }
796 
797  /* Assign a unique non-zero scope ID */
798  for ( netdev->scope_id = 1 ; ; netdev->scope_id++ ) {
800  break;
801  }
802 
803  /* Use least significant bits of the link-layer address to
804  * improve the randomness of the (non-cryptographic) random
805  * number generator.
806  */
808  - sizeof ( seed ) ), sizeof ( seed ) );
809  srand ( rand() ^ seed );
810 
811  /* Add to device list */
812  netdev_get ( netdev );
814  DBGC ( netdev, "NETDEV %s registered (phys %s hwaddr %s)\n",
815  netdev->name, netdev->dev->name,
816  netdev_addr ( netdev ) );
817 
818  /* Register per-netdev configuration settings */
820  NULL, netdev->name ) ) != 0 ) {
821  DBGC ( netdev, "NETDEV %s could not register settings: %s\n",
822  netdev->name, strerror ( rc ) );
823  goto err_register_settings;
824  }
825 
826  /* Probe device */
827  for_each_table_entry ( driver, NET_DRIVERS ) {
828  priv = netdev_priv ( netdev, driver );
829  if ( driver->probe &&
830  ( rc = driver->probe ( netdev, priv ) ) != 0 ) {
831  DBGC ( netdev, "NETDEV %s could not add %s device: "
832  "%s\n", netdev->name, driver->name,
833  strerror ( rc ) );
834  goto err_probe;
835  }
836  }
837 
838  return 0;
839 
840  err_probe:
842  priv = netdev_priv ( netdev, driver );
843  if ( driver->remove )
844  driver->remove ( netdev, priv );
845  }
848  err_register_settings:
849  list_del ( &netdev->list );
850  netdev_put ( netdev );
851  err_duplicate:
852  return rc;
853 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint8_t ll_header_len
Link-layer header length.
Definition: netdevice.h:200
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:198
void unregister_settings(struct settings *settings)
Unregister settings block.
Definition: settings.c:514
#define EEXIST
File exists.
Definition: errno.h:388
size_t mtu
Maximum transmission unit length.
Definition: netdevice.h:415
struct list_head list
List of network devices.
Definition: netdevice.h:356
#define DBGC(...)
Definition: compiler.h:505
char name[40]
Name.
Definition: device.h:75
static const char * netdev_addr(struct net_device *netdev)
Get printable network device link-layer address.
Definition: netdevice.h:538
unsigned int scope_id
Scope ID.
Definition: netdevice.h:360
void(* init_addr)(const void *hw_addr, void *ll_addr)
Initialise link-layer address.
Definition: netdevice.h:150
A network upper-layer driver.
Definition: netdevice.h:473
int(* probe)(struct net_device *netdev, void *priv)
Probe device.
Definition: netdevice.h:484
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:583
A link-layer protocol.
Definition: netdevice.h:114
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
void * memcpy(void *dest, const void *src, size_t len) __nonnull
const char * name
Name.
Definition: netdevice.h:475
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
static int rand(void)
Definition: stdlib.h:59
static void srand(unsigned int seed)
Definition: stdlib.h:63
void * netdev_priv(struct net_device *netdev, struct net_driver *driver)
Get network device driver private data.
Definition: netdevice.c:152
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
static struct net_device * netdev
Definition: gdbudp.c:52
#define NET_DRIVERS
Network driver table.
Definition: netdevice.h:500
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
A network device.
Definition: netdevice.h:352
static struct net_device * netdev_get(struct net_device *netdev)
Get reference to network device.
Definition: netdevice.h:561
unsigned int uint32_t
Definition: stdint.h:12
struct net_device * find_netdev_by_scope_id(unsigned int scope_id)
Get network device by scope ID.
Definition: netdevice.c:1010
static int netdev_has_ll_addr(struct net_device *netdev)
Check whether or not network device has a link-layer address.
Definition: netdevice.c:101
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
static struct tlan_private * priv
Definition: tlan.c:224
void(* remove)(struct net_device *netdev, void *priv)
Remove device.
Definition: netdevice.h:496
struct net_device * find_netdev(const char *name)
Get network device by name.
Definition: netdevice.c:988
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition: settings.c:475
void clear_settings(struct settings *settings)
Clear settings block.
Definition: settings.c:1102
struct list_head net_devices
List of network devices.
Definition: netdevice.c:53
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387
size_t max_pkt_len
Maximum packet length.
Definition: netdevice.h:409
#define for_each_table_entry_continue_reverse(pointer, table)
Iterate through all remaining entries within a linker table in reverse order.
Definition: tables.h:469
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:372

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

Referenced by a3c90x_probe(), atl1e_probe(), axge_probe(), b44_probe(), bnxt_init_one(), dm96xx_probe(), ecm_probe(), efab_probe(), ena_probe(), eoib_create(), exanic_probe_port(), flexboot_nodnic_register_netdev(), forcedeth_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(), 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(), smsc75xx_probe(), smsc95xx_probe(), snpnet_start(), 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 861 of file netdevice.c.

861  {
862  int rc;
863 
864  /* Do nothing if device is already open */
865  if ( netdev->state & NETDEV_OPEN )
866  return 0;
867 
868  DBGC ( netdev, "NETDEV %s opening\n", netdev->name );
869 
870  /* Mark as opened */
872 
873  /* Open the device */
874  if ( ( rc = netdev->op->open ( netdev ) ) != 0 )
875  goto err;
876 
877  /* Add to head of open devices list */
879 
880  /* Notify drivers of device state change */
881  netdev_notify ( netdev );
882 
883  return 0;
884 
885  err:
886  netdev->state &= ~NETDEV_OPEN;
887  return rc;
888 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int(* open)(struct net_device *netdev)
Open network device.
Definition: netdevice.h:222
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
#define NETDEV_OPEN
Network device is open.
Definition: netdevice.h:438
#define DBGC(...)
Definition: compiler.h:505
unsigned int state
Current device state.
Definition: netdevice.h:395
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:369
static struct net_device * netdev
Definition: gdbudp.c:52
static struct list_head open_net_devices
List of open network devices, in reverse order of opening.
Definition: netdevice.c:56
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
struct list_head open_list
List of open network devices.
Definition: netdevice.h:358
static void netdev_notify(struct net_device *netdev)
Notify drivers of network device or link state change.
Definition: netdevice.c:162

References DBGC, list_add, net_device::name, netdev, netdev_notify(), NETDEV_OPEN, net_device::op, net_device_operations::open, net_device::open_list, open_net_devices, rc, and net_device::state.

Referenced by apply_netdev_settings(), efi_snp_initialize(), efi_snp_reset(), gdbudp_ensure_netdev_open(), ifopen(), iwlist(), netvsc_reset(), pxe_exec(), pxe_netdev_open(), pxenv_udp_open(), 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 895 of file netdevice.c.

895  {
896  unsigned int num_configs;
897  unsigned int i;
898 
899  /* Do nothing if device is already closed */
900  if ( ! ( netdev->state & NETDEV_OPEN ) )
901  return;
902 
903  DBGC ( netdev, "NETDEV %s closing\n", netdev->name );
904 
905  /* Terminate any ongoing configurations. Use intf_close()
906  * rather than intf_restart() to allow the cancellation to be
907  * reported back to us if a configuration is actually in
908  * progress.
909  */
911  for ( i = 0 ; i < num_configs ; i++ )
913 
914  /* Remove from open devices list */
915  list_del ( &netdev->open_list );
916 
917  /* Mark as closed */
918  netdev->state &= ~NETDEV_OPEN;
919 
920  /* Notify drivers of device state change */
921  netdev_notify ( netdev );
922 
923  /* Close the device */
924  netdev->op->close ( netdev );
925 
926  /* Stop link block timer */
928 
929  /* Flush TX and RX queues */
932 }
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:249
#define NETDEV_OPEN
Network device is open.
Definition: netdevice.h:438
struct interface job
Job control interface.
Definition: netdevice.h:309
struct retry_timer link_block
Link block timer.
Definition: netdevice.h:403
#define DBGC(...)
Definition: compiler.h:505
unsigned int state
Current device state.
Definition: netdevice.h:395
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:369
#define ECANCELED
Operation canceled.
Definition: errno.h:343
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
struct net_device_configuration configs[0]
Network device configurations (variable length)
Definition: netdevice.h:434
static struct net_device * netdev
Definition: gdbudp.c:52
static void netdev_rx_flush(struct net_device *netdev)
Flush device's receive queue.
Definition: netdevice.c:653
void(* close)(struct net_device *netdev)
Close network device.
Definition: netdevice.h:230
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:117
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
struct list_head open_list
List of open network devices.
Definition: netdevice.h:358
#define NET_DEVICE_CONFIGURATORS
Network device configurator table.
Definition: netdevice.h:332
static void netdev_tx_flush(struct net_device *netdev)
Flush device's transmit queue.
Definition: netdevice.c:523
static void netdev_notify(struct net_device *netdev)
Notify drivers of network device or link state change.
Definition: netdevice.c:162
#define table_num_entries(table)
Get number of entries in linker table.
Definition: tables.h:335

References net_device_operations::close, net_device::configs, DBGC, ECANCELED, intf_close(), net_device_configuration::job, net_device::link_block, list_del, net_device::name, NET_DEVICE_CONFIGURATORS, netdev, netdev_notify(), NETDEV_OPEN, netdev_rx_flush(), netdev_tx_flush(), net_device::op, net_device::open_list, net_device::state, 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(), 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 941 of file netdevice.c.

941  {
942  struct net_driver *driver;
943  void *priv;
944 
945  /* Ensure device is closed */
946  netdev_close ( netdev );
947 
948  /* Remove device */
950  priv = netdev_priv ( netdev, driver );
951  if ( driver->remove )
952  driver->remove ( netdev, priv );
953  }
954 
955  /* Unregister per-netdev configuration settings */
958 
959  /* Remove from device list */
960  DBGC ( netdev, "NETDEV %s unregistered\n", netdev->name );
961  list_del ( &netdev->list );
962  netdev_put ( netdev );
963 }
void unregister_settings(struct settings *settings)
Unregister settings block.
Definition: settings.c:514
struct list_head list
List of network devices.
Definition: netdevice.h:356
#define DBGC(...)
Definition: compiler.h:505
#define for_each_table_entry_reverse(pointer, table)
Iterate through all entries within a linker table in reverse order.
Definition: tables.h:440
A network upper-layer driver.
Definition: netdevice.h:473
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:583
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
void * netdev_priv(struct net_device *netdev, struct net_driver *driver)
Get network device driver private data.
Definition: netdevice.c:152
static struct net_device * netdev
Definition: gdbudp.c:52
#define NET_DRIVERS
Network driver table.
Definition: netdevice.h:500
void netdev_close(struct net_device *netdev)
Close network device.
Definition: netdevice.c:895
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
static struct tlan_private * priv
Definition: tlan.c:224
void(* remove)(struct net_device *netdev, void *priv)
Remove device.
Definition: netdevice.h:496
void clear_settings(struct settings *settings)
Clear settings block.
Definition: settings.c:1102

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

Referenced by a3c90x_remove(), atl1e_remove(), axge_probe(), axge_remove(), b44_remove(), bnxt_remove_one(), dm96xx_probe(), dm96xx_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(), 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(), 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(), smsc75xx_probe(), smsc75xx_remove(), smsc95xx_probe(), smsc95xx_remove(), snpnet_start(), snpnet_stop(), 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 970 of file netdevice.c.

970  {
971 
972  /* Enable or disable device interrupts, if applicable */
973  if ( netdev_irq_supported ( netdev ) )
974  netdev->op->irq ( netdev, enable );
975 
976  /* Record interrupt enabled state */
978  if ( enable )
980 }
unsigned int state
Current device state.
Definition: netdevice.h:395
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:369
void(* irq)(struct net_device *netdev, int enable)
Enable or disable interrupts.
Definition: netdevice.h:276
static struct net_device * netdev
Definition: gdbudp.c:52
static int netdev_irq_supported(struct net_device *netdev)
Check whether or not network device supports interrupts.
Definition: netdevice.h:669
#define NETDEV_IRQ_ENABLED
Network device interrupts are enabled.
Definition: netdevice.h:441

References net_device_operations::irq, netdev, NETDEV_IRQ_ENABLED, netdev_irq_supported(), net_device::op, and net_device::state.

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 988 of file netdevice.c.

988  {
989  struct net_device *netdev;
990 
991  /* Allow "netX" shortcut */
992  if ( strcmp ( name, "netX" ) == 0 )
993  return last_opened_netdev();
994 
995  /* Identify network device by name */
997  if ( strcmp ( netdev->name, name ) == 0 )
998  return netdev;
999  }
1000 
1001  return NULL;
1002 }
const char * name
Definition: ath9k_hw.c:1984
struct list_head list
List of network devices.
Definition: netdevice.h:356
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
struct net_device * last_opened_netdev(void)
Get most recently opened network device.
Definition: netdevice.c:1047
A network device.
Definition: netdevice.h:352
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
int strcmp(const char *first, const char *second)
Compare strings.
Definition: string.c:173
struct list_head net_devices
List of network devices.
Definition: netdevice.c:53
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References last_opened_netdev(), net_device::list, list_for_each_entry, net_device::name, 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 1010 of file netdevice.c.

1010  {
1011  struct net_device *netdev;
1012 
1013  /* Identify network device by index */
1015  if ( netdev->scope_id == scope_id )
1016  return netdev;
1017  }
1018 
1019  return NULL;
1020 }
struct list_head list
List of network devices.
Definition: netdevice.h:356
unsigned int scope_id
Scope ID.
Definition: netdevice.h:360
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
A network device.
Definition: netdevice.h:352
struct list_head net_devices
List of network devices.
Definition: netdevice.c:53
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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 1029 of file netdevice.c.

1030  {
1031  struct net_device *netdev;
1032 
1034  if ( ( netdev->dev->desc.bus_type == bus_type ) &&
1035  ( netdev->dev->desc.location == location ) )
1036  return netdev;
1037  }
1038 
1039  return NULL;
1040 }
struct list_head list
List of network devices.
Definition: netdevice.h:356
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
unsigned int location
Location.
Definition: device.h:29
A network device.
Definition: netdevice.h:352
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
unsigned int bus_type
Bus type.
Definition: device.h:24
struct device_description desc
Device description.
Definition: device.h:79
struct list_head net_devices
List of network devices.
Definition: netdevice.c:53
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References device_description::bus_type, device::desc, net_device::dev, net_device::list, list_for_each_entry, device_description::location, 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 1047 of file netdevice.c.

1047  {
1048  struct net_device *netdev;
1049 
1051  open_list );
1052  if ( ! netdev )
1053  return NULL;
1054 
1055  assert ( netdev_is_open ( netdev ) );
1056  return netdev;
1057 }
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition: netdevice.h:658
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static struct net_device * netdev
Definition: gdbudp.c:52
static struct list_head open_net_devices
List of open network devices, in reverse order of opening.
Definition: netdevice.c:56
A network device.
Definition: netdevice.h:352
struct list_head open_list
List of open network devices.
Definition: netdevice.h:358
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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 1073 of file netdevice.c.

1075  {
1077  int rc;
1078 
1079  /* Add link-layer header */
1080  if ( ( rc = ll_protocol->push ( netdev, iobuf, ll_dest, ll_source,
1081  net_protocol->net_proto ) ) != 0 ) {
1082  /* Record error for diagnosis */
1083  netdev_tx_err ( netdev, iobuf, rc );
1084  return rc;
1085  }
1086 
1087  /* Transmit packet */
1088  return netdev_tx ( netdev, iobuf );
1089 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition: netdevice.c:440
A link-layer protocol.
Definition: netdevice.h:114
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:127
static struct net_device * netdev
Definition: gdbudp.c:52
int netdev_tx(struct net_device *netdev, struct io_buffer *iobuf)
Transmit raw packet via network device.
Definition: netdevice.c:334
uint16_t net_proto
Network-layer protocol.
Definition: netdevice.h:99
A network-layer protocol.
Definition: netdevice.h:64
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:372

References net_device::ll_protocol, 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_discovered(), neighbour_tx(), 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 1102 of file netdevice.c.

1104  {
1105  struct net_protocol *net_protocol;
1106 
1107  /* Hand off to network-layer protocol, if any */
1109  if ( net_protocol->net_proto == net_proto )
1110  return net_protocol->rx ( iobuf, netdev, ll_dest,
1111  ll_source, flags );
1112  }
1113 
1114  DBGC ( netdev, "NETDEV %s unknown network protocol %04x\n",
1115  netdev->name, ntohs ( net_proto ) );
1116  free_iob ( iobuf );
1117  return -ENOTSUP;
1118 }
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
#define DBGC(...)
Definition: compiler.h:505
#define ntohs(value)
Definition: byteswap.h:136
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
static struct net_device * netdev
Definition: gdbudp.c:52
#define NET_PROTOCOLS
Network-layer protocol table.
Definition: netdevice.h:467
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
uint16_t net_proto
Network-layer protocol.
Definition: netdevice.h:99
A network-layer protocol.
Definition: netdevice.h:64
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
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:79
uint8_t flags
Flags.
Definition: ena.h:18

References DBGC, ENOTSUP, flags, for_each_table_entry, free_iob(), net_device::name, 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 1126 of file netdevice.c.

1126  {
1127  struct net_device *netdev;
1128  struct io_buffer *iobuf;
1129  struct ll_protocol *ll_protocol;
1130  const void *ll_dest;
1131  const void *ll_source;
1132  uint16_t net_proto;
1133  unsigned int flags;
1134  int rc;
1135 
1136  /* Poll and process each network device */
1137  list_for_each_entry ( netdev, &net_devices, list ) {
1138 
1139  /* Poll for new packets */
1140  profile_start ( &net_poll_profiler );
1141  netdev_poll ( netdev );
1142  profile_stop ( &net_poll_profiler );
1143 
1144  /* Leave received packets on the queue if receive
1145  * queue processing is currently frozen. This will
1146  * happen when the raw packets are to be manually
1147  * dequeued using netdev_rx_dequeue(), rather than
1148  * processed via the usual networking stack.
1149  */
1150  if ( netdev_rx_frozen ( netdev ) )
1151  continue;
1152 
1153  /* Process all received packets */
1154  while ( ( iobuf = netdev_rx_dequeue ( netdev ) ) ) {
1155 
1156  DBGC2 ( netdev, "NETDEV %s processing %p (%p+%zx)\n",
1157  netdev->name, iobuf, iobuf->data,
1158  iob_len ( iobuf ) );
1159  profile_start ( &net_rx_profiler );
1160 
1161  /* Remove link-layer header */
1163  if ( ( rc = ll_protocol->pull ( netdev, iobuf,
1164  &ll_dest, &ll_source,
1165  &net_proto,
1166  &flags ) ) != 0 ) {
1167  free_iob ( iobuf );
1168  continue;
1169  }
1170 
1171  /* Hand packet to network layer */
1172  if ( ( rc = net_rx ( iob_disown ( iobuf ), netdev,
1173  net_proto, ll_dest,
1174  ll_source, flags ) ) != 0 ) {
1175  /* Record error for diagnosis */
1176  netdev_rx_err ( netdev, NULL, rc );
1177  }
1178  profile_stop ( &net_rx_profiler );
1179  }
1180  }
1181 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned short uint16_t
Definition: stdint.h:11
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
A link-layer protocol.
Definition: netdevice.h:114
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:212
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
void netdev_poll(struct net_device *netdev)
Poll for completed and received packets on network device.
Definition: netdevice.c:612
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
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:1102
A network device.
Definition: netdevice.h:352
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:141
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:48
struct list_head net_devices
List of network devices.
Definition: netdevice.c:53
static int netdev_rx_frozen(struct net_device *netdev)
Check whether or not network device receive queue processing is frozen.
Definition: netdevice.h:692
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:372
struct io_buffer * netdev_rx_dequeue(struct net_device *netdev)
Remove packet from device's receive queue.
Definition: netdevice.c:637
A persistent I/O buffer.
Definition: iobuf.h:33
uint8_t flags
Flags.
Definition: ena.h:18

References io_buffer::data, DBGC2, flags, free_iob(), iob_disown, iob_len(), list_for_each_entry, net_device::ll_protocol, net_device::name, 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()

static void net_step ( struct process *process  __unused)
static

Single-step the network stack.

Parameters
processNetwork stack process

Definition at line 1188 of file netdevice.c.

1188  {
1189  net_poll();
1190 }
void net_poll(void)
Poll the network stack.
Definition: netdevice.c:1126

References net_poll().

◆ 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 1198 of file netdevice.c.

1198  {
1199  return 0;
1200 }

Referenced by efi_snp_probe(), and efi_vlan_find().

◆ 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 1209 of file netdevice.c.

1210  {
1211 
1212  if ( tag == 0 ) {
1213  netdev_rx ( netdev, iobuf );
1214  } else {
1215  netdev_rx_err ( netdev, iobuf, -ENODEV );
1216  }
1217 }
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
static struct net_device * netdev
Definition: gdbudp.c:52
#define ENODEV
No such device.
Definition: errno.h:509
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:548
uint64_t tag
Identity tag.
Definition: edd.h:30

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 1227 of file netdevice.c.

1229  {
1230 
1231  netdev_rx_err ( netdev, iobuf, rc );
1232 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
static struct net_device * netdev
Definition: gdbudp.c:52

Referenced by hermon_eth_complete_recv(), and intelxl_poll_rx().

◆ PERMANENT_PROCESS()

PERMANENT_PROCESS ( net_process  ,
net_step   
)

Networking stack process.

◆ net_discard()

static unsigned int net_discard ( void  )
static

Discard some cached network device data.

Return values
discardedNumber of cached items discarded

Definition at line 1242 of file netdevice.c.

1242  {
1243  struct net_device *netdev;
1244  struct io_buffer *iobuf;
1245  unsigned int discarded = 0;
1246 
1247  /* Try to drop one deferred TX packet from each network device */
1248  for_each_netdev ( netdev ) {
1249  if ( ( iobuf = list_first_entry ( &netdev->tx_deferred,
1250  struct io_buffer,
1251  list ) ) != NULL ) {
1252 
1253  /* Discard first deferred packet */
1254  list_del ( &iobuf->list );
1255  if ( dma_mapped ( &iobuf->map ) )
1256  iob_unmap ( iobuf );
1257  free_iob ( iobuf );
1258 
1259  /* Report discard */
1260  discarded++;
1261  }
1262  }
1263 
1264  return discarded;
1265 }
struct dma_mapping map
DMA mapping.
Definition: iobuf.h:43
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
static __always_inline int dma_mapped(struct dma_mapping *map)
Check if DMA unmapping is required.
Definition: dma.h:449
static __always_inline void iob_unmap(struct io_buffer *iobuf)
Unmap I/O buffer for DMA.
Definition: iobuf.h:275
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head tx_deferred
Deferred TX packet queue.
Definition: netdevice.h:419
#define for_each_netdev(netdev)
Iterate over all network devices.
Definition: netdevice.h:543
A network device.
Definition: netdevice.h:352
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:40
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A persistent I/O buffer.
Definition: iobuf.h:33

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

◆ __cache_discarder()

struct cache_discarder net_discarder __cache_discarder ( CACHE_NORMAL  )

Network device cache discarder.

◆ 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 1278 of file netdevice.c.

1278  {
1279  struct net_device_configurator *configurator;
1280 
1282  if ( strcmp ( configurator->name, name ) == 0 )
1283  return configurator;
1284  }
1285  return NULL;
1286 }
const char * name
Definition: ath9k_hw.c:1984
const char * name
Name.
Definition: netdevice.h:315
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
int strcmp(const char *first, const char *second)
Compare strings.
Definition: string.c:173
A network device configurator.
Definition: netdevice.h:313
#define NET_DEVICE_CONFIGURATORS
Network device configurator table.
Definition: netdevice.h:332
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References for_each_table_entry, net_device_configurator::name, 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 1295 of file netdevice.c.

1296  {
1297  struct net_device_configuration *config =
1299  int rc;
1300 
1301  /* Check applicability of configurator */
1303  DBGC ( netdev, "NETDEV %s does not support configuration via "
1304  "%s\n", netdev->name, configurator->name );
1305  return -ENOTSUP;
1306  }
1307 
1308  /* Terminate any ongoing configuration */
1309  intf_restart ( &config->job, -ECANCELED );
1310 
1311  /* Mark configuration as being in progress */
1312  config->rc = -EINPROGRESS_CONFIG;
1313 
1314  DBGC ( netdev, "NETDEV %s starting configuration via %s\n",
1316 
1317  /* Start configuration */
1318  if ( ( rc = configurator->start ( &config->job, netdev ) ) != 0 ) {
1319  DBGC ( netdev, "NETDEV %s could not start configuration via "
1320  "%s: %s\n", netdev->name, configurator->name,
1321  strerror ( rc ) );
1322  config->rc = rc;
1323  return rc;
1324  }
1325 
1326  return 0;
1327 }
#define EINPROGRESS_CONFIG
Default configuration-in-progress status code.
Definition: netdevice.c:78
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Name.
Definition: netdevice.h:315
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition: interface.c:343
int(* start)(struct interface *job, struct net_device *netdev)
Start configuring network device.
Definition: netdevice.h:328
struct interface job
Job control interface.
Definition: netdevice.h:309
#define DBGC(...)
Definition: compiler.h:505
#define ECANCELED
Operation canceled.
Definition: errno.h:343
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static int netdev_configurator_applies(struct net_device *netdev, struct net_device_configurator *configurator)
Check if configurator applies to network device.
Definition: netdevice.h:623
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
int rc
Configuration status.
Definition: netdevice.h:307
struct net_device_configurator * configurator
Network device configurator.
Definition: netdevice.h:305
A network device configuration.
Definition: netdevice.h:301
static struct net_device_configuration * netdev_configuration(struct net_device *netdev, struct net_device_configurator *configurator)
Get network device configuration.
Definition: netdevice.h:608

References net_device_configuration::configurator, DBGC, ECANCELED, EINPROGRESS_CONFIG, ENOTSUP, intf_restart(), net_device_configuration::job, net_device_configurator::name, net_device::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 1335 of file netdevice.c.

1335  {
1336  struct net_device_configurator *configurator;
1337  int rc;
1338 
1339  /* Start configuration for each configurator */
1341 
1342  /* Skip any inapplicable configurators */
1343  if ( ! netdev_configurator_applies ( netdev, configurator ) )
1344  continue;
1345 
1346  /* Start configuration */
1347  if ( ( rc = netdev_configure ( netdev, configurator ) ) != 0 )
1348  return rc;
1349  }
1350 
1351  return 0;
1352 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int netdev_configure(struct net_device *netdev, struct net_device_configurator *configurator)
Start network device configuration.
Definition: netdevice.c:1295
static struct net_device * netdev
Definition: gdbudp.c:52
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
static int netdev_configurator_applies(struct net_device *netdev, struct net_device_configurator *configurator)
Check if configurator applies to network device.
Definition: netdevice.h:623
A network device configurator.
Definition: netdevice.h:313
#define NET_DEVICE_CONFIGURATORS
Network device configurator table.
Definition: netdevice.h:332

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()

static 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 1361 of file netdevice.c.

1361  {
1362  unsigned int num_configs;
1363  unsigned int i;
1364 
1365  num_configs = table_num_entries ( NET_DEVICE_CONFIGURATORS );
1366  for ( i = 0 ; i < num_configs ; i++ ) {
1367  if ( netdev->configs[i].rc == rc )
1368  return 1;
1369  }
1370  return 0;
1371 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct net_device_configuration configs[0]
Network device configurations (variable length)
Definition: netdevice.h:434
static struct net_device * netdev
Definition: gdbudp.c:52
int rc
Configuration status.
Definition: netdevice.h:307
#define NET_DEVICE_CONFIGURATORS
Network device configurator table.
Definition: netdevice.h:332
#define table_num_entries(table)
Get number of entries in linker table.
Definition: tables.h:335

References net_device::configs, NET_DEVICE_CONFIGURATORS, netdev, net_device_configuration::rc, 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 1379 of file netdevice.c.

1379  {
1380 
1382 }
#define EINPROGRESS_CONFIG
Default configuration-in-progress status code.
Definition: netdevice.c:78
static struct net_device * netdev
Definition: gdbudp.c:52
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:1361

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 1391 of file netdevice.c.

1391  {
1392 
1393  return netdev_has_configuration_rc ( netdev, 0 );
1394 }
static struct net_device * netdev
Definition: gdbudp.c:52
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:1361

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 53 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 56 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 59 of file netdevice.c.

◆ __errortab

struct errortab netdev_errors [] __errortab
Initial value:
= {
}
#define EINFO_EINPROGRESS_CONFIG
Definition: netdevice.c:79
#define __einfo_errortab(einfo)
Definition: errortab.h:23
#define EINFO_ENOTCONN_LINK_DOWN
Definition: netdevice.c:84
#define EINFO_EUNKNOWN_LINK_STATUS
Definition: netdevice.c:69
#define EINFO_EUNUSED_CONFIG
Definition: netdevice.c:74

Human-readable message for the default link statuses.

Definition at line 88 of file netdevice.c.

◆ netdev_config_ops

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

Network device configuration interface operations.

Definition at line 688 of file netdevice.c.

◆ netdev_config_desc

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

Network device configuration interface descriptor.

Definition at line 694 of file netdevice.c.

Referenced by alloc_netdev().