Spirit: Correct setting of the length width field; Add multicast and broadcast addresses to radio properities.

This commit is contained in:
Gregory Nutt
2017-08-04 10:58:29 -06:00
parent f6ebcc2220
commit 733d96cf81
11 changed files with 175 additions and 62 deletions
+3 -2
View File
@@ -369,9 +369,10 @@ Configuration sub-directories
2017-08-01: Testing began. The Spirit1 no configurations with no 2017-08-01: Testing began. The Spirit1 no configurations with no
errors, but there are no tests yet in place to exercise it. errors, but there are no tests yet in place to exercise it.
2017-08-02: The nettest, udp, telnet test programs were added. 2017-08-02: The nettest, udp, telnet test programs were added.
2017-08-05: Successfully exchanging packets, but there there are
issues with address filtering, CRC calculation, and data integrity
(like bad UDP checksums). Lot's more to be done!
Test Matrix: Test Matrix:
The following configurations have been tested: The following configurations have been tested:
+6
View File
@@ -69,4 +69,10 @@ config SPIRIT_BROADCAST
---help--- ---help---
Enables address filtering for the broadcast addess 0xff. Enables address filtering for the broadcast addess 0xff.
config SPIRIT_CRCDISABLE
bool "Disable CRC"
default n
---help---
Disables CRC calculation and filtering. Default is enabled.
endif # SPIRIT_NETDEV endif # SPIRIT_NETDEV
+79 -53
View File
@@ -110,36 +110,38 @@
* transfer the packet length. * transfer the packet length.
*/ */
#if CONFIG_SPIRIT_PKTLEN < 2
# define PKT_LENGTH_WIDTH 1 /* 0 - 1 */
#if CONFIG_SPIRIT_PKTLEN < 4 #if CONFIG_SPIRIT_PKTLEN < 4
# define PKT_LENGTH_WIDTH (2 - 1) # define PKT_LENGTH_WIDTH 2 /* 2 - 3 */
#elif CONFIG_SPIRIT_PKTLEN < 8 #elif CONFIG_SPIRIT_PKTLEN < 8
# define PKT_LENGTH_WIDTH (3 - 1) # define PKT_LENGTH_WIDTH 3 /* 4 - 7 */
#elif CONFIG_SPIRIT_PKTLEN < 16 #elif CONFIG_SPIRIT_PKTLEN < 16
# define PKT_LENGTH_WIDTH (4 - 1) # define PKT_LENGTH_WIDTH 4 /* 8 - 15 */
#elif CONFIG_SPIRIT_PKTLEN < 32 #elif CONFIG_SPIRIT_PKTLEN < 32
# define PKT_LENGTH_WIDTH (5 - 1) # define PKT_LENGTH_WIDTH 5 /* 16 - 31 */
#elif CONFIG_SPIRIT_PKTLEN < 64 #elif CONFIG_SPIRIT_PKTLEN < 64
# define PKT_LENGTH_WIDTH (6 - 1) # define PKT_LENGTH_WIDTH 6 /* 32 - 63 */
#elif CONFIG_SPIRIT_PKTLEN < 128 #elif CONFIG_SPIRIT_PKTLEN < 128
# define PKT_LENGTH_WIDTH (7 - 1) # define PKT_LENGTH_WIDTH 7 /* 63 - 127 */
#elif CONFIG_SPIRIT_PKTLEN < 256 #elif CONFIG_SPIRIT_PKTLEN < 256
# define PKT_LENGTH_WIDTH (8 - 1) # define PKT_LENGTH_WIDTH 8 /* 128 - 255 */
#elif CONFIG_SPIRIT_PKTLEN < 512 #elif CONFIG_SPIRIT_PKTLEN < 512
# define PKT_LENGTH_WIDTH (9 - 1) # define PKT_LENGTH_WIDTH 9 /* 256 - 255 */
#elif CONFIG_SPIRIT_PKTLEN < 1024 #elif CONFIG_SPIRIT_PKTLEN < 1024
# define PKT_LENGTH_WIDTH (10 - 1) # define PKT_LENGTH_WIDTH 10 /* 512 - 1023 */
#elif CONFIG_SPIRIT_PKTLEN < 2048 #elif CONFIG_SPIRIT_PKTLEN < 2048
# define PKT_LENGTH_WIDTH (11 - 1) # define PKT_LENGTH_WIDTH 11 /* 1024 - 2047 */
#elif CONFIG_SPIRIT_PKTLEN < 4096 #elif CONFIG_SPIRIT_PKTLEN < 4096
# define PKT_LENGTH_WIDTH (12 - 1) # define PKT_LENGTH_WIDTH 12 /* 2048 - 4095 */
#elif CONFIG_SPIRIT_PKTLEN < 8192 #elif CONFIG_SPIRIT_PKTLEN < 8192
# define PKT_LENGTH_WIDTH (13 - 1) # define PKT_LENGTH_WIDTH 13 /* 4096 - 8191 */
#elif CONFIG_SPIRIT_PKTLEN < 16384 #elif CONFIG_SPIRIT_PKTLEN < 16384
# define PKT_LENGTH_WIDTH (14 - 1) # define PKT_LENGTH_WIDTH 14 /* 8192 - 16383 */
#elif CONFIG_SPIRIT_PKTLEN < 32768 #elif CONFIG_SPIRIT_PKTLEN < 32768
# define PKT_LENGTH_WIDTH (15 - 1) # define PKT_LENGTH_WIDTH 15 /* 16384 - 32767 */
#elif CONFIG_SPIRIT_PKTLEN < 65536 #elif CONFIG_SPIRIT_PKTLEN < 65536
# define PKT_LENGTH_WIDTH (16 - 1) # define PKT_LENGTH_WIDTH 16 /* 32768 - 65535 */
#else #else
# error Invalid CONFIG_SPIRIT_PKTLEN # error Invalid CONFIG_SPIRIT_PKTLEN
#endif #endif
@@ -274,32 +276,41 @@ int spirit_hw_initialize(FAR struct spirit_driver_s *dev,
static const struct radio_init_s g_radio_init = static const struct radio_init_s g_radio_init =
{ {
SPIRIT_BASE_FREQUENCY, /* base_frequency */ SPIRIT_BASE_FREQUENCY, /* base_frequency selected in board.h */
SPIRIT_CHANNEL_SPACE, /* chspace */ SPIRIT_CHANNEL_SPACE, /* chspace selected in board.h */
SPIRIT_XTAL_OFFSET_PPM, /* foffset */ SPIRIT_XTAL_OFFSET_PPM, /* foffset selected in board.h */
SPIRIT_CHANNEL_NUMBER, /* chnum */ SPIRIT_CHANNEL_NUMBER, /* chnum selected in board.h */
SPIRIT_MODULATION_SELECT, /* modselect */ SPIRIT_MODULATION_SELECT, /* modselect selected in board.h */
SPIRIT_DATARATE, /* datarate */ SPIRIT_DATARATE, /* datarate selected in board.h */
SPIRIT_FREQ_DEVIATION, /* freqdev */ SPIRIT_FREQ_DEVIATION, /* freqdev selected in board.h */
SPIRIT_BANDWIDTH /* bandwidth */ SPIRIT_BANDWIDTH /* bandwidth selected in board.h */
}; };
/* Spirit PktBasic initialization */ /* Spirit PktBasic initialization */
static const struct pktbasic_init_s g_pktbasic_init = static const struct pktbasic_init_s g_pktbasic_init =
{ {
SPIRIT_SYNC_WORD, /* syncwords */ SPIRIT_SYNC_WORD, /* syncword selected in board.h */
SPIRIT_PREAMBLE_LENGTH, /* premblen */ SPIRIT_PREAMBLE_LENGTH, /* premblen selected in board.h*/
SPIRIT_SYNC_LENGTH, /* synclen */ SPIRIT_SYNC_LENGTH, /* synclen selected in board.h */
PKT_LENGTH_VAR, /* fixvarlen, variable packet length */ PKT_LENGTH_VAR, /* fixvarlen variable packet length */
PKT_LENGTH_WIDTH, /* pktlenwidth from CONFIG_SPIRIT_PKTLEN */ PKT_LENGTH_WIDTH, /* pktlenwidth from CONFIG_SPIRIT_PKTLEN */
SPIRIT_CRC_MODE, /* crcmode */ #ifdef CONFIG_SPIRIT_CRCDISABLE
SPIRIT_CONTROL_LENGTH, /* ctrllen */ PKT_NO_CRC, /* crcmode none */
S_ENABLE, /* txdestaddr, need to send address */ #else
SPIRIT_EN_FEC, /* fec */ SPIRIT_CRC_MODE, /* crcmode selected in board.h */
SPIRIT_EN_WHITENING /* datawhite */ #endif
SPIRIT_CONTROL_LENGTH, /* ctrllen selected in board.h */
S_ENABLE, /* txdestaddr need to send address */
SPIRIT_EN_FEC, /* fec selected in board.h */
SPIRIT_EN_WHITENING /* datawhite selected in board.h */
}; };
/* GPIO Configuration.
*
* REVISIT: Assumes interrupt is on GPIO3. Might need to be configurable.
*/
static const struct spirit_gpio_init_s g_gpioinit = static const struct spirit_gpio_init_s g_gpioinit =
{ {
SPIRIT_GPIO_3, /* gpiopin */ SPIRIT_GPIO_3, /* gpiopin */
@@ -307,43 +318,45 @@ static const struct spirit_gpio_init_s g_gpioinit =
SPIRIT_GPIO_DIG_OUT_IRQ /* gpioio */ SPIRIT_GPIO_DIG_OUT_IRQ /* gpioio */
}; };
/* CSMA initialization */
static const struct spirit_csma_init_s g_csma_init = static const struct spirit_csma_init_s g_csma_init =
{ {
1, /* BU counter seed */ 1, /* BU counter seed */
S_ENABLE, /* enable persistent mode */ S_ENABLE, /* enable persistent mode */
TBIT_TIME_64, /* Tcca time */ TBIT_TIME_64, /* Tcca time */
TCCA_TIME_3, /* Lcca length */ TCCA_TIME_3, /* Lcca length */
3, /* max nr of backoffs (<8) */ 3, /* max nr of backoffs (<8) */
8 /* BU prescaler */ 8 /* BU prescaler */
}; };
#ifdef CONFIG_SPIRIT_PROMISICUOUS #ifdef CONFIG_SPIRIT_PROMISICUOUS
static struct pktbasic_addr_s g_addrinit = static struct pktbasic_addr_s g_addrinit =
{ {
S_DISABLE, /* Disable filtering on node address */ S_DISABLE, /* Disable filtering on node address */
SPIRIT_NODE_ADDR, /* Node address (Temporary, until assigned) */ SPIRIT_NODE_ADDR, /* Node address (Temporary, until assigned) */
S_DISABLE, /* Disable filtering on multicast address */ S_DISABLE, /* Disable filtering on multicast address */
0xee, /* Multicast address */ SPIRIT_MCAST_ADDRESS, /* Multicast address */
S_DISABLE, /* Disable filtering on broadcast address */ S_DISABLE, /* Disable filtering on broadcast address */
0xff /* Broadcast address */ SPIRIT_BCAST_ADDRESS /* Broadcast address */
}; };
#else #else
static struct pktbasic_addr_s g_addrinit = static struct pktbasic_addr_s g_addrinit =
{ {
S_ENABLE, /* Enable filtering on node address */ S_ENABLE, /* Enable filtering on node address */
SPIRIT_NODE_ADDR, /* Node address (Temporary, until assigned) */ SPIRIT_NODE_ADDR, /* Node address (Temporary, until assigned) */
#ifdef CONFIG_SPIRIT_MULTICAST #ifdef CONFIG_SPIRIT_MULTICAST
S_ENABLE, /* Enable filtering on multicast address */ S_ENABLE, /* Enable filtering on multicast address */
#else #else
S_DISABLE, /* Disable filtering on multicast address */ S_DISABLE, /* Disable filtering on multicast address */
#endif #endif
0xee, /* Multicast address */ SPIRIT_MCAST_ADDRESS, /* Multicast address */
#ifdef CONFIG_SPIRIT_BROADCAST #ifdef CONFIG_SPIRIT_BROADCAST
S_ENABLE, /* Enable filtering on broadcast address */ S_ENABLE, /* Enable filtering on broadcast address */
#else #else
S_DISABLE, /* Disable filtering on broadcast address */ S_DISABLE, /* Disable filtering on broadcast address */
#endif #endif
0xff /* Broadcast address */ SPIRIT_BCAST_ADDRESS /* Broadcast address */
}; };
#endif #endif
@@ -1922,9 +1935,22 @@ static int spirit_properties(FAR struct sixlowpan_driver_s *netdev,
FAR struct sixlowpan_properties_s *properties) FAR struct sixlowpan_properties_s *properties)
{ {
DEBUGASSERT(netdev != NULL && properties != NULL); DEBUGASSERT(netdev != NULL && properties != NULL);
memset(properties, 0, sizeof(struct sixlowpan_properties_s));
/* General */
properties->sp_addrlen = 1; /* Length of an address */ properties->sp_addrlen = 1; /* Length of an address */
properties->sp_pktlen = CONFIG_SPIRIT_PKTLEN; /* Fixed packet length */ properties->sp_pktlen = CONFIG_SPIRIT_PKTLEN; /* Fixed packet length */
/* Multicast address */
properties->sp_mcast.nv_addrlen = 1;
properties->sp_mcast.nv_addr[0] = SPIRIT_MCAST_ADDRESS;
/* Broadcast address */
properties->sp_bcast.nv_addrlen = 1;
properties->sp_bcast.nv_addr[0] = SPIRIT_BCAST_ADDRESS;
return OK; return OK;
} }
+2
View File
@@ -355,6 +355,8 @@ struct sixlowpan_properties_s
{ {
uint8_t sp_addrlen; /* Length of an address */ uint8_t sp_addrlen; /* Length of an address */
uint8_t sp_pktlen; /* Fixed packet/frame size (up to 255) */ uint8_t sp_pktlen; /* Fixed packet/frame size (up to 255) */
struct netdev_varaddr_s sp_mcast; /* Multicast address */
struct netdev_varaddr_s sp_bcast; /* Broadcast address */
}; };
/* The device structure for radio network device differs from the standard /* The device structure for radio network device differs from the standard
+9 -2
View File
@@ -44,6 +44,7 @@
****************************************************************************/ ****************************************************************************/
#include <nuttx/config.h> #include <nuttx/config.h>
#include <nuttx/net/netdev.h>
#include <nuttx/wireless/wireless.h> #include <nuttx/wireless/wireless.h>
#ifdef CONFIG_WIRELESS_PKTRADIO #ifdef CONFIG_WIRELESS_PKTRADIO
@@ -92,14 +93,18 @@
****************************************************************************/ ****************************************************************************/
/* This describes an address used by the packet radio. There is no standard /* This describes an address used by the packet radio. There is no standard
* size for such an address. Hence, it is represented simply as a arry of * size for such an address. Hence, it is represented simply as a array of
* bytes. * bytes.
*
* NOTE: This MUST be the same as the struct netdev_varaddr_s as defined in
* netdev.h. It is duplicated here for no particularly good reason other
* than to maintain a clean PktRadio namespace.
*/ */
struct pktradio_addr_s struct pktradio_addr_s
{ {
uint8_t pa_addrlen; /* Length of the following address */ uint8_t pa_addrlen; /* Length of the following address */
uint8_t pa_addr[CONFIG_PKTRADIO_ADDRLEN]; uint8_t pa_addr[RADIO_MAX_ADDRLEN];
}; };
/* Different packet radios may have different properties. If there are /* Different packet radios may have different properties. If there are
@@ -116,6 +121,8 @@ struct pktradio_properties_s
{ {
uint8_t pp_addrlen; /* Length of an address */ uint8_t pp_addrlen; /* Length of an address */
uint8_t pp_pktlen; /* Fixed packet/frame size (up to 255) */ uint8_t pp_pktlen; /* Fixed packet/frame size (up to 255) */
struct pktradio_addr_s pp_mcast; /* Multicast address */
struct pktradio_addr_s pp_bcast; /* Broadcast address */
}; };
/* This is the structure passed with all packet radio IOCTL commands. /* This is the structure passed with all packet radio IOCTL commands.
+9
View File
@@ -46,6 +46,15 @@
#include <nuttx/irq.h> #include <nuttx/irq.h>
/****************************************************************************
* Preprocessor Definitions
****************************************************************************/
/* Special multicast and broadcast addresses */
#define SPIRIT_MCAST_ADDRESS 0xee
#define SPIRIT_BCAST_ADDRESS 0xff
/**************************************************************************** /****************************************************************************
* Public Types * Public Types
****************************************************************************/ ****************************************************************************/
+4 -1
View File
@@ -326,7 +326,10 @@ static int sixlowpan_pktradio_metadata(FAR struct sixlowpan_driver_s *radio,
radio->r_dev.d_mac.sixlowpan.nv_addr, radio->r_dev.d_mac.sixlowpan.nv_addr,
radio->r_dev.d_mac.sixlowpan.nv_addrlen); radio->r_dev.d_mac.sixlowpan.nv_addrlen);
/* Set the destination address */ /* Set the destination address.
* REVISIT: Do wee need to check for multicast or broadcast addresses
* here?
*/
pktmeta->pm_dest.pa_addrlen = destmac->nv_addrlen; pktmeta->pm_dest.pa_addrlen = destmac->nv_addrlen;
memcpy(pktmeta->pm_dest.pa_addr, destmac->nv_addr, destmac->nv_addrlen); memcpy(pktmeta->pm_dest.pa_addr, destmac->nv_addr, destmac->nv_addrlen);
+3 -3
View File
@@ -198,9 +198,9 @@ int sixlowpan_meta_data(FAR struct sixlowpan_driver_s *radio,
{ {
/* Broadcast requires short address mode. */ /* Broadcast requires short address mode. */
meta->destaddr.mode = IEEE802154_ADDRMODE_SHORT; meta->destaddr.mode = IEEE802154_ADDRMODE_SHORT;
meta->destaddr.saddr[0] = 0; meta->destaddr.saddr[0] = 0xff;
meta->destaddr.saddr[1] = 0; meta->destaddr.saddr[1] = 0xff;
} }
else if (pktmeta->dextended != 0) else if (pktmeta->dextended != 0)
{ {
+23
View File
@@ -909,9 +909,32 @@ static int lo_properties(FAR struct sixlowpan_driver_s *netdev,
FAR struct sixlowpan_properties_s *properties) FAR struct sixlowpan_properties_s *properties)
{ {
DEBUGASSERT(netdev != NULL && properties != NULL); DEBUGASSERT(netdev != NULL && properties != NULL);
memset(properties, 0, sizeof(struct sixlowpan_properties_s));
/* General */
properties->sp_addrlen = NET_6LOWPAN_ADDRSIZE; /* Length of an address */ properties->sp_addrlen = NET_6LOWPAN_ADDRSIZE; /* Length of an address */
properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */ properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */
/* Multicast address (uses broadcast address)
*
* Multicast address should really determined by the first 3 bits
* (RFC 4944):
*
* 0xxxxxxx xxxxxxxx: Unicast address
* 100xxxxx xxxxxxxx: Multicast address
* 101xxxxx xxxxxxxx: Reserved
* 110xxxxx xxxxxxxx: Reserved
* 111xxxxx xxxxxxxx: Reserved
*/
properties->sp_mcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE;
memset(properties->sp_mcast.nv_addr, 0xff, RADIO_MAX_ADDRLEN);
/* Broadcast address */
properties->sp_bcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE;
memset(properties->sp_mcast.nv_addr, 0xff, RADIO_MAX_ADDRLEN);
return OK; return OK;
} }
+23
View File
@@ -973,9 +973,32 @@ static int macnet_properties(FAR struct sixlowpan_driver_s *netdev,
FAR struct sixlowpan_properties_s *properties) FAR struct sixlowpan_properties_s *properties)
{ {
DEBUGASSERT(netdev != NULL && properties != NULL); DEBUGASSERT(netdev != NULL && properties != NULL);
memset(properties, 0, sizeof(struct sixlowpan_properties_s));
/* General */
properties->sp_addrlen = NET_6LOWPAN_ADDRSIZE; /* Length of an address */ properties->sp_addrlen = NET_6LOWPAN_ADDRSIZE; /* Length of an address */
properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */ properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */
/* Multicast address (uses broadcast address)
*
* Multicast address should really determined by the first 3 bits
* (RFC 4944):
*
* 0xxxxxxx xxxxxxxx: Unicast address
* 100xxxxx xxxxxxxx: Multicast address
* 101xxxxx xxxxxxxx: Reserved
* 110xxxxx xxxxxxxx: Reserved
* 111xxxxx xxxxxxxx: Reserved
*/
properties->sp_mcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE;
memset(properties->sp_mcast.nv_addr, 0xff, RADIO_MAX_ADDRLEN);
/* Broadcast address */
properties->sp_bcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE;
memset(properties->sp_mcast.nv_addr, 0xff, RADIO_MAX_ADDRLEN);
return OK; return OK;
} }
+14 -1
View File
@@ -751,7 +751,7 @@ static int lo_ioctl(FAR struct net_driver_s *dev, int cmd,
FAR struct sixlowpan_properties_s *props = FAR struct sixlowpan_properties_s *props =
(FAR struct sixlowpan_properties_s *)&cmddata->pifr_props; (FAR struct sixlowpan_properties_s *)&cmddata->pifr_props;
ret = spirit_properties(radio, props); ret = lo_properties(radio, props);
} }
break; break;
@@ -932,9 +932,22 @@ static int lo_properties(FAR struct sixlowpan_driver_s *netdev,
FAR struct sixlowpan_properties_s *properties) FAR struct sixlowpan_properties_s *properties)
{ {
DEBUGASSERT(netdev != NULL && properties != NULL); DEBUGASSERT(netdev != NULL && properties != NULL);
memset(properties, 0, sizeof(struct sixlowpan_properties_s));
/* General */
properties->sp_addrlen = CONFIG_PKTRADIO_ADDRLEN; /* Length of an address */ properties->sp_addrlen = CONFIG_PKTRADIO_ADDRLEN; /* Length of an address */
properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */ properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */
/* Multicast address */
properties->sp_mcast.nv_addrlen = CONFIG_PKTRADIO_ADDRLEN;
memset(properties->sp_mcast.nv_addr, 0xee, RADIO_MAX_ADDRLEN);
/* Broadcast address */
properties->sp_bcast.nv_addrlen = CONFIG_PKTRADIO_ADDRLEN;
memset(properties->sp_mcast.nv_addr, 0xff, RADIO_MAX_ADDRLEN);
return OK; return OK;
} }