iPXE
slirp.c File Reference

Linux Slirp network driver. More...

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/if_ether.h>
#include <ipxe/in.h>
#include <ipxe/timer.h>
#include <ipxe/retry.h>
#include <ipxe/linux.h>
#include <ipxe/linux_api.h>
#include <ipxe/slirp.h>

Go to the source code of this file.

Data Structures

struct  slirp_nic
 A Slirp network interface. More...
struct  slirp_alarm
 A Slirp alarm timer. More...

Macros

#define SLIRP_MAX_FDS   128
 Maximum number of open file descriptors.

Functions

static ssize_t __asmcall slirp_send_packet (const void *buf, size_t len, void *device)
 Send packet.
static void __asmcall slirp_guest_error (const char *msg, void *device)
 Print an error message.
static int64_t __asmcall slirp_clock_get_ns (void *device __unused)
 Get virtual clock.
static void slirp_expired (struct retry_timer *timer, int over __unused)
 Handle timer expiry.
static void *__asmcall slirp_timer_new (void(__asmcall *callback)(void *opaque), void *opaque, void *device)
 Create a new timer.
static void __asmcall slirp_timer_free (void *timer, void *device)
 Delete a timer.
static void __asmcall slirp_timer_mod (void *timer, int64_t expire, void *device)
 Set timer expiry time.
static void __asmcall slirp_register_poll_fd (int fd, void *device)
 Register file descriptor for polling.
static void __asmcall slirp_unregister_poll_fd (int fd, void *device)
 Unregister file descriptor.
static void __asmcall slirp_notify (void *device)
 Notify that new events are ready.
static int slirp_open (struct net_device *netdev)
 Open network device.
static void slirp_close (struct net_device *netdev)
 Close network device.
static int slirp_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit packet.
static int __asmcall slirp_add_poll (int fd, int events, void *device)
 Add polling file descriptor.
static int __asmcall slirp_get_revents (int index, void *device)
 Get returned events for a file descriptor.
static void slirp_poll (struct net_device *netdev)
 Poll for completed and received packets.
static int slirp_probe (struct linux_device *linux, struct linux_device_request *request)
 Probe device.
static void slirp_remove (struct linux_device *linux)
 Remove device.
 LINUX_ROM ("slirp", "libslirp NIC")

Variables

static const uint8_t slirp_default_mac [ETH_ALEN]
 Default MAC address.
static struct slirp_callbacks slirp_callbacks
 Slirp callbacks.
static struct net_device_operations slirp_operations
 Network device operations.
struct linux_driver slirp_driver __linux_driver
 Slirp driver.

Detailed Description

Linux Slirp network driver.

Definition in file slirp.c.

Macro Definition Documentation

◆ SLIRP_MAX_FDS

#define SLIRP_MAX_FDS   128

Maximum number of open file descriptors.

Definition at line 40 of file slirp.c.

Referenced by slirp_add_poll().

Function Documentation

◆ slirp_send_packet()

ssize_t __asmcall slirp_send_packet ( const void * buf,
size_t len,
void * device )
static

Send packet.

Parameters
bufData buffer
lenLength of data
deviceDevice opaque pointer
Return values
lenConsumed length (or negative on error)

Definition at line 83 of file slirp.c.

84 {
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}
ring len
Length.
Definition dwmac.h:226
static struct net_device * netdev
Definition gdbudp.c:53
void * memcpy(void *dest, const void *src, 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
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition netdevice.c:549
A hardware device.
Definition device.h:77
A persistent I/O buffer.
Definition iobuf.h:38
A network device.
Definition netdevice.h:353

References __asmcall, alloc_iob(), iob_put, len, memcpy(), netdev, and netdev_rx().

◆ slirp_guest_error()

void __asmcall slirp_guest_error ( const char * msg,
void * device )
static

Print an error message.

Parameters
msgError message
deviceDevice opaque pointer

Definition at line 108 of file slirp.c.

108 {
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}
#define DBGC(...)
Definition compiler.h:505
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition message.c:62
A Slirp network interface.
Definition slirp.c:43
struct Slirp * slirp
The libslirp device object.
Definition slirp.c:45

References __asmcall, DBGC, msg(), netdev, and slirp_nic::slirp.

◆ slirp_clock_get_ns()

int64_t __asmcall slirp_clock_get_ns ( void *device __unused)
static

Get virtual clock.

Parameters
deviceDevice opaque pointer
Return values
clock_nsClock time in nanoseconds

Definition at line 121 of file slirp.c.

121 {
122 int64_t time;
123
124 time = currticks();
125 return ( time * ( 1000000 / TICKS_PER_MS ) );
126}
signed long long int64_t
Definition stdint.h:18
#define TICKS_PER_MS
Number of ticks per millisecond.
Definition timer.h:26
unsigned long currticks(void)
Get current system time in ticks.
Definition timer.c:43

References __asmcall, __unused, currticks(), and TICKS_PER_MS.

◆ slirp_expired()

void slirp_expired ( struct retry_timer * timer,
int over __unused )
static

Handle timer expiry.

Parameters
timerRetry timer
overFailure indicator

Definition at line 134 of file slirp.c.

134 {
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}
#define container_of(ptr, type, field)
Get containing structure.
Definition stddef.h:36
A Slirp alarm timer.
Definition slirp.c:53
void * opaque
Opaque value for callback function.
Definition slirp.c:61
struct slirp_nic * slirp
Slirp network interface.
Definition slirp.c:55
A timer.
Definition timer.h:29

References __unused, container_of, DBGC, slirp_alarm::opaque, slirp_alarm::slirp, and slirp_nic::slirp.

Referenced by slirp_timer_new().

◆ slirp_timer_new()

void *__asmcall slirp_timer_new ( void(__asmcall *callback)(void *opaque) ,
void * opaque,
void * device )
static

Create a new timer.

Parameters
callbackTimer callback
opaqueTimer opaque pointer
deviceDevice opaque pointer
Return values
timerTimer

Definition at line 153 of file slirp.c.

154 {
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}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
void * memset(void *dest, int character, size_t len) __nonnull
void * malloc(size_t size)
Allocate memory.
Definition malloc.c:621
static void slirp_expired(struct retry_timer *timer, int over __unused)
Handle timer expiry.
Definition slirp.c:134
struct retry_timer timer
Retry timer.
Definition slirp.c:57

References __asmcall, DBGC, malloc(), memset(), netdev, NULL, slirp_alarm::opaque, slirp_alarm::slirp, slirp_nic::slirp, slirp_expired(), and slirp_alarm::timer.

◆ slirp_timer_free()

void __asmcall slirp_timer_free ( void * timer,
void * device )
static

Delete a timer.

Parameters
timerTimer
deviceDevice opaque pointer

Definition at line 184 of file slirp.c.

184 {
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}
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition retry.c:118

References __asmcall, DBGC, free, netdev, slirp_alarm::slirp, slirp_nic::slirp, stop_timer(), and slirp_alarm::timer.

◆ slirp_timer_mod()

void __asmcall slirp_timer_mod ( void * timer,
int64_t expire,
void * device )
static

Set timer expiry time.

Parameters
timerTimer
expireExpiry time
deviceDevice opaque pointer

Definition at line 208 of file slirp.c.

209 {
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}
void timeout(int)
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition retry.c:65

References __asmcall, currticks(), DBGC, netdev, slirp_alarm::slirp, slirp_nic::slirp, start_timer_fixed(), TICKS_PER_MS, timeout(), and slirp_alarm::timer.

◆ slirp_register_poll_fd()

void __asmcall slirp_register_poll_fd ( int fd,
void * device )
static

Register file descriptor for polling.

Parameters
fdFile descriptor
deviceDevice opaque pointer

Definition at line 236 of file slirp.c.

236 {
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}

References __asmcall, DBGC, netdev, and slirp_nic::slirp.

◆ slirp_unregister_poll_fd()

void __asmcall slirp_unregister_poll_fd ( int fd,
void * device )
static

Unregister file descriptor.

Parameters
fdFile descriptor
deviceDevice opaque pointer

Definition at line 249 of file slirp.c.

249 {
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}

References __asmcall, DBGC, netdev, and slirp_nic::slirp.

◆ slirp_notify()

void __asmcall slirp_notify ( void * device)
static

Notify that new events are ready.

Parameters
deviceDevice opaque pointer

Definition at line 261 of file slirp.c.

261 {
262 struct net_device *netdev = device;
263 struct slirp_nic *slirp = netdev->priv;
264
265 DBGC2 ( slirp, "SLIRP %p notified\n", slirp );
266}
#define DBGC2(...)
Definition compiler.h:522

References __asmcall, DBGC2, netdev, and slirp_nic::slirp.

◆ slirp_open()

int slirp_open ( struct net_device * netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 294 of file slirp.c.

294 {
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}

References DBGC, netdev, and slirp_nic::slirp.

◆ slirp_close()

void slirp_close ( struct net_device * netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 308 of file slirp.c.

308 {
309 struct slirp_nic *slirp = netdev->priv;
310
311 /* Nothing to do */
312 DBGC ( slirp, "SLIRP %p closed\n", slirp );
313}

References DBGC, netdev, and slirp_nic::slirp.

◆ slirp_transmit()

int slirp_transmit ( struct net_device * netdev,
struct io_buffer * iobuf )
static

Transmit packet.

Parameters
netdevNetwork device
iobufI/O buffer
Return values
rcReturn status code

Definition at line 322 of file slirp.c.

323 {
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}
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
void __asmcall linux_slirp_input(struct Slirp *slirp, const uint8_t *pkt, int pkt_len)
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition netdevice.h:767
void * data
Start of data.
Definition iobuf.h:53

References io_buffer::data, iob_len(), linux_slirp_input(), netdev, netdev_tx_complete(), and slirp_nic::slirp.

◆ slirp_add_poll()

int __asmcall slirp_add_poll ( int fd,
int events,
void * device )
static

Add polling file descriptor.

Parameters
fdFile descriptor
eventsEvents of interest
deviceDevice opaque pointer
Return values
indexFile descriptor index

Definition at line 341 of file slirp.c.

341 {
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}
long index
Definition bigint.h:65
#define DBGCP(...)
Definition compiler.h:539
#define SLIRP_MAX_FDS
Maximum number of open file descriptors.
Definition slirp.c:40
#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
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

References __asmcall, DBGC, DBGCP, index, netdev, slirp_nic::numfds, slirp_nic::pollfds, slirp_nic::slirp, SLIRP_EVENT_ERR, SLIRP_EVENT_HUP, SLIRP_EVENT_IN, SLIRP_EVENT_OUT, SLIRP_EVENT_PRI, and SLIRP_MAX_FDS.

Referenced by slirp_poll().

◆ slirp_get_revents()

int __asmcall slirp_get_revents ( int index,
void * device )
static

Get returned events for a file descriptor.

Parameters
indexFile descriptor index
deviceDevice opaque pointer
Return values
eventsReturned events

Definition at line 381 of file slirp.c.

381 {
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}

References __asmcall, DBGC2, index, netdev, slirp_nic::slirp, SLIRP_EVENT_ERR, SLIRP_EVENT_HUP, SLIRP_EVENT_IN, SLIRP_EVENT_OUT, and SLIRP_EVENT_PRI.

Referenced by slirp_poll().

◆ slirp_poll()

void slirp_poll ( struct net_device * netdev)
static

Poll for completed and received packets.

Parameters
netdevNetwork device

Definition at line 417 of file slirp.c.

417 {
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}
struct arbelprm_completion_with_error error
Definition arbel.h:1
unsigned int uint32_t
Definition stdint.h:12
#define ELINUX(errno)
Convert a Linux error number to an iPXE status code.
Definition linux.h:39
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_pollfds_poll(struct Slirp *slirp, int select_error, int(__asmcall *get_revents)(int idx, void *opaque), void *opaque)
int __asmcall linux_poll(struct pollfd *fds, unsigned int nfds, int timeout)
const char *__asmcall linux_strerror(int linux_errno)
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition netdevice.c:587
static int __asmcall slirp_add_poll(int fd, int events, void *device)
Add polling file descriptor.
Definition slirp.c:341
static int __asmcall slirp_get_revents(int index, void *device)
Get returned events for a file descriptor.
Definition slirp.c:381

References DBGC, ELINUX, error, linux_errno, linux_poll(), linux_slirp_pollfds_fill(), linux_slirp_pollfds_poll(), linux_strerror(), netdev, netdev_rx_err(), NULL, slirp_nic::slirp, slirp_add_poll(), slirp_get_revents(), and timeout().

◆ slirp_probe()

int slirp_probe ( struct linux_device * linux,
struct linux_device_request * request )
static

Probe device.

Parameters
linuxLinux device
requestDevice creation request
Return values
rcReturn status code

Definition at line 464 of file slirp.c.

465 {
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}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition ethernet.c:265
#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
static void linux_set_drvdata(struct linux_device *device, void *priv)
Set linux device driver-private data.
Definition linux.h:78
void linux_apply_settings(struct list_head *new_settings, struct settings *settings_block)
Apply a list of linux settings to a settings block.
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)
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
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 struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition netdevice.h:587
static struct net_device_operations slirp_operations
Network device operations.
Definition slirp.c:443
static const uint8_t slirp_default_mac[ETH_ALEN]
Default MAC address.
Definition slirp.c:65
char name[40]
Name.
Definition device.h:79
struct device dev
Generic device.
Definition linux.h:44
Slirp device callbacks.
Definition slirp.h:81
Slirp device configuration.
Definition slirp.h:31
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition vsprintf.c:383

References alloc_etherdev(), DBGC, linux_device::dev, ENODEV, ENOMEM, ETH_ALEN, htonl, slirp_config::in6_enabled, slirp_config::in_enabled, linux_apply_settings(), linux_set_drvdata(), linux_slirp_cleanup(), linux_slirp_new(), memcpy(), memset(), device::name, netdev, netdev_init(), netdev_link_up(), netdev_nullify(), netdev_put(), netdev_settings(), rc, register_netdev(), request, in_addr::s_addr, slirp_nic::slirp, slirp_default_mac, slirp_operations, snprintf(), unregister_netdev(), slirp_config::vdhcp_start, slirp_config::version, slirp_config::vhost, slirp_config::vnameserver, slirp_config::vnetmask, and slirp_config::vnetwork.

◆ slirp_remove()

void slirp_remove ( struct linux_device * linux)
static

Remove device.

Parameters
linuxLinux device

Definition at line 532 of file slirp.c.

532 {
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}
static void * linux_get_drvdata(struct linux_device *device)
Get linux device driver-private data.
Definition linux.h:89

References linux_get_drvdata(), linux_slirp_cleanup(), netdev, netdev_nullify(), netdev_put(), slirp_nic::slirp, and unregister_netdev().

◆ LINUX_ROM()

LINUX_ROM ( "slirp" ,
"libslirp NIC"  )

Variable Documentation

◆ slirp_default_mac

const uint8_t slirp_default_mac[ETH_ALEN]
static
Initial value:
=
{ 0x52, 0x54, 0x00, 0x12, 0x34, 0x56 }

Default MAC address.

Definition at line 65 of file slirp.c.

66 { 0x52, 0x54, 0x00, 0x12, 0x34, 0x56 };

Referenced by slirp_probe().

◆ slirp_callbacks

struct slirp_callbacks slirp_callbacks
static
Initial value:
= {
.send_packet = slirp_send_packet,
.guest_error = slirp_guest_error,
.clock_get_ns = slirp_clock_get_ns,
.timer_new = slirp_timer_new,
.timer_free = slirp_timer_free,
.timer_mod = slirp_timer_mod,
.register_poll_fd = slirp_register_poll_fd,
.unregister_poll_fd = slirp_unregister_poll_fd,
.notify = slirp_notify,
}
static void __asmcall slirp_notify(void *device)
Notify that new events are ready.
Definition slirp.c:261
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 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 void __asmcall slirp_timer_free(void *timer, void *device)
Delete a timer.
Definition slirp.c:184
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

Slirp callbacks.

Definition at line 269 of file slirp.c.

269 {
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};

◆ slirp_operations

struct net_device_operations slirp_operations
static
Initial value:
= {
.open = slirp_open,
.close = slirp_close,
.transmit = slirp_transmit,
.poll = slirp_poll,
}
static int slirp_open(struct net_device *netdev)
Open network device.
Definition slirp.c:294
static void slirp_close(struct net_device *netdev)
Close network device.
Definition slirp.c:308
static void slirp_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition slirp.c:417
static int slirp_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition slirp.c:322

Network device operations.

Definition at line 443 of file slirp.c.

443 {
444 .open = slirp_open,
445 .close = slirp_close,
446 .transmit = slirp_transmit,
447 .poll = slirp_poll,
448};

Referenced by slirp_probe().

◆ __linux_driver

struct linux_driver slirp_driver __linux_driver
Initial value:
= {
.name = "slirp",
.probe = slirp_probe,
.remove = slirp_remove,
}
static int slirp_probe(struct linux_device *linux, struct linux_device_request *request)
Probe device.
Definition slirp.c:464
static void slirp_remove(struct linux_device *linux)
Remove device.
Definition slirp.c:532

Slirp driver.

Definition at line 548 of file slirp.c.

548 {
549 .name = "slirp",
550 .probe = slirp_probe,
551 .remove = slirp_remove,
552};