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:
parent
415afe130e
commit
6b41aecd99
2 changed files with 71 additions and 0 deletions
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue