static void kw2xrf_set_address(kw2xrf_t *dev) { DEBUG("[kw2xrf] set MAC addresses\n"); eui64_t addr_long; /* get an 8-byte unique ID to use as hardware address */ luid_get(addr_long.uint8, IEEE802154_LONG_ADDRESS_LEN); /* make sure we mark the address as non-multicast and not globally unique */ addr_long.uint8[0] &= ~(0x01); addr_long.uint8[0] |= (0x02); /* set short and long address */ kw2xrf_set_addr_long(dev, ntohll(addr_long.uint64.u64)); kw2xrf_set_addr_short(dev, ntohs(addr_long.uint16[0].u16)); }
static int _set(netdev_t *netdev, netopt_t opt, const void *value, size_t len) { kw2xrf_t *dev = (kw2xrf_t *)netdev; int res = -ENOTSUP; if (dev == NULL) { return -ENODEV; } switch (opt) { case NETOPT_ADDRESS: if (len > sizeof(uint16_t)) { res = -EOVERFLOW; } else { kw2xrf_set_addr_short(dev, *((uint16_t *)value)); /* don't set res to set netdev_ieee802154_t::short_addr */ } break; case NETOPT_ADDRESS_LONG: if (len > sizeof(uint64_t)) { return -EOVERFLOW; } else { kw2xrf_set_addr_long(dev, *((uint64_t *)value)); /* don't set res to set netdev_ieee802154_t::short_addr */ } break; case NETOPT_NID: if (len > sizeof(uint16_t)) { return -EOVERFLOW; } else { kw2xrf_set_pan(dev, *((uint16_t *)value)); /* don't set res to set netdev_ieee802154_t::pan */ } break; case NETOPT_CHANNEL: if (len != sizeof(uint16_t)) { res = -EINVAL; } else { uint8_t chan = ((uint8_t *)value)[0]; if (kw2xrf_set_channel(dev, chan)) { res = -EINVAL; break; } dev->netdev.chan = chan; /* don't set res to set netdev_ieee802154_t::chan */ } break; case NETOPT_CHANNEL_PAGE: res = -EINVAL; break; case NETOPT_TX_POWER: if (len < sizeof(uint16_t)) { res = -EOVERFLOW; } else { kw2xrf_set_tx_power(dev, *(int16_t *)value); res = sizeof(uint16_t); } break; case NETOPT_STATE: if (len > sizeof(netopt_state_t)) { res = -EOVERFLOW; } else { res = _set_state(dev, *((netopt_state_t *)value)); } break; case NETOPT_AUTOACK: /* Set up HW generated automatic ACK after Receive */ kw2xrf_set_option(dev, KW2XRF_OPT_AUTOACK, ((bool *)value)[0]); break; case NETOPT_ACK_REQ: kw2xrf_set_option(dev, KW2XRF_OPT_ACK_REQ, ((bool *)value)[0]); break; case NETOPT_PRELOADING: kw2xrf_set_option(dev, KW2XRF_OPT_PRELOADING, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_PROMISCUOUSMODE: kw2xrf_set_option(dev, KW2XRF_OPT_PROMISCUOUS, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_RX_START_IRQ: kw2xrf_set_option(dev, KW2XRF_OPT_TELL_RX_START, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_RX_END_IRQ: kw2xrf_set_option(dev, KW2XRF_OPT_TELL_RX_END, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_TX_START_IRQ: kw2xrf_set_option(dev, KW2XRF_OPT_TELL_TX_START, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_TX_END_IRQ: kw2xrf_set_option(dev, KW2XRF_OPT_TELL_TX_END, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_AUTOCCA: kw2xrf_set_option(dev, KW2XRF_OPT_AUTOCCA, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_CCA_THRESHOLD: if (len < sizeof(uint8_t)) { res = -EOVERFLOW; } else { kw2xrf_set_cca_threshold(dev, *((int8_t*)value)); res = sizeof(uint8_t); } break; case NETOPT_CCA_MODE: if (len < sizeof(uint8_t)) { res = -EOVERFLOW; } else { switch (*((int8_t*)value)) { case NETDEV_IEEE802154_CCA_MODE_1: case NETDEV_IEEE802154_CCA_MODE_2: case NETDEV_IEEE802154_CCA_MODE_3: kw2xrf_set_cca_mode(dev, *((int8_t*)value)); res = sizeof(uint8_t); break; case NETDEV_IEEE802154_CCA_MODE_4: case NETDEV_IEEE802154_CCA_MODE_5: case NETDEV_IEEE802154_CCA_MODE_6: default: break; } } break; case NETOPT_RF_TESTMODE: #ifdef KW2XRF_TESTMODE if (len < sizeof(uint8_t)) { res = -EOVERFLOW; } else { kw2xrf_set_test_mode(dev, *((uint8_t *)value)); res = sizeof(uint8_t); } #endif break; default: break; } if (res == -ENOTSUP) { res = netdev_ieee802154_set((netdev_ieee802154_t *)netdev, opt, value, len); } return res; }