Networking: Fix an IPv6 bug: Wrong network byte order in comparison

This commit is contained in:
Gregory Nutt 2015-01-19 13:21:26 -06:00
parent 28aadce3e8
commit bd3d26ccd7

View File

@ -104,7 +104,7 @@
/* Macros */ /* Macros */
#define BUF ((FAR struct ipv6_hdr_s *)&dev->d_buf[NET_LL_HDRLEN(dev)]) #define IPv6BUF ((FAR struct ipv6_hdr_s *)&dev->d_buf[NET_LL_HDRLEN(dev)])
/**************************************************************************** /****************************************************************************
* Public Data * Public Data
@ -139,7 +139,7 @@
int ipv6_input(FAR struct net_driver_s *dev) int ipv6_input(FAR struct net_driver_s *dev)
{ {
FAR struct ipv6_hdr_s *pbuf = BUF; FAR struct ipv6_hdr_s *ipv6 = IPv6BUF;
uint16_t iplen; uint16_t iplen;
/* This is where the input processing starts. */ /* This is where the input processing starts. */
@ -151,7 +151,7 @@ int ipv6_input(FAR struct net_driver_s *dev)
/* Start of IP input header processing code. */ /* Start of IP input header processing code. */
/* Check validity of the IP header. */ /* Check validity of the IP header. */
if ((pbuf->vtc & 0xf0) != 0x60) if ((ipv6->vtc & 0xf0) != 0x60)
{ {
/* IP version and header length. */ /* IP version and header length. */
@ -159,7 +159,8 @@ int ipv6_input(FAR struct net_driver_s *dev)
g_netstats.ip.drop++; g_netstats.ip.drop++;
g_netstats.ip.vhlerr++; g_netstats.ip.vhlerr++;
#endif #endif
nlldbg("Invalid IPv6 version: %d\n", pbuf->vtc >> 4);
nlldbg("Invalid IPv6 version: %d\n", ipv6->vtc >> 4);
goto drop; goto drop;
} }
@ -177,7 +178,7 @@ int ipv6_input(FAR struct net_driver_s *dev)
* the size of the IPv6 header (40 bytes). * the size of the IPv6 header (40 bytes).
*/ */
iplen = (pbuf->len[0] << 8) + pbuf->len[1] + IPv6_HDRLEN; iplen = (ipv6->len[0] << 8) + ipv6->len[1] + IPv6_HDRLEN;
if (iplen <= dev->d_len) if (iplen <= dev->d_len)
{ {
dev->d_len = iplen; dev->d_len = iplen;
@ -195,8 +196,8 @@ int ipv6_input(FAR struct net_driver_s *dev)
*/ */
#if defined(CONFIG_NET_BROADCAST) && defined(CONFIG_NET_UDP) #if defined(CONFIG_NET_BROADCAST) && defined(CONFIG_NET_UDP)
if (pbuf->proto == IP_PROTO_UDP && if (ipv6->proto == IP_PROTO_UDP &&
net_ipv6addr_cmp(pbuf->destipaddr, g_ipv6_alloneaddr)) net_ipv6addr_cmp(ipv6->destipaddr, g_ipv6_alloneaddr))
{ {
return udp_ipv6_input(dev); return udp_ipv6_input(dev);
} }
@ -233,8 +234,8 @@ int ipv6_input(FAR struct net_driver_s *dev)
* multicast packets that are sent to the ff02::/16 addresses. * multicast packets that are sent to the ff02::/16 addresses.
*/ */
if (!net_ipv6addr_cmp(pbuf->destipaddr, dev->d_ipv6addr) && if (!net_ipv6addr_cmp(ipv6->destipaddr, dev->d_ipv6addr) &&
pbuf->destipaddr[0] != 0xff02) ipv6->destipaddr[0] != HTONS(0xff02))
{ {
#ifdef CONFIG_NET_STATISTICS #ifdef CONFIG_NET_STATISTICS
g_netstats.ip.drop++; g_netstats.ip.drop++;
@ -247,7 +248,7 @@ int ipv6_input(FAR struct net_driver_s *dev)
* according to the protocol. * according to the protocol.
*/ */
switch (pbuf->proto) switch (ipv6->proto)
{ {
#ifdef CONFIG_NET_TCP #ifdef CONFIG_NET_TCP
case IP_PROTO_TCP: /* TCP input */ case IP_PROTO_TCP: /* TCP input */
@ -275,7 +276,7 @@ int ipv6_input(FAR struct net_driver_s *dev)
g_netstats.ip.protoerr++; g_netstats.ip.protoerr++;
#endif #endif
nlldbg("Unrecognized IP protocol\n"); nlldbg("Unrecognized IP protocol: %04x\n", ipv6->proto);
goto drop; goto drop;
} }