ieee802154: Updated to match nuttx ieee802154 changes

This commit is contained in:
Anthony Merlino 2017-03-24 11:59:30 -04:00
parent a968904300
commit 4774fe4624
16 changed files with 192 additions and 142 deletions

View File

@ -66,3 +66,6 @@ clean: $(foreach SDIR, $(SUBDIRS), $(SDIR)_clean)
distclean: $(foreach SDIR, $(SUBDIRS), $(SDIR)_distclean)
-include Make.dep
.PHONY: preconfig
preconfig:

View File

@ -41,84 +41,97 @@
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <nuttx/ieee802154/ieee802154.h>
#include <apps/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "ieee802154/ieee802154.h"
int ieee802154_addrparse(FAR struct ieee802154_packet_s *packet,
FAR struct ieee802154_addr_s *dest,
FAR struct ieee802154_addr_s *src)
{
uint8_t fc1, fc2, daddr, saddr;
uint16_t frame_ctrl;
int index=3;
/* read fc */
fc1 = packet->data[0];
fc2 = packet->data[1];
daddr = fc2 & IEEE802154_FC2_DADDR;
saddr = fc2 & IEEE802154_FC2_SADDR;
frame_ctrl = packet->data[0];
frame_ctrl |= packet->data[1] << 8;
dest->ia_mode = (frame_ctrl & IEEE802154_FRAMECTRL_DADDR)
>> IEEE802154_FRAMECTRL_SHIFT_DADDR;
src->ia_mode = (frame_ctrl & IEEE802154_FRAMECTRL_SADDR)
>> IEEE802154_FRAMECTRL_SHIFT_SADDR;
/* decode dest addr */
if(daddr == IEEE802154_DADDR_SHORT)
switch (dest->ia_mode)
{
memcpy(&dest->ia_panid, packet->data+index, 2);
index += 2; /* skip dest pan id */
memcpy(&dest->ia_saddr, packet->data+index, 2);
index += 2; /* skip dest addr */
dest->ia_len = 2;
}
else if(daddr == IEEE802154_DADDR_EXT)
{
memcpy(&dest->ia_panid, packet->data+index, 2);
index += 2; /* skip dest pan id */
memcpy(dest->ia_eaddr, packet->data+index, 8);
index += 8; /* skip dest addr */
dest->ia_len = 8;
}
else if(daddr == IEEE802154_DADDR_NONE)
{
dest->ia_len = 0;
}
else
{
return -EINVAL;
case IEEE802154_ADDRMODE_SHORT:
{
memcpy(&dest->ia_panid, packet->data+index, 2);
index += 2; /* skip dest pan id */
memcpy(&dest->ia_saddr, packet->data+index, 2);
index += 2; /* skip dest addr */
}
break;
case IEEE802154_ADDRMODE_EXTENDED:
{
memcpy(&dest->ia_panid, packet->data+index, 2);
index += 2; /* skip dest pan id */
memcpy(dest->ia_eaddr, packet->data+index, 8);
index += 8; /* skip dest addr */
}
break;
case IEEE802154_ADDRMODE_NONE:
break;
default:
return -EINVAL;
}
/* decode source pan id according to compression */
if( (saddr == IEEE802154_SADDR_SHORT) || (saddr == IEEE802154_SADDR_EXT) )
{
if(fc1 & IEEE802154_FC1_INTRA)
{
src->ia_panid = dest->ia_panid;
}
else
{
memcpy(&src->ia_panid, packet->data+index, 2);
index += 2; /*skip dest pan id*/
}
}
if ((src->ia_mode == IEEE802154_ADDRMODE_SHORT) ||
(src->ia_mode == IEEE802154_ADDRMODE_EXTENDED))
{
/* If PANID compression, src PAN ID is same as dest */
if(frame_ctrl & IEEE802154_FRAMECTRL_INTRA)
{
src->ia_panid = dest->ia_panid;
}
else
{
memcpy(&src->ia_panid, packet->data+index, 2);
index += 2; /*skip dest pan id*/
}
}
/* decode source addr */
if(saddr == IEEE802154_SADDR_SHORT)
switch (src->ia_mode)
{
memcpy(&src->ia_saddr, packet->data+index, 2);
index += 2; /* skip dest addr */
src->ia_len = 2;
}
else if(saddr == IEEE802154_SADDR_EXT)
{
memcpy(src->ia_eaddr, packet->data+index, 8);
index += 8; /* skip dest addr */
src->ia_len = 8;
}
else if(saddr == IEEE802154_SADDR_NONE)
{
src->ia_len = 0;
}
else
{
return -EINVAL;
case IEEE802154_ADDRMODE_SHORT:
{
memcpy(&src->ia_saddr, packet->data+index, 2);
index += 2; /* skip src addr */
}
break;
case IEEE802154_ADDRMODE_EXTENDED:
{
memcpy(src->ia_eaddr, packet->data+index, 8);
index += 8; /* skip src addr */
}
break;
case IEEE802154_ADDRMODE_NONE:
break;
default:
return -EINVAL;
}
return index;

View File

@ -41,38 +41,55 @@
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <nuttx/ieee802154/ieee802154.h>
#include <apps/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "ieee802154/ieee802154.h"
int ieee802154_addrstore(FAR struct ieee802154_packet_s *packet,
FAR struct ieee802154_addr_s *dest,
FAR struct ieee802154_addr_s *src)
{
uint16_t frame_ctrl;
int index=3; //skip fc and seq
/* Get the frame control word so we can manipulate it */
frame_ctrl = packet->data[0];
frame_ctrl |= packet->data[1] << 8;
/* Clear the destination address mode */
frame_ctrl &= ~IEEE802154_FRAMECTRL_DADDR;
/* encode dest addr */
if(dest == NULL || dest->ia_len == 0)
if(dest == NULL || dest->ia_mode == IEEE802154_ADDRMODE_NONE)
{
packet->data[1] = (packet->data[1] & ~IEEE802154_FC2_DADDR) | IEEE802154_DADDR_NONE;
/* Set the destination address mode to none */
frame_ctrl |= IEEE802154_ADDRMODE_NONE << IEEE802154_FRAMECTRL_SHIFT_DADDR;
}
else
{
memcpy(packet->data+index, &dest->ia_panid, 2);
index += 2; /* skip dest pan id */
if(dest->ia_len == 2)
/* Set the dest address mode field */
frame_ctrl |= dest->ia_mode << IEEE802154_FRAMECTRL_SHIFT_DADDR;
if(dest->ia_mode == IEEE802154_ADDRMODE_SHORT)
{
memcpy(packet->data+index, &dest->ia_saddr, 2);
index += 2; /* skip dest addr */
packet->data[1] = (packet->data[1] & ~IEEE802154_FC2_DADDR) | IEEE802154_DADDR_SHORT;
}
else if(dest->ia_len == 8)
else if(dest->ia_mode == IEEE802154_ADDRMODE_EXTENDED)
{
memcpy(packet->data+index, &dest->ia_panid, 2);
index += 2; /* skip dest pan id */
memcpy(packet->data+index, dest->ia_eaddr, 8);
index += 8; /* skip dest addr */
packet->data[1] = (packet->data[1] & ~IEEE802154_FC2_DADDR) | IEEE802154_DADDR_EXT;
}
else
{
@ -80,42 +97,57 @@ int ieee802154_addrstore(FAR struct ieee802154_packet_s *packet,
}
}
packet->data[0] &= ~IEEE802154_FC1_INTRA;
if( (dest != NULL && dest->ia_len != 0) && (src != NULL && src->ia_len != 0) )
/* Clear the PAN ID Compression Field */
frame_ctrl &= ~IEEE802154_FRAMECTRL_INTRA;
if( (dest != NULL && dest->ia_mode != IEEE802154_ADDRMODE_NONE) &&
(src != NULL && src->ia_mode != IEEE802154_ADDRMODE_NONE) )
{
/* we have both adresses, encode source pan id according to compression */
if( dest->ia_panid == src->ia_panid)
{
packet->data[0] |= IEEE802154_FC1_INTRA;
frame_ctrl |= IEEE802154_FRAMECTRL_INTRA;
}
}
/* Clear the source address mode */
frame_ctrl &= ~IEEE802154_FRAMECTRL_SADDR;
/* encode source addr */
if(src == NULL || src->ia_len==0)
if(src == NULL || src->ia_mode == IEEE802154_ADDRMODE_NONE)
{
packet->data[1] = (packet->data[1] & ~IEEE802154_FC2_SADDR) | IEEE802154_SADDR_NONE;
/* Set the source address mode to none */
frame_ctrl |= IEEE802154_ADDRMODE_NONE << IEEE802154_FRAMECTRL_SHIFT_SADDR;
}
else
{
/*add src pan id if it was not compressed before*/
if(!(packet->data[0] & IEEE802154_FC1_INTRA))
/* add src pan id if it was not compressed before */
if(!(frame_ctrl & IEEE802154_FRAMECTRL_INTRA))
{
memcpy(packet->data+index, &src->ia_panid, 2);
index += 2; /*skip src pan id*/
}
if(src->ia_len == 2)
/* Set the source address mode field */
frame_ctrl |= src->ia_mode << IEEE802154_FRAMECTRL_SHIFT_SADDR;
if(src->ia_mode == IEEE802154_ADDRMODE_SHORT)
{
memcpy(packet->data+index, &src->ia_saddr, 2);
index += 2; /* skip src addr */
packet->data[1] = (packet->data[1] & ~IEEE802154_FC2_SADDR) | IEEE802154_SADDR_SHORT;
}
else if(src->ia_len == 8)
else if(src->ia_mode == IEEE802154_ADDRMODE_EXTENDED)
{
memcpy(packet->data+index, src->ia_eaddr, 8);
index += 8; /* skip src addr */
packet->data[1] = (packet->data[1] & ~IEEE802154_FC2_SADDR) | IEEE802154_SADDR_EXT;
}
else
{
@ -123,6 +155,9 @@ int ieee802154_addrstore(FAR struct ieee802154_packet_s *packet,
}
}
/* Copy the frame control word back to the buffer */
memcpy(packet->data, &frame_ctrl, 2);
return index;
}

View File

@ -40,8 +40,8 @@
#include <nuttx/config.h>
#include <stdint.h>
#include <stdio.h>
#include <nuttx/ieee802154/ieee802154.h>
#include <apps/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154.h>
#include "ieee802154/ieee802154.h"
int ieee802154_addrtostr(FAR char *buf, int len, FAR struct ieee802154_addr_s *addr)
{
@ -51,11 +51,11 @@ int ieee802154_addrtostr(FAR char *buf, int len, FAR struct ieee802154_addr_s *a
uint16_t panid = addr->ia_panid;
#endif
if(addr->ia_len == 0)
if(addr->ia_mode == IEEE802154_ADDRMODE_NONE)
{
return snprintf(buf, len, "none");
}
else if(addr->ia_len == 2)
else if(addr->ia_mode == IEEE802154_ADDRMODE_SHORT)
{
#ifndef CONFIG_BIG_ENDIAN
uint16_t saddr = ((addr->ia_saddr & 0xff)<<8) | ((addr->ia_saddr>>8) & 0xff);
@ -64,7 +64,7 @@ int ieee802154_addrtostr(FAR char *buf, int len, FAR struct ieee802154_addr_s *a
#endif
return snprintf(buf, len, "%04X/%04X", panid, saddr);
}
else if(addr->ia_len == 8)
else if(addr->ia_mode == IEEE802154_ADDRMODE_EXTENDED)
{
int i;
int off = snprintf(buf, len, "%04X/", panid);

View File

@ -42,15 +42,16 @@
#include <stdio.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <nuttx/wireless/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include "ieee802154/ieee802154.h"
int ieee802154_getcca(int fd, FAR struct ieee802154_cca_s *cca)
{
int ret = ioctl(fd, MAC854IOCGCCA, (unsigned long)cca );
int ret = ioctl(fd, PHY802154IOC_GET_CCA, (unsigned long)cca );
if (ret<0)
{
printf("MAC854IOCGCCA failed\n");
printf("PHY802154IOC_GET_CCA failed\n");
}
return ret;
}

View File

@ -42,15 +42,16 @@
#include <stdio.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <nuttx/wireless/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include "ieee802154/ieee802154.h"
int ieee802154_getchan(int fd, FAR uint8_t *chan)
{
int ret = ioctl(fd, MAC854IOCGCHAN, (unsigned long)chan );
int ret = ioctl(fd, PHY802154IOC_GET_CHAN, (unsigned long)chan );
if (ret<0)
{
printf("MAC854IOCGCHAN failed\n");
printf("PHY802154IOC_GET_CHAN failed\n");
}
return ret;
}

View File

@ -42,15 +42,16 @@
#include <stdio.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <nuttx/wireless/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include "ieee802154/ieee802154.h"
int ieee802154_setcca(int fd, FAR struct ieee802154_cca_s *cca)
{
int ret = ioctl(fd, MAC854IOCSCCA, (unsigned long)cca );
int ret = ioctl(fd, PHY802154IOC_SET_CCA, (unsigned long)cca );
if (ret<0)
{
printf("MAC854IOCSCCA failed\n");
printf("PHY802154IOC_SET_CCA failed\n");
}
return ret;
}

View File

@ -42,14 +42,15 @@
#include <stdio.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include "ieee802154/ieee802154.h"
int ieee802154_setchan(int fd, uint8_t chan)
{
int ret = ioctl(fd, MAC854IOCSCHAN, (unsigned long)chan );
int ret = ioctl(fd, PHY802154IOC_SET_CHAN, (unsigned long)chan );
if (ret<0)
{
printf("MAC854IOCSCHAN failed\n");
printf("PHY802154IOC_SET_CHAN failed\n");
}
return ret;
}

View File

@ -42,14 +42,15 @@
#include <stdio.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include "ieee802154/ieee802154.h"
int ieee802154_setdevmode(int fd, uint8_t devmode)
{
int ret = ioctl(fd, MAC854IOCSDEVMODE, (unsigned long)devmode );
int ret = ioctl(fd, PHY802154IOC_SET_DEVMODE, (unsigned long)devmode );
if (ret<0)
{
printf("MAC854IOCSDEVMODE failed\n");
printf("PHY802154IOC_SET_DEVMODE failed\n");
}
return ret;
}

View File

@ -42,14 +42,15 @@
#include <stdio.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include "ieee802154/ieee802154.h"
int ieee802154_seteaddr(int fd, uint8_t *eaddr)
{
int ret = ioctl(fd, MAC854IOCSEADDR, (unsigned long)eaddr );
int ret = ioctl(fd, PHY802154IOC_SET_EADDR, (unsigned long)eaddr );
if (ret<0)
{
printf("MAC854IOCSEADDR failed\n");
printf("PHY802154IOC_SET_EADDR failed\n");
}
return ret;
}

View File

@ -42,14 +42,15 @@
#include <stdio.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include "ieee802154/ieee802154.h"
int ieee802154_setpanid(int fd, uint16_t panid)
{
int ret = ioctl(fd, MAC854IOCSPANID, (unsigned long)panid );
int ret = ioctl(fd, PHY802154IOC_SET_PANID, (unsigned long)panid );
if (ret<0)
{
printf("MAC854IOCSPANID failed\n");
printf("PHY802154IOC_SET_PANID failed\n");
}
return ret;
}

View File

@ -43,14 +43,15 @@
#include <stdbool.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include "ieee802154/ieee802154.h"
int ieee802154_setpromisc(int fd, bool promisc)
{
int ret = ioctl(fd, MAC854IOCSPROMISC, (unsigned long)promisc );
int ret = ioctl(fd, PHY802154IOC_SET_PROMISC, (unsigned long)promisc );
if (ret<0)
{
printf("MAC854IOCSPROMISC failed\n");
printf("PHY802154IOC_SET_PROMISC failed\n");
}
return ret;
}

View File

@ -42,14 +42,15 @@
#include <stdio.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include "ieee802154/ieee802154.h"
int ieee802154_setsaddr(int fd, uint16_t saddr)
{
int ret = ioctl(fd, MAC854IOCSSADDR, (unsigned long)saddr );
int ret = ioctl(fd, PHY802154IOC_SET_SADDR, (unsigned long)saddr );
if (ret<0)
{
printf("MAC854IOCSSADDR failed\n");
printf("PHY802154IOC_SET_SADDR failed\n");
}
return ret;
}

View File

@ -68,7 +68,7 @@
#include <errno.h>
#include <signal.h>
#include <nuttx/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154.h>
#include <apps/ieee802154/ieee802154.h>

View File

@ -59,9 +59,10 @@
#include <fcntl.h>
#include <sys/ioctl.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/ieee802154/ieee802154.h>
#include <nuttx/ieee802154/ieee802154_dev.h>
#include <apps/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#include "ieee802154/ieee802154.h"
/****************************************************************************
* Definitions
@ -97,7 +98,7 @@ int energy_scan(int fd)
printf("Device is not an IEEE 802.15.4 interface!\n");
return ret;
}
ret = ioctl(fd, MAC854IOCGED, (unsigned long)&energy);
ret = ioctl(fd, PHY802154IOC_ENERGYDETECT, (unsigned long)&energy);
if (ret<0)
{
printf("Device is not an IEEE 802.15.4 interface!\n");
@ -153,10 +154,10 @@ static int status(int fd)
/* Get information */
ret = ioctl(fd, MAC854IOCGPANID, (unsigned long)&panid);
ret = ioctl(fd, PHY802154IOC_GET_PANID, (unsigned long)&panid);
if (ret)
{
printf("MAC854IOCGPANID failed\n");
printf("PHY802154IOC_GET_PANID failed\n");
return ret;
}
@ -166,22 +167,22 @@ static int status(int fd)
return ret;
}
ret = ioctl(fd, MAC854IOCGSADDR, (unsigned long)&saddr);
ret = ioctl(fd, PHY802154IOC_GET_SADDR, (unsigned long)&saddr);
if (ret)
{
printf("MAC854IOCGSADDR failed\n");
printf("PHY802154IOC_GET_SADDR failed\n");
return ret;
}
ret = ioctl(fd, MAC854IOCGEADDR, (unsigned long)&eaddr[0]);
ret = ioctl(fd, PHY802154IOC_GET_EADDR, (unsigned long)&eaddr[0]);
if (ret)
{
printf("MAC854IOCGEADR failed\n");
printf("PHY802154IOC_GET_EADDR failed\n");
return ret;
}
ret = ioctl(fd, MAC854IOCGPROMISC, (unsigned long)&promisc);
ret = ioctl(fd, PHY802154IOC_GET_PROMISC, (unsigned long)&promisc);
if (ret)
{
printf("MAC854IOCGPROMISC failed\n");
printf("PHY802154IOC_GET_PROMISC failed\n");
return ret;
}
ret = ieee802154_getcca(fd, &cca);
@ -548,7 +549,7 @@ data_error:
gTxPacket.data[gTxPacket.len++] = 0x03; //mac command, no ack, no panid compression
gTxPacket.data[gTxPacket.len++] = 0x00; //short destination address, no source address
gTxPacket.data[gTxPacket.len++] = 0; //seq
dest.ia_len = 2;
dest.ia_mode = IEEE802154_ADDRMODE_SHORT;
dest.ia_panid = 0xFFFF;
dest.ia_saddr = 0xFFFF;

View File

@ -38,19 +38,8 @@
#include <stdint.h>
#include <stdbool.h>
struct ieee802154_addr_s
{
uint8_t ia_len; /* structure length NOT including panid, so 2/8*/
uint16_t ia_panid;
union {
uint16_t _ia_saddr;
uint8_t _ia_eaddr[8];
} ia_addr;
#define ia_saddr ia_addr._ia_saddr
#define ia_eaddr ia_addr._ia_eaddr
};
#define IEEE802154_ADDRSTRLEN 22 /* (4+1+8*2) */
#include <nuttx/wireless/ieee802154/ieee802154.h>
#include <nuttx/wireless/ieee802154/ieee802154_radio.h>
int ieee802154_setchan (int fd, uint8_t chan);
int ieee802154_getchan (int fd, FAR uint8_t *chan);