iPXE
slirp.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2021 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
20#include <stdio.h>
21#include <string.h>
22#include <errno.h>
23#include <ipxe/netdevice.h>
24#include <ipxe/ethernet.h>
25#include <ipxe/if_ether.h>
26#include <ipxe/in.h>
27#include <ipxe/timer.h>
28#include <ipxe/retry.h>
29#include <ipxe/linux.h>
30#include <ipxe/linux_api.h>
31#include <ipxe/slirp.h>
32
33/** @file
34 *
35 * Linux Slirp network driver
36 *
37 */
38
39/** Maximum number of open file descriptors */
40#define SLIRP_MAX_FDS 128
41
42/** A Slirp network interface */
43struct slirp_nic {
44 /** The libslirp device object */
45 struct Slirp *slirp;
46 /** Polling file descriptor list */
47 struct pollfd pollfds[SLIRP_MAX_FDS];
48 /** Number of file descriptors */
49 unsigned int numfds;
50};
51
52/** A Slirp alarm timer */
54 /** Slirp network interface */
56 /** Retry timer */
58 /** Callback function */
59 void ( __asmcall * callback ) ( void *opaque );
60 /** Opaque value for callback function */
61 void *opaque;
62};
63
64/** Default MAC address */
66 { 0x52, 0x54, 0x00, 0x12, 0x34, 0x56 };
67
68/******************************************************************************
69 *
70 * Slirp interface
71 *
72 ******************************************************************************
73 */
74
75/**
76 * Send packet
77 *
78 * @v buf Data buffer
79 * @v len Length of data
80 * @v device Device opaque pointer
81 * @ret len Consumed length (or negative on error)
82 */
83static ssize_t __asmcall slirp_send_packet ( const void *buf, size_t len,
84 void *device ) {
85 struct net_device *netdev = device;
86 struct io_buffer *iobuf;
87
88 /* Allocate I/O buffer */
89 iobuf = alloc_iob ( len );
90 if ( ! iobuf )
91 return -1;
92
93 /* Populate I/O buffer */
94 memcpy ( iob_put ( iobuf, len ), buf, len );
95
96 /* Hand off to network stack */
97 netdev_rx ( netdev, iobuf );
98
99 return len;
100}
101
102/**
103 * Print an error message
104 *
105 * @v msg Error message
106 * @v device Device opaque pointer
107 */
108static void __asmcall slirp_guest_error ( const char *msg, void *device ) {
109 struct net_device *netdev = device;
110 struct slirp_nic *slirp = netdev->priv;
111
112 DBGC ( slirp, "SLIRP %p error: %s\n", slirp, msg );
113}
114
115/**
116 * Get virtual clock
117 *
118 * @v device Device opaque pointer
119 * @ret clock_ns Clock time in nanoseconds
120 */
122 int64_t time;
123
124 time = currticks();
125 return ( time * ( 1000000 / TICKS_PER_MS ) );
126}
127
128/**
129 * Handle timer expiry
130 *
131 * @v timer Retry timer
132 * @v over Failure indicator
133 */
134static void slirp_expired ( struct retry_timer *timer, int over __unused ) {
135 struct slirp_alarm *alarm =
136 container_of ( timer, struct slirp_alarm, timer );
137 struct slirp_nic *slirp = alarm->slirp;
138
139 /* Notify callback */
140 DBGC ( slirp, "SLIRP %p timer fired\n", slirp );
141 alarm->callback ( alarm->opaque );
142}
143
144/**
145 * Create a new timer
146 *
147 * @v callback Timer callback
148 * @v opaque Timer opaque pointer
149 * @v device Device opaque pointer
150 * @ret timer Timer
151 */
152static void * __asmcall
153slirp_timer_new ( void ( __asmcall * callback ) ( void *opaque ),
154 void *opaque, void *device ) {
155 struct net_device *netdev = device;
156 struct slirp_nic *slirp = netdev->priv;
157 struct slirp_alarm *alarm;
158
159 /* Allocate timer */
160 alarm = malloc ( sizeof ( *alarm ) );
161 if ( ! alarm ) {
162 DBGC ( slirp, "SLIRP %p could not allocate timer\n", slirp );
163 return NULL;
164 }
165
166 /* Initialise timer */
167 memset ( alarm, 0, sizeof ( *alarm ) );
168 alarm->slirp = slirp;
169 timer_init ( &alarm->timer, slirp_expired, NULL );
170 alarm->callback = callback;
171 alarm->opaque = opaque;
172 DBGC ( slirp, "SLIRP %p timer %p has callback %p (%p)\n",
173 slirp, alarm, alarm->callback, alarm->opaque );
174
175 return alarm;
176}
177
178/**
179 * Delete a timer
180 *
181 * @v timer Timer
182 * @v device Device opaque pointer
183 */
184static void __asmcall slirp_timer_free ( void *timer, void *device ) {
185 struct net_device *netdev = device;
186 struct slirp_nic *slirp = netdev->priv;
187 struct slirp_alarm *alarm = timer;
188
189 /* Ignore timers that failed to allocate */
190 if ( ! alarm )
191 return;
192
193 /* Stop timer */
194 stop_timer ( &alarm->timer );
195
196 /* Free timer */
197 free ( alarm );
198 DBGC ( slirp, "SLIRP %p timer %p freed\n", slirp, alarm );
199}
200
201/**
202 * Set timer expiry time
203 *
204 * @v timer Timer
205 * @v expire Expiry time
206 * @v device Device opaque pointer
207 */
208static void __asmcall slirp_timer_mod ( void *timer, int64_t expire,
209 void *device ) {
210 struct net_device *netdev = device;
211 struct slirp_nic *slirp = netdev->priv;
212 struct slirp_alarm *alarm = timer;
213 int64_t timeout_ms;
214 unsigned long timeout;
215
216 /* Ignore timers that failed to allocate */
217 if ( ! alarm )
218 return;
219
220 /* (Re)start timer */
221 timeout_ms = ( expire - ( currticks() / TICKS_PER_MS ) );
222 if ( timeout_ms < 0 )
223 timeout_ms = 0;
224 timeout = ( timeout_ms * TICKS_PER_MS );
225 start_timer_fixed ( &alarm->timer, timeout );
226 DBGC ( slirp, "SLIRP %p timer %p set for %ld ticks\n",
227 slirp, alarm, timeout );
228}
229
230/**
231 * Register file descriptor for polling
232 *
233 * @v fd File descriptor
234 * @v device Device opaque pointer
235 */
236static void __asmcall slirp_register_poll_fd ( int fd, void *device ) {
237 struct net_device *netdev = device;
238 struct slirp_nic *slirp = netdev->priv;
239
240 DBGC ( slirp, "SLIRP %p registered FD %d\n", slirp, fd );
241}
242
243/**
244 * Unregister file descriptor
245 *
246 * @v fd File descriptor
247 * @v device Device opaque pointer
248 */
249static void __asmcall slirp_unregister_poll_fd ( int fd, void *device ) {
250 struct net_device *netdev = device;
251 struct slirp_nic *slirp = netdev->priv;
252
253 DBGC ( slirp, "SLIRP %p unregistered FD %d\n", slirp, fd );
254}
255
256/**
257 * Notify that new events are ready
258 *
259 * @v device Device opaque pointer
260 */
261static void __asmcall slirp_notify ( void *device ) {
262 struct net_device *netdev = device;
263 struct slirp_nic *slirp = netdev->priv;
264
265 DBGC2 ( slirp, "SLIRP %p notified\n", slirp );
266}
267
268/** Slirp callbacks */
270 .send_packet = slirp_send_packet,
271 .guest_error = slirp_guest_error,
272 .clock_get_ns = slirp_clock_get_ns,
273 .timer_new = slirp_timer_new,
274 .timer_free = slirp_timer_free,
275 .timer_mod = slirp_timer_mod,
276 .register_poll_fd = slirp_register_poll_fd,
277 .unregister_poll_fd = slirp_unregister_poll_fd,
278 .notify = slirp_notify,
279};
280
281/******************************************************************************
282 *
283 * Network device interface
284 *
285 ******************************************************************************
286 */
287
288/**
289 * Open network device
290 *
291 * @v netdev Network device
292 * @ret rc Return status code
293 */
294static int slirp_open ( struct net_device *netdev ) {
295 struct slirp_nic *slirp = netdev->priv;
296
297 /* Nothing to do */
298 DBGC ( slirp, "SLIRP %p opened\n", slirp );
299
300 return 0;
301}
302
303/**
304 * Close network device
305 *
306 * @v netdev Network device
307 */
308static void slirp_close ( struct net_device *netdev ) {
309 struct slirp_nic *slirp = netdev->priv;
310
311 /* Nothing to do */
312 DBGC ( slirp, "SLIRP %p closed\n", slirp );
313}
314
315/**
316 * Transmit packet
317 *
318 * @v netdev Network device
319 * @v iobuf I/O buffer
320 * @ret rc Return status code
321 */
322static int slirp_transmit ( struct net_device *netdev,
323 struct io_buffer *iobuf ) {
324 struct slirp_nic *slirp = netdev->priv;
325
326 /* Transmit packet */
327 linux_slirp_input ( slirp->slirp, iobuf->data, iob_len ( iobuf ) );
328 netdev_tx_complete ( netdev, iobuf );
329
330 return 0;
331}
332
333/**
334 * Add polling file descriptor
335 *
336 * @v fd File descriptor
337 * @v events Events of interest
338 * @v device Device opaque pointer
339 * @ret index File descriptor index
340 */
341static int __asmcall slirp_add_poll ( int fd, int events, void *device ) {
342 struct net_device *netdev = device;
343 struct slirp_nic *slirp = netdev->priv;
344 struct pollfd *pollfd;
345 unsigned int index;
346
347 /* Fail if too many descriptors are registered */
348 if ( slirp->numfds >= SLIRP_MAX_FDS ) {
349 DBGC ( slirp, "SLIRP %p too many file descriptors\n", slirp );
350 return -1;
351 }
352
353 /* Populate polling file descriptor */
354 index = slirp->numfds++;
355 pollfd = &slirp->pollfds[index];
356 pollfd->fd = fd;
357 pollfd->events = 0;
358 if ( events & SLIRP_EVENT_IN )
359 pollfd->events |= POLLIN;
360 if ( events & SLIRP_EVENT_OUT )
361 pollfd->events |= POLLOUT;
362 if ( events & SLIRP_EVENT_PRI )
363 pollfd->events |= POLLPRI;
364 if ( events & SLIRP_EVENT_ERR )
365 pollfd->events |= POLLERR;
366 if ( events & SLIRP_EVENT_HUP )
367 pollfd->events |= ( POLLHUP | POLLRDHUP );
368 DBGCP ( slirp, "SLIRP %p polling FD %d event mask %#04x(%#04x)\n",
369 slirp, fd, events, pollfd->events );
370
371 return index;
372}
373
374/**
375 * Get returned events for a file descriptor
376 *
377 * @v index File descriptor index
378 * @v device Device opaque pointer
379 * @ret events Returned events
380 */
381static int __asmcall slirp_get_revents ( int index, void *device ) {
382 struct net_device *netdev = device;
383 struct slirp_nic *slirp = netdev->priv;
384 int revents;
385 int events;
386
387 /* Ignore failed descriptors */
388 if ( index < 0 )
389 return 0;
390
391 /* Collect events */
392 revents = slirp->pollfds[index].revents;
393 events = 0;
394 if ( revents & POLLIN )
395 events |= SLIRP_EVENT_IN;
396 if ( revents & POLLOUT )
397 events |= SLIRP_EVENT_OUT;
398 if ( revents & POLLPRI )
399 events |= SLIRP_EVENT_PRI;
400 if ( revents & POLLERR )
401 events |= SLIRP_EVENT_ERR;
402 if ( revents & ( POLLHUP | POLLRDHUP ) )
403 events |= SLIRP_EVENT_HUP;
404 if ( events ) {
405 DBGC2 ( slirp, "SLIRP %p polled FD %d events %#04x(%#04x)\n",
406 slirp, slirp->pollfds[index].fd, events, revents );
407 }
408
409 return events;
410}
411
412/**
413 * Poll for completed and received packets
414 *
415 * @v netdev Network device
416 */
417static void slirp_poll ( struct net_device *netdev ) {
418 struct slirp_nic *slirp = netdev->priv;
419 uint32_t timeout = 0;
420 int ready;
421 int error;
422
423 /* Rebuild polling file descriptor list */
424 slirp->numfds = 0;
427
428 /* Poll descriptors */
429 ready = linux_poll ( slirp->pollfds, slirp->numfds, 0 );
430 error = ( ready == -1 );
432 netdev );
433
434 /* Record polling errors */
435 if ( error ) {
436 DBGC ( slirp, "SLIRP %p poll failed: %s\n",
439 }
440}
441
442/** Network device operations */
444 .open = slirp_open,
445 .close = slirp_close,
446 .transmit = slirp_transmit,
447 .poll = slirp_poll,
448};
449
450/******************************************************************************
451 *
452 * Linux driver interface
453 *
454 ******************************************************************************
455 */
456
457/**
458 * Probe device
459 *
460 * @v linux Linux device
461 * @v request Device creation request
462 * @ret rc Return status code
463 */
464static int slirp_probe ( struct linux_device *linux,
465 struct linux_device_request *request ) {
466 struct net_device *netdev;
467 struct slirp_nic *slirp;
468 struct slirp_config config;
469 int rc;
470
471 /* Allocate device */
472 netdev = alloc_etherdev ( sizeof ( *slirp ) );
473 if ( ! netdev ) {
474 rc = -ENOMEM;
475 goto err_alloc;
476 }
478 linux_set_drvdata ( linux, netdev );
479 snprintf ( linux->dev.name, sizeof ( linux->dev.name ), "host" );
480 netdev->dev = &linux->dev;
482 slirp = netdev->priv;
483 memset ( slirp, 0, sizeof ( *slirp ) );
484
485 /* Apply requested settings */
486 linux_apply_settings ( &request->settings,
488
489 /* Initialise default configuration (matching qemu) */
490 memset ( &config, 0, sizeof ( config ) );
491 config.version = 1;
492 config.in_enabled = true;
493 config.vnetwork.s_addr = htonl ( 0x0a000200 ); /* 10.0.2.0 */
494 config.vnetmask.s_addr = htonl ( 0xffffff00 ); /* 255.255.255.0 */
495 config.vhost.s_addr = htonl ( 0x0a000202 ); /* 10.0.2.2 */
496 config.in6_enabled = true;
497 config.vdhcp_start.s_addr = htonl ( 0x0a00020f ); /* 10.0.2.15 */
498 config.vnameserver.s_addr = htonl ( 0x0a000203 ); /* 10.0.2.3 */
499
500 /* Instantiate device */
501 slirp->slirp = linux_slirp_new ( &config, &slirp_callbacks, netdev );
502 if ( ! slirp->slirp ) {
503 DBGC ( slirp, "SLIRP could not instantiate\n" );
504 rc = -ENODEV;
505 goto err_new;
506 }
507
508 /* Register network device */
509 if ( ( rc = register_netdev ( netdev ) ) != 0 )
510 goto err_register;
511
512 /* Set link up since there is no concept of link state */
514
515 return 0;
516
518 err_register:
519 linux_slirp_cleanup ( slirp->slirp );
520 err_new:
522 netdev_put ( netdev );
523 err_alloc:
524 return rc;
525}
526
527/**
528 * Remove device
529 *
530 * @v linux Linux device
531 */
532static void slirp_remove ( struct linux_device *linux ) {
533 struct net_device *netdev = linux_get_drvdata ( linux );
534 struct slirp_nic *slirp = netdev->priv;
535
536 /* Unregister network device */
538
539 /* Shut down device */
540 linux_slirp_cleanup ( slirp->slirp );
541
542 /* Free network device */
544 netdev_put ( netdev );
545}
546
547/** Slirp driver */
548struct linux_driver slirp_driver __linux_driver = {
549 .name = "slirp",
550 .probe = slirp_probe,
551 .remove = slirp_remove,
552};
553
554/* Generate build rules */
555LINUX_ROM ( "slirp", "libslirp NIC" );
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
struct arbelprm_completion_with_error error
Definition arbel.h:1
#define __asmcall
Declare a function with standard calling conventions.
Definition compiler.h:15
unsigned int uint32_t
Definition stdint.h:12
unsigned char uint8_t
Definition stdint.h:10
signed long long int64_t
Definition stdint.h:18
signed long ssize_t
Definition stdint.h:7
long index
Definition bigint.h:65
void timeout(int)
ring len
Length.
Definition dwmac.h:226
Error codes.
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 DBGC2(...)
Definition compiler.h:522
#define DBGCP(...)
Definition compiler.h:539
#define DBGC(...)
Definition compiler.h:505
#define ENOMEM
Not enough space.
Definition errno.h:535
#define ENODEV
No such device.
Definition errno.h:510
u8 request[0]
List of IEs requested.
Definition ieee80211.h:2
#define ETH_ALEN
Definition if_ether.h:9
#define htonl(value)
Definition byteswap.h:134
Linux devices, drivers and device requests.
static void linux_set_drvdata(struct linux_device *device, void *priv)
Set linux device driver-private data.
Definition linux.h:78
#define LINUX_ROM(_name, _desc)
Define build rules for a Linux driver.
Definition linux.h:70
void linux_apply_settings(struct list_head *new_settings, struct settings *settings_block)
Apply a list of linux settings to a settings block.
#define __linux_driver
Declare a Linux driver.
Definition linux.h:67
static void * linux_get_drvdata(struct linux_device *device)
Get linux device driver-private data.
Definition linux.h:89
#define ELINUX(errno)
Convert a Linux error number to an iPXE status code.
Definition linux.h:39
iPXE timers
#define TICKS_PER_MS
Number of ticks per millisecond.
Definition timer.h:26
String functions.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131
#define iob_put(iobuf, len)
Definition iobuf.h:125
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
Linux host API.
int linux_errno
void __asmcall linux_slirp_pollfds_fill(struct Slirp *slirp, uint32_t *timeout, int(__asmcall *add_poll)(int fd, int events, void *opaque), void *opaque)
void __asmcall linux_slirp_input(struct Slirp *slirp, const uint8_t *pkt, int pkt_len)
void __asmcall linux_slirp_pollfds_poll(struct Slirp *slirp, int select_error, int(__asmcall *get_revents)(int idx, void *opaque), void *opaque)
struct Slirp *__asmcall linux_slirp_new(const struct slirp_config *config, const struct slirp_callbacks *callbacks, void *opaque)
void __asmcall linux_slirp_cleanup(struct Slirp *slirp)
int __asmcall linux_poll(struct pollfd *fds, unsigned int nfds, int timeout)
const char *__asmcall linux_strerror(int linux_errno)
void * malloc(size_t size)
Allocate memory.
Definition malloc.c:621
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition message.c:62
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition netdevice.c:549
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition netdevice.c:587
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
Network device management.
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition netdevice.h:789
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
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition retry.c:65
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition retry.c:118
Retry timers.
static void __asmcall slirp_notify(void *device)
Notify that new events are ready.
Definition slirp.c:261
static void slirp_expired(struct retry_timer *timer, int over __unused)
Handle timer expiry.
Definition slirp.c:134
static void __asmcall slirp_unregister_poll_fd(int fd, void *device)
Unregister file descriptor.
Definition slirp.c:249
static ssize_t __asmcall slirp_send_packet(const void *buf, size_t len, void *device)
Send packet.
Definition slirp.c:83
static int slirp_open(struct net_device *netdev)
Open network device.
Definition slirp.c:294
static struct net_device_operations slirp_operations
Network device operations.
Definition slirp.c:443
static void slirp_close(struct net_device *netdev)
Close network device.
Definition slirp.c:308
#define SLIRP_MAX_FDS
Maximum number of open file descriptors.
Definition slirp.c:40
static void slirp_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition slirp.c:417
static int __asmcall slirp_add_poll(int fd, int events, void *device)
Add polling file descriptor.
Definition slirp.c:341
static void __asmcall slirp_guest_error(const char *msg, void *device)
Print an error message.
Definition slirp.c:108
static void __asmcall slirp_timer_mod(void *timer, int64_t expire, void *device)
Set timer expiry time.
Definition slirp.c:208
static int slirp_probe(struct linux_device *linux, struct linux_device_request *request)
Probe device.
Definition slirp.c:464
static const uint8_t slirp_default_mac[ETH_ALEN]
Default MAC address.
Definition slirp.c:65
static int __asmcall slirp_get_revents(int index, void *device)
Get returned events for a file descriptor.
Definition slirp.c:381
static int slirp_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition slirp.c:322
static void __asmcall slirp_timer_free(void *timer, void *device)
Delete a timer.
Definition slirp.c:184
static void slirp_remove(struct linux_device *linux)
Remove device.
Definition slirp.c:532
static void __asmcall slirp_register_poll_fd(int fd, void *device)
Register file descriptor for polling.
Definition slirp.c:236
static void *__asmcall slirp_timer_new(void(__asmcall *callback)(void *opaque), void *opaque, void *device)
Create a new timer.
Definition slirp.c:153
static int64_t __asmcall slirp_clock_get_ns(void *device __unused)
Get virtual clock.
Definition slirp.c:121
Linux Slirp network driver.
#define SLIRP_EVENT_ERR
Error condition.
Definition slirp.h:25
#define SLIRP_EVENT_IN
Ready to be read.
Definition slirp.h:16
#define SLIRP_EVENT_PRI
Exceptional condition.
Definition slirp.h:22
#define SLIRP_EVENT_HUP
Hang up.
Definition slirp.h:28
#define SLIRP_EVENT_OUT
Ready to be written.
Definition slirp.h:19
#define container_of(ptr, type, field)
Get containing structure.
Definition stddef.h:36
A hardware device.
Definition device.h:77
char name[40]
Name.
Definition device.h:79
uint32_t s_addr
Definition in.h:43
A persistent I/O buffer.
Definition iobuf.h:38
void * data
Start of data.
Definition iobuf.h:53
A device request.
Definition linux.h:99
A linux device.
Definition linux.h:42
struct device dev
Generic device.
Definition linux.h:44
A linux driver.
Definition linux.h:54
Network device operations.
Definition netdevice.h:214
A network device.
Definition netdevice.h:353
A retry timer.
Definition retry.h:22
A Slirp alarm timer.
Definition slirp.c:53
struct retry_timer timer
Retry timer.
Definition slirp.c:57
void(__asmcall *callback)(void *opaque)
Callback function.
void * opaque
Opaque value for callback function.
Definition slirp.c:61
struct slirp_nic * slirp
Slirp network interface.
Definition slirp.c:55
Slirp device callbacks.
Definition slirp.h:81
Slirp device configuration.
Definition slirp.h:31
bool in6_enabled
IPv6 is enabled.
Definition slirp.h:45
struct in_addr vhost
IPv4 host server address.
Definition slirp.h:43
bool in_enabled
IPv4 is enabled.
Definition slirp.h:37
uint32_t version
Configuration version.
Definition slirp.h:33
struct in_addr vnetmask
IPv4 netmask.
Definition slirp.h:41
struct in_addr vnameserver
DNS IPv4 address.
Definition slirp.h:63
struct in_addr vdhcp_start
DHCPv4 start address.
Definition slirp.h:61
struct in_addr vnetwork
IPv4 network.
Definition slirp.h:39
A Slirp network interface.
Definition slirp.c:43
unsigned int numfds
Number of file descriptors.
Definition slirp.c:49
struct pollfd pollfds[SLIRP_MAX_FDS]
Polling file descriptor list.
Definition slirp.c:47
struct Slirp * slirp
The libslirp device object.
Definition slirp.c:45
A timer.
Definition timer.h:29
unsigned long currticks(void)
Get current system time in ticks.
Definition timer.c:43
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition vsprintf.c:383