1
0
Fork 0
forked from nuttx/nuttx-update

6LoWPAN: When obtaining the radio MAC address from the IP address, handle the special case of broadcast and multicast address.

This commit is contained in:
Gregory Nutt 2017-08-06 13:50:48 -06:00
parent cb44833599
commit 48a507c0b7
5 changed files with 71 additions and 23 deletions

View file

@ -520,7 +520,11 @@ Configuration sub-directories
might be a work around... it is not. Still RX FIFO errors. From my
reading, the only known work-around is to reduce the maximum packet
size so that it is smaller than 96. I tried setting the maximum packet
length to 84 and that did NOT eliminate the RX FIFO error anyway.
length to 84 and that did NOT eliminate the RX FIFO error.
At the end of the TCP test, the "nsh> ifconfig" command shows that
there were two TX timeouts. Perhaps this is related? The TX timeout
is set to 5 seconds, so this could be a serious performance issue.
So for now I have to live with the RX FIFO error. I have observed
only a single RX FIFO error and it occurs at the same place in the
@ -537,4 +541,5 @@ Configuration sub-directories
the payload correctly from RX FIFO."
Reducing the FIFO to 94 bytes fixed the problem with the 2 byte CRC
but did not resolve that occasional, harmless RX FIFO error.
but did not resolve that occasional RX FIFO error.

View file

@ -31,6 +31,9 @@ config SPIRIT_PKTLEN
This can be avoided by reducing the maximum packet length to a value which
is lower than the RX FIFO size."
Also, with a packet size of 96, I have seen CRC failures on the receiving
side. With a packet size of 94, CRC filtering behaves well.
config SPIRIT_FIFOS
bool "FIFO Watermarks"
default n

View file

@ -4,9 +4,6 @@
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Copyright (C) 2017, Gregory Nutt, all rights reserved
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Derives from logic in Contiki:
*
* Copyright (c) 2008, Swedish Institute of Computer Science.
@ -177,6 +174,8 @@ static void sixlowpan_eaddrfromip(const net_ipv6addr_t ipaddr, FAR uint8_t *eadd
*
* 128 112 96 80 64 48 32 16
* ---- ---- ---- ---- ---- ---- ---- ----
* ff02 xxxx xxxx xxxx xxxx xxxx xxxx xxxx Multicast
* ff02 0000 0000 0000 0000 0000 0000 0001 All nodes multicast group
* xxxx 0000 0000 0000 0000 00ff fe00 xx00 1-byte short address IEEE 48-bit MAC
* xxxx 0000 0000 0000 0000 00ff fe00 xxxx 2-byte short address IEEE 48-bit MAC
* xxxx 0000 0000 0000 xxxx xxxx xxxx xxxx 8-byte extended address IEEE EUI-64
@ -191,10 +190,10 @@ int sixlowpan_destaddrfromip(FAR struct sixlowpan_driver_s *radio,
const net_ipv6addr_t ipaddr,
FAR struct netdev_varaddr_s *destaddr)
{
#ifdef CONFIG_NET_STARPOINT
struct sixlowpan_properties_s properties;
int ret;
#ifdef CONFIG_NET_STARPOINT
/* Only the radio driver knows the correct address of the hub. For IEEE
* 802.15.4 this will be the address of the PAN coordinator. For other
* radios, this may be some configured, "well-known" address.
@ -212,6 +211,44 @@ int sixlowpan_destaddrfromip(FAR struct sixlowpan_driver_s *radio,
#else /* CONFIG_NET_STARPOINT */
/* Check for a multicast address */
if (ipaddr[0] == HTONS(0xff02))
{
DEBUGASSERT(radio->r_properties != NULL);
ret = radio->r_properties(radio, &properties);
if (ret < 0)
{
return ret;
}
/* Check for the broadcast IP address
*
* IPv6 does not implement the method of broadcast, and therefore
* does not define broadcast addresses. Instead, IPv6 uses multicast
* addressing to the all-nodes multicast group: ff02:0:0:0:0:0:0:1.
*
* However, the use of the all-nodes group is not common, and most
* IPv6 protocols use a dedicated link-local multicast group to avoid
* disturbing every interface in the network.
*/
if (ipaddr[1] == 0 && ipaddr[2] == 0 && ipaddr[3] == 0 &&
ipaddr[4] == 0 && ipaddr[5] == 0 && ipaddr[5] == 0 &&
ipaddr[7] == HTONS(0x0001))
{
memcpy(destaddr, &properties.sp_bcast,
sizeof(struct netdev_varaddr_s));
}
else
{
memcpy(destaddr, &properties.sp_mcast,
sizeof(struct netdev_varaddr_s));
}
return OK;
}
/* Otherwise, the destination MAC address is encoded in the IP address */
/* Check for compressible link-local address.
@ -238,9 +275,6 @@ int sixlowpan_destaddrfromip(FAR struct sixlowpan_driver_s *radio,
if (radio->r_dev.d_lltype == NET_LL_PKTRADIO)
#endif
{
struct sixlowpan_properties_s properties;
int ret;
DEBUGASSERT(radio->r_properties != NULL);
ret = radio->r_properties(radio, &properties);
if (ret < 0)

View file

@ -918,14 +918,17 @@ static int lo_properties(FAR struct sixlowpan_driver_s *netdev,
/* Multicast address (uses broadcast address)
*
* Multicast address should really determined by the first 3 bits
* (RFC 4944):
* For meshes (only) a multicast address candetermined by the first 3 bits
* of a short address (RFC 4944):
*
* 0xxxxxxx xxxxxxxx: Unicast address
* 100xxxxx xxxxxxxx: Multicast address
* 101xxxxx xxxxxxxx: Reserved
* 110xxxxx xxxxxxxx: Reserved
* 111xxxxx xxxxxxxx: Reserved
* 0xxxxxxx xxxxxxxx: Unicast address
* 100xxxxx xxxxxxxx: Multicast address
* 101xxxxx xxxxxxxx: Reserved
* 110xxxxx xxxxxxxx: Reserved
* 111xxxxx xxxxxxxx: Reserved
*
* Otherwise, Multicast is implemented with the broadcast address
* (qualified by the destination PANID).
*/
properties->sp_mcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE;

View file

@ -1068,14 +1068,17 @@ static int macnet_properties(FAR struct sixlowpan_driver_s *netdev,
/* Multicast address (uses broadcast address)
*
* Multicast address should really determined by the first 3 bits
* (RFC 4944):
* For meshes (only) a multicast address candetermined by the first 3 bits
* of a short address (RFC 4944):
*
* 0xxxxxxx xxxxxxxx: Unicast address
* 100xxxxx xxxxxxxx: Multicast address
* 101xxxxx xxxxxxxx: Reserved
* 110xxxxx xxxxxxxx: Reserved
* 111xxxxx xxxxxxxx: Reserved
* 0xxxxxxx xxxxxxxx: Unicast address
* 100xxxxx xxxxxxxx: Multicast address
* 101xxxxx xxxxxxxx: Reserved
* 110xxxxx xxxxxxxx: Reserved
* 111xxxxx xxxxxxxx: Reserved
*
* Otherwise, Multicast is implemented with the broadcast address
* (qualified by the destination PANID).
*/
properties->sp_mcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE;