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:
parent
99dbcecc3a
commit
1e9bb7c175
@ -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;
|
||||
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user