Networking: Straighten up use if IPv6/IPv4 in TCP connection logic
This commit is contained in:
parent
d7a71f0119
commit
b187b4f381
@ -84,12 +84,8 @@ static inline void psock_teardown_callbacks(FAR struct tcp_connect_s *pstate,
|
||||
static uint16_t psock_connect_interrupt(FAR struct net_driver_s *dev,
|
||||
FAR void *pvconn, FAR void *pvpriv,
|
||||
uint16_t flags);
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
static inline int psock_tcp_connect(FAR struct socket *psock,
|
||||
FAR const struct sockaddr_in6 *inaddr);
|
||||
#else
|
||||
static inline int psock_tcp_connect(FAR struct socket *psock, const struct sockaddr_in *inaddr);
|
||||
#endif
|
||||
FAR const struct sockaddr *addr);
|
||||
#endif /* CONFIG_NET_TCP */
|
||||
|
||||
/****************************************************************************
|
||||
@ -278,8 +274,8 @@ static uint16_t psock_connect_interrupt(FAR struct net_driver_s *dev,
|
||||
* Perform a TCP connection
|
||||
*
|
||||
* Parameters:
|
||||
* psock A reference to the socket structure of the socket to be connected
|
||||
* inaddr The address of the remote server to connect to
|
||||
* psock - A reference to the socket structure of the socket to be connected
|
||||
* addr - The address of the remote server to connect to
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
@ -290,13 +286,8 @@ static uint16_t psock_connect_interrupt(FAR struct net_driver_s *dev,
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_TCP
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
static inline int psock_tcp_connect(FAR struct socket *psock,
|
||||
FAR const struct sockaddr_in6 *inaddr)
|
||||
#else
|
||||
static inline int psock_tcp_connect(FAR struct socket *psock,
|
||||
FAR const struct sockaddr_in *inaddr)
|
||||
#endif
|
||||
FAR const struct sockaddr *addr)
|
||||
{
|
||||
struct tcp_connect_s state;
|
||||
net_lock_t flags;
|
||||
@ -319,7 +310,7 @@ static inline int psock_tcp_connect(FAR struct socket *psock,
|
||||
{
|
||||
/* Perform the TCP connection operation */
|
||||
|
||||
ret = tcp_connect(psock->s_conn, inaddr);
|
||||
ret = tcp_connect(psock->s_conn, addr);
|
||||
}
|
||||
|
||||
if (ret >= 0)
|
||||
@ -370,8 +361,8 @@ static inline int psock_tcp_connect(FAR struct socket *psock,
|
||||
}
|
||||
}
|
||||
|
||||
net_unlock(flags);
|
||||
return ret;
|
||||
net_unlock(flags);
|
||||
return ret;
|
||||
}
|
||||
#endif /* CONFIG_NET_TCP */
|
||||
|
||||
@ -450,15 +441,10 @@ static inline int psock_tcp_connect(FAR struct socket *psock,
|
||||
int psock_connect(FAR struct socket *psock, FAR const struct sockaddr *addr,
|
||||
socklen_t addrlen)
|
||||
{
|
||||
FAR const struct sockaddr_in *inaddr = (FAR const struct sockaddr_in *)addr;
|
||||
#if defined(CONFIG_NET_TCP) || defined(CONFIG_NET_UDP)
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
FAR const struct sockaddr_in6 *inaddr = (const struct sockaddr_in6 *)addr;
|
||||
#else
|
||||
FAR const struct sockaddr_in *inaddr = (const struct sockaddr_in *)addr;
|
||||
#endif
|
||||
int ret;
|
||||
#endif
|
||||
|
||||
int err;
|
||||
|
||||
/* Verify that the psock corresponds to valid, allocated socket */
|
||||
@ -471,15 +457,37 @@ int psock_connect(FAR struct socket *psock, FAR const struct sockaddr *addr,
|
||||
|
||||
/* Verify that a valid address has been provided */
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
if (addr->sa_family != AF_INET6 || addrlen < sizeof(struct sockaddr_in6))
|
||||
#else
|
||||
if (addr->sa_family != AF_INET || addrlen < sizeof(struct sockaddr_in))
|
||||
switch (inaddr->sin_family)
|
||||
{
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
case AF_INET:
|
||||
{
|
||||
if (addrlen < sizeof(struct sockaddr_in))
|
||||
{
|
||||
err = EBADF;
|
||||
goto errout;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
{
|
||||
err = EBADF;
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
case AF_INET6:
|
||||
{
|
||||
if (addrlen < sizeof(struct sockaddr_in6))
|
||||
{
|
||||
err = EBADF;
|
||||
goto errout;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
DEBUGPANIC();
|
||||
err = EAFNOSUPPORT;
|
||||
goto errout;
|
||||
}
|
||||
}
|
||||
|
||||
/* Perform the connection depending on the protocol type */
|
||||
|
||||
@ -498,7 +506,7 @@ int psock_connect(FAR struct socket *psock, FAR const struct sockaddr *addr,
|
||||
|
||||
/* Its not ... connect it */
|
||||
|
||||
ret = psock_tcp_connect(psock, inaddr);
|
||||
ret = psock_tcp_connect(psock, addr);
|
||||
if (ret < 0)
|
||||
{
|
||||
err = -ret;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* net/tcp/tcp.h
|
||||
*
|
||||
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2014-2015 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -269,6 +269,7 @@ extern "C"
|
||||
|
||||
/* Defined in tcp_conn.c ****************************************************/
|
||||
|
||||
struct sockaddr; /* Forward reference */
|
||||
struct tcp_iphdr_s; /* Forward reference */
|
||||
|
||||
/****************************************************************************
|
||||
@ -393,13 +394,7 @@ int tcp_bind(FAR struct tcp_conn_s *conn,
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
int tcp_connect(FAR struct tcp_conn_s *conn,
|
||||
FAR const struct sockaddr_in6 *addr);
|
||||
#else
|
||||
int tcp_connect(FAR struct tcp_conn_s *conn,
|
||||
FAR const struct sockaddr_in *addr);
|
||||
#endif
|
||||
int tcp_connect(FAR struct tcp_conn_s *conn, FAR const struct sockaddr *addr);
|
||||
|
||||
/* Defined in tcp_ipselect.c ************************************************/
|
||||
/****************************************************************************
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* net/tcp/tcp_conn.c
|
||||
*
|
||||
* Copyright (C) 2007-2011, 2013-2014 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2007-2011, 2013-2015 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Large parts of this file were leveraged from uIP logic:
|
||||
@ -739,13 +739,7 @@ int tcp_bind(FAR struct tcp_conn_s *conn,
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
int tcp_connect(FAR struct tcp_conn_s *conn,
|
||||
FAR const struct sockaddr_in6 *addr)
|
||||
#else
|
||||
int tcp_connect(FAR struct tcp_conn_s *conn,
|
||||
FAR const struct sockaddr_in *addr)
|
||||
#endif
|
||||
int tcp_connect(FAR struct tcp_conn_s *conn, FAR const struct sockaddr *addr)
|
||||
{
|
||||
net_lock_t flags;
|
||||
int port;
|
||||
@ -787,7 +781,6 @@ int tcp_connect(FAR struct tcp_conn_s *conn,
|
||||
conn->tcpstateflags = TCP_SYN_SENT;
|
||||
tcp_initsequence(conn->sndseq);
|
||||
|
||||
conn->mss = MIN_IPv4_TCP_INITIAL_MSS;
|
||||
conn->unacked = 1; /* TCP length of the SYN is one. */
|
||||
conn->nrtx = 0;
|
||||
conn->timer = 1; /* Send the SYN next time around. */
|
||||
@ -801,13 +794,45 @@ int tcp_connect(FAR struct tcp_conn_s *conn,
|
||||
conn->sent = 0;
|
||||
#endif
|
||||
|
||||
/* The sockaddr port is 16 bits and already in network order */
|
||||
/* Save values that are specific to the IP address domain */
|
||||
|
||||
conn->rport = addr->sin_port;
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
if (conn->domain == PF_INET)
|
||||
#endif
|
||||
{
|
||||
FAR const struct sockaddr_in *inaddr =
|
||||
(FAR const struct sockaddr_in *)addr;
|
||||
|
||||
/* The sockaddr address is 32-bits in network order. */
|
||||
/* Save MSS and the port from the sockaddr (already in network order) */
|
||||
|
||||
net_ipv4addr_copy(conn->u.ipv4.raddr, addr->sin_addr.s_addr);
|
||||
conn->mss = MIN_IPv4_TCP_INITIAL_MSS;
|
||||
conn->rport = inaddr->sin_port;
|
||||
|
||||
/* The sockaddr address is 32-bits in network order. */
|
||||
|
||||
net_ipv4addr_copy(conn->u.ipv4.raddr, inaddr->sin_addr.s_addr);
|
||||
}
|
||||
#endif /* CONFIG_NET_IPv4 */
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
else
|
||||
#endif
|
||||
{
|
||||
FAR const struct sockaddr_in6 *inaddr =
|
||||
(FAR const struct sockaddr_in6 *)addr;
|
||||
|
||||
/* Save MSS and the port from the sockaddr (already in network order) */
|
||||
|
||||
conn->mss = MIN_IPv6_TCP_INITIAL_MSS;
|
||||
conn->rport = inaddr->sin_port;
|
||||
|
||||
/* The sockaddr address is 32-bits in network order. */
|
||||
|
||||
net_ipv6addr_copy(conn->u.ipv6.raddr, inaddr->sin6_addr.s6_addr16);
|
||||
}
|
||||
#endif /* CONFIG_NET_IPv6 */
|
||||
|
||||
#ifdef CONFIG_NET_TCP_READAHEAD
|
||||
/* Initialize the list of TCP read-ahead buffers */
|
||||
|
Loading…
Reference in New Issue
Block a user