1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-28 07:51:19 +01:00

net/gnrc_lorawan: add MIB for setting L2 address

This commit is contained in:
Jose Alamos 2019-12-03 14:27:56 +01:00
parent 99dbcecc3a
commit 1e9bb7c175
4 changed files with 42 additions and 24 deletions

View File

@ -73,7 +73,8 @@ typedef enum {
* @brief MAC Information Base attributes
*/
typedef enum {
MIB_ACTIVATION_METHOD /**< type is activation method */
MIB_ACTIVATION_METHOD, /**< type is activation method */
MIB_DEV_ADDR /**< type is dev addr */
} mlme_mib_type_t;
/**
@ -103,6 +104,7 @@ typedef struct {
mlme_mib_type_t type; /**< MIB attribute identifier */
union {
mlme_activation_t activation; /**< holds activation mechanism */
void *dev_addr; /**< pointer to the dev_addr */
};
} mlme_mib_t;

View File

@ -269,39 +269,18 @@ void gnrc_lorawan_process_pkt(gnrc_lorawan_t *mac, gnrc_pktsnip_t *pkt)
int gnrc_lorawan_netdev_get(netdev_t *dev, netopt_t opt, void *value, size_t max_len)
{
int res = 0;
gnrc_lorawan_t *mac = (gnrc_lorawan_t *) dev;
uint32_t tmp;
switch (opt) {
case NETOPT_ADDRESS:
assert(max_len >= sizeof(mac->dev_addr));
tmp = byteorder_swapl(mac->dev_addr.u32);
memcpy(value, &tmp, sizeof(mac->dev_addr));
res = sizeof(mac->dev_addr);
break;
default:
res = netdev_get_pass(dev, opt, value, max_len);
break;
}
return res;
return netdev_get_pass(dev, opt, value, max_len);
}
int gnrc_lorawan_netdev_set(netdev_t *dev, netopt_t opt, const void *value, size_t len)
{
gnrc_lorawan_t *mac = (gnrc_lorawan_t *) dev;
uint32_t tmp;
if (mac->busy) {
return -EBUSY;
}
switch (opt) {
case NETOPT_ADDRESS:
assert(len == sizeof(uint32_t));
tmp = byteorder_swapl(*((uint32_t *) value));
memcpy(&mac->dev_addr, &tmp, sizeof(uint32_t));
break;
case NETOPT_LORAWAN_RX2_DR:
assert(len == sizeof(uint8_t));
_set_rx2_dr(mac, *((uint8_t *) value));

View File

@ -189,6 +189,10 @@ static void _mlme_set(gnrc_lorawan_t *mac, const mlme_request_t *mlme_request,
mac->mlme.activation = mlme_request->mib.activation;
}
break;
case MIB_DEV_ADDR:
mlme_confirm->status = GNRC_LORAWAN_REQ_STATUS_SUCCESS;
memcpy(&mac->dev_addr, mlme_request->mib.dev_addr, sizeof(uint32_t));
break;
default:
break;
}
@ -202,6 +206,10 @@ static void _mlme_get(gnrc_lorawan_t *mac, const mlme_request_t *mlme_request,
mlme_confirm->status = GNRC_LORAWAN_REQ_STATUS_SUCCESS;
mlme_confirm->mib.activation = mac->mlme.activation;
break;
case MIB_DEV_ADDR:
mlme_confirm->status = GNRC_LORAWAN_REQ_STATUS_SUCCESS;
mlme_confirm->mib.dev_addr = &mac->dev_addr;
break;
default:
mlme_confirm->status = -EINVAL;
break;

View File

@ -67,6 +67,20 @@ void gnrc_lorawan_mlme_confirm(gnrc_lorawan_t *mac, mlme_confirm_t *confirm)
}
}
static inline void _set_be_addr(gnrc_lorawan_t *mac, uint8_t *be_addr)
{
uint32_t tmp = *((uint32_t*) be_addr);
tmp = byteorder_swapl(tmp);
mlme_request_t mlme_request;
mlme_confirm_t mlme_confirm;
mlme_request.type = MLME_SET;
mlme_request.mib.type = MIB_DEV_ADDR;
mlme_request.mib.dev_addr = &tmp;
gnrc_lorawan_mlme_request(mac, &mlme_request, &mlme_confirm);
}
void gnrc_lorawan_mcps_indication(gnrc_lorawan_t *mac, mcps_indication_t *ind)
{
(void) mac;
@ -165,7 +179,7 @@ static void _init(gnrc_netif_t *netif)
_memcpy_reversed(netif->lorawan.appeui, _appeui, sizeof(_appeui));
gnrc_lorawan_setup(&netif->lorawan.mac, netif->dev);
netif->lorawan.mac.netdev.driver->set(&netif->lorawan.mac.netdev, NETOPT_ADDRESS, _devaddr, sizeof(_devaddr));
_set_be_addr(&netif->lorawan.mac, _devaddr);
gnrc_lorawan_init(&netif->lorawan.mac, netif->lorawan.nwkskey, netif->lorawan.appskey);
}
@ -222,6 +236,7 @@ static void _msg_handler(gnrc_netif_t *netif, msg_t *msg)
static int _get(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt)
{
int res = 0;
uint32_t tmp;
mlme_confirm_t mlme_confirm;
mlme_request_t mlme_request;
@ -249,6 +264,16 @@ static int _get(gnrc_netif_t *netif, gnrc_netapi_opt_t *opt)
assert(opt->data_len == sizeof(uint8_t));
*((uint8_t *) opt->data) = netif->lorawan.demod_margin;
break;
case NETOPT_ADDRESS:
mlme_request.type = MLME_GET;
mlme_request.mib.type = MIB_DEV_ADDR;
gnrc_lorawan_mlme_request(&netif->lorawan.mac, &mlme_request, &mlme_confirm);
tmp = *((uint32_t*) mlme_confirm.mib.dev_addr);
tmp = byteorder_swapl(tmp);
memcpy(opt->data, &tmp, sizeof(uint32_t));
res = sizeof(uint32_t);
break;
default:
res = netif->lorawan.mac.netdev.driver->get(&netif->lorawan.mac.netdev, opt->opt, opt->data, opt->data_len);
break;
@ -329,6 +354,10 @@ static int _set(gnrc_netif_t *netif, const gnrc_netapi_opt_t *opt)
}
break;
}
case NETOPT_ADDRESS:
assert(opt->data_len == sizeof(uint32_t));
_set_be_addr(&netif->lorawan.mac, opt->data);
break;
case NETOPT_LINK_CHECK:
netif->lorawan.flags |= GNRC_NETIF_LORAWAN_FLAGS_LINK_CHECK;
break;