static int _get(netdev_t *netdev, netopt_t opt, void *val, size_t max_len) { if (netdev == NULL) { return -ENODEV; } cc2420_t *dev = (cc2420_t *)netdev; int ext = netdev_ieee802154_get(&dev->netdev, opt, val, max_len); if (ext > 0) { return ext; } switch (opt) { case NETOPT_ADDRESS: assert(max_len >= sizeof(uint16_t)); cc2420_get_addr_short(dev, val); return sizeof(uint16_t); case NETOPT_ADDRESS_LONG: assert(max_len >= 8); cc2420_get_addr_long(dev, val); return 8; case NETOPT_NID: assert(max_len >= sizeof(uint16_t)); return w_u16(val, cc2420_get_pan(dev)); case NETOPT_CHANNEL: assert(max_len >= sizeof(uint16_t)); return w_u16(val, cc2420_get_chan(dev)); case NETOPT_TX_POWER: assert(max_len >= sizeof(int16_t)); return w_i16(val, cc2420_get_txpower(dev)); case NETOPT_STATE: assert(max_len >= sizeof(netopt_state_t)); *((netopt_state_t *)val) = cc2420_get_state(dev); return sizeof(netopt_state_t); case NETOPT_IS_CHANNEL_CLR: return opt_state(val, cc2420_cca(dev)); case NETOPT_AUTOACK: return opt_state(val, (dev->options & CC2420_OPT_AUTOACK)); case NETOPT_CSMA: return opt_state(val, (dev->options & CC2420_OPT_CSMA)); case NETOPT_PRELOADING: return opt_state(val, (dev->options & CC2420_OPT_PRELOADING)); case NETOPT_PROMISCUOUSMODE: return opt_state(val, (dev->options & CC2420_OPT_PROMISCUOUS)); case NETOPT_RX_START_IRQ: return opt_state(val, (dev->options & CC2420_OPT_TELL_RX_START)); case NETOPT_RX_END_IRQ: return opt_state(val, (dev->options & CC2420_OPT_TELL_TX_END)); case NETOPT_TX_START_IRQ: return opt_state(val, (dev->options & CC2420_OPT_TELL_RX_START)); case NETOPT_TX_END_IRQ: return opt_state(val, (dev->options & CC2420_OPT_TELL_RX_END)); default: return -ENOTSUP; } }
static int _get(netdev_t *netdev, netopt_t opt, void *value, size_t max_len) { cc2538_rf_t *dev = (cc2538_rf_t *)netdev; if (dev == NULL) { return -ENODEV; } switch (opt) { case NETOPT_ADDRESS: if (max_len < sizeof(uint16_t)) { return -EOVERFLOW; } else { *(uint16_t*)value = cc2538_get_addr_short(); } return sizeof(uint16_t); case NETOPT_ADDRESS_LONG: if (max_len < sizeof(uint64_t)) { return -EOVERFLOW; } else { *(uint64_t*)value = cc2538_get_addr_long(); } return sizeof(uint64_t); case NETOPT_AUTOACK: if (RFCORE->XREG_FRMCTRL0bits.AUTOACK) { *((netopt_enable_t *)value) = NETOPT_ENABLE; } else { *((netopt_enable_t *)value) = NETOPT_DISABLE; } return sizeof(netopt_enable_t); case NETOPT_CHANNEL: if (max_len < sizeof(uint16_t)) { return -EOVERFLOW; } *((uint16_t *)value) = (uint16_t)cc2538_get_chan(); return sizeof(uint16_t); case NETOPT_CHANNEL_PAGE: if (max_len < sizeof(uint16_t)) { return -EOVERFLOW; } /* This tranceiver only supports page 0 */ *((uint16_t *)value) = 0; return sizeof(uint16_t); case NETOPT_DEVICE_TYPE: if (max_len < sizeof(uint16_t)) { return -EOVERFLOW; } *((uint16_t *) value) = NETDEV_TYPE_IEEE802154; return sizeof(uint16_t); case NETOPT_IS_CHANNEL_CLR: if (cc2538_channel_clear()) { *((netopt_enable_t *)value) = NETOPT_ENABLE; } else { *((netopt_enable_t *)value) = NETOPT_DISABLE; } return sizeof(netopt_enable_t); case NETOPT_IS_WIRED: return -ENOTSUP; case NETOPT_PROMISCUOUSMODE: if (cc2538_get_monitor()) { *((netopt_enable_t *)value) = NETOPT_ENABLE; } else { *((netopt_enable_t *)value) = NETOPT_DISABLE; } return sizeof(netopt_enable_t); case NETOPT_STATE: if (max_len < sizeof(netopt_state_t)) { return -EOVERFLOW; } *((netopt_state_t *)value) = dev->state; return sizeof(netopt_state_t); case NETOPT_TX_POWER: if (max_len < sizeof(int16_t)) { return -EOVERFLOW; } *((uint16_t *)value) = cc2538_get_tx_power(); return sizeof(uint16_t); default: break; } int res; if (((res = netdev_ieee802154_get((netdev_ieee802154_t *)netdev, opt, value, max_len)) >= 0) || (res != -ENOTSUP)) { return res; } return -ENOTSUP; }
int _get(netdev_t *netdev, netopt_t opt, void *value, size_t len) { kw2xrf_t *dev = (kw2xrf_t *)netdev; if (dev == NULL) { return -ENODEV; } switch (opt) { case NETOPT_MAX_PACKET_SIZE: if (len < sizeof(int16_t)) { return -EOVERFLOW; } *((uint16_t *)value) = KW2XRF_MAX_PKT_LENGTH - _MAX_MHR_OVERHEAD; return sizeof(uint16_t); case NETOPT_STATE: if (len < sizeof(netopt_state_t)) { return -EOVERFLOW; } *((netopt_state_t *)value) = _get_state(dev); return sizeof(netopt_state_t); case NETOPT_PRELOADING: if (dev->netdev.flags & KW2XRF_OPT_PRELOADING) { *((netopt_enable_t *)value) = NETOPT_ENABLE; } else { *((netopt_enable_t *)value) = NETOPT_DISABLE; } return sizeof(netopt_enable_t); case NETOPT_PROMISCUOUSMODE: if (dev->netdev.flags & KW2XRF_OPT_PROMISCUOUS) { *((netopt_enable_t *)value) = NETOPT_ENABLE; } else { *((netopt_enable_t *)value) = NETOPT_DISABLE; } return sizeof(netopt_enable_t); case NETOPT_RX_START_IRQ: *((netopt_enable_t *)value) = !!(dev->netdev.flags & KW2XRF_OPT_TELL_RX_START); return sizeof(netopt_enable_t); case NETOPT_RX_END_IRQ: *((netopt_enable_t *)value) = !!(dev->netdev.flags & KW2XRF_OPT_TELL_RX_END); return sizeof(netopt_enable_t); case NETOPT_TX_START_IRQ: *((netopt_enable_t *)value) = !!(dev->netdev.flags & KW2XRF_OPT_TELL_TX_START); return sizeof(netopt_enable_t); case NETOPT_TX_END_IRQ: *((netopt_enable_t *)value) = !!(dev->netdev.flags & KW2XRF_OPT_TELL_TX_END); return sizeof(netopt_enable_t); case NETOPT_AUTOCCA: *((netopt_enable_t *)value) = !!(dev->netdev.flags & KW2XRF_OPT_AUTOCCA); return sizeof(netopt_enable_t); case NETOPT_TX_POWER: if (len < sizeof(int16_t)) { return -EOVERFLOW; } *((uint16_t *)value) = kw2xrf_get_txpower(dev); return sizeof(uint16_t); case NETOPT_IS_CHANNEL_CLR: if (kw2xrf_cca(dev)) { *((netopt_enable_t *)value) = NETOPT_ENABLE; } else { *((netopt_enable_t *)value) = NETOPT_DISABLE; } return sizeof(netopt_enable_t); case NETOPT_CCA_THRESHOLD: if (len < sizeof(uint8_t)) { return -EOVERFLOW; } else { *(int8_t *)value = kw2xrf_get_cca_threshold(dev); } return sizeof(int8_t); case NETOPT_CCA_MODE: if (len < sizeof(uint8_t)) { return -EOVERFLOW; } else { *(uint8_t *)value = kw2xrf_get_cca_mode(dev); switch (*((int8_t *)value)) { case NETDEV_IEEE802154_CCA_MODE_1: case NETDEV_IEEE802154_CCA_MODE_2: case NETDEV_IEEE802154_CCA_MODE_3: return sizeof(uint8_t); default: break; } return -EOVERFLOW; } break; case NETOPT_CHANNEL_PAGE: default: break; } return netdev_ieee802154_get((netdev_ieee802154_t *)netdev, opt, value, len); }