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
24FILE_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 */
48static 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 */
59static 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 */
71static 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 */
84static 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 */
104void 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 */
111 okx ( testnet->netdev != NULL, file, line );
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 */
138void 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 */
157void 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 */
190void 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 */
207void 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 */
218}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
pseudo_bit_t value[0x00020]
Definition arbel.h:2
const char * name
Definition ath9k_hw.c:1986
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition ethernet.c:265
Ethernet protocol.
static struct net_device * netdev
Definition gdbudp.c:53
#define __unused
Declare a variable or data structure as unused.
Definition compiler.h:573
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
String functions.
void testnet_remove_okx(struct testnet *testnet, const char *file, unsigned int line)
Report a network device removal test result.
static struct net_device_operations testnet_operations
Test network device operations.
Definition netdev_test.c:90
static int testnet_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition netdev_test.c:71
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.
void testnet_okx(struct testnet *testnet, const char *file, unsigned int line)
Report a network device creation test result.
void testnet_open_okx(struct testnet *testnet, const char *file, unsigned int line)
Report a network device opening test result.
void testnet_close_okx(struct testnet *testnet, const char *file, unsigned int line)
Report a network device closing test result.
static void testnet_close(struct net_device *netdev __unused)
Close network device.
Definition netdev_test.c:59
static void testnet_poll(struct net_device *netdev __unused)
Poll for completed and received packets.
Definition netdev_test.c:84
static int testnet_open(struct net_device *netdev __unused)
Open network device.
Definition netdev_test.c:48
Network device tests.
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
int netdev_open(struct net_device *netdev)
Open network device.
Definition netdevice.c:862
void netdev_close(struct net_device *netdev)
Close network device.
Definition netdevice.c:896
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
Network device management.
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition netdevice.h:519
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition netdevice.h:532
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition netdevice.h:576
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition netdevice.h:767
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition netdevice.h:587
struct settings * autovivify_child_settings(struct settings *parent, const char *name)
Find or create child settings block.
Definition settings.c:307
int parse_setting_name(char *name, get_child_settings_t get_child, struct settings **settings, struct setting *setting)
Parse setting name.
Definition settings.c:1529
int storef_setting(struct settings *settings, const struct setting *setting, const char *value)
Store formatted value of setting.
Definition settings.c:1320
int strcmp(const char *first, const char *second)
Compare strings.
Definition string.c:174
char * strchr(const char *src, int character)
Find character within a string.
Definition string.c:272
size_t strlen(const char *src)
Get length of string.
Definition string.c:244
char name[40]
Name.
Definition device.h:79
A persistent I/O buffer.
Definition iobuf.h:38
Network device operations.
Definition netdevice.h:214
A network device.
Definition netdevice.h:353
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition netdevice.h:363
struct device * dev
Underlying hardware device.
Definition netdevice.h:365
A setting.
Definition settings.h:24
A settings block.
Definition settings.h:133
const char * name
Name.
Definition settings.h:137
A test network device setting.
Definition netdev_test.h:16
const char * name
Setting name (relative to network device's settings)
Definition netdev_test.h:18
const char * value
Value.
Definition netdev_test.h:20
A test network device.
Definition netdev_test.h:24
unsigned int count
Number of initial settings.
Definition netdev_test.h:32
struct net_device * netdev
Network device.
Definition netdev_test.h:26
struct device dev
Dummy physical device.
Definition netdev_test.h:28
struct testnet_setting * testset
Initial settings.
Definition netdev_test.h:30
Self-test infrastructure.
#define okx(success, file, line)
Report test result.
Definition test.h:44
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition vsprintf.c:383