diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c index 764b1e5fe8..d6f886c0e7 100644 --- a/net/netdev/netdev_ioctl.c +++ b/net/netdev/netdev_ioctl.c @@ -1544,6 +1544,7 @@ ssize_t net_ioctl_arglen(int cmd) { switch (cmd) { + case FIONSPACE: case FIONREAD: return sizeof(int); diff --git a/net/rpmsg/rpmsg_sockif.c b/net/rpmsg/rpmsg_sockif.c index 22fb058dfb..e52bea646e 100644 --- a/net/rpmsg/rpmsg_sockif.c +++ b/net/rpmsg/rpmsg_sockif.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -144,6 +145,8 @@ static ssize_t rpmsg_socket_sendmsg(FAR struct socket *psock, static ssize_t rpmsg_socket_recvmsg(FAR struct socket *psock, FAR struct msghdr *msg, int flags); static int rpmsg_socket_close(FAR struct socket *psock); +static int rpmsg_socket_ioctl(FAR struct socket *psock, int cmd, + FAR void *arg, size_t arglen); /**************************************************************************** * Public Data @@ -163,7 +166,8 @@ const struct sock_intf_s g_rpmsg_sockif = rpmsg_socket_poll, /* si_poll */ rpmsg_socket_sendmsg, /* si_sendmsg */ rpmsg_socket_recvmsg, /* si_recvmsg */ - rpmsg_socket_close /* si_close */ + rpmsg_socket_close, /* si_close */ + rpmsg_socket_ioctl, /* si_ioctl */ }; /**************************************************************************** @@ -1277,3 +1281,39 @@ static int rpmsg_socket_close(FAR struct socket *psock) rpmsg_socket_free(conn); return 0; } + +static int rpmsg_socket_ioctl(FAR struct socket *psock, int cmd, + FAR void *arg, size_t arglen) +{ + FAR struct rpmsg_socket_conn_s *conn = psock->s_conn; + int ret = OK; + + switch (cmd) + { + case FIONREAD: + if (arglen != sizeof(int)) + { + ret = -EINVAL; + break; + } + + *(FAR int *)((uintptr_t)arg) = circbuf_used(&conn->recvbuf); + + break; + case FIONSPACE: + if (arglen != sizeof(int)) + { + ret = -EINVAL; + break; + } + + *(FAR int *)((uintptr_t)arg) = rpmsg_socket_get_space(conn); + + break; + default: + ret = -ENOTTY; + break; + } + + return ret; +}