install basic coordinator daemon task
This commit is contained in:
parent
49913fa0be
commit
d15e000b36
@ -59,10 +59,14 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
#include <debug.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <pthread.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include <nuttx/ieee802154/ieee802154.h>
|
#include <nuttx/ieee802154/ieee802154.h>
|
||||||
|
|
||||||
@ -86,18 +90,25 @@ struct ieee_client_s
|
|||||||
struct ieee802154_packet_s pending; /* pending packet for device */
|
struct ieee802154_packet_s pending; /* pending packet for device */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ieee_addr
|
||||||
|
{
|
||||||
|
uint8_t len;
|
||||||
|
uint16_t panid;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
uint16_t saddr;
|
||||||
|
uint8_t eaddr[8];
|
||||||
|
} addr;
|
||||||
|
};
|
||||||
|
|
||||||
struct ieee_frame_s
|
struct ieee_frame_s
|
||||||
{
|
{
|
||||||
struct ieee802154_packet_s packet;
|
struct ieee802154_packet_s packet;
|
||||||
uint8_t fc1;
|
uint8_t fc1;
|
||||||
uint8_t fc2;
|
uint8_t fc2;
|
||||||
uint8_t seq;
|
uint8_t seq;
|
||||||
uint8_t *dpanid;
|
struct ieee_addr daddr;
|
||||||
uint8_t *daddr;
|
struct ieee_addr saddr;
|
||||||
uint8_t daddrlen;
|
|
||||||
uint8_t *spanid;
|
|
||||||
uint8_t *saddr;
|
|
||||||
uint8_t saddrlen;
|
|
||||||
uint8_t *payload;
|
uint8_t *payload;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -117,26 +128,7 @@ struct ieee_coord_s
|
|||||||
static struct ieee_coord_s g_coord;
|
static struct ieee_coord_s g_coord;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* coord_initialize
|
* coord_beacon
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void coord_initialize(FAR struct ieee_coord_s *coord, FAR char *dev, FAR char *chan, FAR char *panid)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
coord->nclients = 0;
|
|
||||||
for (i = 0; i < CONFIG_IEEE802154_COORD_MAXCLIENTS; i++)
|
|
||||||
{
|
|
||||||
coord->clients[i].pending.len = 0;
|
|
||||||
}
|
|
||||||
coord->chan = strtol(chan , NULL, 0);
|
|
||||||
coord->panid = strtol(panid, NULL, 0);
|
|
||||||
|
|
||||||
coord->fd = open(dev, O_RDWR);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* coord_main
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int coord_beacon(FAR struct ieee_coord_s *coord)
|
static int coord_beacon(FAR struct ieee_coord_s *coord)
|
||||||
@ -146,7 +138,7 @@ static int coord_beacon(FAR struct ieee_coord_s *coord)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* coord_main
|
* coord_data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int coord_data(FAR struct ieee_coord_s *coord)
|
static int coord_data(FAR struct ieee_coord_s *coord)
|
||||||
@ -156,7 +148,7 @@ static int coord_data(FAR struct ieee_coord_s *coord)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* coord_main
|
* coord_ack
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int coord_ack(FAR struct ieee_coord_s *coord)
|
static int coord_ack(FAR struct ieee_coord_s *coord)
|
||||||
@ -166,7 +158,24 @@ static int coord_ack(FAR struct ieee_coord_s *coord)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* coord_main
|
* coord_command_beacon_req
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int coord_command_beacon_req(FAR struct ieee_coord_s *coord)
|
||||||
|
{
|
||||||
|
FAR struct ieee_frame_s *rx = &coord->rxbuf;
|
||||||
|
|
||||||
|
//check the request looks good
|
||||||
|
|
||||||
|
printf("Beacon request\n");
|
||||||
|
|
||||||
|
//compose a basic response
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* coord_command
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int coord_command(FAR struct ieee_coord_s *coord)
|
static int coord_command(FAR struct ieee_coord_s *coord)
|
||||||
@ -184,7 +193,7 @@ static int coord_command(FAR struct ieee_coord_s *coord)
|
|||||||
case IEEE802154_CMD_DATA_REQ : break;
|
case IEEE802154_CMD_DATA_REQ : break;
|
||||||
case IEEE802154_CMD_PANID_CONF_NOT : break;
|
case IEEE802154_CMD_PANID_CONF_NOT : break;
|
||||||
case IEEE802154_CMD_ORPHAN_NOT : break;
|
case IEEE802154_CMD_ORPHAN_NOT : break;
|
||||||
case IEEE802154_CMD_BEACON_REQ : break;
|
case IEEE802154_CMD_BEACON_REQ : return coord_command_beacon_req(coord); break;
|
||||||
case IEEE802154_CMD_COORD_REALIGN : break;
|
case IEEE802154_CMD_COORD_REALIGN : break;
|
||||||
case IEEE802154_CMD_GTS_REQ : break;
|
case IEEE802154_CMD_GTS_REQ : break;
|
||||||
}
|
}
|
||||||
@ -192,7 +201,7 @@ static int coord_command(FAR struct ieee_coord_s *coord)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* coord_main
|
* coord_manage
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int coord_manage(FAR struct ieee_coord_s *coord)
|
static int coord_manage(FAR struct ieee_coord_s *coord)
|
||||||
@ -219,67 +228,63 @@ static int coord_manage(FAR struct ieee_coord_s *coord)
|
|||||||
|
|
||||||
if(daddr == IEEE802154_DADDR_SHORT)
|
if(daddr == IEEE802154_DADDR_SHORT)
|
||||||
{
|
{
|
||||||
rx->dpanid = rx->packet.data+index;
|
memcpy(&rx->daddr.panid, rx->packet.data+index, 2);
|
||||||
index += 2; /* skip dest pan id */
|
index += 2; /* skip dest pan id */
|
||||||
rx->daddr = rx->packet.data+index;
|
memcpy(&rx->daddr.addr.saddr, rx->packet.data+index, 2);
|
||||||
index += 2; /* skip dest addr */
|
index += 2; /* skip dest addr */
|
||||||
rx->daddrlen = 2;
|
rx->daddr.len = 2;
|
||||||
}
|
}
|
||||||
else if(daddr == IEEE802154_DADDR_EXT)
|
else if(daddr == IEEE802154_DADDR_EXT)
|
||||||
{
|
{
|
||||||
rx->dpanid = rx->packet.data+index;
|
memcpy(&rx->daddr.panid, rx->packet.data+index, 2);
|
||||||
index += 2; /* skip dest pan id */
|
index += 2; /* skip dest pan id */
|
||||||
rx->daddr = rx->packet.data+index;
|
memcpy(&rx->daddr.addr.eaddr, rx->packet.data+index, 8);
|
||||||
index += 8; /* skip dest addr */
|
index += 8; /* skip dest addr */
|
||||||
rx->daddrlen = 8;
|
rx->daddr.len = 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rx->dpanid = NULL;
|
rx->daddr.len = 0;
|
||||||
rx->daddr = NULL;
|
|
||||||
rx->daddrlen = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(saddr == IEEE802154_SADDR_SHORT)
|
if(saddr == IEEE802154_SADDR_SHORT)
|
||||||
{
|
{
|
||||||
if(rx->fc1 & IEEE802154_FC1_INTRA)
|
if(rx->fc1 & IEEE802154_FC1_INTRA)
|
||||||
{
|
{
|
||||||
rx->spanid = rx->dpanid;
|
rx->saddr.panid = rx->daddr.panid;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rx->spanid = rx->packet.data+index;
|
memcpy(&rx->saddr.panid, rx->packet.data+index, 2);
|
||||||
index += 2; /*skip dest pan id*/
|
index += 2; /*skip dest pan id*/
|
||||||
}
|
}
|
||||||
rx->saddr = rx->packet.data+index;
|
memcpy(&rx->saddr.addr.saddr, rx->packet.data+index, 2);
|
||||||
index += 2; /* skip dest addr */
|
index += 2; /* skip dest addr */
|
||||||
rx->saddrlen = 2;
|
rx->saddr.len = 2;
|
||||||
}
|
}
|
||||||
else if(saddr == IEEE802154_SADDR_EXT)
|
else if(saddr == IEEE802154_SADDR_EXT)
|
||||||
{
|
{
|
||||||
if(rx->fc1 & IEEE802154_FC1_INTRA)
|
if(rx->fc1 & IEEE802154_FC1_INTRA)
|
||||||
{
|
{
|
||||||
rx->spanid = rx->dpanid;
|
rx->saddr.panid = rx->daddr.panid;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rx->spanid = rx->packet.data+index;
|
memcpy(&rx->saddr.panid, rx->packet.data+index, 2);
|
||||||
index += 2; /*skip dest pan id*/
|
index += 2; /*skip dest pan id*/
|
||||||
}
|
}
|
||||||
rx->saddr = rx->packet.data+index;
|
memcpy(&rx->saddr.addr.eaddr, rx->packet.data+index, 8);
|
||||||
index += 8; /* skip dest addr */
|
index += 8; /* skip dest addr */
|
||||||
rx->saddrlen = 8;
|
rx->saddr.len = 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rx->spanid = NULL;
|
rx->saddr.len = 0;
|
||||||
rx->saddr = NULL;
|
|
||||||
rx->saddrlen = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rx->payload = rx->packet.data + index;
|
rx->payload = rx->packet.data + index;
|
||||||
|
|
||||||
printf("SADDR len %d DADDR len %d\n", rx->saddrlen, rx->daddrlen);
|
printf("SADDR len %d DADDR len %d\n", rx->saddr.len, rx->daddr.len);
|
||||||
switch(ftype)
|
switch(ftype)
|
||||||
{
|
{
|
||||||
case IEEE802154_FRAME_BEACON : coord_beacon (coord); break;
|
case IEEE802154_FRAME_BEACON : coord_beacon (coord); break;
|
||||||
@ -295,31 +300,102 @@ static int coord_manage(FAR struct ieee_coord_s *coord)
|
|||||||
* coord_loop
|
* coord_loop
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int coord_loop(FAR struct ieee_coord_s *coord)
|
static volatile int gRun;
|
||||||
|
static pthread_t gDaemonPid;
|
||||||
|
|
||||||
|
void task_signal(int sig)
|
||||||
{
|
{
|
||||||
int ret = 1;
|
gRun = 0;
|
||||||
FAR struct ieee_frame_s *rx = &coord->rxbuf;
|
}
|
||||||
|
|
||||||
printf("starting on chan %d, panid %04X\n", coord->chan, coord->panid);
|
/****************************************************************************
|
||||||
|
* coord_initialize
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
ieee802154_setchan (coord->fd, coord->chan );
|
static void coord_initialize(FAR struct ieee_coord_s *coord, FAR char *dev, FAR char *chan, FAR char *panid)
|
||||||
ieee802154_setpanid(coord->fd, coord->panid);
|
{
|
||||||
//ieee802154_setpromisc(coord->fd, TRUE);
|
int i;
|
||||||
|
coord->nclients = 0;
|
||||||
while(ret > 0)
|
for (i = 0; i < CONFIG_IEEE802154_COORD_MAXCLIENTS; i++)
|
||||||
{
|
{
|
||||||
ret = read(coord->fd, &rx->packet, sizeof(struct ieee802154_packet_s));
|
coord->clients[i].pending.len = 0;
|
||||||
|
}
|
||||||
|
coord->chan = strtol(chan , NULL, 0);
|
||||||
|
coord->panid = strtol(panid, NULL, 0);
|
||||||
|
|
||||||
|
coord->fd = open(dev, O_RDWR);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ACTION_STOP 1
|
||||||
|
#define ACTION_PANID 2
|
||||||
|
|
||||||
|
struct message
|
||||||
|
{
|
||||||
|
int action;
|
||||||
|
unsigned long param;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct message g_message;
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* coord_task
|
||||||
|
****************************************************************************/
|
||||||
|
int coord_task(int s_argc, char **s_argv)
|
||||||
|
{
|
||||||
|
FAR struct ieee_frame_s *rx = &g_coord.rxbuf;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
coord_initialize(&g_coord, s_argv[3], s_argv[4], s_argv[5]);
|
||||||
|
|
||||||
|
printf("IEEE 802.15.4 Coordinator started, chan %d, panid %04X, argc %d\n", g_coord.chan, g_coord.panid, s_argc);
|
||||||
|
|
||||||
|
ieee802154_setchan (g_coord.fd, g_coord.chan );
|
||||||
|
ieee802154_setpanid(g_coord.fd, g_coord.panid);
|
||||||
|
|
||||||
|
if(g_coord.fd<0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "cannot open %s, errno=%d\n", s_argv[3], errno);
|
||||||
|
exit(ERROR);
|
||||||
|
}
|
||||||
|
gRun = 1;
|
||||||
|
|
||||||
|
while(gRun)
|
||||||
|
{
|
||||||
|
ret = read(g_coord.fd, &rx->packet, sizeof(struct ieee802154_packet_s));
|
||||||
if(ret > 0)
|
if(ret > 0)
|
||||||
{
|
{
|
||||||
coord_manage(coord);
|
coord_manage(&g_coord);
|
||||||
|
}
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
if(errno==4) //EINTR, signal received
|
||||||
|
{
|
||||||
|
switch(g_message.action)
|
||||||
|
{
|
||||||
|
case ACTION_STOP:
|
||||||
|
gRun = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACTION_PANID:
|
||||||
|
g_coord.panid = (uint16_t)g_message.param;
|
||||||
|
ieee802154_setpanid(g_coord.fd, g_coord.panid);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("received unknown message\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return OK;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("IEEE 802.15.4 Coordinator stopped\n");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* coord_main
|
* coord_main
|
||||||
****************************************************************************/
|
11 ****************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_BUILD_KERNEL
|
#ifdef CONFIG_BUILD_KERNEL
|
||||||
int main(int argc, FAR char *argv[])
|
int main(int argc, FAR char *argv[])
|
||||||
@ -327,21 +403,60 @@ int main(int argc, FAR char *argv[])
|
|||||||
int coord_main(int argc, FAR char *argv[])
|
int coord_main(int argc, FAR char *argv[])
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
printf("IEEE 802.15.4 Coordinator start\n");
|
|
||||||
|
|
||||||
if (argc<4)
|
if(argc < 2)
|
||||||
{
|
{
|
||||||
printf("coord <dev> <chan> [0x]<panid>\n");
|
printf("coord start | stop | panid\n");
|
||||||
return ERROR;
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!strcmp(argv[1], "start"))
|
||||||
coord_initialize(&g_coord, argv[1], argv[2], argv[3]);
|
|
||||||
if(g_coord.fd<0)
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "cannot open %s, errno=%d\n", argv[1], errno);
|
if(argc != 5)
|
||||||
exit(ERROR);
|
{
|
||||||
|
printf("coord start <dev> <chan> <panid>\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
if(gRun)
|
||||||
return coord_loop(&g_coord);
|
{
|
||||||
|
printf("Already started.\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
printf("IEEE 802.15.4 Coordinator starting...\n");
|
||||||
|
gDaemonPid = task_create("coord", SCHED_PRIORITY_DEFAULT,
|
||||||
|
1024,
|
||||||
|
coord_task, argv);
|
||||||
|
}
|
||||||
|
else if(!strcmp(argv[1], "stop"))
|
||||||
|
{
|
||||||
|
if(!gRun)
|
||||||
|
{
|
||||||
|
norun:
|
||||||
|
printf("Not started.\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
printf("IEEE 802.15.4 Coordinator stopping...\n");
|
||||||
|
g_message.action = ACTION_STOP;
|
||||||
|
kill(gDaemonPid, SIGUSR1);
|
||||||
|
}
|
||||||
|
else if(!strcmp(argv[1], "status"))
|
||||||
|
{
|
||||||
|
printf("IEEE 802.15.4 Coordinator %s.\n", gRun?"started":"stopped");
|
||||||
|
}
|
||||||
|
else if(!strcmp(argv[1], "panid"))
|
||||||
|
{
|
||||||
|
if(argc != 3)
|
||||||
|
{
|
||||||
|
printf("coord panid <panid>\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if(!gRun)
|
||||||
|
{
|
||||||
|
goto norun;
|
||||||
|
}
|
||||||
|
g_message.action = ACTION_PANID;
|
||||||
|
g_message.param = strtol(argv[2], NULL, 0);
|
||||||
|
kill(gDaemonPid, SIGUSR1);
|
||||||
|
}
|
||||||
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user