Merge remote-tracking branch 'origin/master' into composite
This commit is contained in:
commit
70faf0d170
@ -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 */
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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))
|
||||
|
153
wireless/ieee802154/i8sak/README.txt
Normal file
153
wireless/ieee802154/i8sak/README.txt
Normal 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.
|
||||
|
189
wireless/ieee802154/i8sak/i8sak.h
Normal file
189
wireless/ieee802154/i8sak/i8sak.h
Normal 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 */
|
175
wireless/ieee802154/i8sak/i8sak_acceptassoc.c
Normal file
175
wireless/ieee802154/i8sak/i8sak_acceptassoc.c
Normal 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(¬if->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], ¬if->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], ¬if->u.assocind.devaddr[0],
|
||||
IEEE802154_EADDR_LEN);
|
||||
|
||||
assocresp.status = IEEE802154_STATUS_DENIED;
|
||||
|
||||
printf("i8sak: rejecting association request\n");
|
||||
}
|
||||
|
||||
ieee802154_assoc_resp(i8sak->fd, &assocresp);
|
||||
}
|
232
wireless/ieee802154/i8sak/i8sak_assoc.c
Normal file
232
wireless/ieee802154/i8sak/i8sak_assoc.c
Normal 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;
|
||||
}
|
||||
}
|
150
wireless/ieee802154/i8sak/i8sak_blaster.c
Normal file
150
wireless/ieee802154/i8sak/i8sak_blaster.c
Normal 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
177
wireless/ieee802154/i8sak/i8sak_poll.c
Normal file
177
wireless/ieee802154/i8sak/i8sak_poll.c
Normal 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);
|
||||
}
|
139
wireless/ieee802154/i8sak/i8sak_sniffer.c
Normal file
139
wireless/ieee802154/i8sak/i8sak_sniffer.c
Normal 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.
|
||||
*/
|
||||
}
|
172
wireless/ieee802154/i8sak/i8sak_startpan.c
Normal file
172
wireless/ieee802154/i8sak/i8sak_startpan.c
Normal 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);
|
||||
}
|
226
wireless/ieee802154/i8sak/i8sak_tx.c
Normal file
226
wireless/ieee802154/i8sak/i8sak_tx.c
Normal 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);
|
||||
}
|
836
wireless/ieee802154/i8sak/wpanlistener.c
Normal file
836
wireless/ieee802154/i8sak/wpanlistener.c
Normal 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)¬if));
|
||||
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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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(¬if, 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;
|
||||
}
|
311
wireless/ieee802154/i8sak/wpanlistener.h
Normal file
311
wireless/ieee802154/i8sak/wpanlistener.h
Normal 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 */
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -54,7 +54,7 @@
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
int ieee802154_enableevents(int fd, bool enable)
|
||||
int ieee802154_enableevents(int fd, bool enable)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -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;
|
||||
|
67
wireless/ieee802154/libmac/ieee802154_getdevmode.c
Normal file
67
wireless/ieee802154/libmac/ieee802154_getdevmode.c
Normal 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;
|
||||
}
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
25
wireless/ieee802154/wpanlistener/Kconfig
Normal file
25
wireless/ieee802154/wpanlistener/Kconfig
Normal 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
|
39
wireless/ieee802154/wpanlistener/Make.defs
Normal file
39
wireless/ieee802154/wpanlistener/Make.defs
Normal 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
|
99
wireless/ieee802154/wpanlistener/Makefile
Normal file
99
wireless/ieee802154/wpanlistener/Makefile
Normal 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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user