net: ieee802154: Expose basic network parameters through net mgmt API

It is then possible to set the channel, pan_id and short address through
this API. Such features are mainly useful for testing purposes.

Change-Id: I41aeb397afdb231458a3b13638f3e13d3ac28a6c
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit is contained in:
Tomasz Bursztyka 2017-01-05 12:41:02 +01:00
commit 6b41aecd99
2 changed files with 71 additions and 0 deletions

View file

@ -68,6 +68,9 @@ enum net_request_ieee802154_cmd {
NET_REQUEST_IEEE802154_CMD_CANCEL_SCAN,
NET_REQUEST_IEEE802154_CMD_ASSOCIATE,
NET_REQUEST_IEEE802154_CMD_DISASSOCIATE,
NET_REQUEST_IEEE802154_CMD_SET_CHAN,
NET_REQUEST_IEEE802154_CMD_SET_PAN_ID,
NET_REQUEST_IEEE802154_CMD_SET_SHORT_ADDR,
};
@ -106,6 +109,20 @@ NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_ASSOCIATE);
NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_DISASSOCIATE);
#define NET_REQUEST_IEEE802154_SET_CHAN \
(_NET_IEEE802154_BASE | NET_REQUEST_IEEE802154_CMD_SET_CHAN)
NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_CHAN);
#define NET_REQUEST_IEEE802154_SET_PAN_ID \
(_NET_IEEE802154_BASE | NET_REQUEST_IEEE802154_CMD_SET_PAN_ID)
NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_PAN_ID);
#define NET_REQUEST_IEEE802154_SET_SHORT_ADDR \
(_NET_IEEE802154_BASE | NET_REQUEST_IEEE802154_CMD_SET_SHORT_ADDR)
NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_SHORT_ADDR);
enum net_event_ieee802154_cmd {
NET_EVENT_IEEE802154_CMD_SCAN_RESULT = 1,

View file

@ -377,3 +377,57 @@ NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_ACK,
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_UNSET_ACK,
ieee802154_set_ack);
static int ieee802154_set_parameters(uint32_t mgmt_request,
struct net_if *iface,
void *data, size_t len)
{
const struct ieee802154_radio_api *radio = iface->dev->driver_api;
struct ieee802154_context *ctx = net_if_l2_data(iface);
uint16_t value;
int ret = 0;
if (ctx->associated) {
return -EBUSY;
}
if (len != sizeof(uint16_t)) {
return -EINVAL;
}
value = *((uint16_t *) data);
if (mgmt_request == NET_REQUEST_IEEE802154_SET_CHAN) {
if (ctx->channel != value) {
ret = radio->set_channel(iface->dev, value);
if (!ret) {
ctx->channel = value;
}
}
} else if (mgmt_request == NET_REQUEST_IEEE802154_SET_PAN_ID) {
if (ctx->pan_id != value) {
ret = radio->set_pan_id(iface->dev, value);
if (!ret) {
ctx->pan_id = value;
}
}
} else {
if (ctx->coord.short_addr != value) {
ret = radio->set_short_addr(iface->dev, value);
if (!ret) {
ctx->coord.short_addr = value;
}
}
}
return ret;
}
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_CHAN,
ieee802154_set_parameters);
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_PAN_ID,
ieee802154_set_parameters);
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_IEEE802154_SET_SHORT_ADDR,
ieee802154_set_parameters);