QEMU-Devel Archive on lore.kernel.org
 help / color / Atom feed
* QEMU Sockets Networking Backend Multicast Networking Fix
@ 2020-02-14 18:51 Faisal Al-Humaimidi
  2020-02-15 10:39 ` Markus Armbruster
  0 siblings, 1 reply; 4+ messages in thread
From: Faisal Al-Humaimidi @ 2020-02-14 18:51 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1.1: Type: text/plain, Size: 2272 bytes --]

Hello QEMU developers,

I have noticed a bug in the `mcast` option of the `socket` networking
backend, where I simply cannot join a multicast group (tested in Windows 10
with QEMU 4.2.0 release). I have found a fix to the problem. The problem
was mainly due to the fact that QEMU was binding to the multicast address,
and not the local address or the default INADDR_ANY (0.0.0.0) if no local
address is used.

Here's the patch text (as well as attached with this email), that outlines
my fix:

```
diff -uarN qemu-4.2.0.original/net/socket.c qemu-4.2.0.modified/net/socket.c
--- qemu-4.2.0.original/net/socket.c 2019-12-12 10:20:48.000000000 -0800
+++ qemu-4.2.0.modified/net/socket.c 2020-02-14 10:30:16.395973453 -0800
@@ -253,6 +253,15 @@
         goto fail;
     }

+    /* Preserve the multicast address, and bind to a non-multicast group
(e.g. a
+     * local address).
+     */
+    struct in_addr group_addr = mcastaddr->sin_addr;
+    if (localaddr) {
+        mcastaddr->sin_addr = *localaddr;
+    } else {
+        mcastaddr->sin_addr.s_addr = htonl(INADDR_ANY);
+    }
     ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
     if (ret < 0) {
         error_setg_errno(errp, errno, "can't bind ip=%s to socket",
@@ -260,7 +269,10 @@
         goto fail;
     }

-    /* Add host to multicast group */
+    /* Restore the multicast address. */
+    mcastaddr->sin_addr = group_addr;
+
+    /* Add host to multicast group. */
     imr.imr_multiaddr = mcastaddr->sin_addr;
     if (localaddr) {
         imr.imr_interface = *localaddr;
@@ -277,7 +289,7 @@
         goto fail;
     }

-    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
+    /* Force mcast msgs to loopback (eg. several QEMUs in same host). */
     loop = 1;
     ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
                           &loop, sizeof(loop));
@@ -287,7 +299,7 @@
         goto fail;
     }

-    /* If a bind address is given, only send packets from that address */
+    /* If a bind address is given, only send packets from that address. */
     if (localaddr != NULL) {
         ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
                               localaddr, sizeof(*localaddr));
```

Regards,
Faisal Al-Humaimidi

[-- Attachment #1.2: Type: text/html, Size: 2754 bytes --]

<div dir="ltr">Hello QEMU developers,<div><br></div><div>I have noticed a bug in the `mcast` option of the `socket` networking backend, where I simply cannot join a multicast group (tested in Windows 10 with QEMU 4.2.0 release). I have found a fix to the problem. The problem was mainly due to the fact that QEMU was binding to the multicast address, and not the local address or the default INADDR_ANY (0.0.0.0) if no local address is used.</div><div><br></div><div>Here&#39;s the patch text (as well as attached with this email), that outlines my fix:</div><div><br></div><div>```</div><div>diff -uarN qemu-4.2.0.original/net/socket.c qemu-4.2.0.modified/net/socket.c<br>--- qemu-4.2.0.original/net/socket.c	2019-12-12 10:20:48.000000000 -0800<br>+++ qemu-4.2.0.modified/net/socket.c	2020-02-14 10:30:16.395973453 -0800<br>@@ -253,6 +253,15 @@<br>         goto fail;<br>     }<br> <br>+    /* Preserve the multicast address, and bind to a non-multicast group (e.g. a <br>+     * local address).<br>+     */<br>+    struct in_addr group_addr = mcastaddr-&gt;sin_addr;<br>+    if (localaddr) {<br>+        mcastaddr-&gt;sin_addr = *localaddr;<br>+    } else {<br>+        mcastaddr-&gt;sin_addr.s_addr = htonl(INADDR_ANY);<br>+    }<br>     ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));<br>     if (ret &lt; 0) {<br>         error_setg_errno(errp, errno, &quot;can&#39;t bind ip=%s to socket&quot;,<br>@@ -260,7 +269,10 @@<br>         goto fail;<br>     }<br> <br>-    /* Add host to multicast group */<br>+    /* Restore the multicast address. */<br>+    mcastaddr-&gt;sin_addr = group_addr;<br>+<br>+    /* Add host to multicast group. */<br>     imr.imr_multiaddr = mcastaddr-&gt;sin_addr;<br>     if (localaddr) {<br>         imr.imr_interface = *localaddr;<br>@@ -277,7 +289,7 @@<br>         goto fail;<br>     }<br> <br>-    /* Force mcast msgs to loopback (eg. several QEMUs in same host */<br>+    /* Force mcast msgs to loopback (eg. several QEMUs in same host). */<br>     loop = 1;<br>     ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,<br>                           &amp;loop, sizeof(loop));<br>@@ -287,7 +299,7 @@<br>         goto fail;<br>     }<br> <br>-    /* If a bind address is given, only send packets from that address */<br>+    /* If a bind address is given, only send packets from that address. */<br>     if (localaddr != NULL) {<br>         ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,<br>                               localaddr, sizeof(*localaddr));<br></div><div>```</div><div><br></div><div>Regards,</div><div>Faisal Al-Humaimidi</div></div>

[-- Attachment #2: qemu-4.2.0-fix_socket_mcast.patch --]
[-- Type: application/octet-stream, Size: 1745 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: QEMU Sockets Networking Backend Multicast Networking Fix
  2020-02-14 18:51 QEMU Sockets Networking Backend Multicast Networking Fix Faisal Al-Humaimidi
@ 2020-02-15 10:39 ` Markus Armbruster
  2020-02-17  9:53   ` Jason Wang
  0 siblings, 1 reply; 4+ messages in thread
From: Markus Armbruster @ 2020-02-15 10:39 UTC (permalink / raw)
  To: Faisal Al-Humaimidi; +Cc: Jason Wang, qemu-devel

Jason, please have a look.

Faisal Al-Humaimidi <falhumai96@gmail.com> writes:

> Hello QEMU developers,
>
> I have noticed a bug in the `mcast` option of the `socket` networking
> backend, where I simply cannot join a multicast group (tested in Windows 10
> with QEMU 4.2.0 release). I have found a fix to the problem. The problem
> was mainly due to the fact that QEMU was binding to the multicast address,
> and not the local address or the default INADDR_ANY (0.0.0.0) if no local
> address is used.
>
> Here's the patch text (as well as attached with this email), that outlines
> my fix:
>
> ```
> diff -uarN qemu-4.2.0.original/net/socket.c qemu-4.2.0.modified/net/socket.c
> --- qemu-4.2.0.original/net/socket.c 2019-12-12 10:20:48.000000000 -0800
> +++ qemu-4.2.0.modified/net/socket.c 2020-02-14 10:30:16.395973453 -0800
> @@ -253,6 +253,15 @@
>          goto fail;
>      }
>
> +    /* Preserve the multicast address, and bind to a non-multicast group
> (e.g. a
> +     * local address).
> +     */
> +    struct in_addr group_addr = mcastaddr->sin_addr;
> +    if (localaddr) {
> +        mcastaddr->sin_addr = *localaddr;
> +    } else {
> +        mcastaddr->sin_addr.s_addr = htonl(INADDR_ANY);
> +    }
>      ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
>      if (ret < 0) {
>          error_setg_errno(errp, errno, "can't bind ip=%s to socket",
> @@ -260,7 +269,10 @@
>          goto fail;
>      }
>
> -    /* Add host to multicast group */
> +    /* Restore the multicast address. */
> +    mcastaddr->sin_addr = group_addr;
> +
> +    /* Add host to multicast group. */
>      imr.imr_multiaddr = mcastaddr->sin_addr;
>      if (localaddr) {
>          imr.imr_interface = *localaddr;
> @@ -277,7 +289,7 @@
>          goto fail;
>      }
>
> -    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
> +    /* Force mcast msgs to loopback (eg. several QEMUs in same host). */
>      loop = 1;
>      ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
>                            &loop, sizeof(loop));
> @@ -287,7 +299,7 @@
>          goto fail;
>      }
>
> -    /* If a bind address is given, only send packets from that address */
> +    /* If a bind address is given, only send packets from that address. */
>      if (localaddr != NULL) {
>          ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
>                                localaddr, sizeof(*localaddr));
> ```
>
> Regards,
> Faisal Al-Humaimidi



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: QEMU Sockets Networking Backend Multicast Networking Fix
  2020-02-15 10:39 ` Markus Armbruster
@ 2020-02-17  9:53   ` Jason Wang
  2020-02-17 10:05     ` Faisal Al-Humaimidi
  0 siblings, 1 reply; 4+ messages in thread
From: Jason Wang @ 2020-02-17  9:53 UTC (permalink / raw)
  To: Markus Armbruster, Faisal Al-Humaimidi; +Cc: qemu-devel


On 2020/2/15 下午6:39, Markus Armbruster wrote:
> Jason, please have a look.
>
> Faisal Al-Humaimidi <falhumai96@gmail.com> writes:
>
>> Hello QEMU developers,
>>
>> I have noticed a bug in the `mcast` option of the `socket` networking
>> backend, where I simply cannot join a multicast group (tested in Windows 10
>> with QEMU 4.2.0 release). I have found a fix to the problem. The problem
>> was mainly due to the fact that QEMU was binding to the multicast address,
>> and not the local address or the default INADDR_ANY (0.0.0.0) if no local
>> address is used.
>>
>> Here's the patch text (as well as attached with this email), that outlines
>> my fix:
>>
>> ```
>> diff -uarN qemu-4.2.0.original/net/socket.c qemu-4.2.0.modified/net/socket.c
>> --- qemu-4.2.0.original/net/socket.c 2019-12-12 10:20:48.000000000 -0800
>> +++ qemu-4.2.0.modified/net/socket.c 2020-02-14 10:30:16.395973453 -0800
>> @@ -253,6 +253,15 @@
>>           goto fail;
>>       }
>>
>> +    /* Preserve the multicast address, and bind to a non-multicast group
>> (e.g. a
>> +     * local address).
>> +     */
>> +    struct in_addr group_addr = mcastaddr->sin_addr;
>> +    if (localaddr) {
>> +        mcastaddr->sin_addr = *localaddr;
>> +    } else {
>> +        mcastaddr->sin_addr.s_addr = htonl(INADDR_ANY);
>> +    }
>>       ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));


This looks wrong, AFAIK the local address should be added through 
IP_ADD_MEMBERSHIP which is already handled in this function I believe.

Thanks


>>       if (ret < 0) {
>>           error_setg_errno(errp, errno, "can't bind ip=%s to socket",
>> @@ -260,7 +269,10 @@
>>           goto fail;
>>       }
>>
>> -    /* Add host to multicast group */
>> +    /* Restore the multicast address. */
>> +    mcastaddr->sin_addr = group_addr;
>> +
>> +    /* Add host to multicast group. */
>>       imr.imr_multiaddr = mcastaddr->sin_addr;
>>       if (localaddr) {
>>           imr.imr_interface = *localaddr;
>> @@ -277,7 +289,7 @@
>>           goto fail;
>>       }
>>
>> -    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
>> +    /* Force mcast msgs to loopback (eg. several QEMUs in same host). */
>>       loop = 1;
>>       ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
>>                             &loop, sizeof(loop));
>> @@ -287,7 +299,7 @@
>>           goto fail;
>>       }
>>
>> -    /* If a bind address is given, only send packets from that address */
>> +    /* If a bind address is given, only send packets from that address. */
>>       if (localaddr != NULL) {
>>           ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
>>                                 localaddr, sizeof(*localaddr));
>> ```
>>
>> Regards,
>> Faisal Al-Humaimidi
>



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: QEMU Sockets Networking Backend Multicast Networking Fix
  2020-02-17  9:53   ` Jason Wang
@ 2020-02-17 10:05     ` Faisal Al-Humaimidi
  0 siblings, 0 replies; 4+ messages in thread
From: Faisal Al-Humaimidi @ 2020-02-17 10:05 UTC (permalink / raw)
  To: Jason Wang; +Cc: Markus Armbruster, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 3524 bytes --]

Hello Jason,

But, the local address is not meant to be added to the group, rather we
listen to it, hence we bind to the local address. The multicast group is a
higher layer that would be requested to join to by the listening host.
Here's a similar example in multicasting that demonstrates this idea in
Python: https://pymotw.com/2/socket/multicast.html.


Regards,
Faisal Al-Humaimidi

On Mon., Feb. 17, 2020, 1:54 a.m. Jason Wang, <jasowang@redhat.com> wrote:

>
> On 2020/2/15 下午6:39, Markus Armbruster wrote:
> > Jason, please have a look.
> >
> > Faisal Al-Humaimidi <falhumai96@gmail.com> writes:
> >
> >> Hello QEMU developers,
> >>
> >> I have noticed a bug in the `mcast` option of the `socket` networking
> >> backend, where I simply cannot join a multicast group (tested in
> Windows 10
> >> with QEMU 4.2.0 release). I have found a fix to the problem. The problem
> >> was mainly due to the fact that QEMU was binding to the multicast
> address,
> >> and not the local address or the default INADDR_ANY (0.0.0.0) if no
> local
> >> address is used.
> >>
> >> Here's the patch text (as well as attached with this email), that
> outlines
> >> my fix:
> >>
> >> ```
> >> diff -uarN qemu-4.2.0.original/net/socket.c
> qemu-4.2.0.modified/net/socket.c
> >> --- qemu-4.2.0.original/net/socket.c 2019-12-12 10:20:48.000000000 -0800
> >> +++ qemu-4.2.0.modified/net/socket.c 2020-02-14 10:30:16.395973453 -0800
> >> @@ -253,6 +253,15 @@
> >>           goto fail;
> >>       }
> >>
> >> +    /* Preserve the multicast address, and bind to a non-multicast
> group
> >> (e.g. a
> >> +     * local address).
> >> +     */
> >> +    struct in_addr group_addr = mcastaddr->sin_addr;
> >> +    if (localaddr) {
> >> +        mcastaddr->sin_addr = *localaddr;
> >> +    } else {
> >> +        mcastaddr->sin_addr.s_addr = htonl(INADDR_ANY);
> >> +    }
> >>       ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
>
>
> This looks wrong, AFAIK the local address should be added through
> IP_ADD_MEMBERSHIP which is already handled in this function I believe.
>
> Thanks
>
>
> >>       if (ret < 0) {
> >>           error_setg_errno(errp, errno, "can't bind ip=%s to socket",
> >> @@ -260,7 +269,10 @@
> >>           goto fail;
> >>       }
> >>
> >> -    /* Add host to multicast group */
> >> +    /* Restore the multicast address. */
> >> +    mcastaddr->sin_addr = group_addr;
> >> +
> >> +    /* Add host to multicast group. */
> >>       imr.imr_multiaddr = mcastaddr->sin_addr;
> >>       if (localaddr) {
> >>           imr.imr_interface = *localaddr;
> >> @@ -277,7 +289,7 @@
> >>           goto fail;
> >>       }
> >>
> >> -    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
> >> +    /* Force mcast msgs to loopback (eg. several QEMUs in same host).
> */
> >>       loop = 1;
> >>       ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
> >>                             &loop, sizeof(loop));
> >> @@ -287,7 +299,7 @@
> >>           goto fail;
> >>       }
> >>
> >> -    /* If a bind address is given, only send packets from that address
> */
> >> +    /* If a bind address is given, only send packets from that
> address. */
> >>       if (localaddr != NULL) {
> >>           ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
> >>                                 localaddr, sizeof(*localaddr));
> >> ```
> >>
> >> Regards,
> >> Faisal Al-Humaimidi
> >
>
>

[-- Attachment #2: Type: text/html, Size: 4837 bytes --]

<div dir="auto"><div>Hello Jason,</div><div dir="auto"><br></div><div dir="auto">But, the local address is not meant to be added to the group, rather we listen to it, hence we bind to the local address. The multicast group is a higher layer that would be requested to join to by the listening host. Here&#39;s a similar example in multicasting that demonstrates this idea in Python: <a href="https://pymotw.com/2/socket/multicast.html">https://pymotw.com/2/socket/multicast.html</a>.</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">Regards,</div><div dir="auto">Faisal Al-Humaimidi<br><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Mon., Feb. 17, 2020, 1:54 a.m. Jason Wang, &lt;<a href="mailto:jasowang@redhat.com">jasowang@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
On 2020/2/15 下午6:39, Markus Armbruster wrote:<br>
&gt; Jason, please have a look.<br>
&gt;<br>
&gt; Faisal Al-Humaimidi &lt;<a href="mailto:falhumai96@gmail.com" target="_blank" rel="noreferrer">falhumai96@gmail.com</a>&gt; writes:<br>
&gt;<br>
&gt;&gt; Hello QEMU developers,<br>
&gt;&gt;<br>
&gt;&gt; I have noticed a bug in the `mcast` option of the `socket` networking<br>
&gt;&gt; backend, where I simply cannot join a multicast group (tested in Windows 10<br>
&gt;&gt; with QEMU 4.2.0 release). I have found a fix to the problem. The problem<br>
&gt;&gt; was mainly due to the fact that QEMU was binding to the multicast address,<br>
&gt;&gt; and not the local address or the default INADDR_ANY (0.0.0.0) if no local<br>
&gt;&gt; address is used.<br>
&gt;&gt;<br>
&gt;&gt; Here&#39;s the patch text (as well as attached with this email), that outlines<br>
&gt;&gt; my fix:<br>
&gt;&gt;<br>
&gt;&gt; ```<br>
&gt;&gt; diff -uarN qemu-4.2.0.original/net/socket.c qemu-4.2.0.modified/net/socket.c<br>
&gt;&gt; --- qemu-4.2.0.original/net/socket.c 2019-12-12 10:20:48.000000000 -0800<br>
&gt;&gt; +++ qemu-4.2.0.modified/net/socket.c 2020-02-14 10:30:16.395973453 -0800<br>
&gt;&gt; @@ -253,6 +253,15 @@<br>
&gt;&gt;           goto fail;<br>
&gt;&gt;       }<br>
&gt;&gt;<br>
&gt;&gt; +    /* Preserve the multicast address, and bind to a non-multicast group<br>
&gt;&gt; (e.g. a<br>
&gt;&gt; +     * local address).<br>
&gt;&gt; +     */<br>
&gt;&gt; +    struct in_addr group_addr = mcastaddr-&gt;sin_addr;<br>
&gt;&gt; +    if (localaddr) {<br>
&gt;&gt; +        mcastaddr-&gt;sin_addr = *localaddr;<br>
&gt;&gt; +    } else {<br>
&gt;&gt; +        mcastaddr-&gt;sin_addr.s_addr = htonl(INADDR_ANY);<br>
&gt;&gt; +    }<br>
&gt;&gt;       ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));<br>
<br>
<br>
This looks wrong, AFAIK the local address should be added through <br>
IP_ADD_MEMBERSHIP which is already handled in this function I believe.<br>
<br>
Thanks<br>
<br>
<br>
&gt;&gt;       if (ret &lt; 0) {<br>
&gt;&gt;           error_setg_errno(errp, errno, &quot;can&#39;t bind ip=%s to socket&quot;,<br>
&gt;&gt; @@ -260,7 +269,10 @@<br>
&gt;&gt;           goto fail;<br>
&gt;&gt;       }<br>
&gt;&gt;<br>
&gt;&gt; -    /* Add host to multicast group */<br>
&gt;&gt; +    /* Restore the multicast address. */<br>
&gt;&gt; +    mcastaddr-&gt;sin_addr = group_addr;<br>
&gt;&gt; +<br>
&gt;&gt; +    /* Add host to multicast group. */<br>
&gt;&gt;       imr.imr_multiaddr = mcastaddr-&gt;sin_addr;<br>
&gt;&gt;       if (localaddr) {<br>
&gt;&gt;           imr.imr_interface = *localaddr;<br>
&gt;&gt; @@ -277,7 +289,7 @@<br>
&gt;&gt;           goto fail;<br>
&gt;&gt;       }<br>
&gt;&gt;<br>
&gt;&gt; -    /* Force mcast msgs to loopback (eg. several QEMUs in same host */<br>
&gt;&gt; +    /* Force mcast msgs to loopback (eg. several QEMUs in same host). */<br>
&gt;&gt;       loop = 1;<br>
&gt;&gt;       ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,<br>
&gt;&gt;                             &amp;loop, sizeof(loop));<br>
&gt;&gt; @@ -287,7 +299,7 @@<br>
&gt;&gt;           goto fail;<br>
&gt;&gt;       }<br>
&gt;&gt;<br>
&gt;&gt; -    /* If a bind address is given, only send packets from that address */<br>
&gt;&gt; +    /* If a bind address is given, only send packets from that address. */<br>
&gt;&gt;       if (localaddr != NULL) {<br>
&gt;&gt;           ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,<br>
&gt;&gt;                                 localaddr, sizeof(*localaddr));<br>
&gt;&gt; ```<br>
&gt;&gt;<br>
&gt;&gt; Regards,<br>
&gt;&gt; Faisal Al-Humaimidi<br>
&gt;<br>
<br>
</blockquote></div></div></div>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, back to index

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-14 18:51 QEMU Sockets Networking Backend Multicast Networking Fix Faisal Al-Humaimidi
2020-02-15 10:39 ` Markus Armbruster
2020-02-17  9:53   ` Jason Wang
2020-02-17 10:05     ` Faisal Al-Humaimidi

QEMU-Devel Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/qemu-devel/0 qemu-devel/git/0.git
	git clone --mirror https://lore.kernel.org/qemu-devel/1 qemu-devel/git/1.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 qemu-devel qemu-devel/ https://lore.kernel.org/qemu-devel \
		qemu-devel@nongnu.org
	public-inbox-index qemu-devel

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.nongnu.qemu-devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git