qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] linux-user: Support for NETLINK socket options
@ 2019-10-29 22:43 Josh Kunz
  2019-11-02  9:30 ` Laurent Vivier
  2019-11-05  9:25 ` Laurent Vivier
  0 siblings, 2 replies; 4+ messages in thread
From: Josh Kunz @ 2019-10-29 22:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: riku.voipio, laurent, Josh Kunz

This change includes support for all AF_NETLINK socket options up to about
kernel version 5.4 (5.4 is not formally released at the time of writing).
Socket options that were introduced in kernel versions before the oldest
currently stable kernel version are guarded by kernel version macros.

This change has been built under gcc 8.3, and clang 9.0, and it passes
`make check`. The netlink options have been tested by emulating some
non-trival software that uses NETLINK socket options, but they have
not been exaustively verified.

Signed-off-by: Josh Kunz <jkz@google.com>
---
 linux-user/syscall.c | 98 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 98 insertions(+)

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 530c843303..cbfb8380a9 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -2247,6 +2247,38 @@ set_timeout:
             return -TARGET_EFAULT;
 	ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, &val, sizeof(val)));
         break;
+#ifdef SOL_NETLINK
+    case SOL_NETLINK:
+        switch (optname) {
+        case NETLINK_PKTINFO:
+        case NETLINK_ADD_MEMBERSHIP:
+        case NETLINK_DROP_MEMBERSHIP:
+        case NETLINK_BROADCAST_ERROR:
+        case NETLINK_NO_ENOBUFS:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+        case NETLINK_LISTEN_ALL_NSID:
+        case NETLINK_CAP_ACK:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
+        case NETLINK_EXT_ACK:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
+        case NETLINK_GET_STRICT_CHK:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
+            break;
+        default:
+            goto unimplemented;
+        }
+        val = 0;
+        if (optlen < sizeof(uint32_t)) {
+            return -TARGET_EINVAL;
+        }
+        if (get_user_u32(val, optval_addr)) {
+            return -TARGET_EFAULT;
+        }
+        ret = get_errno(setsockopt(sockfd, SOL_NETLINK, optname, &val, sizeof(val)));
+        break;
+#endif /* SOL_NETLINK */
     default:
     unimplemented:
         gemu_log("Unsupported setsockopt level=%d optname=%d\n", level, optname);
@@ -2531,6 +2563,72 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
             break;
         }
         break;
+#ifdef SOL_NETLINK
+    case SOL_NETLINK:
+        switch (optname) {
+        case NETLINK_PKTINFO:
+        case NETLINK_BROADCAST_ERROR:
+        case NETLINK_NO_ENOBUFS:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+        case NETLINK_LISTEN_ALL_NSID:
+        case NETLINK_CAP_ACK:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
+        case NETLINK_EXT_ACK:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
+        case NETLINK_GET_STRICT_CHK:
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
+            if (get_user_u32(len, optlen)) {
+                return -TARGET_EFAULT;
+            }
+            if (len != sizeof(val)) {
+                return -TARGET_EINVAL;
+            }
+            lv = len;
+            ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
+            if (ret < 0) {
+                return ret;
+            }
+            if (put_user_u32(lv, optlen)
+                || put_user_u32(val, optval_addr)) {
+                return -TARGET_EFAULT;
+            }
+            break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+        case NETLINK_LIST_MEMBERSHIPS:
+        {
+            if (get_user_u32(len, optlen)) {
+                return -TARGET_EFAULT;
+            }
+            if (len < 0) {
+                return -TARGET_EINVAL;
+            }
+            uint32_t *results = lock_user(VERIFY_WRITE, optval_addr, len, 1);
+            if (!results) {
+                return -TARGET_EFAULT;
+            }
+            lv = len;
+            ret = get_errno(getsockopt(sockfd, level, optname, results, &lv));
+            if (ret < 0) {
+                unlock_user(results, optval_addr, 0);
+                return ret;
+            }
+            /* swap host endianess to target endianess. */
+            for (int i = 0; i < (len / sizeof(uint32_t)); i++) {
+                results[i] = tswap32(results[i]);
+            }
+            if (put_user_u32(lv, optlen)) {
+                return -TARGET_EFAULT;
+            }
+            unlock_user(results, optval_addr, 0);
+            break;
+        }
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
+        default:
+            goto unimplemented;
+        }
+#endif /* SOL_NETLINK */
     default:
     unimplemented:
         gemu_log("getsockopt level=%d optname=%d not yet supported\n",
-- 
2.24.0.rc0.303.g954a862665-goog



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

* Re: [PATCH] linux-user: Support for NETLINK socket options
  2019-10-29 22:43 [PATCH] linux-user: Support for NETLINK socket options Josh Kunz
@ 2019-11-02  9:30 ` Laurent Vivier
  2019-11-05  9:25 ` Laurent Vivier
  1 sibling, 0 replies; 4+ messages in thread
From: Laurent Vivier @ 2019-11-02  9:30 UTC (permalink / raw)
  To: Josh Kunz, qemu-devel; +Cc: riku.voipio

Le 29/10/2019 à 23:43, Josh Kunz a écrit :
> This change includes support for all AF_NETLINK socket options up to about
> kernel version 5.4 (5.4 is not formally released at the time of writing).
> Socket options that were introduced in kernel versions before the oldest
> currently stable kernel version are guarded by kernel version macros.
> 
> This change has been built under gcc 8.3, and clang 9.0, and it passes
> `make check`. The netlink options have been tested by emulating some
> non-trival software that uses NETLINK socket options, but they have
> not been exaustively verified.
> 
> Signed-off-by: Josh Kunz <jkz@google.com>
> ---
>  linux-user/syscall.c | 98 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 98 insertions(+)
...
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
> +        case NETLINK_LIST_MEMBERSHIPS:
> +        {
> +            if (get_user_u32(len, optlen)) {
> +                return -TARGET_EFAULT;
> +            }
> +            if (len < 0) {
> +                return -TARGET_EINVAL;
> +            }
> +            uint32_t *results = lock_user(VERIFY_WRITE, optval_addr, len, 1);

Please put the declaration of "results" at the beginning of the block.
See CODING_STYLE file, "Declarations"

> +            if (!results) {
> +                return -TARGET_EFAULT;
> +            }
> +            lv = len;
> +            ret = get_errno(getsockopt(sockfd, level, optname, results, &lv));
> +            if (ret < 0) {
> +                unlock_user(results, optval_addr, 0);
> +                return ret;
> +            }
> +            /* swap host endianess to target endianess. */
> +            for (int i = 0; i < (len / sizeof(uint32_t)); i++) {

Put the declaration of "i" at the beginning of the block.

Otherwise, it looks good.

Thanks,
Laurent


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

* Re: [PATCH] linux-user: Support for NETLINK socket options
  2019-10-29 22:43 [PATCH] linux-user: Support for NETLINK socket options Josh Kunz
  2019-11-02  9:30 ` Laurent Vivier
@ 2019-11-05  9:25 ` Laurent Vivier
  2019-11-05 18:21   ` Josh Kunz
  1 sibling, 1 reply; 4+ messages in thread
From: Laurent Vivier @ 2019-11-05  9:25 UTC (permalink / raw)
  To: Josh Kunz, qemu-devel; +Cc: riku.voipio

Le 29/10/2019 à 23:43, Josh Kunz a écrit :
> This change includes support for all AF_NETLINK socket options up to about
> kernel version 5.4 (5.4 is not formally released at the time of writing).
> Socket options that were introduced in kernel versions before the oldest
> currently stable kernel version are guarded by kernel version macros.
> 
> This change has been built under gcc 8.3, and clang 9.0, and it passes
> `make check`. The netlink options have been tested by emulating some
> non-trival software that uses NETLINK socket options, but they have
> not been exaustively verified.
> 
> Signed-off-by: Josh Kunz <jkz@google.com>
> ---
>  linux-user/syscall.c | 98 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 98 insertions(+)
> 

I've updated the coding style and applied to my linux-user branch.

Thanks,
Laurent



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

* Re: [PATCH] linux-user: Support for NETLINK socket options
  2019-11-05  9:25 ` Laurent Vivier
@ 2019-11-05 18:21   ` Josh Kunz
  0 siblings, 0 replies; 4+ messages in thread
From: Josh Kunz @ 2019-11-05 18:21 UTC (permalink / raw)
  To: Laurent Vivier; +Cc: qemu-devel, Riku Voipio

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

Thanks for the fixes Laurent, sorry for the delay.

Josh

On Tue, Nov 5, 2019 at 1:25 AM Laurent Vivier <laurent@vivier.eu> wrote:

> Le 29/10/2019 à 23:43, Josh Kunz a écrit :
> > This change includes support for all AF_NETLINK socket options up to
> about
> > kernel version 5.4 (5.4 is not formally released at the time of writing).
> > Socket options that were introduced in kernel versions before the oldest
> > currently stable kernel version are guarded by kernel version macros.
> >
> > This change has been built under gcc 8.3, and clang 9.0, and it passes
> > `make check`. The netlink options have been tested by emulating some
> > non-trival software that uses NETLINK socket options, but they have
> > not been exaustively verified.
> >
> > Signed-off-by: Josh Kunz <jkz@google.com>
> > ---
> >  linux-user/syscall.c | 98 ++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 98 insertions(+)
> >
>
> I've updated the coding style and applied to my linux-user branch.
>
> Thanks,
> Laurent
>
>

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

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

end of thread, other threads:[~2019-11-05 18:25 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-29 22:43 [PATCH] linux-user: Support for NETLINK socket options Josh Kunz
2019-11-02  9:30 ` Laurent Vivier
2019-11-05  9:25 ` Laurent Vivier
2019-11-05 18:21   ` Josh Kunz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).