- Fixed some issues that prevented ipv6 to work with ipv4 enabled.

This commit is contained in:
Pascal Speck 2017-01-18 10:57:15 +01:00
parent 99c765e229
commit 2e074ca4f9
4 changed files with 20 additions and 17 deletions

View File

@ -174,12 +174,12 @@ int ipv6_input(FAR struct net_driver_s *dev)
*
* The length reported in the IPv6 header is the length of the payload
* that follows the header. The device interface uses the d_len variable for
* holding the size of the entire packet, including the IP header and link
* layer header.
* holding the size of the entire packet, including the IP header but without
* the link layer header.
*/
pktlen = ((uint16_t)ipv6->len[0] << 8) + (uint16_t)ipv6->len[1] +
IPv6_HDRLEN + netdev_ipv6_hdrlen(dev);
IPv6_HDRLEN;
if (pktlen <= dev->d_len)
{

View File

@ -105,7 +105,13 @@ void tcp_poll(FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn)
* setup may not actually be used.
*/
#if defined(CONFIG_NET_IPv4)
#if defined(CONFIG_NET_IPv6) && defined(CONFIG_NET_IPv4)
if(conn->domain == PF_INET) {
tcp_ipv4_select(dev);
} else {
tcp_ipv6_select(dev);
}
#elif defined(CONFIG_NET_IPv4)
tcp_ipv4_select(dev);
#else /* if defined(CONFIG_NET_IPv6) */
tcp_ipv6_select(dev);

View File

@ -228,21 +228,21 @@ static inline void psock_lost_connection(FAR struct socket *psock,
#ifdef NEED_IPDOMAIN_SUPPORT
static inline void send_ipselect(FAR struct net_driver_s *dev,
FAR struct socket *psock)
FAR struct tcp_conn_s *conn)
{
/* Which domain the the socket support */
if (psock->s_domain == PF_INET)
if (conn->domain == PF_INET)
{
/* Select the IPv4 domain */
tcp_ipv4_select(dev);
}
else /* if (psock->s_domain == PF_INET6) */
else /* if (conn->domain == PF_INET6) */
{
/* Select the IPv6 domain */
DEBUGASSERT(psock->s_domain == PF_INET6);
DEBUGASSERT(conn->domain == PF_INET6);
tcp_ipv4_select(dev);
}
}
@ -754,7 +754,7 @@ static uint16_t psock_send_interrupt(FAR struct net_driver_s *dev,
* place and we need do nothing.
*/
send_ipselect(dev, psock);
send_ipselect(dev, conn);
#endif
/* Then set-up to send that amount of data with the offset
* corresponding to the amount of data already sent. (this

View File

@ -179,24 +179,21 @@ static inline int send_timeout(FAR struct send_s *pstate)
#ifdef NEED_IPDOMAIN_SUPPORT
static inline void tcpsend_ipselect(FAR struct net_driver_s *dev,
FAR struct send_s *pstate)
FAR struct tcp_conn_s *conn)
{
FAR struct socket *psock = pstate->snd_sock;
DEBUGASSERT(psock);
/* Which domain the the socket support */
if (psock->s_domain == PF_INET)
if (conn->domain == PF_INET)
{
/* Select the IPv4 domain */
tcp_ipv4_select(dev);
}
else /* if (psock->s_domain == PF_INET6) */
else /* if (conn->domain == PF_INET6) */
{
/* Select the IPv6 domain */
DEBUGASSERT(psock->s_domain == PF_INET6);
DEBUGASSERT(conn->domain == PF_INET6);
tcp_ipv4_select(dev);
}
}
@ -538,7 +535,7 @@ static uint16_t tcpsend_interrupt(FAR struct net_driver_s *dev,
* place and we need do nothing.
*/
tcpsend_ipselect(dev, pstate);
tcpsend_ipselect(dev, conn);
#endif
/* Then set-up to send that amount of data. (this won't actually
* happen until the polling cycle completes).