net/ieee802154: Add some missing logic in connect().
This commit is contained in:
parent
de7000ee3e
commit
c78b53a74c
@ -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 */
|
||||||
|
|
||||||
|
@ -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?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user