static void ipv4_addr_add_handler(struct net_mgmt_event_callback *cb, u32_t mgmt_event, struct net_if *iface) { char hr_addr[NET_IPV4_ADDR_LEN]; int i = 0; for (i = 0; i < NET_IF_MAX_IPV4_ADDR; i++) { struct net_if_addr *if_addr = &iface->ipv4.unicast[i]; if (if_addr->addr_type != NET_ADDR_DHCP || !if_addr->is_used) { continue; } NET_INFO("IPv4 address: %s", net_addr_ntop(AF_INET, &if_addr->address.in_addr, hr_addr, NET_IPV4_ADDR_LEN)); NET_INFO("Lease time: %u seconds", iface->dhcpv4.lease_time); NET_INFO("Subnet: %s", net_addr_ntop(AF_INET, &iface->ipv4.netmask, hr_addr, NET_IPV4_ADDR_LEN)); NET_INFO("Router: %s", net_addr_ntop(AF_INET, &iface->ipv4.gw, hr_addr, NET_IPV4_ADDR_LEN)); break; } }
static int do_sync_http_req(struct http_client_ctx *ctx, enum http_method method, const char *url, const char *content_type, const char *payload) { struct http_client_request req = {}; int ret; req.method = method; req.url = url; req.protocol = " " HTTP_PROTOCOL HTTP_CRLF; ret = http_client_send_req(ctx, &req, NULL, result, sizeof(result), NULL, APP_REQ_TIMEOUT); if (ret < 0) { NET_ERR("Cannot send %s request (%d)", http_method_str(method), ret); goto out; } if (ctx->rsp.data_len > sizeof(result)) { NET_ERR("Result buffer overflow by %zd bytes", ctx->rsp.data_len - sizeof(result)); ret = -E2BIG; } else { NET_INFO("HTTP server response status: %s", ctx->rsp.http_status); if (ctx->parser.http_errno) { if (method == HTTP_OPTIONS) { /* Ignore error if OPTIONS is not found */ goto out; } NET_INFO("HTTP parser status: %s", http_errno_description(ctx->parser.http_errno)); ret = -EINVAL; goto out; } if (method != HTTP_HEAD) { if (ctx->rsp.body_found) { NET_INFO("HTTP body: %zd bytes, " "expected: %zd bytes", ctx->rsp.processed, ctx->rsp.content_length); } else { NET_ERR("Error detected during HTTP msg " "processing"); } } } out: return ret; }
void main(void) { int ret; ret = http_client_init(&http_ctx, SERVER_ADDR, SERVER_PORT); if (ret < 0) { NET_ERR("HTTP init failed (%d)", ret); panic(NULL); } http_client_set_net_pkt_pool(&http_ctx, tx_slab, data_pool); ret = do_sync_reqs(&http_ctx, MAX_ITERATIONS); if (ret < 0) { goto out; } ret = do_async_reqs(&http_ctx, MAX_ITERATIONS); if (ret < 0) { goto out; } out: http_client_release(&http_ctx); NET_INFO("Done!"); }
void main(void) { NET_INFO("In main"); init_app(); main_fiber(); }
static inline void pkt_sent(struct net_context *context, int status, void *token, void *user_data) { if (!status) { NET_INFO("Sent %d bytes", POINTER_TO_UINT(token)); } }
static void handler(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface) { if (mgmt_event == NET_EVENT_IPV4_ADDR_ADD) { NET_INFO("NET_EVENT_IPV4_ADDR_ADD"); quit(); } }
void receive(void) { struct net_context *udp_recv4 = { 0 }; struct net_context *udp_recv6 = { 0 }; struct net_context *tcp_recv4 = { 0 }; struct net_context *tcp_recv6 = { 0 }; if (!get_context(&udp_recv4, &udp_recv6, &tcp_recv4, &tcp_recv6)) { NET_ERR("Cannot get network contexts"); return; } NET_INFO("Starting to wait"); #if defined(CONFIG_NET_TCP) setup_tcp_accept(tcp_recv4, tcp_recv6); #endif #if defined(CONFIG_NET_UDP) setup_udp_recv(udp_recv4, udp_recv6); #endif k_sem_take(&quit_lock, K_FOREVER); NET_INFO("Stopping..."); #if defined(CONFIG_NET_IPV6) && defined(CONFIG_NET_UDP) net_context_put(udp_recv6); #endif #if defined(CONFIG_NET_IPV4) && defined(CONFIG_NET_UDP) net_context_put(udp_recv4); #endif #if defined(CONFIG_NET_IPV6) && defined(CONFIG_NET_TCP) net_context_put(tcp_recv6); #endif #if defined(CONFIG_NET_IPV4) && defined(CONFIG_NET_TCP) net_context_put(tcp_recv4); #endif }
static void setup_dhcpv4(struct net_if *iface) { NET_INFO("Running dhcpv4 client..."); net_mgmt_init_event_callback(&mgmt_cb, ipv4_addr_add_handler, NET_EVENT_IPV4_ADDR_ADD); net_mgmt_add_event_callback(&mgmt_cb); net_dhcpv4_start(iface); }
void main(void) { struct net_if *iface = net_if_get_default(); NET_INFO("Starting Telnet sample"); setup_ipv4(iface); setup_dhcpv4(iface); setup_ipv6(iface); }
static void setup_device(void) { char hr_addr[NET_IPV6_ADDR_LEN]; struct net_if *iface; struct in6_addr addr; struct device *dev; dev = device_get_binding(CONFIG_IEEE802154_UPIPE_DRV_NAME); if (!dev) { NET_INFO("Cannot get UPIPE device\n"); return; } iface = net_if_lookup_by_dev(dev); if (!iface) { NET_INFO("Cannot get UPIPE network interface\n"); return; } if (net_addr_pton(AF_INET6, CONFIG_NET_APP_MY_IPV6_ADDR, &addr)) { NET_ERR("Invalid address: %s", CONFIG_NET_APP_MY_IPV6_ADDR); return; } net_if_ipv6_addr_add(iface, &addr, NET_ADDR_MANUAL, 0); NET_INFO("IPv6 address: %s", net_addr_ntop(AF_INET6, &addr, hr_addr, NET_IPV6_ADDR_LEN)); if (net_addr_pton(AF_INET6, MCAST_IP6ADDR, &addr)) { NET_ERR("Invalid address: %s", MCAST_IP6ADDR); return; } NET_INFO("802.15.4 device up and running\n"); }
static void setup_ipv4(struct net_if *iface) { char hr_addr[NET_IPV4_ADDR_LEN]; struct in_addr addr; if (net_addr_pton(AF_INET, CONFIG_NET_APP_MY_IPV4_ADDR, &addr)) { NET_ERR("Invalid address: %s", CONFIG_NET_APP_MY_IPV4_ADDR); return; } net_if_ipv4_addr_add(iface, &addr, NET_ADDR_MANUAL, 0); NET_INFO("IPv4 address: %s", net_addr_ntop(AF_INET, &addr, hr_addr, NET_IPV4_ADDR_LEN)); }
static inline void init_app(void) { struct net_if *iface; NET_INFO("Run dhcpv4 client"); iface = net_if_get_default(); net_dhcpv4_start(iface); k_sem_init(&quit_lock, 0, UINT_MAX); net_mgmt_init_event_callback(&mgmt_cb, handler, NET_EVENT_IPV4_ADDR_ADD); net_mgmt_add_event_callback(&mgmt_cb); }
static inline void init_app(void) { NET_INFO("Run echo server"); k_sem_init(&quit_lock, 0, UINT_MAX); #if defined(CONFIG_NET_IPV6) #if defined(CONFIG_NET_APP_MY_IPV6_ADDR) if (net_addr_pton(AF_INET6, CONFIG_NET_APP_MY_IPV6_ADDR, &in6addr_my) < 0) { NET_ERR("Invalid IPv6 address %s", CONFIG_NET_APP_MY_IPV6_ADDR); } #endif do { struct net_if_addr *ifaddr; ifaddr = net_if_ipv6_addr_add(net_if_get_default(), &in6addr_my, NET_ADDR_MANUAL, 0); } while (0); #endif #if defined(CONFIG_NET_IPV4) #if defined(CONFIG_NET_DHCPV4) net_dhcpv4_start(net_if_get_default()); #else #if defined(CONFIG_NET_APP_MY_IPV4_ADDR) if (net_addr_pton(AF_INET, CONFIG_NET_APP_MY_IPV4_ADDR, &in4addr_my) < 0) { NET_ERR("Invalid IPv4 address %s", CONFIG_NET_APP_MY_IPV4_ADDR); } net_if_ipv4_addr_add(net_if_get_default(), &in4addr_my, NET_ADDR_MANUAL, 0); #endif #endif /* CONFIG_NET_DHCPV4 */ #endif /* CONFIG_NET_IPV4 */ }
static void setup_ipv6(struct net_if *iface) { char hr_addr[NET_IPV6_ADDR_LEN]; struct in6_addr addr; if (net_addr_pton(AF_INET6, CONFIG_NET_APP_MY_IPV6_ADDR, &addr)) { NET_ERR("Invalid address: %s", CONFIG_NET_APP_MY_IPV6_ADDR); return; } net_if_ipv6_addr_add(iface, &addr, NET_ADDR_MANUAL, 0); NET_INFO("IPv6 address: %s", net_addr_ntop(AF_INET6, &addr, hr_addr, NET_IPV6_ADDR_LEN)); if (net_addr_pton(AF_INET6, MCAST_IP6ADDR, &addr)) { NET_ERR("Invalid address: %s", MCAST_IP6ADDR); return; } net_if_ipv6_maddr_add(iface, &addr); }
/* TODO: Handles only DHCPv4 OFFER and ACK messages */ static inline void handle_dhcpv4_reply(struct net_if *iface, uint8_t msg_type) { /* * Check for previous state, reason behind this check is, if client * receives multiple OFFER messages, first one will be handled. * Rest of the replies are discarded. */ if (iface->dhcpv4.state == NET_DHCPV4_DISCOVER) { if (msg_type != NET_DHCPV4_OFFER) { NET_DBG("Reply not handled %d", msg_type); return; } /* Send DHCPv4 Request Message */ k_delayed_work_cancel(&iface->dhcpv4_timeout); send_request(iface, false); } else if (iface->dhcpv4.state == NET_DHCPV4_REQUEST || iface->dhcpv4.state == NET_DHCPV4_RENEWAL) { if (msg_type != NET_DHCPV4_ACK) { NET_DBG("Reply not handled %d", msg_type); return; } k_delayed_work_cancel(&iface->dhcpv4_timeout); switch (iface->dhcpv4.state) { case NET_DHCPV4_REQUEST: NET_INFO("Received: %s", net_sprint_ipv4_addr( &iface->dhcpv4.requested_ip)); if (!net_if_ipv4_addr_add(iface, &iface->dhcpv4.requested_ip, NET_ADDR_DHCP, iface->dhcpv4.lease_time)) { NET_DBG("Failed to add IPv4 addr to iface %p", iface); return; } break; case NET_DHCPV4_RENEWAL: /* TODO: if the renewal is success, update only * vlifetime on iface */ break; default: break; } iface->dhcpv4.attempts = 0; iface->dhcpv4.state = NET_DHCPV4_ACK; /* Start renewal time */ k_delayed_work_init(&iface->dhcpv4_t1_timer, dhcpv4_t1_timeout); k_delayed_work_submit(&iface->dhcpv4_t1_timer, get_dhcpv4_renewal_time(iface)); } }
static struct net_pkt *build_reply_pkt(const char *name, struct net_context *context, struct net_pkt *pkt) { struct net_pkt *reply_pkt; struct net_buf *frag, *tmp; int header_len, recv_len, reply_len; NET_INFO("%s received %d bytes", name, net_pkt_appdatalen(pkt)); if (net_pkt_appdatalen(pkt) == 0) { return NULL; } reply_pkt = net_pkt_get_tx(context, K_FOREVER); NET_ASSERT(reply_pkt); recv_len = net_pkt_get_len(pkt); tmp = pkt->frags; /* First fragment will contain IP header so move the data * down in order to get rid of it. */ header_len = net_pkt_appdata(pkt) - tmp->data; NET_ASSERT(header_len < CONFIG_NET_BUF_DATA_SIZE); /* After this pull, the tmp->data points directly to application * data. */ net_buf_pull(tmp, header_len); while (tmp) { frag = net_pkt_get_data(context, K_FOREVER); if (!net_buf_headroom(tmp)) { /* If there is no link layer headers in the * received fragment, then get rid of that also * in the sending fragment. We end up here * if MTU is larger than fragment size, this * is typical for ethernet. */ net_buf_push(frag, net_buf_headroom(frag)); frag->len = 0; /* to make fragment empty */ /* Make sure to set the reserve so that * in sending side we add the link layer * header if needed. */ net_pkt_set_ll_reserve(reply_pkt, 0); } NET_ASSERT(net_buf_tailroom(frag) >= tmp->len); memcpy(net_buf_add(frag, tmp->len), tmp->data, tmp->len); net_pkt_frag_add(reply_pkt, frag); tmp = net_pkt_frag_del(pkt, NULL, tmp); } reply_len = net_pkt_get_len(reply_pkt); NET_ASSERT_INFO((recv_len - header_len) == reply_len, "Received %d bytes, sending %d bytes", recv_len - header_len, reply_len); return reply_pkt; }
void response(struct http_client_ctx *ctx, u8_t *data, size_t buflen, size_t datalen, enum http_final_call data_end, void *user_data) { struct waiter *waiter = user_data; int ret; if (data_end == HTTP_DATA_MORE) { NET_INFO("Received %zd bytes piece of data", datalen); /* Do something with the data here. For this example * we just ignore the received data. */ waiter->total_len += datalen; if (ctx->rsp.body_start) { /* This fragment contains the start of the body * Note that the header length is not proper if * the header is spanning over multiple recv * fragments. */ waiter->header_len = ctx->rsp.body_start - ctx->rsp.response_buf; } return; } waiter->total_len += datalen; NET_INFO("HTTP server response status: %s", ctx->rsp.http_status); if (ctx->parser.http_errno) { if (ctx->req.method == HTTP_OPTIONS) { /* Ignore error if OPTIONS is not found */ goto out; } NET_INFO("HTTP parser status: %s", http_errno_description(ctx->parser.http_errno)); ret = -EINVAL; goto out; } if (ctx->req.method != HTTP_HEAD && ctx->req.method != HTTP_OPTIONS) { if (ctx->rsp.body_found) { NET_INFO("HTTP body: %zd bytes, expected: %zd bytes", ctx->rsp.processed, ctx->rsp.content_length); } else { NET_ERR("Error detected during HTTP msg processing"); } if (waiter->total_len != waiter->header_len + ctx->rsp.content_length) { NET_ERR("Error while receiving data, " "received %zd expected %zd bytes", waiter->total_len, waiter->header_len + ctx->rsp.content_length); } } out: k_sem_give(&waiter->wait); }