-----BEGIN PGP SIGNATURE-----
iQEzBAABCAAdFiEEIV1G9IJGaJ7HfzVi7wSWWzmNYhEFAmasTgwACgkQ7wSWWzmN YhFUtAgAq45v7fQJ7cKKwRam/VrIkxT5cM59ODwzLSL9kPWfL6f/bJ7xM/zvLyvn LNBXFWWu+eNKA73f95cckZwaqZ4U6giGbiesCACn1IpgVtieLS+Lq78jsifKIAsR yxFvbT9oLhU0dZ1Up3+isc6V+jeAE4ZYu4KOiIt7PscTEzkJl+vSUjN4X9rRVtUD PzONUacL6MoTJtX8UZJZXNzLN9JTsN39Gx+LSDGQ27MDmDvE3R9BW+T0ZgF9JQZ7 wnrL5sharqF3gxa7X55fPBI1qwY5gWcH0yyJpRdM8guA13vhtvlrhNSypip9eKWi HtPHUTKEB5YOvF236WRiuQPIm/GNpA== =7HGN -----END PGP SIGNATURE----- Merge tag 'net-pull-request' of https://github.com/jasowang/qemu into staging # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCAAdFiEEIV1G9IJGaJ7HfzVi7wSWWzmNYhEFAmasTgwACgkQ7wSWWzmN # YhFUtAgAq45v7fQJ7cKKwRam/VrIkxT5cM59ODwzLSL9kPWfL6f/bJ7xM/zvLyvn # LNBXFWWu+eNKA73f95cckZwaqZ4U6giGbiesCACn1IpgVtieLS+Lq78jsifKIAsR # yxFvbT9oLhU0dZ1Up3+isc6V+jeAE4ZYu4KOiIt7PscTEzkJl+vSUjN4X9rRVtUD # PzONUacL6MoTJtX8UZJZXNzLN9JTsN39Gx+LSDGQ27MDmDvE3R9BW+T0ZgF9JQZ7 # wnrL5sharqF3gxa7X55fPBI1qwY5gWcH0yyJpRdM8guA13vhtvlrhNSypip9eKWi # HtPHUTKEB5YOvF236WRiuQPIm/GNpA== # =7HGN # -----END PGP SIGNATURE----- # gpg: Signature made Fri 02 Aug 2024 01:10:04 PM AEST # gpg: using RSA key 215D46F48246689EC77F3562EF04965B398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 215D 46F4 8246 689E C77F 3562 EF04 965B 398D 6211 * tag 'net-pull-request' of https://github.com/jasowang/qemu: net: Reinstate '-net nic, model=help' output as documented in man page net: update netdev stream man page with the reconnect parameter net: update netdev dgram man page with unix socket net: update netdev stream man page with unix socket net: update netdev stream/dgram man page virtio-net: Fix network stall at the host side waiting for kick virtio-net: Ensure queue index fits with RSS rtl8139: Fix behaviour for old kernels. Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
c4d242501a
@ -2738,7 +2738,11 @@ static void rtl8139_io_writeb(void *opaque, uint8_t addr, uint32_t val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case RxConfig:
|
||||||
|
DPRINTF("RxConfig write(b) val=0x%02x\n", val);
|
||||||
|
rtl8139_RxConfig_write(s,
|
||||||
|
(rtl8139_RxConfig_read(s) & 0xFFFFFF00) | val);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
DPRINTF("not implemented write(b) addr=0x%x val=0x%02x\n", addr,
|
DPRINTF("not implemented write(b) addr=0x%x val=0x%02x\n", addr,
|
||||||
val);
|
val);
|
||||||
|
@ -1641,24 +1641,28 @@ static bool virtio_net_can_receive(NetClientState *nc)
|
|||||||
|
|
||||||
static int virtio_net_has_buffers(VirtIONetQueue *q, int bufsize)
|
static int virtio_net_has_buffers(VirtIONetQueue *q, int bufsize)
|
||||||
{
|
{
|
||||||
|
int opaque;
|
||||||
|
unsigned int in_bytes;
|
||||||
VirtIONet *n = q->n;
|
VirtIONet *n = q->n;
|
||||||
if (virtio_queue_empty(q->rx_vq) ||
|
|
||||||
(n->mergeable_rx_bufs &&
|
|
||||||
!virtqueue_avail_bytes(q->rx_vq, bufsize, 0))) {
|
|
||||||
virtio_queue_set_notification(q->rx_vq, 1);
|
|
||||||
|
|
||||||
/* To avoid a race condition where the guest has made some buffers
|
while (virtio_queue_empty(q->rx_vq) || n->mergeable_rx_bufs) {
|
||||||
* available after the above check but before notification was
|
opaque = virtqueue_get_avail_bytes(q->rx_vq, &in_bytes, NULL,
|
||||||
* enabled, check for available buffers again.
|
bufsize, 0);
|
||||||
*/
|
/* Buffer is enough, disable notifiaction */
|
||||||
if (virtio_queue_empty(q->rx_vq) ||
|
if (bufsize <= in_bytes) {
|
||||||
(n->mergeable_rx_bufs &&
|
break;
|
||||||
!virtqueue_avail_bytes(q->rx_vq, bufsize, 0))) {
|
}
|
||||||
|
|
||||||
|
if (virtio_queue_enable_notification_and_check(q->rx_vq, opaque)) {
|
||||||
|
/* Guest has added some buffers, try again */
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtio_queue_set_notification(q->rx_vq, 0);
|
virtio_queue_set_notification(q->rx_vq, 0);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1905,7 +1909,8 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,
|
|||||||
if (!no_rss && n->rss_data.enabled && n->rss_data.enabled_software_rss) {
|
if (!no_rss && n->rss_data.enabled && n->rss_data.enabled_software_rss) {
|
||||||
int index = virtio_net_process_rss(nc, buf, size, &extra_hdr);
|
int index = virtio_net_process_rss(nc, buf, size, &extra_hdr);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
NetClientState *nc2 = qemu_get_subqueue(n->nic, index);
|
NetClientState *nc2 =
|
||||||
|
qemu_get_subqueue(n->nic, index % n->curr_queue_pairs);
|
||||||
return virtio_net_receive_rcu(nc2, buf, size, true);
|
return virtio_net_receive_rcu(nc2, buf, size, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -744,6 +744,60 @@ int virtio_queue_empty(VirtQueue *vq)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool virtio_queue_split_poll(VirtQueue *vq, unsigned shadow_idx)
|
||||||
|
{
|
||||||
|
if (unlikely(!vq->vring.avail)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (uint16_t)shadow_idx != vring_avail_idx(vq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool virtio_queue_packed_poll(VirtQueue *vq, unsigned shadow_idx)
|
||||||
|
{
|
||||||
|
VRingPackedDesc desc;
|
||||||
|
VRingMemoryRegionCaches *caches;
|
||||||
|
|
||||||
|
if (unlikely(!vq->vring.desc)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
caches = vring_get_region_caches(vq);
|
||||||
|
if (!caches) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
vring_packed_desc_read(vq->vdev, &desc, &caches->desc,
|
||||||
|
shadow_idx, true);
|
||||||
|
|
||||||
|
return is_desc_avail(desc.flags, vq->shadow_avail_wrap_counter);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool virtio_queue_poll(VirtQueue *vq, unsigned shadow_idx)
|
||||||
|
{
|
||||||
|
if (virtio_device_disabled(vq->vdev)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virtio_vdev_has_feature(vq->vdev, VIRTIO_F_RING_PACKED)) {
|
||||||
|
return virtio_queue_packed_poll(vq, shadow_idx);
|
||||||
|
} else {
|
||||||
|
return virtio_queue_split_poll(vq, shadow_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool virtio_queue_enable_notification_and_check(VirtQueue *vq,
|
||||||
|
int opaque)
|
||||||
|
{
|
||||||
|
virtio_queue_set_notification(vq, 1);
|
||||||
|
|
||||||
|
if (opaque >= 0) {
|
||||||
|
return virtio_queue_poll(vq, (unsigned)opaque);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void virtqueue_unmap_sg(VirtQueue *vq, const VirtQueueElement *elem,
|
static void virtqueue_unmap_sg(VirtQueue *vq, const VirtQueueElement *elem,
|
||||||
unsigned int len)
|
unsigned int len)
|
||||||
{
|
{
|
||||||
@ -1442,9 +1496,9 @@ err:
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
|
int virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
|
||||||
unsigned int *out_bytes,
|
unsigned int *out_bytes, unsigned max_in_bytes,
|
||||||
unsigned max_in_bytes, unsigned max_out_bytes)
|
unsigned max_out_bytes)
|
||||||
{
|
{
|
||||||
uint16_t desc_size;
|
uint16_t desc_size;
|
||||||
VRingMemoryRegionCaches *caches;
|
VRingMemoryRegionCaches *caches;
|
||||||
@ -1477,7 +1531,7 @@ void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
|
|||||||
caches);
|
caches);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return (int)vq->shadow_avail_idx;
|
||||||
err:
|
err:
|
||||||
if (in_bytes) {
|
if (in_bytes) {
|
||||||
*in_bytes = 0;
|
*in_bytes = 0;
|
||||||
@ -1485,6 +1539,8 @@ err:
|
|||||||
if (out_bytes) {
|
if (out_bytes) {
|
||||||
*out_bytes = 0;
|
*out_bytes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
|
int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
|
||||||
|
@ -273,9 +273,13 @@ void qemu_put_virtqueue_element(VirtIODevice *vdev, QEMUFile *f,
|
|||||||
VirtQueueElement *elem);
|
VirtQueueElement *elem);
|
||||||
int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
|
int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
|
||||||
unsigned int out_bytes);
|
unsigned int out_bytes);
|
||||||
void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
|
/**
|
||||||
unsigned int *out_bytes,
|
* Return <0 on error or an opaque >=0 to pass to
|
||||||
unsigned max_in_bytes, unsigned max_out_bytes);
|
* virtio_queue_enable_notification_and_check on success.
|
||||||
|
*/
|
||||||
|
int virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
|
||||||
|
unsigned int *out_bytes, unsigned max_in_bytes,
|
||||||
|
unsigned max_out_bytes);
|
||||||
|
|
||||||
void virtio_notify_irqfd(VirtIODevice *vdev, VirtQueue *vq);
|
void virtio_notify_irqfd(VirtIODevice *vdev, VirtQueue *vq);
|
||||||
void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
|
void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
|
||||||
@ -309,6 +313,15 @@ int virtio_queue_ready(VirtQueue *vq);
|
|||||||
|
|
||||||
int virtio_queue_empty(VirtQueue *vq);
|
int virtio_queue_empty(VirtQueue *vq);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable notification and check whether guest has added some
|
||||||
|
* buffers since last call to virtqueue_get_avail_bytes.
|
||||||
|
*
|
||||||
|
* @opaque: value returned from virtqueue_get_avail_bytes
|
||||||
|
*/
|
||||||
|
bool virtio_queue_enable_notification_and_check(VirtQueue *vq,
|
||||||
|
int opaque);
|
||||||
|
|
||||||
void virtio_queue_set_shadow_avail_idx(VirtQueue *vq, uint16_t idx);
|
void virtio_queue_set_shadow_avail_idx(VirtQueue *vq, uint16_t idx);
|
||||||
|
|
||||||
/* Host binding interface. */
|
/* Host binding interface. */
|
||||||
|
25
net/net.c
25
net/net.c
@ -1139,6 +1139,21 @@ NICInfo *qemu_find_nic_info(const char *typename, bool match_default,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_nic_model_help_option(const char *model)
|
||||||
|
{
|
||||||
|
if (model && is_help_option(model)) {
|
||||||
|
/*
|
||||||
|
* Trigger the help output by instantiating the hash table which
|
||||||
|
* will gather tha available models as they get registered.
|
||||||
|
*/
|
||||||
|
if (!nic_model_help) {
|
||||||
|
nic_model_help = g_hash_table_new_full(g_str_hash, g_str_equal,
|
||||||
|
g_free, NULL);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* "I have created a device. Please configure it if you can" */
|
/* "I have created a device. Please configure it if you can" */
|
||||||
bool qemu_configure_nic_device(DeviceState *dev, bool match_default,
|
bool qemu_configure_nic_device(DeviceState *dev, bool match_default,
|
||||||
@ -1722,6 +1737,12 @@ void net_check_clients(void)
|
|||||||
|
|
||||||
static int net_init_client(void *dummy, QemuOpts *opts, Error **errp)
|
static int net_init_client(void *dummy, QemuOpts *opts, Error **errp)
|
||||||
{
|
{
|
||||||
|
const char *model = qemu_opt_get_del(opts, "model");
|
||||||
|
|
||||||
|
if (is_nic_model_help_option(model)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return net_client_init(opts, false, errp);
|
return net_client_init(opts, false, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1778,9 +1799,7 @@ static int net_param_nic(void *dummy, QemuOpts *opts, Error **errp)
|
|||||||
memset(ni, 0, sizeof(*ni));
|
memset(ni, 0, sizeof(*ni));
|
||||||
ni->model = qemu_opt_get_del(opts, "model");
|
ni->model = qemu_opt_get_del(opts, "model");
|
||||||
|
|
||||||
if (!nic_model_help && !g_strcmp0(ni->model, "help")) {
|
if (is_nic_model_help_option(ni->model)) {
|
||||||
nic_model_help = g_hash_table_new_full(g_str_hash, g_str_equal,
|
|
||||||
g_free, NULL);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
189
qemu-options.hx
189
qemu-options.hx
@ -3353,6 +3353,195 @@ SRST
|
|||||||
-device e1000,netdev=n1,mac=52:54:00:12:34:56 \\
|
-device e1000,netdev=n1,mac=52:54:00:12:34:56 \\
|
||||||
-netdev socket,id=n1,mcast=239.192.168.1:1102,localaddr=1.2.3.4
|
-netdev socket,id=n1,mcast=239.192.168.1:1102,localaddr=1.2.3.4
|
||||||
|
|
||||||
|
``-netdev stream,id=str[,server=on|off],addr.type=inet,addr.host=host,addr.port=port[,to=maxport][,numeric=on|off][,keep-alive=on|off][,mptcp=on|off][,addr.ipv4=on|off][,addr.ipv6=on|off][,reconnect=seconds]``
|
||||||
|
Configure a network backend to connect to another QEMU virtual machine or a proxy using a TCP/IP socket.
|
||||||
|
|
||||||
|
``server=on|off``
|
||||||
|
if ``on`` create a server socket
|
||||||
|
|
||||||
|
``addr.host=host,addr.port=port``
|
||||||
|
socket address to listen on (server=on) or connect to (server=off)
|
||||||
|
|
||||||
|
``to=maxport``
|
||||||
|
if present, this is range of possible addresses, with port between ``port`` and ``maxport``.
|
||||||
|
|
||||||
|
``numeric=on|off``
|
||||||
|
if ``on`` ``host`` and ``port`` are guaranteed to be numeric, otherwise a name resolution should be attempted (default: ``off``)
|
||||||
|
|
||||||
|
``keep-alive=on|off``
|
||||||
|
enable keep-alive when connecting to this socket. Not supported for passive sockets.
|
||||||
|
|
||||||
|
``mptcp=on|off``
|
||||||
|
enable multipath TCP
|
||||||
|
|
||||||
|
``ipv4=on|off``
|
||||||
|
whether to accept IPv4 addresses, default to try both IPv4 and IPv6
|
||||||
|
|
||||||
|
``ipv6=on|off``
|
||||||
|
whether to accept IPv6 addresses, default to try both IPv4 and IPv6
|
||||||
|
|
||||||
|
``reconnect=seconds``
|
||||||
|
for a client socket, if a socket is disconnected, then attempt a reconnect after the given number of seconds.
|
||||||
|
Setting this to zero disables this function. (default: 0)
|
||||||
|
|
||||||
|
Example (two guests connected using a TCP/IP socket):
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
# first VM
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:56 \\
|
||||||
|
-netdev stream,id=net0,server=on,addr.type=inet,addr.host=localhost,addr.port=1234
|
||||||
|
# second VM
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:57 \\
|
||||||
|
-netdev stream,id=net0,server=off,addr.type=inet,addr.host=localhost,addr.port=1234,reconnect=5
|
||||||
|
|
||||||
|
``-netdev stream,id=str[,server=on|off],addr.type=unix,addr.path=path[,abstract=on|off][,tight=on|off][,reconnect=seconds]``
|
||||||
|
Configure a network backend to connect to another QEMU virtual machine or a proxy using a stream oriented unix domain socket.
|
||||||
|
|
||||||
|
``server=on|off``
|
||||||
|
if ``on`` create a server socket
|
||||||
|
|
||||||
|
``addr.path=path``
|
||||||
|
filesystem path to use
|
||||||
|
|
||||||
|
``abstract=on|off``
|
||||||
|
if ``on``, this is a Linux abstract socket address.
|
||||||
|
|
||||||
|
``tight=on|off``
|
||||||
|
if false, pad an abstract socket address with enough null bytes to make it fill struct sockaddr_un member sun_path.
|
||||||
|
|
||||||
|
``reconnect=seconds``
|
||||||
|
for a client socket, if a socket is disconnected, then attempt a reconnect after the given number of seconds.
|
||||||
|
Setting this to zero disables this function. (default: 0)
|
||||||
|
|
||||||
|
Example (using passt as a replacement of -netdev user):
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
# start passt server as a non privileged user
|
||||||
|
passt
|
||||||
|
UNIX domain socket bound at /tmp/passt_1.socket
|
||||||
|
# start QEMU to connect to passt
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0 \\
|
||||||
|
-netdev stream,id=net0,server=off,addr.type=unix,addr.path=/tmp/passt_1.socket
|
||||||
|
|
||||||
|
Example (two guests connected using a stream oriented unix domain socket):
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
# first VM
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:56 \\
|
||||||
|
netdev stream,id=net0,server=on,addr.type=unix,addr.path=/tmp/qemu0
|
||||||
|
# second VM
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:57 \\
|
||||||
|
-netdev stream,id=net0,server=off,addr.type=unix,addr.path=/tmp/qemu0,reconnect=5
|
||||||
|
|
||||||
|
``-netdev stream,id=str[,server=on|off],addr.type=fd,addr.str=file-descriptor[,reconnect=seconds]``
|
||||||
|
Configure a network backend to connect to another QEMU virtual machine or a proxy using a stream oriented socket file descriptor.
|
||||||
|
|
||||||
|
``server=on|off``
|
||||||
|
if ``on`` create a server socket
|
||||||
|
|
||||||
|
``addr.str=file-descriptor``
|
||||||
|
file descriptor number to use as a socket
|
||||||
|
|
||||||
|
``reconnect=seconds``
|
||||||
|
for a client socket, if a socket is disconnected, then attempt a reconnect after the given number of seconds.
|
||||||
|
Setting this to zero disables this function. (default: 0)
|
||||||
|
|
||||||
|
``-netdev dgram,id=str,remote.type=inet,remote.host=maddr,remote.port=port[,local.type=inet,local.host=addr]``
|
||||||
|
Configure a network backend to connect to a multicast address.
|
||||||
|
|
||||||
|
``remote.host=maddr,remote.port=port``
|
||||||
|
multicast address
|
||||||
|
|
||||||
|
``local.host=addr``
|
||||||
|
specify the host address to send packets from
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
# launch one QEMU instance
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:56 \\
|
||||||
|
-netdev dgram,id=net0,remote.type=inet,remote.host=224.0.0.1,remote.port=1234
|
||||||
|
# launch another QEMU instance on same "bus"
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:57 \\
|
||||||
|
-netdev dgram,id=net0,remote.type=inet,remote.host=224.0.0.1,remote.port=1234
|
||||||
|
# launch yet another QEMU instance on same "bus"
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:58 \\
|
||||||
|
-netdev dgram,id=net0,remote.type=inet,remote.host=224.0.0.1,remote.port=1234
|
||||||
|
|
||||||
|
``-netdev dgram,id=str,remote.type=inet,remote.host=maddr,remote.port=port[,local.type=fd,local.str=file-descriptor]``
|
||||||
|
Configure a network backend to connect to a multicast address using a UDP socket file descriptor.
|
||||||
|
|
||||||
|
``remote.host=maddr,remote.port=port``
|
||||||
|
multicast address
|
||||||
|
|
||||||
|
``local.str=file-descriptor``
|
||||||
|
File descriptor to use to send packets
|
||||||
|
|
||||||
|
``-netdev dgram,id=str,local.type=inet,local.host=addr,local.port=port[,remote.type=inet,remote.host=addr,remote.port=port]``
|
||||||
|
Configure a network backend to connect to another QEMU virtual
|
||||||
|
machine or a proxy using a datagram oriented unix domain socket.
|
||||||
|
|
||||||
|
``local.host=addr,local.port=port``
|
||||||
|
IP address to use to send the packets from
|
||||||
|
|
||||||
|
``remote.host=addr,remote.port=port``
|
||||||
|
Destination IP address
|
||||||
|
|
||||||
|
Example (two guests connected using an UDP/IP socket):
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
# first VM
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:56 \\
|
||||||
|
-netdev dgram,id=net0,local.type=inet,local.host=localhost,local.port=1234,remote.type=inet,remote.host=localhost,remote.port=1235
|
||||||
|
# second VM
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:56 \\
|
||||||
|
-netdev dgram,id=net0,local.type=inet,local.host=localhost,local.port=1235,remote.type=inet,remote.host=localhost,remote.port=1234
|
||||||
|
|
||||||
|
``-netdev dgram,id=str,local.type=unix,local.path=path[,remote.type=unix,remote.path=path]``
|
||||||
|
Configure a network backend to connect to another QEMU virtual
|
||||||
|
machine or a proxy using a datagram oriented unix socket.
|
||||||
|
|
||||||
|
``local.path=path``
|
||||||
|
filesystem path to use to bind the socket
|
||||||
|
|
||||||
|
``remote.path=path``
|
||||||
|
filesystem path to use as a destination (see sendto(2))
|
||||||
|
|
||||||
|
Example (two guests connected using an UDP/UNIX socket):
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
# first VM
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:56 \\
|
||||||
|
-netdev dgram,id=net0,local.type=unix,local.path=/tmp/qemu0,remote.type=unix,remote.path=/tmp/qemu1
|
||||||
|
# second VM
|
||||||
|
|qemu_system| linux.img \\
|
||||||
|
-device virtio-net,netdev=net0,mac=52:54:00:12:34:57 \\
|
||||||
|
-netdev dgram,id=net0,local.type=unix,local.path=/tmp/qemu1,remote.type=unix,remote.path=/tmp/qemu0
|
||||||
|
|
||||||
|
``-netdev dgram,id=str,local.type=fd,local.str=file-descriptor``
|
||||||
|
Configure a network backend to connect to another QEMU virtual
|
||||||
|
machine or a proxy using a datagram oriented socket file descriptor.
|
||||||
|
|
||||||
|
``local.str=file-descriptor``
|
||||||
|
File descriptor to use to send packets
|
||||||
|
|
||||||
``-netdev l2tpv3,id=id,src=srcaddr,dst=dstaddr[,srcport=srcport][,dstport=dstport],txsession=txsession[,rxsession=rxsession][,ipv6=on|off][,udp=on|off][,cookie64=on|off][,counter=on|off][,pincounter=on|off][,txcookie=txcookie][,rxcookie=rxcookie][,offset=offset]``
|
``-netdev l2tpv3,id=id,src=srcaddr,dst=dstaddr[,srcport=srcport][,dstport=dstport],txsession=txsession[,rxsession=rxsession][,ipv6=on|off][,udp=on|off][,cookie64=on|off][,counter=on|off][,pincounter=on|off][,txcookie=txcookie][,rxcookie=rxcookie][,offset=offset]``
|
||||||
Configure a L2TPv3 pseudowire host network backend. L2TPv3 (RFC3931)
|
Configure a L2TPv3 pseudowire host network backend. L2TPv3 (RFC3931)
|
||||||
is a popular protocol to transport Ethernet (and other Layer 2) data
|
is a popular protocol to transport Ethernet (and other Layer 2) data
|
||||||
|
Loading…
x
Reference in New Issue
Block a user