netlink: Remove netlink_route_recvfrom

The same functionality could be implemented in the common place(netlink_recvfrom)

Change-Id: I8aedb29c4f0572f020ca5c0775f06c5e1e17ae4a
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
Xiang Xiao 2020-04-08 18:30:28 +08:00 committed by patacongo
parent 16dbe373c0
commit 70012bc4a2
3 changed files with 35 additions and 213 deletions

View File

@ -279,21 +279,6 @@ ssize_t netlink_route_sendto(FAR struct socket *psock,
socklen_t tolen);
#endif
/****************************************************************************
* Name: netlink_route_recvfrom()
*
* Description:
* Perform the recvfrom() operation for the NETLINK_ROUTE protocol.
*
****************************************************************************/
#ifdef CONFIG_NETLINK_ROUTE
ssize_t netlink_route_recvfrom(FAR struct socket *psock,
FAR struct nlmsghdr *nlmsg,
size_t len, int flags,
FAR struct sockaddr_nl *from);
#endif
#undef EXTERN
#ifdef __cplusplus
}

View File

@ -1015,179 +1015,4 @@ ssize_t netlink_route_sendto(FAR struct socket *psock,
return ret;
}
/****************************************************************************
* Name: netlink_route_recvfrom()
*
* Description:
* Perform the recvfrom() operation for the NETLINK_ROUTE protocol.
*
****************************************************************************/
ssize_t netlink_route_recvfrom(FAR struct socket *psock,
FAR struct nlmsghdr *nlmsg,
size_t len, int flags,
FAR struct sockaddr_nl *from)
{
FAR struct netlink_response_s *entry;
ssize_t ret;
DEBUGASSERT(psock != NULL && nlmsg != NULL &&
len >= sizeof(struct nlmsghdr));
/* Find the response to this message. The return value */
entry = (FAR struct netlink_response_s *)netlink_tryget_response(psock);
if (entry == NULL)
{
/* No response is variable, but presumably, one is expected. Check
* if the socket has been configured for non-blocking operation.
* REVISIT: I think there needs to be some higher level logic to
* select Netlink non-blocking sockets.
*/
if (_SS_ISNONBLOCK(psock->s_flags) || (flags & MSG_DONTWAIT) != 0)
{
return -EAGAIN;
}
/* Wait for the response. This should always succeed. */
entry = (FAR struct netlink_response_s *)netlink_get_response(psock);
DEBUGASSERT(entry != NULL);
if (entry == NULL)
{
return -EPIPE;
}
}
if (len < entry->msg.nlmsg_len)
{
kmm_free(entry);
return -EMSGSIZE;
}
/* Handle the response according to the message type */
switch (entry->msg.nlmsg_type)
{
#ifndef CONFIG_NETLINK_DISABLE_GETLINK
case RTM_NEWLINK:
{
FAR struct getlink_recvfrom_rsplist_s *resp =
(FAR struct getlink_recvfrom_rsplist_s *)entry;
/* Copy the payload to the user buffer */
memcpy(nlmsg, &resp->payload, resp->payload.hdr.nlmsg_len);
/* Return address. REVISIT... this is just a guess. */
if (from != NULL)
{
from->nl_family = resp->payload.iface.ifi_family;
from->nl_pad = 0;
from->nl_pid = resp->payload.hdr.nlmsg_pid;
from->nl_groups = resp->payload.hdr.nlmsg_type;
}
/* The return value is the payload size */
ret = resp->payload.hdr.nlmsg_len;
}
break;
#endif
#ifndef CONFIG_NETLINK_DISABLE_GETNEIGH
case RTM_GETNEIGH:
{
FAR struct getneigh_recvfrom_rsplist_s *resp =
(FAR struct getneigh_recvfrom_rsplist_s *)entry;
/* Copy the payload to the user buffer */
memcpy(nlmsg, &resp->payload, resp->payload.hdr.nlmsg_len);
/* Return address. REVISIT... this is just a guess. */
if (from != NULL)
{
from->nl_family = resp->payload.msg.ndm_family;
from->nl_pad = 0;
from->nl_pid = resp->payload.hdr.nlmsg_pid;
from->nl_groups = resp->payload.hdr.nlmsg_type;
}
/* The return value is the payload size */
ret = resp->payload.hdr.nlmsg_len;
}
break;
#endif
#ifndef CONFIG_NETLINK_DISABLE_GETROUTE
case RTM_NEWROUTE:
{
FAR struct getroute_recvfrom_resplist_s *resp =
(FAR struct getroute_recvfrom_resplist_s *)entry;
/* Copy the payload to the user buffer */
memcpy(nlmsg, &resp->payload, resp->payload.hdr.nlmsg_len);
/* Return address. REVISIT... this is just a guess. */
if (from != NULL)
{
from->nl_family = resp->payload.rte.rtm_family;
from->nl_pad = 0;
from->nl_pid = resp->payload.hdr.nlmsg_pid;
from->nl_groups = resp->payload.hdr.nlmsg_type;
}
/* The return value is the payload size */
ret = resp->payload.hdr.nlmsg_len;
}
break;
#endif
#ifndef NETLINK_DISABLE_NLMSGDONE
case NLMSG_DONE:
{
FAR struct nlroute_msgdone_rsplist_s *resp =
(FAR struct nlroute_msgdone_rsplist_s *)entry;
/* Copy the payload to the user buffer */
resp->payload.hdr.nlmsg_len = sizeof(struct nlmsghdr);
memcpy(nlmsg, &resp->payload, sizeof(struct nlmsghdr));
/* Return address. REVISIT... this is just a guess. */
if (from != NULL)
{
from->nl_family = resp->payload.gen.rtgen_family;
from->nl_pad = 0;
from->nl_pid = resp->payload.hdr.nlmsg_pid;
from->nl_groups = 0;
}
/* The return value is the payload size */
ret = sizeof(struct nlmsghdr);
}
break;
#endif
default:
nerr("ERROR: Unrecognized message type: %u\n",
entry->msg.nlmsg_type);
ret = -EIO;
break;
}
kmm_free(entry);
return ret;
}
#endif /* CONFIG_NETLINK_ROUTE */

View File

@ -799,40 +799,52 @@ static ssize_t netlink_recvfrom(FAR struct socket *psock, FAR void *buf,
FAR struct sockaddr *from,
FAR socklen_t *fromlen)
{
FAR struct netlink_conn_s *conn;
FAR struct nlmsghdr *nlmsg;
int ret;
FAR struct netlink_response_s *entry;
DEBUGASSERT(psock != NULL && psock->s_conn != NULL && buf != NULL);
DEBUGASSERT(from == NULL ||
(fromlen != NULL && *fromlen >= sizeof(struct sockaddr_nl)));
conn = (FAR struct netlink_conn_s *)psock->s_conn;
/* Find the response to this message. The return value */
/* Get a reference to the NetLink message */
nlmsg = (FAR struct nlmsghdr *)buf;
switch (conn->protocol)
entry = (FAR struct netlink_response_s *)netlink_tryget_response(psock);
if (entry == NULL)
{
#ifdef CONFIG_NETLINK_ROUTE
case NETLINK_ROUTE:
ret = netlink_route_recvfrom(psock, nlmsg, len, flags,
(FAR struct sockaddr_nl *)from);
if (ret >= 0 && fromlen != NULL)
{
*fromlen = sizeof(struct sockaddr_nl);
}
/* No response is variable, but presumably, one is expected. Check
* if the socket has been configured for non-blocking operation.
*/
break;
#endif
if (_SS_ISNONBLOCK(psock->s_flags) || (flags & MSG_DONTWAIT) != 0)
{
return -EAGAIN;
}
default:
ret = -EOPNOTSUPP;
break;
/* Wait for the response. This should always succeed. */
entry = (FAR struct netlink_response_s *)netlink_get_response(psock);
DEBUGASSERT(entry != NULL);
if (entry == NULL)
{
return -EPIPE;
}
}
return ret;
if (len > entry->msg.nlmsg_len)
{
len = entry->msg.nlmsg_len;
}
/* Copy the payload to the user buffer */
memcpy(buf, &entry->msg, len);
kmm_free(entry);
if (from != NULL)
{
netlink_getpeername(psock, from, fromlen);
}
return len;
}
/****************************************************************************