From d9c266c71ba1a8f174d730d77dfca4dd539f4ab8 Mon Sep 17 00:00:00 2001
From: Gregory Nutt
- Correct + Preferred
struct abc_s From 575fb0acbfb9702de0d0e5933ab5c8329622e4a7 Mon Sep 17 00:00:00 2001 From: Gregory NuttDate: Wed, 19 Apr 2017 07:26:51 -0600 Subject: [PATCH 2/6] Nucleo-F072RB: Enable board_app_inititalize, procfs, and built-in functions. --- configs/nucleo-f072rb/nsh/defconfig | 55 +++++++++++++++++++---- configs/nucleo-f072rb/src/stm32_bringup.c | 3 +- configs/nucleo-f072rb/src/stm32_buttons.c | 8 ++-- 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/configs/nucleo-f072rb/nsh/defconfig b/configs/nucleo-f072rb/nsh/defconfig index 48868af1246..946a2edad25 100644 --- a/configs/nucleo-f072rb/nsh/defconfig +++ b/configs/nucleo-f072rb/nsh/defconfig @@ -407,14 +407,20 @@ CONFIG_ARCH_BOARD="nucleo-f072rb" CONFIG_ARCH_HAVE_LEDS=y CONFIG_ARCH_LEDS=y CONFIG_ARCH_HAVE_BUTTONS=y -# CONFIG_ARCH_BUTTONS is not set +CONFIG_ARCH_BUTTONS=y CONFIG_ARCH_HAVE_IRQBUTTONS=y +CONFIG_ARCH_IRQBUTTONS=y # # Board-Specific Options # # CONFIG_BOARD_CRASHDUMP is not set -# CONFIG_LIB_BOARDCTL is not set +CONFIG_LIB_BOARDCTL=y +# CONFIG_BOARDCTL_RESET is not set +# CONFIG_BOARDCTL_UNIQUEID is not set +# CONFIG_BOARDCTL_TSCTEST is not set +# CONFIG_BOARDCTL_GRAPHICS is not set +# CONFIG_BOARDCTL_IOCTL is not set # # RTOS Features @@ -448,6 +454,7 @@ CONFIG_PREALLOC_TIMERS=0 # CONFIG_SPINLOCK is not set # CONFIG_INIT_NONE is not set CONFIG_INIT_ENTRYPOINT=y +# CONFIG_INIT_FILEPATH is not set CONFIG_USER_ENTRYPOINT="nsh_main" CONFIG_RR_INTERVAL=200 # CONFIG_SCHED_SPORADIC is not set @@ -675,13 +682,28 @@ CONFIG_SYSLOG_CONSOLE=y # # File system configuration # -CONFIG_DISABLE_MOUNTPOINT=y +# CONFIG_DISABLE_MOUNTPOINT is not set +# CONFIG_FS_AUTOMOUNTER is not set CONFIG_DISABLE_PSEUDOFS_OPERATIONS=y -# CONFIG_FS_READABLE is not set +CONFIG_FS_READABLE=y # CONFIG_FS_WRITABLE is not set # CONFIG_FS_NAMED_SEMAPHORES is not set # CONFIG_FS_RAMMAP is not set -# CONFIG_FS_PROCFS is not set +# CONFIG_FS_FAT is not set +# CONFIG_FS_NXFFS is not set +# CONFIG_FS_ROMFS is not set +# CONFIG_FS_TMPFS is not set +# CONFIG_FS_SMARTFS is not set +# CONFIG_FS_BINFS is not set +CONFIG_FS_PROCFS=y +# CONFIG_FS_PROCFS_REGISTER is not set + +# +# Exclude individual procfs entries +# +# CONFIG_FS_PROCFS_EXCLUDE_PROCESS is not set +# CONFIG_FS_PROCFS_EXCLUDE_UPTIME is not set +# CONFIG_FS_PROCFS_EXCLUDE_MOUNTS is not set # CONFIG_FS_UNIONFS is not set # @@ -709,7 +731,10 @@ CONFIG_MM_REGIONS=1 # # Binary Loader # -CONFIG_BINFMT_DISABLE=y +# CONFIG_BINFMT_DISABLE is not set +# CONFIG_NXFLAT is not set +# CONFIG_ELF is not set +CONFIG_BUILTIN=y # CONFIG_PIC is not set # CONFIG_SYMTAB_ORDEREDBYNAME is not set @@ -762,6 +787,7 @@ CONFIG_LIB_RAND_ORDER=1 # # Program Execution Options # +# CONFIG_LIBC_EXECFUNCS is not set CONFIG_POSIX_SPAWN_PROXY_STACKSIZE=1024 CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=1536 @@ -801,6 +827,7 @@ CONFIG_ARCH_HAVE_TLS=y # # NETDB Support # +# CONFIG_NETDB_HOSTFILE is not set # CONFIG_LIBC_IOCTL_VARIADIC is not set CONFIG_LIB_SENDFILE_BUFSIZE=512 @@ -822,6 +849,11 @@ CONFIG_LIB_SENDFILE_BUFSIZE=512 # Application Configuration # +# +# Built-In Applications +# +CONFIG_BUILTIN_PROXY_STACKSIZE=1024 + # # CAN Utilities # @@ -867,12 +899,14 @@ CONFIG_EXAMPLES_NSH=y # CONFIG_EXAMPLES_SERLOOP is not set # CONFIG_EXAMPLES_SLCD is not set # CONFIG_EXAMPLES_SMART is not set +# CONFIG_EXAMPLES_SMART_TEST is not set # CONFIG_EXAMPLES_SMP is not set # CONFIG_EXAMPLES_STAT is not set # CONFIG_EXAMPLES_TCPECHO is not set # CONFIG_EXAMPLES_TELNETD is not set # CONFIG_EXAMPLES_TIFF is not set # CONFIG_EXAMPLES_TOUCHSCREEN is not set +# CONFIG_EXAMPLES_USBSERIAL is not set # CONFIG_EXAMPLES_WATCHDOG is not set # CONFIG_EXAMPLES_WEBSERVER is not set # CONFIG_EXAMPLES_XBC_TEST is not set @@ -881,6 +915,7 @@ CONFIG_EXAMPLES_NSH=y # File System Utilities # # CONFIG_FSUTILS_INIFILE is not set +# CONFIG_FSUTILS_PASSWD is not set # # GPS Utilities @@ -896,6 +931,7 @@ CONFIG_EXAMPLES_NSH=y # # Interpreters # +# CONFIG_INTERPRETERS_BAS is not set # CONFIG_INTERPRETERS_FICL is not set # CONFIG_INTERPRETERS_MICROPYTHON is not set # CONFIG_INTERPRETERS_MINIBASIC is not set @@ -928,10 +964,12 @@ CONFIG_NSH_READLINE=y # CONFIG_NSH_CLE is not set CONFIG_NSH_LINELEN=64 CONFIG_NSH_DISABLE_SEMICOLON=y +# CONFIG_NSH_CMDPARMS is not set CONFIG_NSH_MAXARGUMENTS=6 # CONFIG_NSH_ARGCAT is not set CONFIG_NSH_NESTDEPTH=3 # CONFIG_NSH_DISABLEBG is not set +CONFIG_NSH_BUILTIN_APPS=y # # Disable Individual commands @@ -939,7 +977,7 @@ CONFIG_NSH_NESTDEPTH=3 CONFIG_NSH_DISABLE_ADDROUTE=y CONFIG_NSH_DISABLE_BASENAME=y # CONFIG_NSH_DISABLE_CAT is not set -CONFIG_NSH_DISABLE_CD=y +# CONFIG_NSH_DISABLE_CD is not set CONFIG_NSH_DISABLE_CP=y CONFIG_NSH_DISABLE_CMP=y CONFIG_NSH_DISABLE_DATE=y @@ -991,6 +1029,7 @@ CONFIG_NSH_MMCSDMINOR=0 # CONFIG_NSH_CODECS_BUFSIZE=128 # CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_NSH_PROC_MOUNTPOINT="/proc" CONFIG_NSH_FILEIOSIZE=64 # @@ -1003,7 +1042,7 @@ CONFIG_NSH_DISABLESCRIPT=y # CONFIG_NSH_CONSOLE=y # CONFIG_NSH_ALTCONDEV is not set -# CONFIG_NSH_ARCHINIT is not set +CONFIG_NSH_ARCHINIT=y # CONFIG_NSH_LOGIN is not set # CONFIG_NSH_CONSOLE_LOGIN is not set diff --git a/configs/nucleo-f072rb/src/stm32_bringup.c b/configs/nucleo-f072rb/src/stm32_bringup.c index 0c9c7f89dfe..137e458e782 100644 --- a/configs/nucleo-f072rb/src/stm32_bringup.c +++ b/configs/nucleo-f072rb/src/stm32_bringup.c @@ -41,6 +41,7 @@ #include #include +#include #include "nucleo-f072rb.h" @@ -72,7 +73,7 @@ int stm32_bringup(void) ret = mount(NULL, "/proc", "procfs", 0, NULL); if (ret < 0) { - syslog(LOG_ERR, "ERROR: Failed to mount procfs at /proc: %d\n", ret); + ferr("ERROR: Failed to mount procfs at /proc: %d\n", ret); } #endif diff --git a/configs/nucleo-f072rb/src/stm32_buttons.c b/configs/nucleo-f072rb/src/stm32_buttons.c index b4aed6807a4..f8574e47b3d 100644 --- a/configs/nucleo-f072rb/src/stm32_buttons.c +++ b/configs/nucleo-f072rb/src/stm32_buttons.c @@ -40,12 +40,14 @@ #include #include +#include #include #include #include #include +#include "stm32f0_gpio.h" #include "nucleo-f072rb.h" #ifdef CONFIG_ARCH_BUTTONS @@ -71,7 +73,7 @@ void board_button_initialize(void) * also configured for the pin. */ - stm32_configgpio(GPIO_BTN_USER); + stm32f0_configgpio(GPIO_BTN_USER); } /**************************************************************************** @@ -84,7 +86,7 @@ uint32_t board_buttons(void) * pressed. */ - bool released = stm32_gpioread(GPIO_BTN_USER); + bool released = stm32f0_gpioread(GPIO_BTN_USER); return !released; } @@ -117,7 +119,7 @@ int board_button_irq(int id, xcpt_t irqhandler, FAR void *arg) if (id == BUTTON_USER) { - ret = stm32_gpiosetevent(GPIO_BTN_USER, true, true, true, irqhandler, arg); + ret = stm32f0_gpiosetevent(GPIO_BTN_USER, true, true, true, irqhandler, arg); } return ret; From d3e1ea84f60556cd16440ced7601614532356ead Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Wed, 19 Apr 2017 11:19:40 -0600 Subject: [PATCH 3/6] Update README --- configs/nucleo-f072rb/README.txt | 57 ++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/configs/nucleo-f072rb/README.txt b/configs/nucleo-f072rb/README.txt index fb35cac2d37..033b7b75609 100644 --- a/configs/nucleo-f072rb/README.txt +++ b/configs/nucleo-f072rb/README.txt @@ -267,18 +267,55 @@ Configurations NOTES: - 1. Support for NSH built-in applications is provided: + 1. This initial release of this configuration was very minimal, but + also very small: - Binary Formats: - CONFIG_BUILTIN=y : Enable support for built-in programs + $ size nuttx + text data bss dec hex filename + 32000 92 1172 33264 81f0 nuttx - Application Configuration: - CONFIG_NSH_BUILTIN_APPS=y : Enable starting apps from NSH command line + The current version, additional features have been enabled: board + bring-up initialization, button support, the procfs file system, + and NSH built-in application support. The size increased as follows: - No built applications are enabled in the base configuration, however. + $ size nuttx + text data bss dec hex filename + 40231 92 1208 41531 a23b nuttx - 2. C++ support for applications is enabled: + Those additional features cost about 8KiB FLASH. I believe that is a + good use of the STM32F072RB's FLASH, but if you interested in the + more minimal configuration, here is what was changed: - CONFIG_HAVE_CXX=y - CONFIG_HAVE_CXXINITIALIZE=y - CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y + Removed + + CONFIG_BINFMT_DISABLE=y + CONFIG_DISABLE_MOUNTPOINT=y + CONFIG_NSH_DISABLE_CD=y + + Added: + + CONFIG_ARCH_BUTTONS=y + CONFIG_ARCH_IRQBUTTONS=y + + CONFIG_BUILTIN=y + CONFIG_BUILTIN_PROXY_STACKSIZE=1024 + + CONFIG_FS_PROCFS=y + CONFIG_NSH_PROC_MOUNTPOINT="/proc" + + CONFIG_LIB_BOARDCTL=y + CONFIG_NSH_ARCHINIT=y + CONFIG_NSH_BUILTIN_APPS=y + + Support for NSH built-in applications is enabled for future use. + However, no built applications are enabled in this base configuration. + + 2. C++ support for applications is NOT enabled. That could be enabled + with the following configuration changes: + + CONFIG_HAVE_CXX=y + CONFIG_HAVE_CXXINITIALIZE=y + CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y + + And also support fo C++ constructors under + apps/platform/nucleo-stm32f072rb. From 50fda0d748acaacba14e126749f79e1a09af4a2c Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Wed, 19 Apr 2017 13:33:20 -0600 Subject: [PATCH 4/6] 6loWPAN: Fix a missing source address in header. Correct calculation of payload size. --- include/nuttx/net/netconfig.h | 4 ++-- net/sixlowpan/Kconfig | 9 -------- net/sixlowpan/README.txt | 21 +++++++++--------- net/sixlowpan/sixlowpan_framelist.c | 13 +++++++----- net/sixlowpan/sixlowpan_framer.c | 33 +++++++++++++++++++++-------- net/sixlowpan/sixlowpan_input.c | 4 +++- net/sixlowpan/sixlowpan_internal.h | 6 +++--- 7 files changed, 51 insertions(+), 39 deletions(-) diff --git a/include/nuttx/net/netconfig.h b/include/nuttx/net/netconfig.h index 99f00e38563..fbdd2772d54 100644 --- a/include/nuttx/net/netconfig.h +++ b/include/nuttx/net/netconfig.h @@ -309,7 +309,7 @@ #endif #ifdef CONFIG_NET_6LOWPAN -# define IEEE802154_UDP_MSS(h) (CONFIG_NET_6LOWPAN_MAXPAYLOAD - UDP_HDRLEN - (h)) +# define IEEE802154_UDP_MSS(h) (CONFIG_NET_6LOWPAN_MTU - UDP_HDRLEN - (h)) # ifndef CONFIG_NET_MULTILINK # define __MIN_UDP_MSS(h) IEEE802154_UDP_MSS(h) # define __MAX_UDP_MSS(h) IEEE802154_UDP_MSS(h) @@ -484,7 +484,7 @@ #endif #ifdef CONFIG_NET_6LOWPAN -# define IEEE802154_TCP_MSS(h) (CONFIG_NET_6LOWPAN_MAXPAYLOAD - TCP_HDRLEN - (h)) +# define IEEE802154_TCP_MSS(h) (CONFIG_NET_6LOWPAN_MTU - TCP_HDRLEN - (h)) # ifndef CONFIG_NET_MULTILINK # define __MIN_TCP_MSS(h) IEEE802154_TCP_MSS(h) # define __MAX_TCP_MSS(h) IEEE802154_TCP_MSS(h) diff --git a/net/sixlowpan/Kconfig b/net/sixlowpan/Kconfig index ad59e290555..021571fbd01 100644 --- a/net/sixlowpan/Kconfig +++ b/net/sixlowpan/Kconfig @@ -156,15 +156,6 @@ config NET_6LOWPAN_MAX_MACTRANSMITS layer should resend packets if no link-layer ACK wasreceived. This only makes sense with the csma_driver. -config NET_6LOWPAN_MAXPAYLOAD - int "Max packet size" - default 102 - ---help--- - NET_6LOWPAN_MAXPAYLOAD specifies the maximum size of packets - before they get fragmented. The default is 127 bytes (the maximum size - of a 802.15.4 frame) - 25 bytes (for the 802.15.4 MAClayer header). This - can be increased for systems with larger packet sizes. - config NET_6LOWPAN_MTU int "6LoWPAN packet buffer size" default 1294 diff --git a/net/sixlowpan/README.txt b/net/sixlowpan/README.txt index e325533474e..7a65c77ade1 100644 --- a/net/sixlowpan/README.txt +++ b/net/sixlowpan/README.txt @@ -33,7 +33,7 @@ Optimal 6loWPAN Configuration Fragmentation Headers --------------------- A fragment header is placed at the beginning of the outgoing packet just -after the FCF when the payload is too large to fit in a single IEEE 802.15.4 +after the MAC when the payload is too large to fit in a single IEEE 802.15.4 frame. The fragment header contains three fields: Datagram size, datagram tag and datagram offset. @@ -47,7 +47,7 @@ The length of the fragment header length is four bytes for the first header (FRAG1) and five bytes for all subsequent headers (FRAGN). For example, this is a HC1 compressed first frame of a packet - 01 08 01 0000 3412 ### 7-byte FCF header + 41 88 01 0000 3412 cdab ### 9-byte MAC header c50e 000b ### 4-byte FRAG1 header 42 ### SIXLOWPAN_DISPATCH_HC1 fb ### RIME_HC1_HC_UDP_HC1_ENCODING @@ -56,14 +56,15 @@ this is a HC1 compressed first frame of a packet 10 ### RIME_HC1_HC_UDP_PORTS 0000 ### RIME_HC1_HC_UDP_CHKSUM - 80 byte Payload follows: + 104 byte Payload follows: 4f4e452064617920 48656e6e792d7065 6e6e792077617320 7069636b696e6720 757020636f726e20 696e207468652063 6f726e7961726420 7768656e2d2d7768 - 61636b212d2d736f 6d657468696e6720 g + 61636b212d2d736f 6d657468696e6720 6869742068657220 75706f6e20746865 + 20686561642e2027 This is the second frame of the same transfer: - 01 08 01 0000 3412 ### 7-byte FCF header + 41 88 01 0000 3412 cdab ### 9-byte MAC header e50e 000b 0a ### 5 byte FRAGN header 42 ### SIXLOWPAN_DISPATCH_HC1 fb ### RIME_HC1_HC_UDP_HC1_ENCODING @@ -72,11 +73,11 @@ This is the second frame of the same transfer: 10 ### RIME_HC1_HC_UDP_PORTS 0000 ### RIME_HC1_HC_UDP_CHKSUM - 80 byte Payload follows: - 6869742068657220 75706f6e20746865 20686561642e2027 476f6f646e657373 - 2067726163696f75 73206d6521272073 6169642048656e6e 792d70656e6e793b - 202774686520736b 79277320612d676f - + 104 byte Payload follows: + 476f6f646e657373 2067726163696f75 73206d6521272073 6169642048656e6e + 792d70656e6e793b 202774686520736b 79277320612d676f 696e6720746f2066 + 616c6c3b2049206d 75737420676f2061 6e642074656c6c20 746865206b696e67 + 2e270a0a536f2073 The payload length is encoded in the LS 11-bits of the first 16-bit value: In this example the payload size is 0x050e or 1,294. The tag is 0x000b. In diff --git a/net/sixlowpan/sixlowpan_framelist.c b/net/sixlowpan/sixlowpan_framelist.c index 23969c09f33..79e653d10bd 100644 --- a/net/sixlowpan/sixlowpan_framelist.c +++ b/net/sixlowpan/sixlowpan_framelist.c @@ -281,6 +281,11 @@ int sixlowpan_queue_frames(FAR struct ieee802154_driver_s *ieee, ninfo("Sending packet length %d\n", buflen); + /* Set the source and destinatino address */ + + rimeaddr_copy(&g_pktaddrs[PACKETBUF_ADDR_SENDER], &ieee->i_nodeaddr); + rimeaddr_copy(&g_pktaddrs[PACKETBUF_ADDR_RECEIVER], destmac); + /* Pre-calculate frame header length. */ framer_hdrlen = sixlowpan_send_hdrlen(ieee, ieee->i_panid); @@ -317,11 +322,9 @@ int sixlowpan_queue_frames(FAR struct ieee802154_driver_s *ieee, ninfo("Header of length %d\n", g_frame_hdrlen); - rimeaddr_copy(&g_pktaddrs[PACKETBUF_ADDR_RECEIVER], destmac); - /* Check if we need to fragment the packet into several frames */ - if (buflen > (CONFIG_NET_6LOWPAN_MAXPAYLOAD - g_frame_hdrlen)) + if (buflen > (CONFIG_NET_6LOWPAN_FRAMELEN - g_frame_hdrlen)) { #ifdef CONFIG_NET_6LOWPAN_FRAG /* ieee->i_framelist will hold the generated frames; frames will be @@ -384,7 +387,7 @@ int sixlowpan_queue_frames(FAR struct ieee802154_driver_s *ieee, * bytes. */ - paysize = (CONFIG_NET_6LOWPAN_MAXPAYLOAD - g_frame_hdrlen) & ~7; + paysize = (CONFIG_NET_6LOWPAN_FRAMELEN - g_frame_hdrlen) & ~7; memcpy(fptr + g_frame_hdrlen, buf, paysize); /* Set outlen to what we already sent from the IP payload */ @@ -457,7 +460,7 @@ int sixlowpan_queue_frames(FAR struct ieee802154_driver_s *ieee, /* Copy payload and enqueue */ /* Check for the last fragment */ - paysize = (CONFIG_NET_6LOWPAN_MAXPAYLOAD - fragn_hdrlen) & + paysize = (CONFIG_NET_6LOWPAN_FRAMELEN - fragn_hdrlen) & SIXLOWPAN_DISPATCH_FRAG_MASK; if (buflen - outlen < paysize) { diff --git a/net/sixlowpan/sixlowpan_framer.c b/net/sixlowpan/sixlowpan_framer.c index 746d6dc1139..66f8a1c3fb6 100644 --- a/net/sixlowpan/sixlowpan_framer.c +++ b/net/sixlowpan/sixlowpan_framer.c @@ -70,11 +70,11 @@ struct field_length_s { - uint8_t dest_pid_len; /**< Length (in bytes) of destination PAN ID field */ - uint8_t dest_addr_len; /**< Length (in bytes) of destination address field */ - uint8_t src_pid_len; /**< Length (in bytes) of source PAN ID field */ - uint8_t src_addr_len; /**< Length (in bytes) of source address field */ - uint8_t aux_sec_len; /**< Length (in bytes) of aux security header field */ + uint8_t dest_pid_len; /* Length (in bytes) of destination PAN ID field */ + uint8_t dest_addr_len; /* Length (in bytes) of destination address field */ + uint8_t src_pid_len; /* Length (in bytes) of source PAN ID field */ + uint8_t src_addr_len; /* Length (in bytes) of source address field */ + uint8_t aux_sec_len; /* Length (in bytes) of aux security header field */ }; /**************************************************************************** @@ -179,10 +179,17 @@ static void sixlowpan_fieldlengths(FAR struct frame802154_s *finfo, (finfo->fcf.src_addr_mode & 3) != 0 && finfo->src_pid == finfo->dest_pid) { + /* Indicate source PANID compression */ + finfo->fcf.panid_compression = 1; - /* Compressed header, only do dest pid */ - /* flen->src_pid_len = 0; */ + /* Compressed header, only do dest pid. + * + * REVISIT: This was commented out in corresponding Contiki logic, but + * is needed to match sixlowpan_recv_hdrlen(). + */ + + flen->src_pid_len = 0; } /* Determine address lengths */ @@ -348,7 +355,7 @@ static void sixlowpan_setup_params(FAR struct ieee802154_driver_s *ieee, rimeaddr_copy((struct rimeaddr_s *)¶ms->dest_addr, g_pktaddrs[PACKETBUF_ADDR_RECEIVER].u8); - /* Use short address mode if so configured */ + /* Use short destination address mode if so configured */ #ifdef CONFIG_NET_6LOWPAN_RIMEADDR_EXTENDED params->fcf.dest_addr_mode = FRAME802154_LONGADDRMODE; @@ -359,7 +366,15 @@ static void sixlowpan_setup_params(FAR struct ieee802154_driver_s *ieee, /* Set the source address to the node address assigned to the device */ - rimeaddr_copy((struct rimeaddr_s *)¶ms->src_addr, &ieee->i_nodeaddr.u8); + rimeaddr_copy((struct rimeaddr_s *)¶ms->src_addr, &ieee->i_nodeaddr); + + /* Use short soruce address mode if so configured */ + +#ifdef CONFIG_NET_6LOWPAN_RIMEADDR_EXTENDED + params->fcf.src_addr_mode = FRAME802154_LONGADDRMODE; +#else + params->fcf.src_addr_mode = FRAME802154_SHORTADDRMODE; +#endif } /**************************************************************************** diff --git a/net/sixlowpan/sixlowpan_input.c b/net/sixlowpan/sixlowpan_input.c index 119dd4dfd21..bfa74da13a4 100644 --- a/net/sixlowpan/sixlowpan_input.c +++ b/net/sixlowpan/sixlowpan_input.c @@ -167,7 +167,7 @@ int sixlowpan_recv_hdrlen(FAR const uint8_t *fptr) } else if (addrmode == FRAME802154_LONGADDRMODE) { - /* 2 byte dest PAN + 6 byte dest long address */ + /* 2 byte dest PAN + 8 byte dest long address */ hdrlen += 10; } @@ -193,6 +193,8 @@ int sixlowpan_recv_hdrlen(FAR const uint8_t *fptr) } else { + /* Add source PANID if PANIDs are not compressed */ + if ((fptr[0] & (1 << FRAME802154_PANIDCOMP_SHIFT)) == 0) { hdrlen += 2; diff --git a/net/sixlowpan/sixlowpan_internal.h b/net/sixlowpan/sixlowpan_internal.h index deede9d3b8f..392bc376b78 100644 --- a/net/sixlowpan/sixlowpan_internal.h +++ b/net/sixlowpan/sixlowpan_internal.h @@ -221,9 +221,9 @@ struct frame802154_fcf_s struct frame802154_scf_s { - uint8_t security_level; /* 3 bit. security level */ - uint8_t key_id_mode; /* 2 bit. Key identifier mode */ - uint8_t reserved; /* 3 bit. Reserved bits */ + uint8_t security_level; /* 3 bit. security level */ + uint8_t key_id_mode; /* 2 bit. Key identifier mode */ + uint8_t reserved; /* 3 bit. Reserved bits */ }; /* 802.15.4 Aux security header */ From 6a2c43b0c1abedb437ffbafaeb58bf31d7d3dc15 Mon Sep 17 00:00:00 2001 From: Ian McAfee Date: Wed, 19 Apr 2017 14:32:28 -0600 Subject: [PATCH 5/6] SAMV7 EMAC: Add conditional logic to account the fact that the SAMV71 has 6 rather than 3 queues after version 1. --- arch/arm/src/samv7/sam_emac.c | 97 ++++++++++++++++++++++++++++++++++- include/nuttx/net/ioctl.h | 2 +- 2 files changed, 96 insertions(+), 3 deletions(-) diff --git a/arch/arm/src/samv7/sam_emac.c b/arch/arm/src/samv7/sam_emac.c index 4432570c782..4760577b8b2 100644 --- a/arch/arm/src/samv7/sam_emac.c +++ b/arch/arm/src/samv7/sam_emac.c @@ -86,6 +86,7 @@ #include "cache.h" #include "chip/sam_pinmap.h" +#include "chip/sam_chipid.h" #include "sam_gpio.h" #include "sam_periphclks.h" #include "sam_ethernet.h" @@ -331,7 +332,19 @@ #define EMAC_QUEUE_0 0 #define EMAC_QUEUE_1 1 #define EMAC_QUEUE_2 2 -#define EMAC_NQUEUES 3 + +#if defined(CONFIG_ARCH_CHIP_SAMV71) + /* After chip version 1, the SAMV71 increased from 3 to 6 queue */ + +# define EMAC_QUEUE_3 3 +# define EMAC_QUEUE_4 4 +# define EMAC_QUEUE_5 5 +# define EMAC_NQUEUES (g_emac_nqueues) +# define EMAC_MAX_NQUEUES 6 +#else +# define EMAC_NQUEUES 3 +# define EMAC_MAX_NQUEUES 3 +#endif /* Interrupt settings */ @@ -537,7 +550,7 @@ struct sam_emac_s /* Transfer queues */ - struct sam_queue_s xfrq[EMAC_NQUEUES]; + struct sam_queue_s xfrq[EMAC_MAX_NQUEUES]; /* Debug stuff */ @@ -924,6 +937,16 @@ static uint8_t g_pktbuf1[MAX_NET_DEV_MTU + CONFIG_NET_GUARDSIZE]; /* EMAC1 peripheral state */ static struct sam_emac_s g_emac1; + +#endif /* CONFIG_SAMV7_EMAC1 */ + +/* The SAMV71 may support from 3 to 6 queue, depending upon the chip + * revision. NOTE that this is a global setting and applies to both + * EMAC peripherals. + */ + +#if defined(CONFIG_ARCH_CHIP_SAMV71) +static uint8_t g_emac_nqueues = 3; #endif /**************************************************************************** @@ -2677,6 +2700,16 @@ static int sam_ifup(struct net_driver_s *dev) sam_emac_configure(priv); sam_queue_configure(priv, EMAC_QUEUE_1); sam_queue_configure(priv, EMAC_QUEUE_2); + +#if defined(CONFIG_ARCH_CHIP_SAMV71) + if (g_emac_nqueues > 3) + { + sam_queue_configure(priv, EMAC_QUEUE_3); + sam_queue_configure(priv, EMAC_QUEUE_4); + sam_queue_configure(priv, EMAC_QUEUE_5); + } +#endif + sam_queue0_configure(priv); /* Set the MAC address (should have been configured while we were down) */ @@ -4540,10 +4573,28 @@ static void sam_emac_reset(struct sam_emac_s *priv) sam_rxreset(priv, EMAC_QUEUE_1); sam_rxreset(priv, EMAC_QUEUE_2); +#if defined(CONFIG_ARCH_CHIP_SAMV71) + if (g_emac_nqueues > 3) + { + sam_rxreset(priv, EMAC_QUEUE_3); + sam_rxreset(priv, EMAC_QUEUE_4); + sam_rxreset(priv, EMAC_QUEUE_5); + } +#endif + sam_txreset(priv, EMAC_QUEUE_0); sam_txreset(priv, EMAC_QUEUE_1); sam_txreset(priv, EMAC_QUEUE_2); +#if defined(CONFIG_ARCH_CHIP_SAMV71) + if (g_emac_nqueues > 3) + { + sam_txreset(priv, EMAC_QUEUE_3); + sam_txreset(priv, EMAC_QUEUE_4); + sam_txreset(priv, EMAC_QUEUE_5); + } +#endif + /* Disable Rx and Tx, plus the statistics registers. */ regval = sam_getreg(priv, SAM_EMAC_NCR_OFFSET); @@ -4561,10 +4612,28 @@ static void sam_emac_reset(struct sam_emac_s *priv) sam_rxreset(priv, EMAC_QUEUE_1); sam_rxreset(priv, EMAC_QUEUE_2); +#if defined(CONFIG_ARCH_CHIP_SAMV71) + if (g_emac_nqueues > 3) + { + sam_rxreset(priv, EMAC_QUEUE_3); + sam_rxreset(priv, EMAC_QUEUE_4); + sam_rxreset(priv, EMAC_QUEUE_5); + } +#endif + sam_txreset(priv, EMAC_QUEUE_0); sam_txreset(priv, EMAC_QUEUE_1); sam_txreset(priv, EMAC_QUEUE_2); +#if defined(CONFIG_ARCH_CHIP_SAMV71) + if (g_emac_nqueues > 3) + { + sam_txreset(priv, EMAC_QUEUE_3); + sam_txreset(priv, EMAC_QUEUE_4); + sam_txreset(priv, EMAC_QUEUE_5); + } +#endif + /* Make sure that RX and TX are disabled; clear statistics registers */ sam_putreg(priv, SAM_EMAC_NCR_OFFSET, EMAC_NCR_CLRSTAT); @@ -4875,12 +4944,36 @@ int sam_emac_initialize(int intf) { struct sam_emac_s *priv; const struct sam_emacattr_s *attr; +#if defined(CONFIG_ARCH_CHIP_SAMV71) + uint32_t regval; +#endif uint8_t *pktbuf; #if defined(CONFIG_NETDEV_PHY_IOCTL) && defined(CONFIG_ARCH_PHY_INTERRUPT) uint8_t phytype; #endif int ret; +#if defined(CONFIG_ARCH_CHIP_SAMV71) + /* Determine if the chip has 3 or 6 queues. This logic is for the + * V71 only -- if you are using a different chip in the family, + * the version number at which to switch from 3 to 6 queues may + * be different. For the V71, versions 1 and higher have 6 queues. + * + * If both emacs are enabled, this code will be run twice, which + * should not be a problem as the result will be the same each time + * it is run. + */ + + regval = getreg32(SAM_CHIPID_CIDR); + if ((regval & CHIPID_CIDR_ARCH_MASK) == CHIPID_CIDR_ARCH_SAMV71) + { + if (((regval & CHIPID_CIDR_VERSION_MASK) >> CHIPID_CIDR_VERSION_SHIFT) > 0) + { + g_emac_nqueues = 6; + } + } +#endif + #if defined(CONFIG_SAMV7_EMAC0) if (intf == EMAC0_INTF) { diff --git a/include/nuttx/net/ioctl.h b/include/nuttx/net/ioctl.h index c6180284055..2c31e634287 100644 --- a/include/nuttx/net/ioctl.h +++ b/include/nuttx/net/ioctl.h @@ -128,7 +128,7 @@ * See include/nuttx/net/telnet.h */ /**************************************************************************** - * Pulbic Type Definitions + * Public Type Definitions ****************************************************************************/ /* See include/net/if.h, include/net/route.h, and include/net/arp.h */ From 9281cd558eb68a190b261bdd831fe1f6397d8b2a Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Wed, 19 Apr 2017 18:06:43 -0600 Subject: [PATCH 6/6] 6loWPAN: Add an IOCTL to set the IEEE802.15.4 PAN ID --- include/nuttx/fs/ioctl.h | 6 ++ include/nuttx/net/ioctl.h | 3 - include/nuttx/wireless/wireless.h | 71 ++++++++++++++++++---- net/netdev/netdev_ioctl.c | 98 +++++++++++++++++++++++++------ net/sixlowpan/README.txt | 4 +- 5 files changed, 146 insertions(+), 36 deletions(-) diff --git a/include/nuttx/fs/ioctl.h b/include/nuttx/fs/ioctl.h index 86aaefae180..ce31d599cef 100644 --- a/include/nuttx/fs/ioctl.h +++ b/include/nuttx/fs/ioctl.h @@ -233,6 +233,12 @@ #define _MTDIOCVALID(c) (_IOC_TYPE(c)==_MTDIOCBASE) #define _MTDIOC(nr) _IOC(_MTDIOCBASE,nr) +/* Socket IOCTLs ************************************************************/ +/* See include/nuttx/net/ioctl.h */ + +#define _SIOCVALID(c) (_IOC_TYPE(c)==_SIOCBASE) +#define _SIOC(nr) _IOC(_SIOCBASE,nr) + /* NuttX ARP driver ioctl definitions (see netinet/arp.h) *******************/ #define _ARPIOCVALID(c) (_IOC_TYPE(c)==_ARPIOCBASE) diff --git a/include/nuttx/net/ioctl.h b/include/nuttx/net/ioctl.h index 2c31e634287..69c513b489a 100644 --- a/include/nuttx/net/ioctl.h +++ b/include/nuttx/net/ioctl.h @@ -51,9 +51,6 @@ * masks, and hardware address, and a few others */ -#define _SIOCVALID(c) (_IOC_TYPE(c)==_SIOCBASE) -#define _SIOC(nr) _IOC(_SIOCBASE,nr) - /* IPv4 interface control operations */ #define SIOCGIFADDR _SIOC(0x0001) /* Get IP address */ diff --git a/include/nuttx/wireless/wireless.h b/include/nuttx/wireless/wireless.h index bd9f93ba8f7..0b67366e790 100644 --- a/include/nuttx/wireless/wireless.h +++ b/include/nuttx/wireless/wireless.h @@ -37,8 +37,8 @@ * (when applicable). */ -#ifndef __INCLUDE_NUTTX_WIRELESS_H -#define __INCLUDE_NUTTX_WIRELESS_H +#ifndef __INCLUDE_NUTTX_WIRELESS_WIRELESS_H +#define __INCLUDE_NUTTX_WIRELESS_WIRELESS_H /************************************************************************************ * Included Files @@ -63,6 +63,7 @@ * interface. */ +/* IEEE802.11 */ /* Wireless identification */ #define SIOCSIWCOMMIT _WLIOC(0x0001) /* Commit pending changes to driver */ @@ -153,8 +154,24 @@ #define SIOCSIWPMKSA _WLIOC(0x0032) /* PMKSA cache operation */ -#define WL_FIRSTCHAR 0x0033 -#define WL_NNETCMDS 0x0032 +/* IEEE802.15.4 6loWPAN + * + * IEEE802.15.4 IOCTLs may be directed at one of three layers: + * + * 1. To the 6loWPAN network layer, as documented here, + * 2. To the IEEE802.15.4 MAC layer, as documented in, + * include/nuttx/wireless/ieee802154/ioeee802154_mac.h, or to + * 3. To the IEEE802.15.4 radio device layer, as documented in, + * include/nuttx/wireless/ieee802154/ioeee802154_radio.h. + * + * SIOCSWPANID - Join the specified PAN ID + */ + +#define SIOCSWPANID _WLIOC(0x0033) /* Join PAN ID */ +#define SIOCGWPANID _WLIOC(0x0034) /* Return PAN ID */ + +#define WL_FIRSTCHAR 0x0035 +#define WL_NNETCMDS 0x0034 /* Character Driver IOCTL commands *************************************************/ /* Non-compatible, NuttX only IOCTL definitions for use with low-level wireless @@ -162,23 +179,23 @@ * requires a file descriptor created by the open() interface. */ -#define WLIOC_SETRADIOFREQ _WLIOC(0x0033) /* arg: Pointer to uint32_t, frequency +#define WLIOC_SETRADIOFREQ _WLIOC(0x0035) /* arg: Pointer to uint32_t, frequency * value (in Mhz) */ -#define WLIOC_GETRADIOFREQ _WLIOC(0x0034) /* arg: Pointer to uint32_t, frequency +#define WLIOC_GETRADIOFREQ _WLIOC(0x0036) /* arg: Pointer to uint32_t, frequency * value (in Mhz) */ -#define WLIOC_SETADDR _WLIOC(0x0035) /* arg: Pointer to address value, format +#define WLIOC_SETADDR _WLIOC(0x0037) /* arg: Pointer to address value, format * of the address is driver specific */ -#define WLIOC_GETADDR _WLIOC(0x0036) /* arg: Pointer to address value, format +#define WLIOC_GETADDR _WLIOC(0x0038) /* arg: Pointer to address value, format * of the address is driver specific */ -#define WLIOC_SETTXPOWER _WLIOC(0x0037) /* arg: Pointer to int32_t, output power +#define WLIOC_SETTXPOWER _WLIOC(0x0039) /* arg: Pointer to int32_t, output power * (in dBm) */ -#define WLIOC_GETTXPOWER _WLIOC(0x0038) /* arg: Pointer to int32_t, output power +#define WLIOC_GETTXPOWER _WLIOC(0x003a) /* arg: Pointer to int32_t, output power * (in dBm) */ /* Device-specific IOCTL commands **************************************************/ #define WL_FIRST 0x0001 /* First common command */ -#define WL_NCMDS 0x0038 /* Number of common commands */ +#define WL_NCMDS 0x003a /* Number of common commands */ /* User defined ioctl commands are also supported. These will be forwarded * by the upper-half QE driver to the lower-half QE driver via the ioctl() @@ -355,5 +372,35 @@ struct iw_event union iwreq_data u; /* Fixed IOCTL payload */ }; +/* 6loWPAN */ +/* This structure is used with the SIOCSWPANID IOCTL command to select the + * PAN ID to join. + */ + +struct sixlowpan_panid_s +{ + uint16_t panid; /* The PAN ID to join */ +}; + +/* This union defines the data payload of an 6loWPAN or SIOCGWPANID ioctl + * command and is used in struct sixlowpan_req_s below. + */ + +union sixlowpan_data +{ + struct sixlowpan_panid_s panid; /* PAN ID to join */ +}; + +/* This is the structure used to exchange data in wireless IOCTLs. This + * structure is the same as 'struct ifreq', but defined for use with + * 6loWPAN IOCTLs. + */ + +struct sixlowpan_req_s +{ + char ifr_name[IFNAMSIZ]; /* Interface name, e.g. "wpan0" */ + union sixlowpan_data u; /* Data payload */ +}; + #endif /* CONFIG_DRIVERS_WIRELESS */ -#endif /* __INCLUDE_NUTTX_WIRELESS_H */ +#endif /* __INCLUDE_NUTTX_WIRELESS_WIRELESS_H */ diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c index a0c58491dfe..7f2efbf9826 100644 --- a/net/netdev/netdev_ioctl.c +++ b/net/netdev/netdev_ioctl.c @@ -61,6 +61,7 @@ #ifdef CONFIG_NET_6LOWPAN # include +# include #endif #ifdef CONFIG_NET_IGMP @@ -321,32 +322,73 @@ static void ioctl_set_ipv6addr(FAR net_ipv6addr_t outaddr, #endif /**************************************************************************** - * Name: netdev_wifr_dev + * Name: netdev_sixlowpan_ioctl * * Description: - * Verify the struct iwreq and get the Wireless device. + * Perform 6loWPAN network device specific operations. * * Parameters: - * req - The argument of the ioctl cmd + * psock Socket structure + * dev Ethernet driver device structure + * cmd The ioctl command + * req The argument of the ioctl cmd * * Return: - * A pointer to the driver structure on success; NULL on failure. + * >=0 on success (positive non-zero values are cmd-specific) + * Negated errno returned on failure. * ****************************************************************************/ -#if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NETDEV_WIRELESS_IOCTL) -static FAR struct net_driver_s *netdev_wifr_dev(FAR struct iwreq *req) +#if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NET_6LOWPAN) +static int netdev_sixlowpan_ioctl(FAR struct socket *psock, int cmd, + FAR struct sixlowpan_req_s *req) { - if (req != NULL) - { - /* Find the network device associated with the device name - * in the request data. - */ + FAR struct ieee802154_driver_s *ieee; + int ret = -ENOTTY; - return netdev_findbyname(req->ifrn_name); + /* Verify that this is a valid wireless network IOCTL command */ + + if (_WLIOCVALID(cmd) && (unsigned)_IOC_NR(cmd) <= WL_NNETCMDS) + { + switch (cmd) + { + + case SIOCSWPANID: /* Join PAN ID */ + { + ieee = (FAR struct ieee802154_driver_s *)netdev_findbyname(req->ifr_name); + if (ieee == NULL) + { + ret = -ENODEV; + } + else + { + ieee->i_panid = req->u.panid.panid; + ret = OK; + } + } + break; + + case SIOCGWPANID: /* Return PAN ID */ + { + ieee = (FAR struct ieee802154_driver_s *)netdev_findbyname(req->ifr_name); + if (ieee == NULL) + { + ret = -ENODEV; + } + else + { + req->u.panid.panid = ieee->i_panid; + ret = OK; + } + } + break; + + default: + return -ENOTTY; + } } - return NULL; + return ret; } #endif @@ -381,8 +423,8 @@ static int netdev_wifr_ioctl(FAR struct socket *psock, int cmd, { /* Get the wireless device associated with the IOCTL command */ - dev = netdev_wifr_dev(req); - if (dev) + dev = netdev_findbyname(req->ifrn_name); + if (dev != NULL) { /* Just forward the IOCTL to the wireless driver */ @@ -1209,7 +1251,11 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg) * non-NULL. */ +#ifdef CONFIG_DRIVERS_WIRELESS + if (!_SIOCVALID(cmd) && !_WLIOCVALID(cmd)) +#else if (!_SIOCVALID(cmd)) +#endif { ret = -ENOTTY; goto errout; @@ -1227,13 +1273,27 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg) ret = netdev_ifr_ioctl(psock, cmd, (FAR struct ifreq *)((uintptr_t)arg)); -#if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NETDEV_WIRELESS_IOCTL) - /* Check a wireless network command */ +#if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NET_6LOWPAN) + /* Check for a 6loWPAN network command */ if (ret == -ENOTTY) { - ret = netdev_wifr_ioctl(psock, cmd, - (FAR struct iwreq *)((uintptr_t)arg)); + FAR struct sixlowpan_req_s *slpreq; + + slpreq = (FAR struct sixlowpan_req_s *)((uintptr_t)arg); + ret = netdev_sixlowpan_ioctl(psock, cmd, slpreq); + } +#endif + +#if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NETDEV_WIRELESS_IOCTL) + /* Check for a wireless network command */ + + if (ret == -ENOTTY) + { + FAR struct iwreq *wifrreq; + + wifrreq = (FAR struct sixlowpan_req_s *)((uintptr_t)arg); + ret = netdev_wifr_ioctl(psock, cmd, wifrreq); } #endif diff --git a/net/sixlowpan/README.txt b/net/sixlowpan/README.txt index 7a65c77ade1..a311f5408db 100644 --- a/net/sixlowpan/README.txt +++ b/net/sixlowpan/README.txt @@ -47,7 +47,7 @@ The length of the fragment header length is four bytes for the first header (FRAG1) and five bytes for all subsequent headers (FRAGN). For example, this is a HC1 compressed first frame of a packet - 41 88 01 0000 3412 cdab ### 9-byte MAC header + 41 88 01 cefa 3412 cdab ### 9-byte MAC header c50e 000b ### 4-byte FRAG1 header 42 ### SIXLOWPAN_DISPATCH_HC1 fb ### RIME_HC1_HC_UDP_HC1_ENCODING @@ -64,7 +64,7 @@ this is a HC1 compressed first frame of a packet This is the second frame of the same transfer: - 41 88 01 0000 3412 cdab ### 9-byte MAC header + 41 88 01 cefa 3412 cdab ### 9-byte MAC header e50e 000b 0a ### 5 byte FRAGN header 42 ### SIXLOWPAN_DISPATCH_HC1 fb ### RIME_HC1_HC_UDP_HC1_ENCODING