iPXE
ifmgmt.c File Reference

Network interface management. More...

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <ipxe/console.h>
#include <ipxe/netdevice.h>
#include <ipxe/device.h>
#include <ipxe/job.h>
#include <ipxe/monojob.h>
#include <ipxe/timer.h>
#include <ipxe/errortab.h>
#include <usr/ifmgmt.h>

Go to the source code of this file.

Data Structures

struct  ifpoller
 Network device poller. More...

Macros

#define LINK_WAIT_TIMEOUT   ( 15 * TICKS_PER_SEC )
 Default time to wait for link-up.
#define EADDRNOTAVAIL_CONFIG   __einfo_error ( EINFO_EADDRNOTAVAIL_CONFIG )
 Default unsuccessful configuration status code.
#define EINFO_EADDRNOTAVAIL_CONFIG

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
int ifopen (struct net_device *netdev)
 Open network device.
void ifclose (struct net_device *netdev)
 Close network device.
static void ifstat_errors (struct net_device_stats *stats, const char *prefix)
 Print network device error breakdown.
void ifstat (struct net_device *netdev)
 Print status of network device.
static int ifpoller_progress (struct ifpoller *ifpoller, struct job_progress *progress __unused)
 Report network device poller progress.
static int ifpoller_wait (struct net_device *netdev, struct net_device_configurator *configurator, unsigned long timeout, int(*progress)(struct ifpoller *ifpoller))
 Poll network device until completion.
static int iflinkwait_progress (struct ifpoller *ifpoller)
 Check link-up progress.
int iflinkwait (struct net_device *netdev, unsigned long timeout, int verbose)
 Wait for link-up, with status indication.
static int ifconf_progress (struct ifpoller *ifpoller)
 Check configuration progress.
int ifconf (struct net_device *netdev, struct net_device_configurator *configurator, unsigned long timeout)
 Perform network device configuration.

Variables

struct errortab ifmgmt_errors[] __errortab
 Human-readable error message.
static struct interface_operation ifpoller_job_op []
 Network device poller operations.
static struct interface_descriptor ifpoller_job_desc
 Network device poller descriptor.

Detailed Description

Network interface management.

Definition in file ifmgmt.c.

Macro Definition Documentation

◆ LINK_WAIT_TIMEOUT

#define LINK_WAIT_TIMEOUT   ( 15 * TICKS_PER_SEC )

Default time to wait for link-up.

Definition at line 47 of file ifmgmt.c.

Referenced by ifconf().

◆ EADDRNOTAVAIL_CONFIG

#define EADDRNOTAVAIL_CONFIG   __einfo_error ( EINFO_EADDRNOTAVAIL_CONFIG )

Default unsuccessful configuration status code.

Definition at line 50 of file ifmgmt.c.

Referenced by ifconf_progress().

◆ EINFO_EADDRNOTAVAIL_CONFIG

#define EINFO_EADDRNOTAVAIL_CONFIG
Value:
"No configuration methods succeeded" )
#define __einfo_uniqify(einfo_base, uniq, desc)
Declare disambiguated error.
Definition errno.h:181
#define EINFO_EADDRNOTAVAIL
Definition errno.h:310

Definition at line 51 of file ifmgmt.c.

51#define EINFO_EADDRNOTAVAIL_CONFIG \
52 __einfo_uniqify ( EINFO_EADDRNOTAVAIL, 0x01, \
53 "No configuration methods succeeded" )

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ ifopen()

int ifopen ( struct net_device * netdev)

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 66 of file ifmgmt.c.

66 {
67 int rc;
68
69 if ( ( rc = netdev_open ( netdev ) ) != 0 ) {
70 printf ( "Could not open %s: %s\n",
71 netdev->name, strerror ( rc ) );
72 return rc;
73 }
74
75 return 0;
76}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
static struct net_device * netdev
Definition gdbudp.c:53
int netdev_open(struct net_device *netdev)
Open network device.
Definition netdevice.c:862
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition vsprintf.c:465

References netdev, netdev_open(), printf(), rc, and strerror().

Referenced by COMMAND(), iflinkwait(), ifopen_payload(), loopback_test(), and netboot().

◆ ifclose()

void ifclose ( struct net_device * netdev)

Close network device.

Parameters
netdevNetwork device

Definition at line 83 of file ifmgmt.c.

83 {
85}
void netdev_close(struct net_device *netdev)
Close network device.
Definition netdevice.c:896

References netdev, and netdev_close().

Referenced by close_other_netdevs(), COMMAND(), and ifclose_payload().

◆ ifstat_errors()

void ifstat_errors ( struct net_device_stats * stats,
const char * prefix )
static

Print network device error breakdown.

Parameters
statsNetwork device statistics
prefixMessage prefix

Definition at line 93 of file ifmgmt.c.

94 {
95 unsigned int i;
96
97 for ( i = 0 ; i < ( sizeof ( stats->errors ) /
98 sizeof ( stats->errors[0] ) ) ; i++ ) {
99 if ( stats->errors[i].count )
100 printf ( " [%s: %d x \"%s\"]\n", prefix,
101 stats->errors[i].count,
102 strerror ( stats->errors[i].rc ) );
103 }
104}
int rc
Error status code.
Definition netdevice.h:283
unsigned int count
Error count.
Definition netdevice.h:285
struct net_device_error errors[NETDEV_MAX_UNIQUE_ERRORS]
Error breakdowns.
Definition netdevice.h:298
char prefix[4]
Definition vmconsole.c:53

References net_device_error::count, net_device_stats::errors, prefix, printf(), net_device_error::rc, and strerror().

Referenced by ifstat().

◆ ifstat()

void ifstat ( struct net_device * netdev)

Print status of network device.

Parameters
netdevNetwork device

Definition at line 111 of file ifmgmt.c.

111 {
112 printf ( "%s: %s using %s on %s (%s) [%s]\n"
113 " [Link:%s%s, TX:%d TXE:%d RX:%d RXE:%d]\n",
114 netdev->name, netdev_addr ( netdev ),
115 netdev->dev->driver_name, netdev->dev->name,
116 netdev->ll_protocol->name,
117 ( netdev_is_open ( netdev ) ? "open" : "closed" ),
118 ( netdev_link_ok ( netdev ) ? "up" : "down" ),
119 ( netdev_link_blocked ( netdev ) ? " (blocked)" : "" ),
120 netdev->tx_stats.good, netdev->tx_stats.bad,
121 netdev->rx_stats.good, netdev->rx_stats.bad );
122 if ( ! netdev_link_ok ( netdev ) ) {
123 printf ( " [Link status: %s]\n",
124 strerror ( netdev->link_rc ) );
125 }
126 ifstat_errors ( &netdev->tx_stats, "TXE" );
127 ifstat_errors ( &netdev->rx_stats, "RXE" );
128}
static void ifstat_errors(struct net_device_stats *stats, const char *prefix)
Print network device error breakdown.
Definition ifmgmt.c:93
static int netdev_link_blocked(struct net_device *netdev)
Check link block state of network device.
Definition netdevice.h:651
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition netdevice.h:662
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition netdevice.h:640
static const char * netdev_addr(struct net_device *netdev)
Get printable network device link-layer address.
Definition netdevice.h:542

References ifstat_errors(), netdev, netdev_addr(), netdev_is_open(), netdev_link_blocked(), netdev_link_ok(), printf(), and strerror().

Referenced by COMMAND(), ifstat_payload(), iwstat(), loopback_test(), and netboot().

◆ ifpoller_progress()

int ifpoller_progress ( struct ifpoller * ifpoller,
struct job_progress *progress __unused )
static

Report network device poller progress.

Parameters
ifpollerNetwork device poller
progressProgress report to fill in
Return values
ongoing_rcOngoing job status code (if known)

Definition at line 154 of file ifmgmt.c.

155 {
156
157 /* Hand off to current progress checker */
158 return ifpoller->progress ( ifpoller );
159}
Network device poller.
Definition ifmgmt.c:131
int(* progress)(struct ifpoller *ifpoller)
Check progress.
Definition ifmgmt.c:144

References __unused, and ifpoller::progress.

◆ ifpoller_wait()

int ifpoller_wait ( struct net_device * netdev,
struct net_device_configurator * configurator,
unsigned long timeout,
int(* progress )(struct ifpoller *ifpoller) )
static

Poll network device until completion.

Parameters
netdevNetwork device
configuratorNetwork device configurator (if applicable)
timeoutTimeout period, in ticks
progressMethod to check progress
Return values
rcReturn status code

Definition at line 179 of file ifmgmt.c.

182 {
183 static struct ifpoller ifpoller = {
184 .job = INTF_INIT ( ifpoller_job_desc ),
185 };
186
191 return monojob_wait ( "", timeout );
192}
void timeout(int)
static struct interface_descriptor ifpoller_job_desc
Network device poller descriptor.
Definition ifmgmt.c:167
void intf_plug_plug(struct interface *a, struct interface *b)
Plug two object interfaces together.
Definition interface.c:108
#define INTF_INIT(descriptor)
Initialise a static object interface.
Definition interface.h:218
struct interface monojob
Definition monojob.c:57
int monojob_wait(const char *string, unsigned long timeout)
Wait for single foreground job to complete.
Definition monojob.c:82
struct interface job
Job control interface.
Definition ifmgmt.c:133
struct net_device_configurator * configurator
Network device configurator (if applicable)
Definition ifmgmt.c:137
struct net_device * netdev
Network device.
Definition ifmgmt.c:135

References ifpoller::configurator, ifpoller_job_desc, INTF_INIT, intf_plug_plug(), ifpoller::job, monojob, monojob_wait(), ifpoller::netdev, netdev, ifpoller::progress, and timeout().

Referenced by ifconf(), and iflinkwait().

◆ iflinkwait_progress()

int iflinkwait_progress ( struct ifpoller * ifpoller)
static

Check link-up progress.

Parameters
ifpollerNetwork device poller
Return values
ongoing_rcOngoing job status code (if known)

Definition at line 200 of file ifmgmt.c.

200 {
201 struct net_device *netdev = ifpoller->netdev;
202 int ongoing_rc = netdev->link_rc;
203
204 /* Terminate successfully if link is up */
205 if ( ongoing_rc == 0 )
206 intf_close ( &ifpoller->job, 0 );
207
208 /* Otherwise, report link status as ongoing job status */
209 return ongoing_rc;
210}
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition interface.c:250
A network device.
Definition netdevice.h:353

References intf_close(), ifpoller::job, ifpoller::netdev, and netdev.

Referenced by iflinkwait().

◆ iflinkwait()

int iflinkwait ( struct net_device * netdev,
unsigned long timeout,
int verbose )

Wait for link-up, with status indication.

Parameters
netdevNetwork device
timeoutTimeout period, in ticks
verboseAlways display progress message
Return values
rcReturn status code

Definition at line 220 of file ifmgmt.c.

221 {
222 int rc;
223
224 /* Ensure device is open */
225 if ( ( rc = ifopen ( netdev ) ) != 0 )
226 return rc;
227
228 /* Return immediately if link is already up, unless being verbose */
230 if ( netdev_link_ok ( netdev ) && ( ! verbose ) )
231 return 0;
232
233 /* Wait for link-up */
234 printf ( "Waiting for link-up on %s", netdev->name );
236}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
int ifopen(struct net_device *netdev)
Open network device.
Definition ifmgmt.c:66
static int ifpoller_wait(struct net_device *netdev, struct net_device_configurator *configurator, unsigned long timeout, int(*progress)(struct ifpoller *ifpoller))
Poll network device until completion.
Definition ifmgmt.c:179
static int iflinkwait_progress(struct ifpoller *ifpoller)
Check link-up progress.
Definition ifmgmt.c:200
void netdev_poll(struct net_device *netdev)
Poll for completed and received packets on network device.
Definition netdevice.c:613

References iflinkwait_progress(), ifopen(), ifpoller_wait(), netdev, netdev_link_ok(), netdev_poll(), NULL, printf(), rc, and timeout().

Referenced by COMMAND(), ifconf(), iflinkwait_payload(), and loopback_test().

◆ ifconf_progress()

int ifconf_progress ( struct ifpoller * ifpoller)
static

Check configuration progress.

Parameters
ifpollerNetwork device poller
Return values
ongoing_rcOngoing job status code (if known)

Definition at line 244 of file ifmgmt.c.

244 {
245 struct net_device *netdev = ifpoller->netdev;
246 struct net_device_configurator *configurator = ifpoller->configurator;
247 struct net_device_configuration *config;
248 int rc;
249
250 /* Do nothing unless configuration has completed */
252 return 0;
253
254 /* Terminate with appropriate overall return status code */
255 if ( configurator ) {
257 rc = config->rc;
258 } else {
261 }
262 intf_close ( &ifpoller->job, rc );
263
264 return rc;
265}
#define EADDRNOTAVAIL_CONFIG
Default unsuccessful configuration status code.
Definition ifmgmt.c:50
int netdev_configuration_ok(struct net_device *netdev)
Check if network device has at least one successful configuration.
Definition netdevice.c:1392
int netdev_configuration_in_progress(struct net_device *netdev)
Check if network device configuration is in progress.
Definition netdevice.c:1380
static struct net_device_configuration * netdev_configuration(struct net_device *netdev, struct net_device_configurator *configurator)
Get network device configuration.
Definition netdevice.h:612
A network device configuration.
Definition netdevice.h:302
int rc
Configuration status.
Definition netdevice.h:308
struct net_device_configurator * configurator
Network device configurator.
Definition netdevice.h:306
A network device configurator.
Definition netdevice.h:314

References ifpoller::configurator, net_device_configuration::configurator, EADDRNOTAVAIL_CONFIG, intf_close(), ifpoller::job, ifpoller::netdev, netdev, netdev_configuration(), netdev_configuration_in_progress(), netdev_configuration_ok(), net_device_configuration::rc, and rc.

Referenced by ifconf().

◆ ifconf()

int ifconf ( struct net_device * netdev,
struct net_device_configurator * configurator,
unsigned long timeout )

Perform network device configuration.

Parameters
netdevNetwork device
configuratorNetwork device configurator, or NULL to use all
timeoutTimeout period, in ticks
Return values
rcReturn status code

Definition at line 275 of file ifmgmt.c.

277 {
278 int rc;
279
280 /* Ensure device is open and link is up */
281 if ( ( rc = iflinkwait ( netdev, LINK_WAIT_TIMEOUT, 0 ) ) != 0 )
282 return rc;
283
284 /* Start configuration */
285 if ( configurator ) {
286 if ( ( rc = netdev_configure ( netdev, configurator ) ) != 0 ) {
287 printf ( "Could not configure %s via %s: %s\n",
288 netdev->name, configurator->name,
289 strerror ( rc ) );
290 return rc;
291 }
292 } else {
293 if ( ( rc = netdev_configure_all ( netdev ) ) != 0 ) {
294 printf ( "Could not configure %s: %s\n",
295 netdev->name, strerror ( rc ) );
296 return rc;
297 }
298 }
299
300 /* Wait for configuration to complete */
301 printf ( "Configuring %s%s%s(%s %s)",
302 ( configurator ? "[" : "" ),
303 ( configurator ? configurator->name : "" ),
304 ( configurator ? "] " : "" ),
305 netdev->name, netdev->ll_protocol->ntoa ( netdev->ll_addr ) );
306 return ifpoller_wait ( netdev, configurator, timeout, ifconf_progress );
307}
#define LINK_WAIT_TIMEOUT
Default time to wait for link-up.
Definition ifmgmt.c:47
static int ifconf_progress(struct ifpoller *ifpoller)
Check configuration progress.
Definition ifmgmt.c:244
int iflinkwait(struct net_device *netdev, unsigned long timeout, int verbose)
Wait for link-up, with status indication.
Definition ifmgmt.c:220
int netdev_configure_all(struct net_device *netdev)
Start network device configuration via all supported configurators.
Definition netdevice.c:1336
int netdev_configure(struct net_device *netdev, struct net_device_configurator *configurator)
Start network device configuration.
Definition netdevice.c:1296
const char * name
Name.
Definition netdevice.h:316

References net_device_configuration::configurator, ifconf_progress(), iflinkwait(), ifpoller_wait(), LINK_WAIT_TIMEOUT, net_device_configurator::name, netdev, netdev_configure(), netdev_configure_all(), printf(), rc, strerror(), and timeout().

Referenced by COMMAND(), ifconf_payload(), and netboot().

Variable Documentation

◆ __errortab

struct errortab ifmgmt_errors [] __errortab
Initial value:
= {
}
#define __einfo_errortab(einfo)
Definition errortab.h:24
#define EINFO_EADDRNOTAVAIL_CONFIG
Definition ifmgmt.c:51

Human-readable error message.

Definition at line 56 of file ifmgmt.c.

◆ ifpoller_job_op

struct interface_operation ifpoller_job_op[]
static
Initial value:
= {
}
static int ifpoller_progress(struct ifpoller *ifpoller, struct job_progress *progress __unused)
Report network device poller progress.
Definition ifmgmt.c:154
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition interface.h:33
Job progress.
Definition job.h:16

Network device poller operations.

Definition at line 162 of file ifmgmt.c.

162 {
164};

◆ ifpoller_job_desc

struct interface_descriptor ifpoller_job_desc
static
Initial value:
=
static struct interface_operation ifpoller_job_op[]
Network device poller operations.
Definition ifmgmt.c:162
#define INTF_DESC(object_type, intf, operations)
Define an object interface descriptor.
Definition interface.h:81

Network device poller descriptor.

Definition at line 167 of file ifmgmt.c.

Referenced by ifpoller_wait().