Merge branch 'ieee802154'

This commit is contained in:
Gregory Nutt 2017-06-16 17:32:24 -06:00
commit a7770590d3
51 changed files with 3588 additions and 480 deletions

View File

@ -65,6 +65,7 @@ int ieee802154_get_req(int fd, FAR struct ieee802154_get_req_s *req);
int ieee802154_gts_req(int fd, FAR struct ieee802154_gts_req_s *req);
int ieee802154_orphan_resp(int fd,
FAR struct ieee802154_orphan_resp_s *resp);
int ieee802154_reset_req(int fd, FAR struct ieee802154_reset_req_s *req);
int ieee802154_rxenable_req(int fd,
FAR struct ieee802154_rxenable_req_s *req);
int ieee802154_scan_req(int fd, FAR struct ieee802154_scan_req_s *req);
@ -106,6 +107,8 @@ int ieee802154_gettxpwr(int fd, FAR int32_t *txpwr);
int ieee802154_setcca(int fd, FAR struct ieee802154_cca_s *cca);
int ieee802154_getcca(int fd, FAR struct ieee802154_cca_s *cca);
int ieee802154_getdevmode(int fd, FAR enum ieee802154_devmode_e *devmode);
#ifdef CONFIG_NET_6LOWPAN
/* Netork driver IOCTL helpers */

View File

@ -9,6 +9,7 @@ config IEEE802154_I8SAK
select IEEE802154_MAC_DEV
select IEEE802154_LIBUTILS
select IEEE802154_LIBMAC
select IEEE802154_WPANLISTENER
---help---
Enable the IEEE 802.15.4 Swiss Army Knife

View File

@ -47,7 +47,8 @@ STACKSIZE = 4096
# IEEE 802.15.4 SAK (Swiss Army Knife)
ASRCS =
CSRCS =
CSRCS = i8sak_acceptassoc.c i8sak_assoc.c i8sak_blaster.c i8sak_poll.c
CSRCS += i8sak_sniffer.c i8sak_startpan.c i8sak_tx.c wpanlistener.c
MAINSRC = i8sak_main.c
AOBJS = $(ASRCS:.S=$(OBJEXT))

View File

@ -0,0 +1,153 @@
IEEE 802.15.4 Swiss Army Knife (i8sak, or i8)
============================================================
Description
===========
The i8sak app is a useful CLI for testing various IEEE 802.15.4 functionality.
It also serves as a starting place for learning how to interface with the
NuttX IEEE 802.15.4 MAC layer.
The i8sak CLI can be used to manipulate multiple MAC layer networks at once.
IEEE 802.15.4 MAC character drivers show up in NuttX as /dev/ieeeN by default.
When you invoke the first call to i8sak with a specified devname, it creates
an i8sak instance and launches a deamon to handle processing work. The instance
is considered sticky, so it is possible to run `i8 /dev/ieee0` at the beginning
of a session and then can exclude the devname from all future calls. The number
of i8sak instances supported is controllable through menuconfig.
The i8sak app has many settings that can be configured. Most options are "sticky",
meaning, if you set the endpoint short address once, any future operation using
the endpoint short address can default to the previously used address. This is
particularly useful to keep the command lengths down.
How To Use
==========
The i8sak app has a series of CLI functions that can be invoked. The default
i8sak command is 'i8' to make things quick and easy to type.
In my test setup I have 2 Clicker2-STM32 boards from MikroElektronika, with
the BEE-click (MRF24J40) radios. Choose one device to be the PAN Coordinator.
We'll refer to that as device A.
On that device, run:
```
i8 /dev/ieee0 startpan
```
For now, this function assumes that we are operating a non-beacon enabled PAN,
since, as of this writing, beacon-enabled networks are unfinished. Unless you
have previously overriden address settings, the startpan command will also
configure the devices address to be that of CONFIG_I8SAK_PANCOORD_XXX. It
will then set the endpoint to be the CONFIG_I8SAK_DEV_XXX address.
Next, on the same device, run:
```
i8 acceptassoc
```
Notice in the second command, we did not use the devname, again, that is "sticky"
so unless we are switching back and forth between character drivers, we can
just use it once.
The acceptassoc command, without any arguments, informs the i8sak instance to
accept all association requests. The acceptassoc command also allows you to only
accept requests from a single device by specifying the extended address with option
-e.
For instance:
```
i8 acceptassoc -e DEADBEEF00FADE0B
```
But for this example, let's just use the command with no arguments.
Now, the second device will act as an endpoint device. The i8sak instance defaults
to being in endpoint mode. Let's refer to the second device as device B.
On device B, run:
```
i8 /dev/ieee0 assoc
```
This command without any options defaults the endpoint address to the default
PANCOORD address settings, and sends an association request to that device.
If everything is setup correctly, device A should have log information saying
that a device tried to associate and that it accepted the assocation. On device
B, the console should show that the association request was successful. With all
default settings, device B should have been allocated a short address of 0x000B.
If you are following along with a packet sniffer, you should see the following
transactions:
1) Association Request
Frame Type - CMD
Sequence Number - 0
Dest. PAN ID - 0xFADE
Dest. Address - 0x000A
Src. PAN ID - 0xFFFE
Src. Address - 0xDEADBEEF00FADE0C
Command Type - Association Request
1a) ACK
Frame Type - ACK
Sequence Number - 0
2) Data Request
Frame Type - CMD
Sequence Number - 1
Dest. PAN ID - 0xFADE
Dest. Address - 0x000A
Src. PAN ID - 0xFFFE
Src. Address - 0xDEADBEEF00FADE0C
Command Type - Data Request
2a) ACK
Frame Type - ACK
Sequence Number - 1
3) Association Response
Frame Type - CMD
Sequence Number - 0
Dest. PAN ID - 0xFADE
Dest. Address - 0xDEADBEEF00FADE0C
Src. Address - 0xDEADBEEF00FADE0A
Command Type - Association Response
Assigned SADDR - 0x000C
Assoc Status - Successful
3a) ACK
Frame Type - ACK
Sequence Number - 0
Device B has now successfully associated with device A. If you want to send data
from device B to device A, run the following on device B:
```
i8 tx ABCDEF
```
This will immediately (not actually immediate, transaction is sent using CSMA)
send the frame to device A with frame payload 0xABCDEF
Sending data from device A to device B is different. In IEEE 802.15.4, frames
must be extracted from the coordinator. To prepare the frame, run the following
command on device A
```
i8 tx AB
```
Because the devmode is PAN Coordinator, the i8sak app knows to send the data
as an indirect transaction. If you were running the i8sak app on a device
that is a coordinator, but not the PAN coordinator, you can force the i8sak app
to send the transaction directly, rather than to the parent coordinator, by using
the -d option.
NOTE: Currently, the indirect transaction timeout is disabled. This means frames
must be extracted or space may run out. This is only for the testing phase as it
is easier to debug when I am not fighting a timeout. Re-enabling the timeout may
effect the behavior of the indirect transaction features in the i8sak app.
To extract the data, run the following command on device B:
```
i8 poll
```
This command polls the endpoint (our device A PAN Coordinator in this case) to
see if there is any data. In the console of device B you should see a Poll request
status print out.

View File

@ -0,0 +1,189 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/i8sak.h
* IEEE 802.15.4 Swiss Army Knife
*
* Copyright (C) 2014-2015, 2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2014-2015 Sebastien Lorquet. All rights reserved.
* Copyright (C) 2017 Verge Inc. All rights reserved.
*
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
* Author: Anthony Merlino <anthony@vergeaero.com>
* Author: Gregory Nuttx <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __APPS_EXAMPLES_WIRELESS_IEEE802154_I8SAK_H
#define __APPS_EXAMPLES_WIRELESS_IEEE802154_I8SAK_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include "wpanlistener.h"
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Configuration ************************************************************/
#if !defined(CONFIG_IEEE802154_I8SAK_PANCOORD_SADDR)
#define CONFIG_IEEE802154_I8SAK_PANCOORD_SADDR 0x000A
#endif
#if !defined(CONFIG_IEEE802154_I8SAK_PANCOORD_EADDR)
#define CONFIG_IEEE802154_I8SAK_PANCOORD_EADDR 0xDEADBEEF00FADE0A
#endif
#if !defined(CONFIG_IEEE802154_I8SAK_COORD_SADDR)
#define CONFIG_IEEE802154_I8SAK_COORD_SADDR 0x000B
#endif
#if !defined(CONFIG_IEEE802154_I8SAK_COORD_EADDR)
#define CONFIG_IEEE802154_I8SAK_COORD_EADDR 0xDEADBEEF00FADE0B
#endif
#if !defined(CONFIG_IEEE802154_I8SAK_DEV_SADDR)
#define CONFIG_IEEE802154_I8SAK_DEV_SADDR 0x000C
#endif
#if !defined(CONFIG_IEEE802154_I8SAK_DEV_EADDR)
#define CONFIG_IEEE802154_I8SAK_DEV_EADDR 0xDEADBEEF00FADE0C
#endif
#if !defined(CONFIG_IEEE802154_I8SAK_PANID)
#define CONFIG_IEEE802154_I8SAK_PANID 0xFADE
#endif
#if !defined(CONFIG_IEEE802154_I8SAK_BLATER_PERIOD)
#define CONFIG_IEEE802154_I8SAK_BLATER_PERIOD 1000
#endif
#if !defined(CONFIG_IEEE802154_I8SAK_CHNUM)
#define CONFIG_IEEE802154_I8SAK_CHNUM 11
#endif
#if !defined(CONFIG_IEEE802154_I8SAK_CHPAGE)
#define CONFIG_IEEE802154_I8SAK_CHPAGE 0
#endif
#define I8SAK_DAEMONNAME_FMT "i8sak_%s"
#define I8SAK_MAX_DEVNAME 12
/* /dev/ is 5 characters */
#define I8SAK_DAEMONNAME_FMTLEN (6 + (I8SAK_MAX_DEVNAME-5) + 1)
/****************************************************************************
* Public Types
****************************************************************************/
enum i8sak_cmd_e
{
I8_CMD_NONE = 0x00,
I8_CMD_SNIFFER,
I8_CMD_STARTPAN,
I8_CMD_ACCEPTASSOC,
I8_CMD_ASSOC,
I8_CMD_TX,
I8_CMD_BLASTER,
I8_CMD_POLL,
};
struct i8sak_s
{
/* Support singly linked list */
FAR struct i8sak_s *flink;
bool initialized : 1;
bool daemon_started : 1;
bool daemon_shutdown : 1;
bool addrset : 1;
bool blasterenabled : 1;
bool verbose : 1;
bool indirect : 1;
bool acceptall : 1;
bool assoc : 1;
pid_t daemon_pid;
FAR char devname[I8SAK_MAX_DEVNAME];
struct wpanlistener_s wpanlistener;
int fd;
sem_t exclsem; /* For synchronizing access to the signaling semaphore */
sem_t sigsem; /* For signaling various tasks */
sem_t updatesem; /* For signaling the daemon that it's settings have changed */
uint8_t msdu_handle;
/* Settings */
uint8_t chnum;
uint8_t chpage;
struct ieee802154_addr_s addr;
struct ieee802154_addr_s ep;
uint16_t next_saddr;
uint8_t payload[IEEE802154_MAX_MAC_PAYLOAD_SIZE];
uint16_t payload_len;
int blasterperiod;
};
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
int i8sak_tx(FAR struct i8sak_s *i8sak, int fd);
long i8sak_str2long(FAR const char *str);
uint8_t i8sak_str2luint8(FAR const char *str);
uint16_t i8sak_str2luint16(FAR const char *str);
uint8_t i8sak_char2nibble(char ch);
int i8sak_str2payload(FAR const char *str, FAR uint8_t *buf);
void i8sak_str2eaddr(FAR const char *str, FAR uint8_t *eaddr);
bool i8sak_str2bool(FAR const char *str);
void i8sak_startpan_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]);
void i8sak_acceptassoc_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]);
void i8sak_assoc_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]);
void i8sak_tx_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]);
void i8sak_poll_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]);
void i8sak_sniffer_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]);
void i8sak_blaster_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]);
/****************************************************************************
* Inline Functions
****************************************************************************/
static inline void i8sak_cmd_error(FAR struct i8sak_s *i8sak)
{
sem_post(&i8sak->exclsem);
exit(EXIT_FAILURE);
}
#endif /* __APPS_EXAMPLES_WIRELESS_IEEE802154_I8SAK_H */

View File

@ -0,0 +1,175 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/i8sak_acceptassoc.c
* IEEE 802.15.4 Swiss Army Knife
*
* Copyright (C) 2017 Verge Inc. All rights reserved.
* Author: Anthony Merlino <anthony@vergeaero.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include "i8sak.h"
#include <nuttx/wireless/ieee802154/ieee802154_ioctl.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "wireless/ieee802154.h"
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static void acceptassoc_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg);
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name : i8_acceptassoc
*
* Description :
* Start accepting association requests.
****************************************************************************/
void i8sak_acceptassoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[])
{
struct wpanlistener_eventfilter_s filter;
bool acceptall = true; /* start off assuming we are going to allow all connections */
int option;
int optcnt;
optcnt = 0;
while ((option = getopt(argc, argv, ":he:")) != ERROR)
{
optcnt++;
switch (option)
{
case 'h':
fprintf(stderr, "Starts accepting association requests\n"
"Usage: %s [-h|e <extended address>]\n"
" -h = this help menu\n"
" -e = only accept requests from eaddr\n"
"Note: No option accepts all requests\n"
, argv[0]);
/* Must manually reset optind if we are going to exit early */
optind = -1;
return;
case 'e': /* Accept only this extended address */
i8sak_str2eaddr(optarg, &i8sak->ep.eaddr[0]);
acceptall = false;
break;
case ':':
fprintf(stderr, "ERROR: missing argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
case '?':
fprintf(stderr, "ERROR: invalid argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
}
}
if (!optcnt)
{
i8sak->acceptall = acceptall;
printf("i8sak: accepting all assoc requests\n");
}
/* Register new callback for receiving the association notifications */
memset(&filter, 0, sizeof(struct wpanlistener_eventfilter_s));
filter.indevents.assoc = true;
wpanlistener_add_eventreceiver(&i8sak->wpanlistener, acceptassoc_eventcb,
&filter, (FAR void *)i8sak, !i8sak->acceptall);
}
static void acceptassoc_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg)
{
FAR struct i8sak_s *i8sak = (FAR struct i8sak_s *)arg;
struct ieee802154_assoc_resp_s assocresp;
printf("i8sak: a device is trying to associate\n");
/* If the address matches our device, accept the association.
* Otherwise, reject the assocation.
*/
if (memcmp(&notif->u.assocind.devaddr[0], &i8sak->ep.eaddr[0],
IEEE802154_EADDR_LEN) == 0)
{
/* Send a ASSOC.resp primtive to the MAC. Copy the association
* indication address into the association response primitive
*/
memcpy(&assocresp.devaddr[0], &notif->u.assocind.devaddr[0],
IEEE802154_EADDR_LEN);
assocresp.assocsaddr = i8sak->next_saddr;
assocresp.status = IEEE802154_STATUS_SUCCESS;
printf("i8sak: accepting association request\n");
}
else
{
/* Send a ASSOC.resp primtive to the MAC. Copy the association
* indication address into the association response primitive
*/
memcpy(&assocresp.devaddr[0], &notif->u.assocind.devaddr[0],
IEEE802154_EADDR_LEN);
assocresp.status = IEEE802154_STATUS_DENIED;
printf("i8sak: rejecting association request\n");
}
ieee802154_assoc_resp(i8sak->fd, &assocresp);
}

View File

@ -0,0 +1,232 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/i8sak_assoc.c
* IEEE 802.15.4 Swiss Army Knife
*
* Copyright (C) 2014-2015, 2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2014-2015 Sebastien Lorquet. All rights reserved.
* Copyright (C) 2017 Verge Inc. All rights reserved.
*
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
* Author: Anthony Merlino <anthony@vergeaero.com>
* Author: Gregory Nuttx <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include "i8sak.h"
#include <nuttx/wireless/ieee802154/ieee802154_ioctl.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "wireless/ieee802154.h"
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static void assoc_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg);
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name : i8sak_assoc
*
* Description :
* Request association with the Coordinator
****************************************************************************/
void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[])
{
struct ieee802154_assoc_req_s assocreq;
struct wpanlistener_eventfilter_s filter;
int fd;
int option;
int optcnt;
int ret;
/* If the addresses has never been automatically or manually set before, set
* it assuming that we are the default device address and the endpoint is the
* default PAN Coordinator address. This is actually the way the i8sak settings
* are configured, so just set the flag if it's not already set.
*/
if (!i8sak->addrset)
{
i8sak->addrset = true;
}
optcnt = 0;
while ((option = getopt(argc, argv, ":hs:e:")) != ERROR)
{
optcnt++;
switch (option)
{
case 'h':
fprintf(stderr, "Requests association with endpoint\n"
"Usage: %s [-h]\n"
" -h = this help menu\n"
, argv[0]);
/* Must manually reset optind if we are going to exit early */
optind = -1;
return;
case 's':
/* Parse extended address and put it into the i8sak instance */
i8sak->ep.saddr = i8sak_str2luint16(optarg);
i8sak->ep.mode= IEEE802154_ADDRMODE_SHORT;
break;
case 'e':
/* Parse extended address and put it into the i8sak instance */
i8sak_str2eaddr(optarg, &i8sak->ep.eaddr[0]);
i8sak->ep.mode = IEEE802154_ADDRMODE_EXTENDED;
break;
case ':':
fprintf(stderr, "ERROR: missing argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
case '?':
fprintf(stderr, "ERROR: unknown argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
}
}
/* If none of the option flags were used, and there is an argument included,
* assume it is the PAN ID
*/
if (optcnt && argc == 2)
{
i8sak->ep.panid = i8sak_str2luint16(argv[1]);
}
fd = open(i8sak->devname, O_RDWR);
if (fd < 0)
{
printf("i8sak: cannot open %s, errno=%d\n", i8sak->devname, errno);
i8sak_cmd_error(i8sak);
}
if (argc < 2)
{
/* TODO: Perform a scan operation here, to determine addressing information
* of coordinator.
*/
fprintf(stderr, "i8sak: scan not implemented. Using default values\n");
}
/* Register new callback for receiving the association notifications */
memset(&filter, 0, sizeof(struct wpanlistener_eventfilter_s));
filter.confevents.assoc = true;
wpanlistener_add_eventreceiver(&i8sak->wpanlistener, assoc_eventcb, &filter,
(FAR void *)i8sak, true);
printf("i8sak: issuing ASSOC. request\n");
assocreq.chnum = i8sak->chnum;
assocreq.chpage = i8sak->chpage;
memcpy(&assocreq.coordaddr, &i8sak->ep, sizeof(struct ieee802154_addr_s));
assocreq.capabilities.devtype = 0;
assocreq.capabilities.powersource = 1;
assocreq.capabilities.rxonidle = 1;
assocreq.capabilities.security = 0;
assocreq.capabilities.allocaddr = 1;
ieee802154_assoc_req(fd, &assocreq);
close(fd);
/* Wait here, the event listener will notify us if the correct event occurs */
i8sak->assoc = true;
ret = sem_wait(&i8sak->sigsem);
sem_post(&i8sak->exclsem);
if (ret != OK)
{
i8sak->assoc = false;
printf("i8sak: test cancelled\n");
i8sak_cmd_error(i8sak);
}
}
/****************************************************************************
* Private Functions
****************************************************************************/
static void assoc_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg)
{
FAR struct i8sak_s *i8sak = (FAR struct i8sak_s *)arg;
if (notif->u.assocconf.status == IEEE802154_STATUS_SUCCESS)
{
printf("i8sak: ASSOC.request succeeded\n");
}
else
{
printf("i8sak: ASSOC.request failed: %s\n",
IEEE802154_STATUS_STRING[notif->u.assocconf.status]);
}
if (i8sak->assoc)
{
sem_post(&i8sak->sigsem);
i8sak->assoc = false;
}
}

View File

@ -0,0 +1,150 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/i8sak_blaster.c
* IEEE 802.15.4 Swiss Army Knife
*
* Copyright (C) 2014-2015, 2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2014-2015 Sebastien Lorquet. All rights reserved.
* Copyright (C) 2017 Verge Inc. All rights reserved.
*
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
* Author: Anthony Merlino <anthony@vergeaero.com>
* Author: Gregory Nuttx <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include "i8sak.h"
#include <nuttx/wireless/ieee802154/ieee802154_ioctl.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "wireless/ieee802154.h"
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static inline void i8sak_blaster_start (FAR struct i8sak_s *i8sak);
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name : i8sak_blaster
*
* Description :
* Continuously transmit a packet
****************************************************************************/
void i8sak_blaster_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[])
{
int option;
if (argc < 2)
{
i8sak_blaster_start(i8sak);
}
while ((option = getopt(argc, argv, "hqp:f:")) != ERROR)
{
switch (option)
{
case 'h':
fprintf(stderr, "Blasts frames\n"
"Usage: %s [-h|q|f <hex-payload>|p <period_ms>]\n"
" -h = this help menu\n"
" -q = quit blasting\n"
" -f = set frame (and starts blaster)\n"
" -p = set period (and start blaster)\n"
"Note: No option starts blaster with defaults\n"
, argv[0]);
/* Must manually reset optind if we are going to exit early */
optind = -1;
return;
case 'q': /* Quit blaster */
i8sak->blasterenabled = false;
break;
case 'p': /* Inline change blaster period */
i8sak->blasterperiod = atoi(optarg);
i8sak_blaster_start(i8sak);
break;
case 'f': /* Inline change blaster frame */
i8sak->payload_len = i8sak_str2payload(optarg, &i8sak->payload[0]);
i8sak_blaster_start(i8sak);
break;
case ':':
fprintf(stderr, "ERROR: missing argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
break;
case '?':
fprintf(stderr, "ERROR: unknown argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
}
}
}
static inline void i8sak_blaster_start (FAR struct i8sak_s *i8sak)
{
if (!i8sak->blasterenabled)
{
i8sak->blasterenabled = true;
/* Signal the daemon to start running */
printf("starting blaster\n");
sem_post(&i8sak->updatesem);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,177 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/i8sak_poll.c
* IEEE 802.15.4 Swiss Army Knife
*
* Copyright (C) 2014-2015, 2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2014-2015 Sebastien Lorquet. All rights reserved.
* Copyright (C) 2017 Verge Inc. All rights reserved.
*
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
* Author: Anthony Merlino <anthony@vergeaero.com>
* Author: Gregory Nuttx <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include "i8sak.h"
#include <nuttx/wireless/ieee802154/ieee802154_ioctl.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "wireless/ieee802154.h"
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static void poll_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg);
static void poll_receiver(FAR struct mac802154dev_rxframe_s *frame, FAR void *arg);
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name : i8sak_poll_cmd
*
* Description :
* Try and extract data from the coordinator
****************************************************************************/
void i8sak_poll_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[])
{
struct ieee802154_poll_req_s pollreq;
struct wpanlistener_eventfilter_s eventfilter;
int option;
int fd;
int ret;
ret = OK;
while ((option = getopt(argc, argv, ":h")) != ERROR)
{
switch (option)
{
case 'h':
fprintf(stderr, "Polls coordinator for data\n"
"Usage: %s [-h]\n"
" -h = this help menu\n"
, argv[0]);
/* Must manually reset optind if we are going to exit early */
optind = -1;
return;
case ':':
fprintf(stderr, "ERROR: missing argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
case '?':
fprintf(stderr, "ERROR: unknown argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
}
}
if (ret != OK)
{
i8sak_cmd_error(i8sak);
}
fd = open(i8sak->devname, O_RDWR);
if (fd < 0)
{
printf("cannot open %s, errno=%d\n", i8sak->devname, errno);
i8sak_cmd_error(i8sak);
}
/* Register new oneshot callback for receiving the association notifications */
memset(&eventfilter, 0, sizeof(struct wpanlistener_eventfilter_s));
eventfilter.confevents.poll = true;
wpanlistener_add_eventreceiver(&i8sak->wpanlistener, poll_eventcb,
&eventfilter, (FAR void *)i8sak, true);
printf("i8sak: Polling coordinator. PAN ID: 0x%04X SADDR: 0x%04X\n",
i8sak->ep.panid,
i8sak->ep.saddr);
pollreq.coordaddr.mode = IEEE802154_ADDRMODE_SHORT;
pollreq.coordaddr.saddr = i8sak->ep.saddr;
pollreq.coordaddr.panid = i8sak->ep.panid;
ieee802154_poll_req(fd, &pollreq);
close(fd);
/* Wait here, the event listener will notify us if the correct event occurs */
ret = sem_wait(&i8sak->sigsem);
if (ret != OK)
{
printf("i8sak: poll cancelled\n");
i8sak_cmd_error(i8sak);
}
}
/****************************************************************************
* Private Function
****************************************************************************/
static void poll_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg)
{
FAR struct i8sak_s *i8sak = (FAR struct i8sak_s *)arg;
if (notif->u.pollconf.status == IEEE802154_STATUS_SUCCESS)
{
printf("i8sak: POLL.request succeeded\n");
}
else
{
printf("i8sak: POLL.request failed: %s\n",
IEEE802154_STATUS_STRING[notif->u.pollconf.status]);
}
sem_post(&i8sak->sigsem);
}

View File

@ -0,0 +1,139 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/i8sak_sniffer.c
* IEEE 802.15.4 Swiss Army Knife
*
* Copyright (C) 2014-2015, 2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2014-2015 Sebastien Lorquet. All rights reserved.
* Copyright (C) 2017 Verge Inc. All rights reserved.
*
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
* Author: Anthony Merlino <anthony@vergeaero.com>
* Author: Gregory Nuttx <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include "i8sak.h"
#include <nuttx/wireless/ieee802154/ieee802154_ioctl.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "wireless/ieee802154.h"
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name : i8sak_sniffer_cmd
*
* Description :
* Sniff for frames (Promiscuous mode)
****************************************************************************/
void i8sak_sniffer_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[])
{
int option;
int fd;
int ret;
ret = OK;
while ((option = getopt(argc, argv, "h")) != ERROR)
{
switch (option)
{
case 'h':
fprintf(stderr, "Starts sniffer\n"
"Usage: %s [-h]\n"
" -h = this help menu\n"
, argv[0]);
/* Must manually reset optind if we are going to exit early */
optind = -1;
return;
case ':':
fprintf(stderr, "ERROR: missing argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
case '?':
fprintf(stderr, "ERROR: unknown argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
}
}
if (ret != OK)
{
i8sak_cmd_error(i8sak);
}
fd = open(i8sak->devname, O_RDWR);
if (fd < 0)
{
printf("cannot open %s, errno=%d\n", i8sak->devname, errno);
i8sak_cmd_error(i8sak);
}
/* Enable promiscuous mode */
printf("i8sak: turning on promiscuous mode.\n");
ieee802154_setpromisc(fd, true);
/* Make sure receiver is always on while idle */
printf("i8sak: setting receiveonidle.\n");
ieee802154_setrxonidle(fd, true);
close(fd);
/* Don't need to register a callback or anything since the wpanlistener
* prints when it receives a frame. This may not be a good solution in
* the future.
*/
}

View File

@ -0,0 +1,172 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/i8sak_startpan.c
* IEEE 802.15.4 Swiss Army Knife
*
* Copyright (C) 2014-2015, 2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2014-2015 Sebastien Lorquet. All rights reserved.
* Copyright (C) 2017 Verge Inc. All rights reserved.
*
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
* Author: Anthony Merlino <anthony@vergeaero.com>
* Author: Gregory Nuttx <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include "i8sak.h"
#include <nuttx/wireless/ieee802154/ieee802154_ioctl.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "wireless/ieee802154.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name : i8sak_startpan_cmd
*
* Description :
* Start PAN and accept association requests
****************************************************************************/
void i8sak_startpan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[])
{
struct ieee802154_reset_req_s resetreq;
struct ieee802154_start_req_s startreq;
int option;
int fd;
int i;
while ((option = getopt(argc, argv, ":h")) != ERROR)
{
switch (option)
{
case 'h':
fprintf(stderr, "Starts PAN as PAN Coordinator\n"
"Usage: %s [-h]\n"
" -h = this help menu\n"
, argv[0]);
/* Must manually reset optind if we are going to exit early */
optind = -1;
return;
case ':':
fprintf(stderr, "ERROR: missing argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
case '?':
fprintf(stderr, "ERROR: unknown argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
}
}
fd = open(i8sak->devname, O_RDWR);
if (fd < 0)
{
printf("cannot open %s, errno=%d\n", i8sak->devname, errno);
i8sak_cmd_error(i8sak);
}
/* Reset the MAC layer */
printf("\ni8sak: resetting MAC layer\n");
resetreq.rst_pibattr = true;
ieee802154_reset_req(fd, &resetreq);
/* Make sure receiver is always on */
ieee802154_setrxonidle(fd, true);
/* If the addresses has never been automatically or manually set before, set
* it assuming that we are the default PAN coordinator address and the
* endpoint is the default device address.
*/
if (!i8sak->addrset)
{
for (i = 0; i < IEEE802154_EADDR_LEN; i++)
{
i8sak->addr.eaddr[i] =
(uint8_t)((CONFIG_IEEE802154_I8SAK_PANCOORD_EADDR >> (i*8)) & 0xFF);
}
i8sak->addr.mode = IEEE802154_ADDRMODE_SHORT;
i8sak->addr.saddr = CONFIG_IEEE802154_I8SAK_PANCOORD_SADDR;
i8sak->addr.panid = CONFIG_IEEE802154_I8SAK_PANID;
for (i = 0; i < IEEE802154_EADDR_LEN; i++)
{
i8sak->ep.eaddr[i] =
(uint8_t)((CONFIG_IEEE802154_I8SAK_DEV_EADDR >> (i*8)) & 0xFF);
}
i8sak->ep.mode = IEEE802154_ADDRMODE_SHORT;
i8sak->ep.saddr = CONFIG_IEEE802154_I8SAK_DEV_SADDR;
i8sak->ep.panid = CONFIG_IEEE802154_I8SAK_PANID;
}
/* Set EADDR and SADDR */
ieee802154_seteaddr(fd, &i8sak->addr.eaddr[0]);
ieee802154_setsaddr(fd, i8sak->addr.saddr);
/* Tell the MAC to start acting as a coordinator */
printf("i8sak: starting PAN\n");
startreq.panid = i8sak->addr.panid;
startreq.chnum = i8sak->chnum;
startreq.chpage = i8sak->chpage;
startreq.beaconorder = 15;
startreq.pancoord = true;
startreq.coordrealign = false;
ieee802154_start_req(fd, &startreq);
close(fd);
}

View File

@ -0,0 +1,226 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/i8sak_tx.c
* IEEE 802.15.4 Swiss Army Knife
*
* Copyright (C) 2014-2015, 2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2014-2015 Sebastien Lorquet. All rights reserved.
* Copyright (C) 2017 Verge Inc. All rights reserved.
*
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
* Author: Anthony Merlino <anthony@vergeaero.com>
* Author: Gregory Nuttx <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include "i8sak.h"
#include <nuttx/wireless/ieee802154/ieee802154_ioctl.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "wireless/ieee802154.h"
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static void tx_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg);
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name : i8_tx_cmd
*
* Description :
* Transmit a data frame.
****************************************************************************/
void i8sak_tx_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[])
{
enum ieee802154_devmode_e devmode;
struct wpanlistener_eventfilter_s eventfilter;
bool sendasdev = false;
int argind;
int option;
int fd;
int ret;
ret = OK;
argind = 1;
while ((option = getopt(argc, argv, ":hd")) != ERROR)
{
switch (option)
{
case 'h':
fprintf(stderr, "Transmits packet to endpoint\n"
"Usage: %s [-h|d] [<hex-payload>]\n"
" -h = this help menu\n"
" -d = send as device instead of coord\n"
, argv[0]);
/* Must manually reset optind if we are going to exit early */
optind = -1;
return;
case 'd':
sendasdev = true;
argind++;
break;
case ':':
fprintf(stderr, "ERROR: missing argument\n");
/* Must manually reset optind if we are going to exit early */
optind = -1;
i8sak_cmd_error(i8sak); /* This exits for us */
case '?':
fprintf(stderr, "ERROR: unknown argument\n");
ret = ERROR;
break;
}
}
if (ret != OK)
{
i8sak_cmd_error(i8sak);
}
if (argc == argind + 1)
{
i8sak->payload_len = i8sak_str2payload(argv[1], &i8sak->payload[0]);
}
fd = open(i8sak->devname, O_RDWR);
if (fd < 0)
{
printf("i8sak: cannot open %s, errno=%d\n", i8sak->devname, errno);
i8sak_cmd_error(i8sak);
}
/* Check if transaction should be indirect or not */
ieee802154_getdevmode(fd, &devmode);
if (!sendasdev)
{
/* If we are acting as an endpoint, send as normal CSMA (non-indirect)
* If we are a coordinator or PAN coordinator, send as indirect.
*/
if (devmode == IEEE802154_DEVMODE_ENDPOINT)
{
i8sak->indirect = false;
}
else
{
i8sak->indirect = true;
}
}
else
{
/* We cannot send a frame as direct if we are the PAN coordinator. Maybe
* this should be the hook for sending payload in beacon? But for now,
* let's just thow an error.
*/
if (devmode == IEEE802154_DEVMODE_PANCOORD)
{
fprintf(stderr, "ERROR: invalid option\n");
close(fd);
i8sak_cmd_error(i8sak);
}
i8sak->indirect = false;
}
if (i8sak->indirect)
{
printf("i8sak: queuing indirect tx\n");
}
/* Register new oneshot callback for receiving the association notifications */
memset(&eventfilter, 0, sizeof(struct wpanlistener_eventfilter_s));
eventfilter.confevents.data = true;
wpanlistener_add_eventreceiver(&i8sak->wpanlistener, tx_eventcb,
&eventfilter, (FAR void *)i8sak, true);
ret = i8sak_tx(i8sak,fd);
if (ret < 0)
{
fprintf(stderr, "ERROR: Failed to transmit packet\n");
close(fd);
i8sak_cmd_error(i8sak);
}
close(fd);
}
static void tx_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg)
{
FAR struct i8sak_s *i8sak = (FAR struct i8sak_s *)arg;
if (notif->u.dataconf.status == IEEE802154_STATUS_SUCCESS)
{
if (i8sak->indirect)
{
printf("i8sak: tx frame extracted\n");
}
else
{
printf("i8sak: frame tx success\n");
}
}
else
{
printf("i8sak: frame failed to send: %s\n",
IEEE802154_STATUS_STRING[notif->u.dataconf.status]);
}
sem_post(&i8sak->sigsem);
}

View File

@ -0,0 +1,836 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/wpanlistener.c
*
* Copyright (C) 2017 Verge Inc. All rights reserved.
* Author: Anthony Merlino <anthony@vergeaero.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
#include "wpanlistener.h"
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static pthread_addr_t wpanlistener_framethread(pthread_addr_t arg);
static pthread_addr_t wpanlistener_eventthread(pthread_addr_t arg);
/***************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: wpanlistener_setup
*
* Description:
* Initializes the internal struct
*
* Parameters:
* handle - handle to the wpan listener struct to initialize
* fd - file descriptor to access device
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_setup(FAR struct wpanlistener_s *handle, int fd)
{
int i;
/* Initialize the frame receiver allocation pool */
sq_init(&handle->framereceivers);
sq_init(&handle->framereceivers_free);
for (i = 0; i < CONFIG_WPANLISTENER_NFRAMERECEIVERS; i++)
{
sq_addlast((FAR sq_entry_t *)&handle->framereceiver_pool[i], &handle->framereceivers_free);
}
/* Initialize the frame receiver allocation pool */
sq_init(&handle->eventreceivers);
sq_init(&handle->eventreceivers_free);
for (i = 0; i < CONFIG_WPANLISTENER_NEVENTRECEIVERS; i++)
{
sq_addlast((FAR sq_entry_t *)&handle->eventreceiver_pool[i], &handle->eventreceivers_free);
}
sem_init(&handle->exclsem, 0, 1);
handle->is_setup = true;
handle->fd = fd;
return OK;
}
/****************************************************************************
* Name: wpanlistener_start
*
* Description:
* Starts internal threads to listen for frames and events.
*
* Parameters:
* handle - handle to the wpan listener struct
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_start(FAR struct wpanlistener_s *handle)
{
int ret;
handle->threadrun = true;
ret = pthread_create(&handle->frame_threadid, NULL, wpanlistener_framethread,
(void *)handle);
if (ret != 0)
{
fprintf(stderr, "wpanlistener: failed to start frame thread: %d\n", ret);
return ret;
}
ret = pthread_create(&handle->event_threadid, NULL, wpanlistener_eventthread,
(void *)handle);
if (ret != 0)
{
fprintf(stderr, "wpanlistener: failed to start event thread: %d\n", ret);
return ret;
}
return OK;
}
/****************************************************************************
* Name: wpanlistener_stop
*
* Description:
* Stops internal threads.
*
* Parameters:
* handle - handle to the wpan listener struct
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_stop(FAR struct wpanlistener_s *handle)
{
return -ENOTTY;
}
/****************************************************************************
* Name: wpanlistener_add_framereceiver
*
* Description:
* Add a frame receiver. A frame receiver consists of filter settings for
* determining which frames should be passed to the callback, and the corresponding
* callback.
*
* Parameters:
* handle - handle to the wpan listener struct
* callback - callback to be called on reception of frame matching filter
* settings
* filter - struct containing settings for filtering frames
* arg - user specified argument to send to the callback
* oneshot - whether the receiver is automatically unregistered after the
* first notification
*
* Returned Value:
* OK if successful; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_add_framereceiver(FAR struct wpanlistener_s *handle,
wpanlistener_framecallback_t cb,
FAR struct wpanlistener_framefilter_s *filter,
FAR void * arg, bool oneshot)
{
FAR struct wpanlistener_framereceiver_s *receiver;
int ret;
/* Get exclusive access to the struct */
ret = sem_wait(&handle->exclsem);
if (ret != OK)
{
fprintf(stderr, "wpanlistener: failed to add receiver: %d\n", ret);
return ret;
}
/* Allocate a receiver struct from the static pool */
receiver = (FAR struct wpanlistener_framereceiver_s *)sq_remfirst(
&handle->framereceivers_free);
if (receiver == NULL)
{
fprintf(stderr, "wpanlistener: failed to add receiver: %d\n", ENOMEM);
sem_post(&handle->exclsem);
return -ENOMEM;
}
receiver->cb = cb;
memcpy(&receiver->filter, filter, sizeof(struct wpanlistener_framefilter_s));
receiver->arg = arg;
receiver->oneshot = oneshot;
/* Link the receiver into the list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->framereceivers);
sem_post(&handle->exclsem);
return OK;
}
/****************************************************************************
* Name: wpanlistener_add_eventreceiver
*
* Description:
* Add an event receiver. An event receiver consists of a callback and flags
* for which events should be sent to the callback.
*
* Parameters:
* handle - handle to the wpan listener struct
* cb - callback to be called on reception of notification event from
* MAC layer that matches one of the masked events
* filter - struct containing event mask bits to indicate whether event
* type should trigger callback
* arg - user specified argument to send to the callback
* oneshot - whether the receiver is automatically unregistered after the
* first notification
*
* Returned Value:
* OK if successful; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_add_eventreceiver(FAR struct wpanlistener_s *handle,
wpanlistener_eventcallback_t cb,
FAR struct wpanlistener_eventfilter_s *filter,
FAR void * arg, bool oneshot)
{
FAR struct wpanlistener_eventreceiver_s *receiver;
int ret;
/* Get exclusive access to the struct */
ret = sem_wait(&handle->exclsem);
if (ret != OK)
{
fprintf(stderr, "wpanlistener: failed to add receiver: %d\n", ret);
return ret;
}
/* Allocate a receiver struct from the static pool */
receiver = (FAR struct wpanlistener_eventreceiver_s *)sq_remfirst(
&handle->eventreceivers_free);
if (receiver == NULL)
{
fprintf(stderr, "wpanlistener: failed to add receiver: %d\n", ENOMEM);
sem_post(&handle->exclsem);
return -ENOMEM;
}
receiver->cb = cb;
memcpy(&receiver->filter, filter, sizeof(struct wpanlistener_eventfilter_s));
receiver->arg = arg;
receiver->oneshot = oneshot;
/* Link the receiver into the list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers);
sem_post(&handle->exclsem);
return OK;
}
/****************************************************************************
* Name: wpanlistener_remove_framereceiver
*
* Description:
* Removes a frame receiver. Listener will no longer call callback. This
* function finds the first frame receiver with the provided callback.
*
* Parameters:
* handle - handle to the wpan listener struct
* cb - callback function to search for.
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_remove_framereceiver(FAR struct wpanlistener_s *handle,
wpanlistener_framecallback_t cb)
{
FAR struct wpanlistener_framereceiver_s *receiver;
int ret;
/* Get exclusive access to the struct */
ret = sem_wait(&handle->exclsem);
if (ret != OK)
{
fprintf(stderr, "wpanlistener: failed to remove receiver: %d\n", ret);
return ret;
}
/* Search through frame receivers until either we match the callback, or
* there is no more receivers to check.
*/
receiver = (FAR struct wpanlistener_framereceiver_s *)sq_peek(
&handle->framereceivers);
while (receiver != NULL)
{
/* Check if callback matches */
if (receiver->cb == cb)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->framereceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->framereceivers_free);
sem_post(&handle->exclsem);
return OK;
}
receiver = (FAR struct wpanlistener_framereceiver_s *)sq_next(
(FAR sq_entry_t *)receiver);
}
sem_post(&handle->exclsem);
fprintf(stderr, "wpanlistener: failed to remove receiver");
return ERROR;
}
/****************************************************************************
* Name: wpanlistener_remove_eventreceiver
*
* Description:
* Removes a event receiver. Listener will no longer call callback. This
* function finds the first event receiver with the provided callback.
*
* Parameters:
* handle - handle to the wpan listener struct
* cb - callback function to search for.
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_remove_eventreceiver(FAR struct wpanlistener_s *handle,
wpanlistener_eventcallback_t cb)
{
FAR struct wpanlistener_eventreceiver_s *receiver;
int ret;
/* Get exclusive access to the struct */
ret = sem_wait(&handle->exclsem);
if (ret != OK)
{
fprintf(stderr, "wpanlistener: failed to remove receiver: %d\n", ret);
return ret;
}
/* Search through frame receivers until either we match the callback, or
* there is no more receivers to check.
*/
receiver = (FAR struct wpanlistener_eventreceiver_s *)sq_peek(
&handle->eventreceivers);
while (receiver != NULL)
{
/* Check if callback matches */
if (receiver->cb == cb)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
sem_post(&handle->exclsem);
return OK;
}
receiver = (FAR struct wpanlistener_eventreceiver_s *)sq_next(
(FAR sq_entry_t *)receiver);
}
sem_post(&handle->exclsem);
fprintf(stderr, "wpanlistener: failed to remove receiver");
return ERROR;
}
/****************************************************************************
* handleate Function Prototypes
****************************************************************************/
/****************************************************************************
* Name : wpanlistener_framethread
*
* Description :
* Listen for frames received at the MAC layer
****************************************************************************/
static pthread_addr_t wpanlistener_framethread(pthread_addr_t arg)
{
FAR struct wpanlistener_s *handle = (FAR struct wpanlistener_s *)arg;
FAR struct wpanlistener_framereceiver_s *receiver;
struct mac802154dev_rxframe_s frame;
int ret;
int i;
while (handle->threadrun)
{
ret = read(handle->fd, &frame, sizeof(struct mac802154dev_rxframe_s));
if (ret != OK)
{
return NULL;
}
/* Get exclusive access to the struct */
ret = sem_wait(&handle->exclsem);
if (ret != OK)
{
return NULL;
}
printf("Frame Received:\n");
for (i = 0; i < frame.length; i++)
{
printf("%02X", frame.payload[i]);
}
printf(" \n");
fflush(stdout);
/* Loop through frame receivers and call callbacks for those receivers
* whose filter matches this frame
*/
receiver = (FAR struct wpanlistener_framereceiver_s *)sq_peek(
&handle->framereceivers);
while (receiver != NULL)
{
/* TODO: When filtering options are figured out. Actually filter packets
* here. For now, all frames get passed to all receivers.
*/
receiver->cb(&frame, receiver->arg);
receiver = (FAR struct wpanlistener_framereceiver_s *)sq_next(
(FAR sq_entry_t *)receiver);
/* Check if the receiver was a one-shot receiver, then throw it out
* if it is
*/
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->framereceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->framereceivers_free);
}
}
sem_post(&handle->exclsem);
}
return NULL;
}
/****************************************************************************
* Name : wpanlistener_eventthread
*
* Description :
* Listen for events from the MAC layer
****************************************************************************/
static pthread_addr_t wpanlistener_eventthread(pthread_addr_t arg)
{
FAR struct wpanlistener_s *handle = (FAR struct wpanlistener_s *)arg;
FAR struct wpanlistener_eventreceiver_s *receiver;
struct ieee802154_notif_s notif;
int ret;
while (handle->threadrun)
{
ret = ioctl(handle->fd, MAC802154IOC_GET_EVENT, (unsigned long)((uintptr_t)&notif));
if (ret != OK)
{
return NULL;
}
/* Get exclusive access to the struct */
ret = sem_wait(&handle->exclsem);
if (ret != OK)
{
return NULL;
}
/* Loop through event receivers and call callbacks for those receivers
* listening for this event type.
*/
receiver = (FAR struct wpanlistener_eventreceiver_s *)sq_peek(
&handle->eventreceivers);
while (receiver != NULL)
{
if (notif.notiftype == IEEE802154_NOTIFY_CONF_DATA &&
receiver->filter.confevents.data)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_CONF_ASSOC &&
receiver->filter.confevents.assoc)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_CONF_DISASSOC &&
receiver->filter.confevents.disassoc)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_CONF_GTS &&
receiver->filter.confevents.gts)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_CONF_RESET &&
receiver->filter.confevents.reset)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_CONF_RXENABLE &&
receiver->filter.confevents.rxenable)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_CONF_SCAN &&
receiver->filter.confevents.scan)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_CONF_START &&
receiver->filter.confevents.start)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_CONF_POLL &&
receiver->filter.confevents.poll)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_IND_ASSOC &&
receiver->filter.indevents.assoc)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_IND_DISASSOC &&
receiver->filter.indevents.disassoc)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_IND_BEACONNOTIFY &&
receiver->filter.indevents.beaconnotify)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_IND_GTS &&
receiver->filter.indevents.gts)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_IND_ORPHAN &&
receiver->filter.indevents.orphan)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_IND_COMMSTATUS &&
receiver->filter.indevents.commstatus)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
if (notif.notiftype == IEEE802154_NOTIFY_IND_SYNCLOSS &&
receiver->filter.indevents.syncloss)
{
receiver->cb(&notif, receiver->arg);
if (receiver->oneshot)
{
/* Unlink the receiver from the list */
sq_rem((FAR sq_entry_t *)receiver, &handle->eventreceivers);
/* Link the receiver back into the free list */
sq_addlast((FAR sq_entry_t *)receiver, &handle->eventreceivers_free);
}
}
receiver = (FAR struct wpanlistener_eventreceiver_s *)sq_next(
(FAR sq_entry_t *)receiver);
}
sem_post(&handle->exclsem);
}
return NULL;
}

View File

@ -0,0 +1,311 @@
/****************************************************************************
* apps/wireless/ieee802154/i8sak/wpanlistener.h
*
* Copyright (C) 2017 Verge Inc. All rights reserved.
* Author: Anthony Merlino <anthony@vergeaero.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __APPS_WIRELESS_IEEE802154_I8SAK_WPANLISTENER_H
#define __APPS_WIRELESS_IEEE802154_I8SAK_WPANLISTENER_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <semaphore.h>
#include <nuttx/wireless/ieee802154/ieee802154_ioctl.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Configuration ************************************************************/
#if !defined(CONFIG_WPANLISTENER_NFRAMERECEIVERS) || CONFIG_WPANLISTENER_NFRAMERECEIVERS <= 0
# undef CONFIG_WPANLISTENER_NFRAMERECEIVERS
# define CONFIG_WPANLISTENER_NFRAMERECEIVERS 3
#endif
#if !defined(CONFIG_WPANLISTENER_NEVENTRECEIVERS) || CONFIG_WPANLISTENER_NEVENTRECEIVERS <= 0
# undef CONFIG_WPANLISTENER_NEVENTRECEIVERS
# define CONFIG_WPANLISTENER_NEVENTRECEIVERS 3
#endif
/****************************************************************************
* Public Types
****************************************************************************/
typedef void (*wpanlistener_framecallback_t)
(FAR struct mac802154dev_rxframe_s *frame, FAR void *arg);
typedef void (*wpanlistener_eventcallback_t) (FAR struct ieee802154_notif_s *notif,
FAR void *arg);
struct wpanlistener_framefilter_s
{
/* Frame filtering settings here */
bool acceptall;
};
struct wpanlistener_eventfilter_s
{
struct
{
uint32_t assoc : 1;
uint32_t disassoc : 1;
uint32_t beaconnotify : 1;
uint32_t commstatus : 1;
uint32_t gts : 1;
uint32_t orphan : 1;
uint32_t syncloss : 1;
} indevents;
struct {
uint32_t data : 1;
uint32_t assoc : 1;
uint32_t disassoc : 1;
uint32_t gts : 1;
uint32_t commstatus : 1;
uint32_t reset : 1;
uint32_t rxenable : 1;
uint32_t scan : 1;
uint32_t start : 1;
uint32_t poll : 1;
} confevents;
};
struct wpanlistener_framereceiver_s
{
FAR struct wpanlistener_framereceiver_s *flink;
wpanlistener_framecallback_t cb;
struct wpanlistener_framefilter_s filter;
FAR void *arg;
bool oneshot;
};
struct wpanlistener_eventreceiver_s
{
FAR struct wpanlistener_eventreceiver_s *flink;
wpanlistener_eventcallback_t cb;
struct wpanlistener_eventfilter_s filter;
FAR void *arg;
bool oneshot;
};
struct wpanlistener_s
{
sem_t exclsem;
int fd;
bool threadrun : 1;
bool is_setup : 1;
bool is_started : 1;
pthread_t frame_threadid;
pthread_t event_threadid;
sq_queue_t eventreceivers;
sq_queue_t framereceivers;
sq_queue_t eventreceivers_free;
sq_queue_t framereceivers_free;
struct wpanlistener_framereceiver_s
framereceiver_pool[CONFIG_WPANLISTENER_NFRAMERECEIVERS];
struct wpanlistener_eventreceiver_s
eventreceiver_pool[CONFIG_WPANLISTENER_NEVENTRECEIVERS];
};
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: wpanlistener_setup
*
* Description:
* Initializes the internal struct
*
* Parameters:
* handle - handle to the wpan listener struct to initialize
* fd - file descriptor to access device
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_setup(FAR struct wpanlistener_s *handle, int fd);
/****************************************************************************
* Name: wpanlistener_start
*
* Description:
* Starts internal threads to listen for frames and events.
*
* Parameters:
* handle - handle to the wpan listener struct
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_start(FAR struct wpanlistener_s *handle);
/****************************************************************************
* Name: wpanlistener_stop
*
* Description:
* Stops internal threads.
*
* Parameters:
* handle - handle to the wpan listener struct
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_stop(FAR struct wpanlistener_s *handle);
/****************************************************************************
* Name: wpanlistener_add_framereceiver
*
* Description:
* Add a frame receiver. A frame receiver consists of filter settings for
* determining which frames should be passed to the callback, and the corresponding
* callback.
*
* Parameters:
* handle - handle to the wpan listener struct
* callback - callback to be called on reception of frame matching filter
* settings
* filter - struct containing settings for filtering frames
* arg - user specified argument to send to the callback
* oneshot - whether the receiver is automatically unregistered after the
* first notification
*
* Returned Value:
* OK if successful; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_add_framereceiver(FAR struct wpanlistener_s *handle,
wpanlistener_framecallback_t cb,
FAR struct wpanlistener_framefilter_s *filter,
FAR void * arg, bool oneshot);
/****************************************************************************
* Name: wpanlistener_add_eventreceiver
*
* Description:
* Add an event receiver. An event receiver consists of a callback and flags
* for which events should be sent to the callback.
*
* Parameters:
* handle - handle to the wpan listener struct
* cb - callback to be called on reception of notification event from
* MAC layer that matches one of the masked events
* filter - struct containing event mask bits to indicate whether event
* type should trigger callback
* arg - user specified argument to send to the callback
* oneshot - whether the receiver is automatically unregistered after the
* first notification
*
* Returned Value:
* OK if successful; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_add_eventreceiver(FAR struct wpanlistener_s *handle,
wpanlistener_eventcallback_t cb,
FAR struct wpanlistener_eventfilter_s *filter,
FAR void * arg, bool oneshot);
/****************************************************************************
* Name: wpanlistener_remove_framereceiver
*
* Description:
* Removes a frame receiver. Listener will no longer call callback. This
* function finds the first frame receiver with the provided callback.
*
* Parameters:
* handle - handle to the wpan listener struct
* cb - callback function to search for.
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_remove_framereceiver(FAR struct wpanlistener_s *handle,
wpanlistener_framecallback_t cb);
/****************************************************************************
* Name: wpanlistener_remove_eventreceiver
*
* Description:
* Removes a event receiver. Listener will no longer call callback. This
* function finds the first event receiver with the provided callback.
*
* Parameters:
* handle - handle to the wpan listener struct
* cb - callback function to search for.
*
* Returned Value:
* OK on success; a negated errno on failure
*
* Assumptions:
*
****************************************************************************/
int wpanlistener_remove_eventreceiver(FAR struct wpanlistener_s *handle,
wpanlistener_eventcallback_t cb);
#endif /* __APPS_WIRELESS_IEEE802154_I8SAK_WPANLISTENER_H */

View File

@ -54,6 +54,7 @@ CSRCS += ieee802154_seteaddr.c ieee802154_geteaddr.c
CSRCS += ieee802154_setpromisc.c ieee802154_getpromisc.c
CSRCS += ieee802154_setrxonidle.c ieee802154_getrxonidle.c
CSRCS += ieee802154_settxpwr.c ieee802154_gettxpwr.c
CSRCS += ieee802154_getdevmode.c
ifeq ($(CONFIG_NET_6LOWPAN),y)
# Add Get/Set Attribute helpers

View File

@ -56,10 +56,9 @@
int ieee802154_assoc_resp(int fd, FAR struct ieee802154_assoc_resp_s *resp)
{
union ieee802154_macarg_u arg;
int ret;
ret = ioctl(fd, MAC802154IOC_MLME_ASSOC_RESPONSE, (unsigned long)((uintptr_t)&arg));
ret = ioctl(fd, MAC802154IOC_MLME_ASSOC_RESPONSE, (unsigned long)((uintptr_t)resp));
if (ret < 0)
{
ret = -errno;
@ -67,6 +66,5 @@ int ieee802154_assoc_resp(int fd, FAR struct ieee802154_assoc_resp_s *resp)
return ret;
}
memcpy(resp, &arg.assocresp, sizeof(struct ieee802154_assoc_resp_s));
return OK;
}

View File

@ -54,7 +54,7 @@
* Public Functions
****************************************************************************/
int ieee802154_enableevents(int fd, bool enable)
int ieee802154_enableevents(int fd, bool enable)
{
int ret;

View File

@ -58,7 +58,7 @@ int ieee802154_getchan(int fd, FAR uint8_t *chan)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_PHY_CURRENT_CHANNEL;
req.attr = IEEE802154_ATTR_PHY_CURRENT_CHANNEL;
ret = ieee802154_get_req(fd, &req);
*chan = req.attrval.phy.channel;

View File

@ -0,0 +1,67 @@
/****************************************************************************
* apps/wireless/ieee802154/libmac/ieee802154_getdevmode.c
*
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2015 Sebastien Lorquet. All rights reserved.
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <stdio.h>
#include <errno.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "wireless/ieee802154.h"
/****************************************************************************
* Public Functions
****************************************************************************/
int ieee802154_getdevmode(int fd, FAR enum ieee802154_devmode_e *devmode)
{
struct ieee802154_get_req_s req;
int ret;
req.attr = IEEE802154_ATTR_MAC_DEVMODE;
ret = ieee802154_get_req(fd, &req);
*devmode = req.attrval.mac.devmode;
return ret;
}

View File

@ -58,7 +58,7 @@ int ieee802154_geteaddr(int fd, FAR uint8_t *eaddr)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_EXTENDED_ADDR;
req.attr = IEEE802154_ATTR_MAC_EXTENDED_ADDR;
ret = ieee802154_get_req(fd, &req);
memcpy(eaddr, &req.attrval.mac.eaddr[0], 8);

View File

@ -57,7 +57,7 @@ int ieee802154_getpanid(int fd, FAR uint16_t *panid)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_PANID;
req.attr = IEEE802154_ATTR_MAC_PANID;
ret = ieee802154_get_req(fd, &req);
*panid = req.attrval.mac.panid;

View File

@ -57,7 +57,7 @@ int ieee802154_getpromisc(int fd, FAR bool *promisc)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_PROMISCUOUS_MODE;
req.attr = IEEE802154_ATTR_MAC_PROMISCUOUS_MODE;
ret = ieee802154_get_req(fd, &req);
*promisc = req.attrval.mac.promisc_mode;

View File

@ -58,7 +58,7 @@ int ieee802154_getrxonidle(int fd, FAR bool *rxonidle)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_RX_ON_WHEN_IDLE;
req.attr = IEEE802154_ATTR_MAC_RX_ON_WHEN_IDLE;
ret = ieee802154_get_req(fd, &req);
*rxonidle = req.attrval.mac.rxonidle;

View File

@ -57,7 +57,7 @@ int ieee802154_getsaddr(int fd, FAR uint16_t *saddr)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_SHORT_ADDRESS;
req.attr = IEEE802154_ATTR_MAC_SHORT_ADDRESS;
ret = ieee802154_get_req(fd, &req);
*saddr = req.attrval.mac.saddr;

View File

@ -57,7 +57,7 @@ int ieee802154_gettxpwr(int fd, FAR int32_t *txpwr)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_PHY_TX_POWER;
req.attr = IEEE802154_ATTR_PHY_TX_POWER;
ret = ieee802154_get_req(fd, &req);
*txpwr = req.attrval.phy.txpwr;

View File

@ -57,7 +57,7 @@ int ieee802154_setchan(int fd, uint8_t chan)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_PHY_CURRENT_CHANNEL;
req.attr = IEEE802154_ATTR_PHY_CURRENT_CHANNEL;
req.attrval.phy.channel = chan;
return ieee802154_set_req(fd, &req);

View File

@ -58,7 +58,7 @@ int ieee802154_seteaddr(int fd, FAR const uint8_t *eaddr)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_EXTENDED_ADDR;
req.attr = IEEE802154_ATTR_MAC_EXTENDED_ADDR;
memcpy(&req.attrval.mac.eaddr[0], eaddr, 8);
return ieee802154_set_req(fd, &req);

View File

@ -57,7 +57,7 @@ int ieee802154_setpanid(int fd, uint16_t panid)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_PANID;
req.attr = IEEE802154_ATTR_MAC_PANID;
req.attrval.mac.panid = panid;
return ieee802154_set_req(fd, &req);

View File

@ -58,7 +58,7 @@ int ieee802154_setpromisc(int fd, bool promisc)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_PROMISCUOUS_MODE;
req.attr = IEEE802154_ATTR_MAC_PROMISCUOUS_MODE;
req.attrval.mac.promisc_mode = promisc;
return ieee802154_set_req(fd, &req);

View File

@ -58,7 +58,7 @@ int ieee802154_setrxonidle(int fd, bool rxonidle)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_RX_ON_WHEN_IDLE;
req.attr = IEEE802154_ATTR_MAC_RX_ON_WHEN_IDLE;
req.attrval.mac.rxonidle = rxonidle;
return ieee802154_set_req(fd, &req);

View File

@ -57,7 +57,7 @@ int ieee802154_setsaddr(int fd, uint16_t saddr)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_SHORT_ADDRESS;
req.attr = IEEE802154_ATTR_MAC_SHORT_ADDRESS;
req.attrval.mac.saddr = saddr;
return ieee802154_set_req(fd, &req);

View File

@ -56,7 +56,7 @@ int ieee802154_settxpwr(int fd, int32_t txpwr)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_PHY_TX_POWER;
req.attr = IEEE802154_ATTR_PHY_TX_POWER;
req.attrval.phy.txpwr = txpwr;
return ieee802154_set_req(fd, &req);

View File

@ -58,7 +58,7 @@ int sixlowpan_getchan(int sock, FAR const char *ifname, FAR uint8_t *chan)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_PHY_CURRENT_CHANNEL;
req.attr = IEEE802154_ATTR_PHY_CURRENT_CHANNEL;
ret = sixlowpan_get_req(sock, ifname, &req);
*chan = req.attrval.phy.channel;

View File

@ -58,7 +58,7 @@ int sixlowpan_geteaddr(int sock, FAR const char *ifname, FAR uint8_t *eaddr)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_EXTENDED_ADDR;
req.attr = IEEE802154_ATTR_MAC_EXTENDED_ADDR;
ret = sixlowpan_get_req(sock, ifname, &req);
memcpy(eaddr, &req.attrval.mac.eaddr[0], 8);

View File

@ -58,7 +58,7 @@ int sixlowpan_getpanid(int sock, FAR const char *ifname, FAR uint16_t *panid)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_PANID;
req.attr = IEEE802154_ATTR_MAC_PANID;
ret = sixlowpan_get_req(sock, ifname, &req);
*panid = req.attrval.mac.panid;

View File

@ -58,7 +58,7 @@ int sixlowpan_getpromisc(int sock, FAR const char *ifname, FAR bool *promisc)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_PROMISCUOUS_MODE;
req.attr = IEEE802154_ATTR_MAC_PROMISCUOUS_MODE;
ret = sixlowpan_get_req(sock, ifname, &req);
*promisc = req.attrval.mac.promisc_mode;

View File

@ -58,7 +58,7 @@ int sixlowpan_getrxonidle(int sock, FAR const char *ifname, FAR bool *rxonidle)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_RX_ON_WHEN_IDLE;
req.attr = IEEE802154_ATTR_MAC_RX_ON_WHEN_IDLE;
ret = sixlowpan_get_req(sock, ifname, &req);
*rxonidle = req.attrval.mac.rxonidle;

View File

@ -58,7 +58,7 @@ int sixlowpan_getsaddr(int sock, FAR const char *ifname, FAR uint16_t *saddr)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_MAC_SHORT_ADDRESS;
req.attr = IEEE802154_ATTR_MAC_SHORT_ADDRESS;
ret = sixlowpan_get_req(sock, ifname, &req);
*saddr = req.attrval.mac.saddr;

View File

@ -58,7 +58,7 @@ int sixlowpan_gettxpwr(int sock, FAR const char *ifname, FAR int32_t *txpwr)
struct ieee802154_get_req_s req;
int ret;
req.pib_attr = IEEE802154_PIB_PHY_TX_POWER;
req.attr = IEEE802154_ATTR_PHY_TX_POWER;
ret = sixlowpan_get_req(sock, ifname, &req);
*txpwr = req.attrval.phy.txpwr;

View File

@ -57,7 +57,7 @@ int sixlowpan_setchan(int sock, FAR const char *ifname, uint8_t chan)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_PHY_CURRENT_CHANNEL;
req.attr = IEEE802154_ATTR_PHY_CURRENT_CHANNEL;
req.attrval.phy.channel = chan;
return sixlowpan_set_req(sock, ifname, &req);

View File

@ -57,7 +57,7 @@ int sixlowpan_seteaddr(int sock, FAR const char *ifname, FAR const uint8_t *eadd
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_EXTENDED_ADDR;
req.attr = IEEE802154_ATTR_MAC_EXTENDED_ADDR;
memcpy(&req.attrval.mac.eaddr[0], eaddr, 8);
return sixlowpan_set_req(sock, ifname, &req);

View File

@ -57,7 +57,7 @@ int sixlowpan_setpanid(int sock, FAR const char *ifname, uint16_t panid)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_PANID;
req.attr = IEEE802154_ATTR_MAC_PANID;
req.attrval.mac.panid = panid;
return sixlowpan_set_req(sock, ifname, &req);

View File

@ -58,7 +58,7 @@ int sixlowpan_setpromisc(int sock, FAR const char *ifname, bool promisc)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_PROMISCUOUS_MODE;
req.attr = IEEE802154_ATTR_MAC_PROMISCUOUS_MODE;
req.attrval.mac.promisc_mode = promisc;
return sixlowpan_set_req(sock, ifname, &req);

View File

@ -58,7 +58,7 @@ int sixlowpan_setrxonidle(int sock, FAR const char *ifname, bool rxonidle)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_RX_ON_WHEN_IDLE;
req.attr = IEEE802154_ATTR_MAC_RX_ON_WHEN_IDLE;
req.attrval.mac.rxonidle = rxonidle;
return sixlowpan_set_req(sock, ifname, &req);

View File

@ -57,7 +57,7 @@ int sixlowpan_setsaddr(int sock, FAR const char *ifname, uint16_t saddr)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_MAC_SHORT_ADDRESS;
req.attr = IEEE802154_ATTR_MAC_SHORT_ADDRESS;
req.attrval.mac.saddr = saddr;
return sixlowpan_set_req(sock, ifname, &req);

View File

@ -57,7 +57,7 @@ int sixlowpan_settxpwr(int sock, FAR const char *ifname, int32_t txpwr)
{
struct ieee802154_set_req_s req;
req.pib_attr = IEEE802154_PIB_PHY_TX_POWER;
req.attr = IEEE802154_ATTR_PHY_TX_POWER;
req.attrval.phy.txpwr = txpwr;
return sixlowpan_set_req(sock, ifname, &req);

View File

@ -0,0 +1,25 @@
#
# For a description of the syntax of this configuration file,
# see misc/tools/kconfig-language.txt.
#
config IEEE802154_WPANLISTENER
bool "WPAN Listener Module for receiving various IEEE 802.15.4 MAC events"
default n
select IEEE802154_MAC_DEV
select IEEE802154_LIBUTILS
select IEEE802154_LIBMAC
---help---
Enable the IEEE 802.15.4 WPAN Listener
if IEEE802154_WPANLISTENER
config WPANLISTENER_NFRAMERECEIVERS
int "Number of frame receivers"
default 3
config WPANLISTENER_NEVENTRECEIVERS
int "Number of event receivers"
default 3
endif

View File

@ -0,0 +1,39 @@
############################################################################
# apps/wireless/ieee802154/wpanlistener/Make.defs
# Adds selected applications to apps/ build
#
# Copyright (C) 2017 Verge Inc. All rights reserved.
# Author: Anthony Merlino <anthony@vergeaero.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name NuttX nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################
ifeq ($(CONFIG_IEEE802154_WPANLISTENER),y)
CONFIGURED_APPS += wireless/ieee802154/wpanlistener
endif

View File

@ -0,0 +1,99 @@
############################################################################
# apps/wireless/ieee802154/wpanlistener/Makefile
#
# Copyright (C) 2017 Gregory Nutt. All rights reserved.
# Copyright (C) 2017 Verge Inc. All rights reserved.
#
# Author: Gregory Nutt <gnutt@nuttx.org>
# Author: Anthony Merlino <anthony@vergeaero.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name NuttX nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################
-include $(TOPDIR)/.config
-include $(TOPDIR)/Make.defs
include $(APPDIR)/Make.defs
ASRCS =
CSRCS = wpanlistener.c
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS)
OBJS = $(AOBJS) $(COBJS)
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
BIN = ..\..\..\libapps$(LIBEXT)
else
ifeq ($(WINTOOL),y)
BIN = ..\\..\\..\\libapps$(LIBEXT)
else
BIN = ../../../libapps$(LIBEXT)
endif
endif
ROOTDEPPATH = --dep-path .
VPATH =
# Build targets
all: .built
.PHONY: context .depend depend clean distclean
$(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@)
$(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
.built: $(OBJS)
$(call ARCHIVE, $(BIN), $(OBJS))
@touch .built
install:
context:
.depend: Makefile $(SRCS)
@$(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep
@touch $@
depend: .depend
clean:
$(call DELFILE, .built)
$(call CLEAN)
distclean: clean
$(call DELFILE, Make.dep)
$(call DELFILE, .depend)
-include Make.dep

View File

@ -488,7 +488,7 @@ static void wapi_essid_cmd(int sock, FAR const char *ifname,
/* Convert input strings to values */
essid_flag = (enum wapi_essid_flag_e)wapi_str2ndx(flagstr, g_wapi_essid_flags, 2);
/* Set the ESSID */
ret = wapi_set_essid(sock, ifname, essid, essid_flag);