mirror of
https://github.com/apache/nuttx.git
synced 2026-06-04 23:03:27 +08:00
ieee802.15.4 loopback: Better simulation addressing: sort, extended, panid, and IP address conversion
This commit is contained in:
@@ -116,10 +116,22 @@ struct lo_driver_s
|
|||||||
static struct lo_driver_s g_loopback;
|
static struct lo_driver_s g_loopback;
|
||||||
static uint8_t g_iobuffer[CONFIG_NET_6LOWPAN_MTU + CONFIG_NET_GUARDSIZE];
|
static uint8_t g_iobuffer[CONFIG_NET_6LOWPAN_MTU + CONFIG_NET_GUARDSIZE];
|
||||||
|
|
||||||
|
static uint8_t g_eaddr[8] =
|
||||||
|
{
|
||||||
|
0x00, 0xfa, 0xde, 0x00, 0xde, 0xad, 0xbe, 0xef
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t g_saddr = 0xabcd;
|
||||||
|
static uint16_t g_panid = 0xcafe;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* IP address conversion */
|
||||||
|
|
||||||
|
static void lo_addr2ip(FAR struct net_driver_s *dev);
|
||||||
|
|
||||||
/* Polling logic */
|
/* Polling logic */
|
||||||
|
|
||||||
static int lo_loopback(FAR struct net_driver_s *dev);
|
static int lo_loopback(FAR struct net_driver_s *dev);
|
||||||
@@ -153,6 +165,48 @@ static int lo_req_data(FAR struct ieee802154_driver_s *netdev,
|
|||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lo_addr2ip
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Create a MAC-based IP address from the IEEE 802.15.14 short or extended
|
||||||
|
* address of the MAC.
|
||||||
|
*
|
||||||
|
* 128 112 96 80 64 48 32 16
|
||||||
|
* ---- ---- ---- ---- ---- ---- ---- ----
|
||||||
|
* fe80 0000 0000 0000 0000 00ff fe00 xxxx 2-byte short address IEEE 48-bit MAC
|
||||||
|
* fe80 0000 0000 0000 xxxx xxxx xxxx xxxx 8-byte extended address IEEE EUI-64
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR
|
||||||
|
static void lo_addr2ip(FAR struct net_driver_s *dev)
|
||||||
|
{
|
||||||
|
dev->d_ipv6addr[0] = HTONS(0xfe80);
|
||||||
|
dev->d_ipv6addr[1] = 0;
|
||||||
|
dev->d_ipv6addr[2] = 0;
|
||||||
|
dev->d_ipv6addr[3] = 0;
|
||||||
|
dev->d_ipv6addr[4] = (uint16_t)g_eaddr[0] << 8 | (uint16_t)g_eaddr[1];
|
||||||
|
dev->d_ipv6addr[5] = (uint16_t)g_eaddr[2] << 8 | (uint16_t)g_eaddr[3];
|
||||||
|
dev->d_ipv6addr[6] = (uint16_t)g_eaddr[4] << 8 | (uint16_t)g_eaddr[5];
|
||||||
|
dev->d_ipv6addr[6] = (uint16_t)g_eaddr[6] << 8 | (uint16_t)g_eaddr[6];
|
||||||
|
dev->d_ipv6addr[6] ^= 0x200;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void lo_addr2ip(FAR struct net_driver_s *dev)
|
||||||
|
{
|
||||||
|
dev->d_ipv6addr[0] = HTONS(0xfe80);
|
||||||
|
dev->d_ipv6addr[1] = 0;
|
||||||
|
dev->d_ipv6addr[2] = 0;
|
||||||
|
dev->d_ipv6addr[3] = 0;
|
||||||
|
dev->d_ipv6addr[4] = 0;
|
||||||
|
dev->d_ipv6addr[5] = HTONS(0x00ff);
|
||||||
|
dev->d_ipv6addr[0] = HTONS(0xfe00);
|
||||||
|
dev->d_ipv6addr[0] = htons(g_saddr) ^ 0x0200;
|
||||||
|
dev->d_ipv6addr[6] ^= 0x200;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: lo_loopback
|
* Name: lo_loopback
|
||||||
*
|
*
|
||||||
@@ -580,8 +634,12 @@ static int lo_rmmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac)
|
|||||||
static int lo_ioctl(FAR struct net_driver_s *dev, int cmd,
|
static int lo_ioctl(FAR struct net_driver_s *dev, int cmd,
|
||||||
unsigned long arg)
|
unsigned long arg)
|
||||||
{
|
{
|
||||||
#if 0
|
FAR struct lo_driver_s *priv;
|
||||||
FAR struct lo_driver_s *priv = (FAR struct lo_driver_s *)dev->d_private;
|
|
||||||
|
DEBUGASSERT(dev != NULL && dev->d_private != NULL);
|
||||||
|
priv = (FAR struct lo_driver_s *)dev->d_private;
|
||||||
|
|
||||||
|
UNUSED(priv);
|
||||||
|
|
||||||
/* Check for IOCTLs aimed at the IEEE802.15.4 MAC layer */
|
/* Check for IOCTLs aimed at the IEEE802.15.4 MAC layer */
|
||||||
|
|
||||||
@@ -589,9 +647,71 @@ static int lo_ioctl(FAR struct net_driver_s *dev, int cmd,
|
|||||||
{
|
{
|
||||||
FAR struct ieee802154_netmac_s *netmac =
|
FAR struct ieee802154_netmac_s *netmac =
|
||||||
(FAR struct ieee802154_netmac_s *)arg;
|
(FAR struct ieee802154_netmac_s *)arg;
|
||||||
|
|
||||||
|
DEBUGASSERT(netmac != NULL);
|
||||||
|
|
||||||
|
if (cmd == MAC802154IOC_MLME_SET_REQUEST)
|
||||||
|
{
|
||||||
|
FAR struct ieee802154_set_req_s *setreq = &netmac->u.setreq;
|
||||||
|
|
||||||
|
switch (setreq->attr)
|
||||||
|
{
|
||||||
|
case IEEE802154_ATTR_MAC_PANID:
|
||||||
|
g_panid = setreq->attrval.mac.panid;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IEEE802154_ATTR_MAC_EXTENDED_ADDR:
|
||||||
|
memcpy(setreq->attrval.mac.eaddr, g_eaddr, 8);
|
||||||
|
#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR
|
||||||
|
lo_addr2ip(dev);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IEEE802154_ATTR_MAC_SHORT_ADDRESS:
|
||||||
|
g_saddr = setreq->attrval.mac.saddr;
|
||||||
|
#ifndef CONFIG_NET_6LOWPAN_EXTENDEDADDR
|
||||||
|
lo_addr2ip(dev);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return -ENOTTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
else if (cmd == MAC802154IOC_MLME_GET_REQUEST)
|
||||||
|
{
|
||||||
|
FAR struct ieee802154_get_req_s *getreq = &netmac->u.getreq;
|
||||||
|
|
||||||
|
switch (getreq->attr)
|
||||||
|
{
|
||||||
|
case IEEE802154_ATTR_MAC_PANID:
|
||||||
|
getreq->attrval.mac.panid = g_panid;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IEEE802154_ATTR_MAC_EXTENDED_ADDR:
|
||||||
|
memcpy(g_eaddr, getreq->attrval.mac.eaddr, 8);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IEEE802154_ATTR_MAC_SHORT_ADDRESS:
|
||||||
|
getreq->attrval.mac.saddr = g_saddr;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return -ENOTTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Not a supported IEEE 802.15.4 MAC IOCTL command */
|
||||||
|
|
||||||
|
return -ENOTTY;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
/* Not a valid IEEE 802.15.4 MAC IOCTL command */
|
/* Not a valid IEEE 802.15.4 MAC IOCTL command */
|
||||||
|
|
||||||
@@ -741,6 +861,10 @@ int ieee8021514_loopback(void)
|
|||||||
dev->d_buf = g_iobuffer; /* Attach the IO buffer */
|
dev->d_buf = g_iobuffer; /* Attach the IO buffer */
|
||||||
dev->d_private = (FAR void *)priv; /* Used to recover private state from dev */
|
dev->d_private = (FAR void *)priv; /* Used to recover private state from dev */
|
||||||
|
|
||||||
|
/* Advertise our MAC-based IP address */
|
||||||
|
|
||||||
|
lo_addr2ip(dev);
|
||||||
|
|
||||||
/* Initialize the Network frame-related callbacks */
|
/* Initialize the Network frame-related callbacks */
|
||||||
|
|
||||||
ieee->i_get_mhrlen = lo_get_mhrlen; /* Get MAC header length */
|
ieee->i_get_mhrlen = lo_get_mhrlen; /* Get MAC header length */
|
||||||
|
|||||||
Reference in New Issue
Block a user