static int _set(netdev_t *netdev, netopt_t opt, const void *val, size_t max_len) { DEBUG("%s: %s %p %p %u\n", __func__, netopt2str(opt), netdev, val, max_len); CHECK_PARAM_RET (netdev != NULL, -ENODEV); CHECK_PARAM_RET (val != NULL, -EINVAL); esp_now_netdev_t *dev = (esp_now_netdev_t *) netdev; int res = -ENOTSUP; switch (opt) { #ifdef MODULE_GNRC case NETOPT_PROTO: CHECK_PARAM_RET(max_len == sizeof(gnrc_nettype_t), -EOVERFLOW); dev->proto = *((gnrc_nettype_t *)val); res = sizeof(gnrc_nettype_t); break; #endif case NETOPT_ADDRESS: CHECK_PARAM_RET(max_len >= sizeof(dev->addr), -EOVERFLOW); memcpy(dev->addr, val, sizeof(dev->addr)); res = sizeof(dev->addr); break; default: DEBUG("%s: %s not supported\n", __func__, netopt2str(opt)); break; } return res; }
static int _get(netdev_t *netdev, netopt_t opt, void *val, size_t max_len) { ESP_WIFI_DEBUG("%s %p %p %u", netopt2str(opt), netdev, val, max_len); assert(netdev != NULL); assert(val != NULL); esp_wifi_netdev_t *dev = (esp_wifi_netdev_t*)netdev; switch (opt) { case NETOPT_IS_WIRED: return -ENOTSUP; case NETOPT_LINK_CONNECTED: assert(max_len == 1); if (dev->state == ESP_WIFI_CONNECTED) { *((netopt_enable_t *)val) = NETOPT_ENABLE; } else { *((netopt_enable_t *)val) = NETOPT_DISABLE; } return 1; case NETOPT_ADDRESS: assert(max_len >= sizeof(dev->mac)); memcpy(val, dev->mac, sizeof(dev->mac)); return sizeof(dev->mac); default: return netdev_eth_get(netdev, opt, val, max_len); } }
static int _set(netdev_t *netdev, netopt_t opt, const void *val, size_t max_len) { ESP_WIFI_DEBUG("%s %p %p %u", netopt2str(opt), netdev, val, max_len); assert(netdev != NULL); assert(val != NULL); esp_wifi_netdev_t *dev = (esp_wifi_netdev_t *) netdev; switch (opt) { case NETOPT_ADDRESS: assert(max_len >= sizeof(dev->mac)); memcpy(dev->mac, val, sizeof(dev->mac)); return sizeof(dev->mac); default: return netdev_eth_set(netdev, opt, val, max_len); } }
/** * @brief Startup code and event loop of the gnrc_netdev2 layer * * @param[in] args expects a pointer to the underlying netdev device * * @return never returns */ static void *_gnrc_netdev2_thread(void *args) { DEBUG("gnrc_netdev2: starting thread\n"); gnrc_netdev2_t *gnrc_netdev2 = (gnrc_netdev2_t*) args; netdev2_t *dev = gnrc_netdev2->dev; gnrc_netdev2->pid = thread_getpid(); gnrc_netapi_opt_t *opt; int res; msg_t msg, reply, msg_queue[NETDEV2_NETAPI_MSG_QUEUE_SIZE]; /* setup the MAC layers message queue */ msg_init_queue(msg_queue, NETDEV2_NETAPI_MSG_QUEUE_SIZE); /* register the event callback with the device driver */ dev->event_callback = _event_cb; dev->context = (void*) gnrc_netdev2; /* register the device to the network stack*/ gnrc_netif_add(thread_getpid()); /* initialize low-level driver */ dev->driver->init(dev); /* start the event loop */ while (1) { DEBUG("gnrc_netdev2: waiting for incoming messages\n"); msg_receive(&msg); /* dispatch NETDEV and NETAPI messages */ switch (msg.type) { case NETDEV2_MSG_TYPE_EVENT: DEBUG("gnrc_netdev2: GNRC_NETDEV_MSG_TYPE_EVENT received\n"); dev->driver->isr(dev); break; case GNRC_NETAPI_MSG_TYPE_SND: DEBUG("gnrc_netdev2: GNRC_NETAPI_MSG_TYPE_SND received\n"); gnrc_pktsnip_t *pkt = (gnrc_pktsnip_t *)msg.content.ptr; gnrc_netdev2->send(gnrc_netdev2, pkt); break; case GNRC_NETAPI_MSG_TYPE_SET: /* read incoming options */ opt = (gnrc_netapi_opt_t *)msg.content.ptr; DEBUG("gnrc_netdev2: GNRC_NETAPI_MSG_TYPE_SET received. opt=%s\n", netopt2str(opt->opt)); /* set option for device driver */ res = dev->driver->set(dev, opt->opt, opt->data, opt->data_len); DEBUG("gnrc_netdev2: response of netdev->set: %i\n", res); /* send reply to calling thread */ reply.type = GNRC_NETAPI_MSG_TYPE_ACK; reply.content.value = (uint32_t)res; msg_reply(&msg, &reply); break; case GNRC_NETAPI_MSG_TYPE_GET: /* read incoming options */ opt = (gnrc_netapi_opt_t *)msg.content.ptr; DEBUG("gnrc_netdev2: GNRC_NETAPI_MSG_TYPE_GET received. opt=%s\n", netopt2str(opt->opt)); /* get option from device driver */ res = dev->driver->get(dev, opt->opt, opt->data, opt->data_len); DEBUG("gnrc_netdev2: response of netdev->get: %i\n", res); /* send reply to calling thread */ reply.type = GNRC_NETAPI_MSG_TYPE_ACK; reply.content.value = (uint32_t)res; msg_reply(&msg, &reply); break; default: DEBUG("gnrc_netdev2: Unknown command %" PRIu16 "\n", msg.type); break; } } /* never reached */ return NULL; }
static void *_gnrc_netif_thread(void *args) { gnrc_netapi_opt_t *opt; gnrc_netif_t *netif; netdev_t *dev; int res; msg_t reply = { .type = GNRC_NETAPI_MSG_TYPE_ACK }; msg_t msg, msg_queue[_NETIF_NETAPI_MSG_QUEUE_SIZE]; DEBUG("gnrc_netif: starting thread %i\n", sched_active_pid); netif = args; gnrc_netif_acquire(netif); dev = netif->dev; netif->pid = sched_active_pid; /* setup the link-layer's message queue */ msg_init_queue(msg_queue, _NETIF_NETAPI_MSG_QUEUE_SIZE); /* register the event callback with the device driver */ dev->event_callback = _event_cb; dev->context = netif; /* initialize low-level driver */ dev->driver->init(dev); _init_from_device(netif); netif->cur_hl = GNRC_NETIF_DEFAULT_HL; #ifdef MODULE_GNRC_IPV6_NIB gnrc_ipv6_nib_init_iface(netif); #endif if (netif->ops->init) { netif->ops->init(netif); } /* now let rest of GNRC use the interface */ gnrc_netif_release(netif); while (1) { DEBUG("gnrc_netif: waiting for incoming messages\n"); msg_receive(&msg); /* dispatch netdev, MAC and gnrc_netapi messages */ switch (msg.type) { case NETDEV_MSG_TYPE_EVENT: DEBUG("gnrc_netif: GNRC_NETDEV_MSG_TYPE_EVENT received\n"); dev->driver->isr(dev); break; case GNRC_NETAPI_MSG_TYPE_SND: DEBUG("gnrc_netif: GNRC_NETDEV_MSG_TYPE_SND received\n"); res = netif->ops->send(netif, msg.content.ptr); if (res < 0) { DEBUG("gnrc_netif: error sending packet %p (code: %u)\n", msg.content.ptr, res); } break; case GNRC_NETAPI_MSG_TYPE_SET: opt = msg.content.ptr; #ifdef MODULE_NETOPT DEBUG("gnrc_netif: GNRC_NETAPI_MSG_TYPE_SET received. opt=%s\n", netopt2str(opt->opt)); #else DEBUG("gnrc_netif: GNRC_NETAPI_MSG_TYPE_SET received. opt=%d\n", opt->opt); #endif /* set option for device driver */ res = netif->ops->set(netif, opt); DEBUG("gnrc_netif: response of netif->ops->set(): %i\n", res); reply.content.value = (uint32_t)res; msg_reply(&msg, &reply); break; case GNRC_NETAPI_MSG_TYPE_GET: opt = msg.content.ptr; #ifdef MODULE_NETOPT DEBUG("gnrc_netif: GNRC_NETAPI_MSG_TYPE_GET received. opt=%s\n", netopt2str(opt->opt)); #else DEBUG("gnrc_netif: GNRC_NETAPI_MSG_TYPE_GET received. opt=%d\n", opt->opt); #endif /* get option from device driver */ res = netif->ops->get(netif, opt); DEBUG("gnrc_netif: response of netif->ops->get(): %i\n", res); reply.content.value = (uint32_t)res; msg_reply(&msg, &reply); break; default: if (netif->ops->msg_handler) { DEBUG("gnrc_netif: delegate message of type 0x%04x to " "netif->ops->msg_handler()\n", msg.type); netif->ops->msg_handler(netif, &msg); } else { DEBUG("gnrc_netif: unknown message type 0x%04x" "(no message handler defined)\n", msg.type); } break; } } /* never reached */ return NULL; }
static int _get(netdev_t *netdev, netopt_t opt, void *val, size_t max_len) { DEBUG("%s: %s %p %p %u\n", __func__, netopt2str(opt), netdev, val, max_len); CHECK_PARAM_RET (netdev != NULL, -ENODEV); CHECK_PARAM_RET (val != NULL, -EINVAL); esp_now_netdev_t *dev = (esp_now_netdev_t *)netdev; int res = -ENOTSUP; switch (opt) { case NETOPT_DEVICE_TYPE: CHECK_PARAM_RET (max_len >= sizeof(uint16_t), -EOVERFLOW); *((uint16_t *)val) = NETDEV_TYPE_ESP_NOW; res = sizeof(uint16_t); break; #ifdef MODULE_GNRC case NETOPT_PROTO: CHECK_PARAM_RET(max_len == sizeof(gnrc_nettype_t), -EOVERFLOW); *((gnrc_nettype_t *)val) = dev->proto; res = sizeof(gnrc_nettype_t); break; #endif case NETOPT_MAX_PACKET_SIZE: CHECK_PARAM_RET (max_len >= sizeof(uint16_t), -EOVERFLOW); *((uint16_t *)val) = ESP_NOW_MAX_SIZE; res = sizeof(uint16_t); break; case NETOPT_ADDR_LEN: case NETOPT_SRC_LEN: CHECK_PARAM_RET (max_len >= sizeof(uint16_t), -EOVERFLOW); *((uint16_t *)val) = sizeof(dev->addr); res = sizeof(uint16_t); break; case NETOPT_ADDRESS: CHECK_PARAM_RET (max_len >= sizeof(dev->addr), -EOVERFLOW); memcpy(val, dev->addr, sizeof(dev->addr)); res = sizeof(dev->addr); break; case NETOPT_IPV6_IID: res = _get_iid(dev, val, max_len); break; #ifdef MODULE_NETSTATS_L2 case NETOPT_STATS: CHECK_PARAM_RET (max_len == sizeof(uintptr_t), -EOVERFLOW); *((netstats_t **)val) = &netdev->stats; res = sizeof(uintptr_t); break; #endif default: DEBUG("%s: %s not supported\n", __func__, netopt2str(opt)); break; } return res; }