iPXE
netdevice.h
Go to the documentation of this file.
1 #ifndef _IPXE_NETDEVICE_H
2 #define _IPXE_NETDEVICE_H
3 
4 /** @file
5  *
6  * Network device management
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 
12 #include <stdint.h>
13 #include <ipxe/list.h>
14 #include <ipxe/tables.h>
15 #include <ipxe/refcnt.h>
16 #include <ipxe/settings.h>
17 #include <ipxe/interface.h>
18 #include <ipxe/retry.h>
19 
20 struct io_buffer;
21 struct net_device;
22 struct net_protocol;
23 struct ll_protocol;
24 struct device;
25 
26 /** Maximum length of a hardware address
27  *
28  * The longest currently-supported link-layer address is for IPoIB.
29  */
30 #define MAX_HW_ADDR_LEN 8
31 
32 /** Maximum length of a link-layer address
33  *
34  * The longest currently-supported link-layer address is for IPoIB.
35  */
36 #define MAX_LL_ADDR_LEN 20
37 
38 /** Maximum length of a link-layer header
39  *
40  * The longest currently-supported link-layer header is for RNDIS: an
41  * 8-byte RNDIS header, a 32-byte RNDIS packet message header, a
42  * 14-byte Ethernet header and a possible 4-byte VLAN header. Round
43  * up to 64 bytes.
44  */
45 #define MAX_LL_HEADER_LEN 64
46 
47 /** Maximum length of a network-layer address */
48 #define MAX_NET_ADDR_LEN 16
49 
50 /** Maximum length of a network-layer header
51  *
52  * The longest currently-supported network-layer header is for IPv6 at
53  * 40 bytes.
54  */
55 #define MAX_NET_HEADER_LEN 40
56 
57 /** Maximum combined length of a link-layer and network-layer header */
58 #define MAX_LL_NET_HEADER_LEN ( MAX_LL_HEADER_LEN + MAX_NET_HEADER_LEN )
59 
60 /**
61  * A network-layer protocol
62  *
63  */
64 struct net_protocol {
65  /** Protocol name */
66  const char *name;
67  /**
68  * Process received packet
69  *
70  * @v iobuf I/O buffer
71  * @v netdev Network device
72  * @v ll_dest Link-layer destination address
73  * @v ll_source Link-layer source address
74  * @v flags Packet flags
75  * @ret rc Return status code
76  *
77  * This method takes ownership of the I/O buffer.
78  */
79  int ( * rx ) ( struct io_buffer *iobuf, struct net_device *netdev,
80  const void *ll_dest, const void *ll_source,
81  unsigned int flags );
82  /**
83  * Transcribe network-layer address
84  *
85  * @v net_addr Network-layer address
86  * @ret string Human-readable transcription of address
87  *
88  * This method should convert the network-layer address into a
89  * human-readable format (e.g. dotted quad notation for IPv4).
90  *
91  * The buffer used to hold the transcription is statically
92  * allocated.
93  */
94  const char * ( *ntoa ) ( const void * net_addr );
95  /** Network-layer protocol
96  *
97  * This is an ETH_P_XXX constant, in network-byte order
98  */
100  /** Network-layer address length */
102 };
103 
104 /** Packet is a multicast (including broadcast) packet */
105 #define LL_MULTICAST 0x0001
106 
107 /** Packet is a broadcast packet */
108 #define LL_BROADCAST 0x0002
109 
110 /**
111  * A link-layer protocol
112  *
113  */
114 struct ll_protocol {
115  /** Protocol name */
116  const char *name;
117  /**
118  * Add link-layer header
119  *
120  * @v netdev Network device
121  * @v iobuf I/O buffer
122  * @v ll_dest Link-layer destination address
123  * @v ll_source Source link-layer address
124  * @v net_proto Network-layer protocol, in network-byte order
125  * @ret rc Return status code
126  */
127  int ( * push ) ( struct net_device *netdev, struct io_buffer *iobuf,
128  const void *ll_dest, const void *ll_source,
129  uint16_t net_proto );
130  /**
131  * Remove link-layer header
132  *
133  * @v netdev Network device
134  * @v iobuf I/O buffer
135  * @ret ll_dest Link-layer destination address
136  * @ret ll_source Source link-layer address
137  * @ret net_proto Network-layer protocol, in network-byte order
138  * @ret flags Packet flags
139  * @ret rc Return status code
140  */
141  int ( * pull ) ( struct net_device *netdev, struct io_buffer *iobuf,
142  const void **ll_dest, const void **ll_source,
143  uint16_t *net_proto, unsigned int *flags );
144  /**
145  * Initialise link-layer address
146  *
147  * @v hw_addr Hardware address
148  * @v ll_addr Link-layer address to fill in
149  */
150  void ( * init_addr ) ( const void *hw_addr, void *ll_addr );
151  /**
152  * Transcribe link-layer address
153  *
154  * @v ll_addr Link-layer address
155  * @ret string Human-readable transcription of address
156  *
157  * This method should convert the link-layer address into a
158  * human-readable format.
159  *
160  * The buffer used to hold the transcription is statically
161  * allocated.
162  */
163  const char * ( * ntoa ) ( const void *ll_addr );
164  /**
165  * Hash multicast address
166  *
167  * @v af Address family
168  * @v net_addr Network-layer address
169  * @v ll_addr Link-layer address to fill in
170  * @ret rc Return status code
171  */
172  int ( * mc_hash ) ( unsigned int af, const void *net_addr,
173  void *ll_addr );
174  /**
175  * Generate Ethernet-compatible compressed link-layer address
176  *
177  * @v ll_addr Link-layer address
178  * @v eth_addr Ethernet-compatible address to fill in
179  * @ret rc Return status code
180  */
181  int ( * eth_addr ) ( const void *ll_addr, void *eth_addr );
182  /**
183  * Generate EUI-64 address
184  *
185  * @v ll_addr Link-layer address
186  * @v eui64 EUI-64 address to fill in
187  * @ret rc Return status code
188  */
189  int ( * eui64 ) ( const void *ll_addr, void *eui64 );
190  /** Link-layer protocol
191  *
192  * This is an ARPHRD_XXX constant, in network byte order.
193  */
195  /** Hardware address length */
197  /** Link-layer address length */
199  /** Link-layer header length */
201  /** Flags */
202  unsigned int flags;
203 };
204 
205 /** Local link-layer address functions only as a name
206  *
207  * This flag indicates that the local link-layer address cannot
208  * directly be used as a destination address by a remote node.
209  */
210 #define LL_NAME_ONLY 0x0001
211 
212 /** Network device operations */
214  /** Open network device
215  *
216  * @v netdev Network device
217  * @ret rc Return status code
218  *
219  * This method should allocate RX I/O buffers and enable
220  * the hardware to start transmitting and receiving packets.
221  */
222  int ( * open ) ( struct net_device *netdev );
223  /** Close network device
224  *
225  * @v netdev Network device
226  *
227  * This method should stop the flow of packets, and free up
228  * any packets that are currently in the device's TX queue.
229  */
230  void ( * close ) ( struct net_device *netdev );
231  /** Transmit packet
232  *
233  * @v netdev Network device
234  * @v iobuf I/O buffer
235  * @ret rc Return status code
236  *
237  * This method should cause the hardware to initiate
238  * transmission of the I/O buffer.
239  *
240  * If this method returns success, the I/O buffer remains
241  * owned by the net device's TX queue, and the net device must
242  * eventually call netdev_tx_complete() to free the buffer.
243  * If this method returns failure, the I/O buffer is
244  * immediately released; the failure is interpreted as
245  * "failure to enqueue buffer".
246  *
247  * This method is guaranteed to be called only when the device
248  * is open.
249  */
250  int ( * transmit ) ( struct net_device *netdev,
251  struct io_buffer *iobuf );
252  /** Poll for completed and received packets
253  *
254  * @v netdev Network device
255  *
256  * This method should cause the hardware to check for
257  * completed transmissions and received packets. Any received
258  * packets should be delivered via netdev_rx().
259  *
260  * This method is guaranteed to be called only when the device
261  * is open.
262  */
263  void ( * poll ) ( struct net_device *netdev );
264  /** Enable or disable interrupts
265  *
266  * @v netdev Network device
267  * @v enable Interrupts should be enabled
268  *
269  * This method may be NULL to indicate that interrupts are not
270  * supported.
271  */
272  void ( * irq ) ( struct net_device *netdev, int enable );
273 };
274 
275 /** Network device error */
277  /** Error status code */
278  int rc;
279  /** Error count */
280  unsigned int count;
281 };
282 
283 /** Maximum number of unique errors that we will keep track of */
284 #define NETDEV_MAX_UNIQUE_ERRORS 4
285 
286 /** Network device statistics */
288  /** Count of successful completions */
289  unsigned int good;
290  /** Count of error completions */
291  unsigned int bad;
292  /** Error breakdowns */
294 };
295 
296 /** A network device configuration */
298  /** Network device */
300  /** Network device configurator */
302  /** Configuration status */
303  int rc;
304  /** Job control interface */
305  struct interface job;
306 };
307 
308 /** A network device configurator */
310  /** Name */
311  const char *name;
312  /** Check applicability of configurator
313  *
314  * @v netdev Network device
315  * @ret applies Configurator applies to this network device
316  */
317  int ( * applies ) ( struct net_device *netdev );
318  /** Start configuring network device
319  *
320  * @v job Job control interface
321  * @v netdev Network device
322  * @ret rc Return status code
323  */
324  int ( * start ) ( struct interface *job, struct net_device *netdev );
325 };
326 
327 /** Network device configurator table */
328 #define NET_DEVICE_CONFIGURATORS \
329  __table ( struct net_device_configurator, "net_device_configurators" )
330 
331 /** Declare a network device configurator */
332 #define __net_device_configurator \
333  __table_entry ( NET_DEVICE_CONFIGURATORS, 01 )
334 
335 /** Maximum length of a network device name */
336 #define NETDEV_NAME_LEN 12
337 
338 /**
339  * A network device
340  *
341  * This structure represents a piece of networking hardware. It has
342  * properties such as a link-layer address and methods for
343  * transmitting and receiving raw packets.
344  *
345  * Note that this structure must represent a generic network device,
346  * not just an Ethernet device.
347  */
348 struct net_device {
349  /** Reference counter */
350  struct refcnt refcnt;
351  /** List of network devices */
352  struct list_head list;
353  /** List of open network devices */
355  /** Index of this network device */
356  unsigned int index;
357  /** Name of this network device */
359  /** Underlying hardware device */
360  struct device *dev;
361 
362  /** Network device operations */
364 
365  /** Link-layer protocol */
367  /** Hardware address
368  *
369  * This is an address which is an intrinsic property of the
370  * hardware, e.g. an address held in EEPROM.
371  *
372  * Note that the hardware address may not be the same length
373  * as the link-layer address.
374  */
376  /** Link-layer address
377  *
378  * This is the current link-layer address assigned to the
379  * device. It can be changed at runtime.
380  */
382  /** Link-layer broadcast address */
384 
385  /** Current device state
386  *
387  * This is the bitwise-OR of zero or more NETDEV_XXX constants.
388  */
389  unsigned int state;
390  /** Link status code
391  *
392  * Zero indicates that the link is up; any other value
393  * indicates the error preventing link-up.
394  */
395  int link_rc;
396  /** Link block timer */
398  /** Maximum packet length
399  *
400  * This is the maximum packet length (including any link-layer
401  * headers) supported by the hardware.
402  */
403  size_t max_pkt_len;
404  /** Maximum transmission unit length
405  *
406  * This is the maximum transmission unit length (excluding any
407  * link-layer headers) configured for the link.
408  */
409  size_t mtu;
410  /** TX packet queue */
412  /** Deferred TX packet queue */
414  /** RX packet queue */
416  /** TX statistics */
418  /** RX statistics */
420 
421  /** Configuration settings applicable to this device */
423 
424  /** Driver private data */
425  void *priv;
426 
427  /** Network device configurations (variable length) */
429 };
430 
431 /** Network device is open */
432 #define NETDEV_OPEN 0x0001
433 
434 /** Network device interrupts are enabled */
435 #define NETDEV_IRQ_ENABLED 0x0002
436 
437 /** Network device receive queue processing is frozen */
438 #define NETDEV_RX_FROZEN 0x0004
439 
440 /** Network device interrupts are unsupported
441  *
442  * This flag can be used by a network device to indicate that
443  * interrupts are not supported despite the presence of an irq()
444  * method.
445  */
446 #define NETDEV_IRQ_UNSUPPORTED 0x0008
447 
448 /** Link-layer protocol table */
449 #define LL_PROTOCOLS __table ( struct ll_protocol, "ll_protocols" )
450 
451 /** Declare a link-layer protocol */
452 #define __ll_protocol __table_entry ( LL_PROTOCOLS, 01 )
453 
454 /** Network-layer protocol table */
455 #define NET_PROTOCOLS __table ( struct net_protocol, "net_protocols" )
456 
457 /** Declare a network-layer protocol */
458 #define __net_protocol __table_entry ( NET_PROTOCOLS, 01 )
459 
460 /** A network upper-layer driver */
461 struct net_driver {
462  /** Name */
463  const char *name;
464  /** Probe device
465  *
466  * @v netdev Network device
467  * @ret rc Return status code
468  */
469  int ( * probe ) ( struct net_device *netdev );
470  /** Notify of device or link state change
471  *
472  * @v netdev Network device
473  */
474  void ( * notify ) ( struct net_device *netdev );
475  /** Remove device
476  *
477  * @v netdev Network device
478  */
479  void ( * remove ) ( struct net_device *netdev );
480 };
481 
482 /** Network driver table */
483 #define NET_DRIVERS __table ( struct net_driver, "net_drivers" )
484 
485 /** Declare a network driver */
486 #define __net_driver __table_entry ( NET_DRIVERS, 01 )
487 
488 extern struct list_head net_devices;
491 
492 /**
493  * Initialise a network device
494  *
495  * @v netdev Network device
496  * @v op Network device operations
497  */
498 static inline void netdev_init ( struct net_device *netdev,
499  struct net_device_operations *op ) {
500  netdev->op = op;
501 }
502 
503 /**
504  * Stop using a network device
505  *
506  * @v netdev Network device
507  *
508  * Drivers should call this method immediately before the final call
509  * to netdev_put().
510  */
511 static inline void netdev_nullify ( struct net_device *netdev ) {
513 }
514 
515 /**
516  * Get printable network device link-layer address
517  *
518  * @v netdev Network device
519  * @ret name Link-layer address
520  */
521 static inline const char * netdev_addr ( struct net_device *netdev ) {
522  return netdev->ll_protocol->ntoa ( netdev->ll_addr );
523 }
524 
525 /** Iterate over all network devices */
526 #define for_each_netdev( netdev ) \
527  list_for_each_entry ( (netdev), &net_devices, list )
528 
529 /** There exist some network devices
530  *
531  * @ret existence Existence of network devices
532  */
533 static inline int have_netdevs ( void ) {
534  return ( ! list_empty ( &net_devices ) );
535 }
536 
537 /**
538  * Get reference to network device
539  *
540  * @v netdev Network device
541  * @ret netdev Network device
542  */
543 static inline __attribute__ (( always_inline )) struct net_device *
545  ref_get ( &netdev->refcnt );
546  return netdev;
547 }
548 
549 /**
550  * Drop reference to network device
551  *
552  * @v netdev Network device
553  */
554 static inline __attribute__ (( always_inline )) void
556  ref_put ( &netdev->refcnt );
557 }
558 
559 /**
560  * Get driver private area for this network device
561  *
562  * @v netdev Network device
563  * @ret priv Driver private area for this network device
564  */
565 static inline __attribute__ (( always_inline )) void *
567  return netdev->priv;
568 }
569 
570 /**
571  * Get per-netdevice configuration settings block
572  *
573  * @v netdev Network device
574  * @ret settings Settings block
575  */
576 static inline __attribute__ (( always_inline )) struct settings *
578  return &netdev->settings.settings;
579 }
580 
581 /**
582  * Initialise a per-netdevice configuration settings block
583  *
584  * @v generics Generic settings block
585  * @v refcnt Containing object reference counter, or NULL
586  * @v name Settings block name
587  */
588 static inline __attribute__ (( always_inline )) void
592 }
593 
594 /**
595  * Get network device configuration
596  *
597  * @v netdev Network device
598  * @v configurator Network device configurator
599  * @ret config Network device configuration
600  */
601 static inline struct net_device_configuration *
604 
606  configurator ) ];
607 }
608 
609 /**
610  * Check if configurator applies to network device
611  *
612  * @v netdev Network device
613  * @v configurator Network device configurator
614  * @ret applies Configurator applies to network device
615  */
616 static inline int
619  return ( ( configurator->applies == NULL ) ||
620  configurator->applies ( netdev ) );
621 }
622 
623 /**
624  * Check link state of network device
625  *
626  * @v netdev Network device
627  * @ret link_up Link is up
628  */
629 static inline __attribute__ (( always_inline )) int
631  return ( netdev->link_rc == 0 );
632 }
633 
634 /**
635  * Check link block state of network device
636  *
637  * @v netdev Network device
638  * @ret link_blocked Link is blocked
639  */
640 static inline __attribute__ (( always_inline )) int
642  return ( timer_running ( &netdev->link_block ) );
643 }
644 
645 /**
646  * Check whether or not network device is open
647  *
648  * @v netdev Network device
649  * @ret is_open Network device is open
650  */
651 static inline __attribute__ (( always_inline )) int
653  return ( netdev->state & NETDEV_OPEN );
654 }
655 
656 /**
657  * Check whether or not network device supports interrupts
658  *
659  * @v netdev Network device
660  * @ret irq_supported Network device supports interrupts
661  */
662 static inline __attribute__ (( always_inline )) int
664  return ( ( netdev->op->irq != NULL ) &&
666 }
667 
668 /**
669  * Check whether or not network device interrupts are currently enabled
670  *
671  * @v netdev Network device
672  * @ret irq_enabled Network device interrupts are enabled
673  */
674 static inline __attribute__ (( always_inline )) int
676  return ( netdev->state & NETDEV_IRQ_ENABLED );
677 }
678 
679 /**
680  * Check whether or not network device receive queue processing is frozen
681  *
682  * @v netdev Network device
683  * @ret rx_frozen Network device receive queue processing is frozen
684  */
685 static inline __attribute__ (( always_inline )) int
687  return ( netdev->state & NETDEV_RX_FROZEN );
688 }
689 
690 extern void netdev_rx_freeze ( struct net_device *netdev );
691 extern void netdev_rx_unfreeze ( struct net_device *netdev );
692 extern void netdev_link_err ( struct net_device *netdev, int rc );
693 extern void netdev_link_down ( struct net_device *netdev );
694 extern void netdev_link_block ( struct net_device *netdev,
695  unsigned long timeout );
696 extern void netdev_link_unblock ( struct net_device *netdev );
697 extern int netdev_tx ( struct net_device *netdev, struct io_buffer *iobuf );
698 extern void netdev_tx_defer ( struct net_device *netdev,
699  struct io_buffer *iobuf );
700 extern void netdev_tx_err ( struct net_device *netdev,
701  struct io_buffer *iobuf, int rc );
702 extern void netdev_tx_complete_err ( struct net_device *netdev,
703  struct io_buffer *iobuf, int rc );
704 extern void netdev_tx_complete_next_err ( struct net_device *netdev, int rc );
705 extern void netdev_rx ( struct net_device *netdev, struct io_buffer *iobuf );
706 extern void netdev_rx_err ( struct net_device *netdev,
707  struct io_buffer *iobuf, int rc );
708 extern void netdev_poll ( struct net_device *netdev );
709 extern struct io_buffer * netdev_rx_dequeue ( struct net_device *netdev );
710 extern struct net_device * alloc_netdev ( size_t priv_size );
711 extern int register_netdev ( struct net_device *netdev );
712 extern int netdev_open ( struct net_device *netdev );
713 extern void netdev_close ( struct net_device *netdev );
714 extern void unregister_netdev ( struct net_device *netdev );
715 extern void netdev_irq ( struct net_device *netdev, int enable );
716 extern struct net_device * find_netdev ( const char *name );
717 extern struct net_device * find_netdev_by_index ( unsigned int index );
718 extern struct net_device * find_netdev_by_location ( unsigned int bus_type,
719  unsigned int location );
720 extern struct net_device *
721 find_netdev_by_ll_addr ( struct ll_protocol *ll_protocol, const void *ll_addr );
722 extern struct net_device * last_opened_netdev ( void );
723 extern int net_tx ( struct io_buffer *iobuf, struct net_device *netdev,
724  struct net_protocol *net_protocol, const void *ll_dest,
725  const void *ll_source );
726 extern int net_rx ( struct io_buffer *iobuf, struct net_device *netdev,
727  uint16_t net_proto, const void *ll_dest,
728  const void *ll_source, unsigned int flags );
729 extern void net_poll ( void );
730 extern struct net_device_configurator *
731 find_netdev_configurator ( const char *name );
732 extern int netdev_configure ( struct net_device *netdev,
733  struct net_device_configurator *configurator );
734 extern int netdev_configure_all ( struct net_device *netdev );
735 extern int netdev_configuration_in_progress ( struct net_device *netdev );
736 extern int netdev_configuration_ok ( struct net_device *netdev );
737 
738 /**
739  * Complete network transmission
740  *
741  * @v netdev Network device
742  * @v iobuf I/O buffer
743  *
744  * The packet must currently be in the network device's TX queue.
745  */
746 static inline void netdev_tx_complete ( struct net_device *netdev,
747  struct io_buffer *iobuf ) {
748  netdev_tx_complete_err ( netdev, iobuf, 0 );
749 }
750 
751 /**
752  * Complete network transmission
753  *
754  * @v netdev Network device
755  *
756  * Completes the oldest outstanding packet in the TX queue.
757  */
758 static inline void netdev_tx_complete_next ( struct net_device *netdev ) {
760 }
761 
762 /**
763  * Mark network device as having link up
764  *
765  * @v netdev Network device
766  */
767 static inline __attribute__ (( always_inline )) void
769  netdev_link_err ( netdev, 0 );
770 }
771 
772 #endif /* _IPXE_NETDEVICE_H */
#define __attribute__(x)
Definition: compiler.h:10
struct net_device * alloc_netdev(size_t priv_size)
Allocate network device.
Definition: netdevice.c:622
static void * netdev_priv(struct net_device *netdev)
Get driver private area for this network device.
Definition: netdevice.h:566
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
unsigned short uint16_t
Definition: stdint.h:11
const char * name
Name.
Definition: netdevice.h:311
const char * name
Protocol name.
Definition: netdevice.h:66
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:746
static void netdev_settings_init(struct net_device *netdev)
Initialise a per-netdevice configuration settings block.
Definition: netdevice.h:589
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
int(* start)(struct interface *job, struct net_device *netdev)
Start configuring network device.
Definition: netdevice.h:324
struct list_head net_devices
List of network devices.
Definition: netdevice.c:53
#define NETDEV_RX_FROZEN
Network device receive queue processing is frozen.
Definition: netdevice.h:438
void netdev_close(struct net_device *netdev)
Close network device.
Definition: netdevice.c:801
void netdev_rx_freeze(struct net_device *netdev)
Freeze network device receive queue processing.
Definition: netdevice.c:134
int(* open)(struct net_device *netdev)
Open network device.
Definition: netdevice.h:222
#define NETDEV_OPEN
Network device is open.
Definition: netdevice.h:432
void netdev_poll(struct net_device *netdev)
Poll for completed and received packets on network device.
Definition: netdevice.c:523
struct interface job
Job control interface.
Definition: netdevice.h:305
static void generic_settings_init(struct generic_settings *generics, struct refcnt *refcnt)
Initialise a settings block.
Definition: settings.h:512
struct net_device * find_netdev_by_location(unsigned int bus_type, unsigned int location)
Get network device by PCI bus:dev.fn address.
Definition: netdevice.c:934
static void netdev_tx_complete_next(struct net_device *netdev)
Complete network transmission.
Definition: netdevice.h:758
int netdev_configuration_ok(struct net_device *netdev)
Check if network device has at least one successful configuration.
Definition: netdevice.c:1315
struct retry_timer link_block
Link block timer.
Definition: netdevice.h:397
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:667
struct net_device_operations null_netdev_operations
Definition: nullnet.c:59
size_t mtu
Maximum transmission unit length.
Definition: netdevice.h:409
Retry timers.
struct list_head list
List of network devices.
Definition: netdevice.h:352
void netdev_link_block(struct net_device *netdev, unsigned long timeout)
Mark network device link as being blocked.
Definition: netdevice.c:203
A retry timer.
Definition: retry.h:21
const uint8_t * ll_broadcast
Link-layer broadcast address.
Definition: netdevice.h:383
void netdev_link_unblock(struct net_device *netdev)
Mark network device link as being unblocked.
Definition: netdevice.c:218
unsigned int state
Current device state.
Definition: netdevice.h:389
struct net_device * last_opened_netdev(void)
Get most recently opened network device.
Definition: netdevice.c:973
static int have_netdevs(void)
There exist some network devices.
Definition: netdevice.h:533
Network device error.
Definition: netdevice.h:276
static int netdev_link_blocked(struct net_device *netdev)
Check link block state of network device.
Definition: netdevice.h:641
struct net_device_operations * op
Network device operations.
Definition: netdevice.h:363
#define NETDEV_NAME_LEN
Maximum length of a network device name.
Definition: netdevice.h:336
static const char * netdev_addr(struct net_device *netdev)
Get printable network device link-layer address.
Definition: netdevice.h:521
struct settings_operations * op
Settings block operations.
Definition: settings.h:144
struct net_device_stats tx_stats
TX statistics.
Definition: netdevice.h:417
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:461
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:577
A link-layer protocol.
Definition: netdevice.h:114
struct list_head rx_queue
RX packet queue.
Definition: netdevice.h:415
unsigned int count
Error count.
Definition: netdevice.h:280
A doubly-linked list entry (or list head)
Definition: list.h:18
void(* poll)(struct net_device *netdev)
Poll for completed and received packets.
Definition: netdevice.h:263
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
A reference counter.
Definition: refcnt.h:26
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.
Definition: netdevice.c:999
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:498
const char * name
Protocol name.
Definition: netdevice.h:116
void(* irq)(struct net_device *netdev, int enable)
Enable or disable interrupts.
Definition: netdevice.h:272
int netdev_open(struct net_device *netdev)
Open network device.
Definition: netdevice.c:767
void netdev_irq(struct net_device *netdev, int enable)
Enable or disable interrupts.
Definition: netdevice.c:875
struct settings_operations netdev_settings_operations
Network device configuration settings operations.
A hardware device.
Definition: device.h:73
#define NETDEV_MAX_UNIQUE_ERRORS
Maximum number of unique errors that we will keep track of.
Definition: netdevice.h:284
const char * name
Name.
Definition: netdevice.h:463
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition: netdevice.h:652
#define MAX_LL_ADDR_LEN
Maximum length of a link-layer address.
Definition: netdevice.h:36
struct net_device * find_netdev_by_ll_addr(struct ll_protocol *ll_protocol, const void *ll_addr)
Get network device by link-layer address.
Definition: netdevice.c:954
int link_rc
Link status code.
Definition: netdevice.h:395
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:555
An object interface.
Definition: interface.h:109
uint8_t hw_addr_len
Hardware address length.
Definition: netdevice.h:196
void * priv
Driver private data.
Definition: netdevice.h:425
void(* remove)(struct net_device *netdev)
Remove device.
Definition: netdevice.h:479
Object interfaces.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:768
struct list_head tx_queue
TX packet queue.
Definition: netdevice.h:411
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition: netdevice.h:630
#define MAX_HW_ADDR_LEN
Maximum length of a hardware address.
Definition: netdevice.h:30
struct net_device_configuration configs[0]
Network device configurations (variable length)
Definition: netdevice.h:428
static struct net_device * netdev
Definition: gdbudp.c:52
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:501
struct list_head tx_deferred
Deferred TX packet queue.
Definition: netdevice.h:413
Linked lists.
Configuration settings.
static int netdev_irq_enabled(struct net_device *netdev)
Check whether or not network device interrupts are currently enabled.
Definition: netdevice.h:675
struct refcnt refcnt
Reference counter.
Definition: netdevice.h:350
#define ref_get(refcnt)
Get additional reference to object.
Definition: refcnt.h:92
struct net_device_stats rx_stats
RX statistics.
Definition: netdevice.h:419
int(* eui64)(const void *ll_addr, void *eui64)
Generate EUI-64 address.
Definition: netdevice.h:189
unsigned int bad
Count of error completions.
Definition: netdevice.h:291
A network device.
Definition: netdevice.h:348
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:511
Settings block operations.
Definition: settings.h:85
A settings block.
Definition: settings.h:132
struct net_device_error errors[NETDEV_MAX_UNIQUE_ERRORS]
Error breakdowns.
Definition: netdevice.h:293
unsigned char uint8_t
Definition: stdint.h:10
Network device statistics.
Definition: netdevice.h:287
unsigned int flags
Flags.
Definition: netdevice.h:202
struct net_device * find_netdev_by_index(unsigned int index)
Get network device by index.
Definition: netdevice.c:915
static struct net_device * netdev_get(struct net_device *netdev)
Get reference to network device.
Definition: netdevice.h:544
void(* close)(struct net_device *netdev)
Close network device.
Definition: netdevice.h:230
uint16_t net_proto
Network-layer protocol.
Definition: netdevice.h:99
void netdev_tx_complete_next_err(struct net_device *netdev, int rc)
Complete network transmission.
Definition: netdevice.c:434
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition: netdevice.c:186
uint16_t ll_proto
Link-layer protocol.
Definition: netdevice.h:194
int(* mc_hash)(unsigned int af, const void *net_addr, void *ll_addr)
Hash multicast address.
Definition: netdevice.h:172
int(* transmit)(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: netdevice.h:250
int(* applies)(struct net_device *netdev)
Check applicability of configurator.
Definition: netdevice.h:317
Network device operations.
Definition: netdevice.h:213
struct device * dev
Underlying hardware device.
Definition: netdevice.h:360
A network-layer protocol.
Definition: netdevice.h:64
void net_poll(void)
Poll the network stack.
Definition: netdevice.c:1052
static int netdev_configurator_applies(struct net_device *netdev, struct net_device_configurator *configurator)
Check if configurator applies to network device.
Definition: netdevice.h:617
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
A generic settings block.
Definition: settings.h:298
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:844
unsigned int good
Count of successful completions.
Definition: netdevice.h:289
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:358
struct settings settings
Settings block.
Definition: settings.h:300
int netdev_configure_all(struct net_device *netdev)
Start network device configuration via all supported configurators.
Definition: netdevice.c:1259
unsigned int index
Index of this network device.
Definition: netdevice.h:356
uint8_t net_addr_len
Network-layer address length.
Definition: netdevice.h:101
struct net_device * netdev
Network device.
Definition: netdevice.h:299
struct io_buffer * netdev_rx_dequeue(struct net_device *netdev)
Remove packet from device's receive queue.
Definition: netdevice.c:538
int rc
Configuration status.
Definition: netdevice.h:303
struct list_head open_list
List of open network devices.
Definition: netdevice.h:354
A network device configurator.
Definition: netdevice.h:309
Reference counting.
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:1028
Linker tables.
int netdev_configuration_in_progress(struct net_device *netdev)
Check if network device configuration is in progress.
Definition: netdevice.c:1303
const char *(* ntoa)(const void *ll_addr)
Transcribe link-layer address.
Definition: netdevice.h:163
int netdev_tx(struct net_device *netdev, struct io_buffer *iobuf)
Transmit raw packet via network device.
Definition: netdevice.c:290
void netdev_tx_defer(struct net_device *netdev, struct io_buffer *iobuf)
Defer transmitted packet.
Definition: netdevice.c:344
struct net_device_configurator * configurator
Network device configurator.
Definition: netdevice.h:301
void(* notify)(struct net_device *netdev)
Notify of device or link state change.
Definition: netdevice.h:474
#define NET_DEVICE_CONFIGURATORS
Network device configurator table.
Definition: netdevice.h:328
void timeout(int)
int(* probe)(struct net_device *netdev)
Probe device.
Definition: netdevice.h:469
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:381
size_t max_pkt_len
Maximum packet length.
Definition: netdevice.h:403
int rc
Error status code.
Definition: netdevice.h:278
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition: netdevice.c:369
A network device configuration.
Definition: netdevice.h:297
static int netdev_rx_frozen(struct net_device *netdev)
Check whether or not network device receive queue processing is frozen.
Definition: netdevice.h:686
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:470
uint64_t index
Index of the first segment within the content.
Definition: pccrc.h:21
#define NETDEV_IRQ_UNSUPPORTED
Network device interrupts are unsupported.
Definition: netdevice.h:446
struct generic_settings settings
Configuration settings applicable to this device.
Definition: netdevice.h:422
void netdev_rx_unfreeze(struct net_device *netdev)
Unfreeze network device receive queue processing.
Definition: netdevice.c:148
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:375
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
static int netdev_irq_supported(struct net_device *netdev)
Check whether or not network device supports interrupts.
Definition: netdevice.h:663
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition: netdevice.c:395
#define NETDEV_IRQ_ENABLED
Network device interrupts are enabled.
Definition: netdevice.h:435
static struct net_device_configuration * netdev_configuration(struct net_device *netdev, struct net_device_configurator *configurator)
Get network device configuration.
Definition: netdevice.h:602
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:366
int netdev_configure(struct net_device *netdev, struct net_device_configurator *configurator)
Start network device configuration.
Definition: netdevice.c:1219
#define table_index(table, entry)
Get index of entry within linker table.
Definition: tables.h:334
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
struct net_device_configurator * find_netdev_configurator(const char *name)
Find network device configurator.
Definition: netdevice.c:1202
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
int(* eth_addr)(const void *ll_addr, void *eth_addr)
Generate Ethernet-compatible compressed link-layer address.
Definition: netdevice.h:181
struct net_device * find_netdev(const char *name)
Get network device by name.
Definition: netdevice.c:893
A persistent I/O buffer.
Definition: iobuf.h:32
void netdev_link_err(struct net_device *netdev, int rc)
Mark network device as having a specific link state.
Definition: netdevice.c:163
uint8_t flags
Flags.
Definition: ena.h:18