net/ieee802154: Add some missing logic in connect().

This commit is contained in:
Gregory Nutt 2018-03-31 09:26:35 -06:00
parent de7000ee3e
commit c78b53a74c
4 changed files with 44 additions and 13 deletions

View File

@ -153,7 +153,6 @@ EXTERN const struct sock_intf_s g_ieee802154_sockif;
struct ieee802154_data_ind_s; /* Forward reference */ struct ieee802154_data_ind_s; /* Forward reference */
struct radio_driver_s; /* Forward reference */ struct radio_driver_s; /* Forward reference */
struct net_driver_s; /* Forward reference */ struct net_driver_s; /* Forward reference */
struct eth_hdr_s; /* Forward reference */
struct socket; /* Forward reference */ struct socket; /* Forward reference */
struct sockaddr; /* Forward reference */ struct sockaddr; /* Forward reference */

View File

@ -218,7 +218,7 @@ FAR struct ieee802154_conn_s *
conn = (FAR struct ieee802154_conn_s *)conn->node.flink) conn = (FAR struct ieee802154_conn_s *)conn->node.flink)
{ {
/* Does the destination address match the bound address of the socket. */ /* Does the destination address match the bound address of the socket. */
/* REVISIT: Currently and explict address must be assigned. Should we /* REVISIT: Currently and explicit address must be assigned. Should we
* support some moral equivalent to INADDR_ANY? * support some moral equivalent to INADDR_ANY?
*/ */

View File

@ -56,7 +56,6 @@
#include <nuttx/mm/iob.h> #include <nuttx/mm/iob.h>
#include <nuttx/net/radiodev.h> #include <nuttx/net/radiodev.h>
#include <nuttx/net/net.h> #include <nuttx/net/net.h>
#include <nuttx/net/ip.h>
#include "netdev/netdev.h" #include "netdev/netdev.h"
#include "devif/devif.h" #include "devif/devif.h"
@ -178,9 +177,9 @@ static inline bool ieee802154_eaddrnull(FAR const uint8_t *eaddr)
* *
****************************************************************************/ ****************************************************************************/
void ieee802154_meta_data(FAR struct radio_driver_s *radio, static void ieee802154_meta_data(FAR struct radio_driver_s *radio,
FAR struct ieee802154_sendto_s *pstate, FAR struct ieee802154_sendto_s *pstate,
FAR struct ieee802154_frame_meta_s *meta) FAR struct ieee802154_frame_meta_s *meta)
{ {
FAR struct ieee802154_saddr_s *destaddr; FAR struct ieee802154_saddr_s *destaddr;
FAR struct ieee802154_saddr_s *srcaddr; FAR struct ieee802154_saddr_s *srcaddr;
@ -537,7 +536,7 @@ ssize_t psock_ieee802154_sendto(FAR struct socket *psock, FAR const void *buf,
psock->s_flags = _SS_SETSTATE(psock->s_flags, _SF_IDLE); psock->s_flags = _SS_SETSTATE(psock->s_flags, _SF_IDLE);
/* Check for a errors, Errors are signalled by negative errno values /* Check for a errors, Errors are signaled by negative errno values
* for the send length * for the send length
*/ */

View File

@ -271,9 +271,42 @@ static void ieee802154_addref(FAR struct socket *psock)
****************************************************************************/ ****************************************************************************/
static int ieee802154_connect(FAR struct socket *psock, static int ieee802154_connect(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen) FAR const struct sockaddr *addr,
socklen_t addrlen)
{ {
return -EAFNOSUPPORT; FAR struct ieee802154_conn_s *conn;
FAR struct sockaddr_ieee802154_s *ieeeaddr;
int ret;
DEBUGASSERT(psock != NULL || addr != NULL);
conn = (FAR struct ieee802154_conn_s *)psock->s_conn;
DEBUGASSERT(conn != NULL);
/* Verify the address family */
if (addr->sa_family == AF_IEEE802154)
{
/* Save the "connection" address */
ieeeaddr = (FAR struct sockaddr_ieee802154_s *)addr;
memcpy(&conn->raddr, &ieeeaddr->sa_addr,
sizeof(struct ieee802154_saddr_s));
/* Mark the socket as connected. */
psock->s_flags |= _SF_CONNECTED;
ret = OK;
}
else
{
/* The specified address is not a valid address for the address family
* of the specified socket.
*/
ret = -EAFNOSUPPORT;
}
return ret;
} }
/**************************************************************************** /****************************************************************************
@ -363,7 +396,7 @@ static int ieee802154_bind(FAR struct socket *psock,
addrlen < sizeof(struct sockaddr_ieee802154_s)) addrlen < sizeof(struct sockaddr_ieee802154_s))
{ {
nerr("ERROR: Invalid family: %u or address length: %d < %d\n", nerr("ERROR: Invalid family: %u or address length: %d < %d\n",
addr->sa_family, addrlen, sizeof(struct sockaddr_ll)); addr->sa_family, addrlen, sizeof(struct sockaddr_ieee802154_s));
return -EBADF; return -EBADF;
} }
@ -460,7 +493,7 @@ static int ieee802154_getsockname(FAR struct socket *psock,
/* Create a copy of the full address on the stack */ /* Create a copy of the full address on the stack */
tmp.sa_family = PF_IEEE802154; tmp.sa_family = AF_IEEE802154;
memcpy(&tmp.sa_addr, &conn->laddr, sizeof(struct ieee802154_saddr_s)); memcpy(&tmp.sa_addr, &conn->laddr, sizeof(struct ieee802154_saddr_s));
/* Copy to the user buffer, truncating if necessary */ /* Copy to the user buffer, truncating if necessary */
@ -574,7 +607,7 @@ static ssize_t ieee802154_send(FAR struct socket *psock, FAR const void *buf,
if (psock->s_type == SOCK_DGRAM) if (psock->s_type == SOCK_DGRAM)
{ {
/* send() may be used only if the socket is has been connected. */ /* send() may be used only if the socket has been connected. */
if (!_SS_ISCONNECTED( psock->s_flags) || if (!_SS_ISCONNECTED( psock->s_flags) ||
conn->raddr.s_mode == IEEE802154_ADDRMODE_NONE) conn->raddr.s_mode == IEEE802154_ADDRMODE_NONE)
@ -583,7 +616,7 @@ static ssize_t ieee802154_send(FAR struct socket *psock, FAR const void *buf,
} }
else else
{ {
to.sa_family = PF_IEEE802154; to.sa_family = AF_IEEE802154;
memcpy(&to.sa_addr, &conn->raddr, memcpy(&to.sa_addr, &conn->raddr,
sizeof(struct ieee802154_saddr_s)); sizeof(struct ieee802154_saddr_s));