iPXE
netdev_test.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2025 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  *
19  * You can also choose to distribute this program under the terms of
20  * the Unmodified Binary Distribution Licence (as given in the file
21  * COPYING.UBDL), provided that you have satisfied its requirements.
22  */
23 
24 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25 
26 /** @file
27  *
28  * Network device tests
29  *
30  */
31 
32 /* Forcibly enable assertions */
33 #undef NDEBUG
34 
35 #include <string.h>
36 #include <stdio.h>
37 #include <ipxe/netdevice.h>
38 #include <ipxe/ethernet.h>
39 #include <ipxe/test.h>
40 #include "netdev_test.h"
41 
42 /**
43  * Open network device
44  *
45  * @v netdev Network device
46  * @ret rc Return status code
47  */
48 static int testnet_open ( struct net_device *netdev __unused ) {
49 
50  /* Do nothing, successfully */
51  return 0;
52 }
53 
54 /**
55  * Close network device
56  *
57  * @v netdev Network device
58  */
59 static void testnet_close ( struct net_device *netdev __unused ) {
60 
61  /* Do nothing */
62 }
63 
64 /**
65  * Transmit packet
66  *
67  * @v netdev Network device
68  * @v iobuf I/O buffer
69  * @ret rc Return status code
70  */
71 static int testnet_transmit ( struct net_device *netdev,
72  struct io_buffer *iobuf ) {
73 
74  /* Complete immediately */
75  netdev_tx_complete ( netdev, iobuf );
76  return 0;
77 }
78 
79 /**
80  * Poll for completed and received packets
81  *
82  * @v netdev Network device
83  */
84 static void testnet_poll ( struct net_device *netdev __unused ) {
85 
86  /* Do nothing */
87 }
88 
89 /** Test network device operations */
91  .open = testnet_open,
92  .close = testnet_close,
93  .transmit = testnet_transmit,
94  .poll = testnet_poll,
95 };
96 
97 /**
98  * Report a network device creation test result
99  *
100  * @v testnet Test network device
101  * @v file Test code file
102  * @v line Test code line
103  */
104 void testnet_okx ( struct testnet *testnet, const char *file,
105  unsigned int line ) {
106  struct testnet_setting *testset;
107  unsigned int i;
108 
109  /* Allocate device */
110  testnet->netdev = alloc_etherdev ( 0 );
111  okx ( testnet->netdev != NULL, file, line );
113  testnet->netdev->dev = &testnet->dev;
114  snprintf ( testnet->netdev->name, sizeof ( testnet->netdev->name ),
115  "%s", testnet->dev.name );
116 
117  /* Register device */
118  okx ( register_netdev ( testnet->netdev ) == 0, file, line );
119 
120  /* Open device */
121  testnet_open_okx ( testnet, file, line );
122 
123  /* Apply initial settings */
124  for ( i = 0 ; i < testnet->count ; i++ ) {
125  testset = &testnet->testset[i];
126  testnet_set_okx ( testnet, testset->name, testset->value,
127  file, line );
128  }
129 }
130 
131 /**
132  * Report a network device opening test result
133  *
134  * @v testnet Test network device
135  * @v file Test code file
136  * @v line Test code line
137  */
138 void testnet_open_okx ( struct testnet *testnet, const char *file,
139  unsigned int line ) {
140 
141  /* Sanity check */
142  okx ( testnet->netdev != NULL, file, line );
143 
144  /* Open device */
145  okx ( netdev_open ( testnet->netdev ) == 0, file, line );
146 }
147 
148 /**
149  * Report a network device setting test result
150  *
151  * @v testnet Test network device
152  * @v name Setting name (relative to network device's settings)
153  * @v value Setting value
154  * @v file Test code file
155  * @v line Test code line
156  */
157 void testnet_set_okx ( struct testnet *testnet, const char *name,
158  const char *value, const char *file,
159  unsigned int line ) {
160  char fullname[ strlen ( testnet->dev.name ) + 1 /* "." or "/" */ +
161  strlen ( name ) + 1 /* NUL */ ];
162  struct settings *settings;
163  struct setting setting;
164 
165  /* Sanity check */
166  okx ( testnet->netdev != NULL, file, line );
168  okx ( settings != NULL, file, line );
169  okx ( strcmp ( settings->name, testnet->dev.name ) == 0, file, line );
170 
171  /* Construct setting name */
172  snprintf ( fullname, sizeof ( fullname ), "%s%c%s", testnet->dev.name,
173  ( strchr ( name, '/' ) ? '.' : '/' ), name );
174 
175  /* Parse setting name */
177  &settings, &setting ) == 0, file, line );
178 
179  /* Apply setting */
180  okx ( storef_setting ( settings, &setting, value ) == 0, file, line );
181 }
182 
183 /**
184  * Report a network device closing test result
185  *
186  * @v testnet Test network device
187  * @v file Test code file
188  * @v line Test code line
189  */
190 void testnet_close_okx ( struct testnet *testnet, const char *file,
191  unsigned int line ) {
192 
193  /* Sanity check */
194  okx ( testnet->netdev != NULL, file, line );
195 
196  /* Close device */
198 }
199 
200 /**
201  * Report a network device removal test result
202  *
203  * @v testnet Test network device
204  * @v file Test code file
205  * @v line Test code line
206  */
207 void testnet_remove_okx ( struct testnet *testnet, const char *file,
208  unsigned int line ) {
209 
210  /* Sanity check */
211  okx ( testnet->netdev != NULL, file, line );
212 
213  /* Remove device */
217  testnet->netdev = NULL;
218 }
const char * name
Definition: ath9k_hw.c:1984
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:766
struct device dev
Dummy physical device.
Definition: netdev_test.h:28
int(* open)(struct net_device *netdev)
Open network device.
Definition: netdevice.h:222
A test network device.
Definition: netdev_test.h:24
static void testnet_poll(struct net_device *netdev __unused)
Poll for completed and received packets.
Definition: netdev_test.c:84
unsigned int count
Number of initial settings.
Definition: netdev_test.h:32
struct net_device * netdev
Network device.
Definition: netdev_test.h:26
char name[40]
Name.
Definition: device.h:78
Self-test infrastructure.
static int testnet_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: netdev_test.c:71
static void testnet_close(struct net_device *netdev __unused)
Close network device.
Definition: netdev_test.c:59
void testnet_set_okx(struct testnet *testnet, const char *name, const char *value, const char *file, unsigned int line)
Report a network device setting test result.
Definition: netdev_test.c:157
void testnet_close_okx(struct testnet *testnet, const char *file, unsigned int line)
Report a network device closing test result.
Definition: netdev_test.c:190
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:586
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:518
struct testnet_setting * testset
Initial settings.
Definition: netdev_test.h:30
#define okx(success, file, line)
Report test result.
Definition: test.h:44
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:575
Ethernet protocol.
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
#define __unused
Declare a variable or data structure as unused.
Definition: compiler.h:573
static struct net_device * netdev
Definition: gdbudp.c:52
struct settings * autovivify_child_settings(struct settings *parent, const char *name)
Find or create child settings block.
Definition: settings.c:306
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
void testnet_okx(struct testnet *testnet, const char *file, unsigned int line)
Report a network device creation test result.
Definition: netdev_test.c:104
const char * value
Value.
Definition: netdev_test.h:20
int storef_setting(struct settings *settings, const struct setting *setting, const char *value)
Store formatted value of setting.
Definition: settings.c:1319
char * strchr(const char *src, int character)
Find character within a string.
Definition: string.c:271
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:759
A network device.
Definition: netdevice.h:352
size_t strlen(const char *src)
Get length of string.
Definition: string.c:243
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:531
static int testnet_open(struct net_device *netdev __unused)
Open network device.
Definition: netdev_test.c:48
A settings block.
Definition: settings.h:132
A test network device setting.
Definition: netdev_test.h:16
static struct net_device_operations testnet_operations
Test network device operations.
Definition: netdev_test.c:90
const char * name
Name.
Definition: settings.h:136
const char * name
Setting name (relative to network device's settings)
Definition: netdev_test.h:18
void testnet_remove_okx(struct testnet *testnet, const char *file, unsigned int line)
Report a network device removal test result.
Definition: netdev_test.c:207
A setting.
Definition: settings.h:23
Network device operations.
Definition: netdevice.h:213
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
void netdev_close(struct net_device *netdev)
Close network device.
Definition: netdevice.c:895
Network device management.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
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 net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
Network device tests.
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
String functions.
int netdev_open(struct net_device *netdev)
Open network device.
Definition: netdevice.c:861
void testnet_open_okx(struct testnet *testnet, const char *file, unsigned int line)
Report a network device opening test result.
Definition: netdev_test.c:138
int parse_setting_name(char *name, get_child_settings_t get_child, struct settings **settings, struct setting *setting)
Parse setting name.
Definition: settings.c:1528
A persistent I/O buffer.
Definition: iobuf.h:37