static int query_get(struct zoap_resource *resource, struct zoap_packet *request, const struct sockaddr *from) { struct zoap_option options[4]; struct net_pkt *pkt; struct net_buf *frag; struct zoap_packet response; u8_t *payload, code, type; u16_t len, id; int i, r; code = zoap_header_get_code(request); type = zoap_header_get_type(request); id = zoap_header_get_id(request); r = zoap_find_options(request, ZOAP_OPTION_URI_QUERY, options, 4); if (r <= 0) { return -EINVAL; } printk("*******\n"); printk("type: %u code %u id %u\n", type, code, id); printk("num queries: %d\n", r); for (i = 0; i < r; i++) { char str[16]; if (options[i].len + 1 > sizeof(str)) { printk("Unexpected length of query: " "%d (expected %zu)\n", options[i].len, sizeof(str)); break; } memcpy(str, options[i].value, options[i].len); str[options[i].len] = '\0'; printk("query[%d]: %s\n", i + 1, str); } printk("*******\n"); pkt = net_pkt_get_reserve(&zoap_pkt_slab, 0, K_NO_WAIT); if (!pkt) { return -ENOMEM; } frag = net_buf_alloc(&zoap_data_pool, K_NO_WAIT); if (!frag) { return -ENOMEM; } net_pkt_frag_add(pkt, frag); r = zoap_packet_init(&response, pkt); if (r < 0) { return -EINVAL; } /* FIXME: Could be that zoap_packet_init() sets some defaults */ zoap_header_set_version(&response, 1); zoap_header_set_type(&response, ZOAP_TYPE_ACK); zoap_header_set_code(&response, ZOAP_RESPONSE_CODE_CONTENT); zoap_header_set_id(&response, id); payload = zoap_packet_get_payload(&response, &len); if (!payload) { return -EINVAL; } /* The response that coap-client expects */ r = snprintk((char *)payload, len, "Type: %u\nCode: %u\nMID: %u\n", type, code, id); if (r < 0 || r > len) { return -EINVAL; } r = zoap_packet_set_used(&response, r); if (r) { return -EINVAL; } do { r = mbedtls_ssl_write(curr_ctx, frag->data, frag->len); } while (r == MBEDTLS_ERR_SSL_WANT_READ || r == MBEDTLS_ERR_SSL_WANT_WRITE); if (r >= 0) { r = 0; } net_pkt_unref(pkt); return r; }
static int sm_bootstrap_done(int index) { /* TODO: Fix this */ /* check that we should still use bootstrap */ if (clients[index].use_bootstrap) { #ifdef CONFIG_LWM2M_SECURITY_OBJ_SUPPORT int i; SYS_LOG_DBG("*** Bootstrap - checking for server info ..."); /* get the server URI */ if (sec_data->server_uri_len > 0) { /* TODO: Write endpoint parsing function */ #if 0 if (!parse_endpoint(sec_data->server_uri, sec_data->server_uri_len, &clients[index].reg_server)) { #else if (true) { #endif SYS_LOG_ERR("Failed to parse URI!"); } else { clients[index].has_registration_info = 1; clients[index].registered = 0; clients[index].bootstrapped++; } } else { SYS_LOG_ERR("** failed to parse URI"); } /* if we did not register above - then fail this and restart */ if (clients[index].bootstrapped == 0) { /* Not ready - Retry with the bootstrap server again */ set_sm_state(index, ENGINE_DO_BOOTSTRAP); } else { set_sm_state(index, ENGINE_DO_REGISTRATION); } } else { #endif set_sm_state(index, ENGINE_DO_REGISTRATION); } return 0; } static int sm_send_registration(int index, bool send_obj_support_data, zoap_reply_t reply_cb) { struct zoap_packet request; struct net_pkt *pkt = NULL; struct zoap_pending *pending = NULL; struct zoap_reply *reply = NULL; u8_t *payload; u16_t client_data_len, len; int ret = 0; /* remember the last reg time */ clients[index].last_update = k_uptime_get(); ret = lwm2m_init_message(clients[index].net_ctx, &request, &pkt, ZOAP_TYPE_CON, ZOAP_METHOD_POST, 0, NULL, 0); if (ret) { goto cleanup; } zoap_add_option(&request, ZOAP_OPTION_URI_PATH, LWM2M_RD_CLIENT_URI, strlen(LWM2M_RD_CLIENT_URI)); if (!clients[index].registered) { /* include client endpoint in URI QUERY on 1st registration */ zoap_add_option_int(&request, ZOAP_OPTION_CONTENT_FORMAT, LWM2M_FORMAT_APP_LINK_FORMAT); snprintf(query_buffer, sizeof(query_buffer) - 1, "lwm2m=%s", LWM2M_PROTOCOL_VERSION); zoap_add_option(&request, ZOAP_OPTION_URI_QUERY, query_buffer, strlen(query_buffer)); snprintf(query_buffer, sizeof(query_buffer) - 1, "ep=%s", clients[index].ep_name); zoap_add_option(&request, ZOAP_OPTION_URI_QUERY, query_buffer, strlen(query_buffer)); } else { /* include server endpoint in URI PATH otherwise */ zoap_add_option(&request, ZOAP_OPTION_URI_PATH, clients[index].server_ep, strlen(clients[index].server_ep)); } snprintf(query_buffer, sizeof(query_buffer) - 1, "lt=%d", clients[index].lifetime); zoap_add_option(&request, ZOAP_OPTION_URI_QUERY, query_buffer, strlen(query_buffer)); /* TODO: add supported binding query string */ if (send_obj_support_data) { /* generate the rd data */ client_data_len = lwm2m_get_rd_data(client_data, sizeof(client_data)); payload = zoap_packet_get_payload(&request, &len); if (!payload) { ret = -EINVAL; goto cleanup; } memcpy(payload, client_data, client_data_len); ret = zoap_packet_set_used(&request, client_data_len); if (ret) { goto cleanup; } } pending = lwm2m_init_message_pending(&request, &clients[index].reg_server, pendings, NUM_PENDINGS); if (!pending) { ret = -ENOMEM; goto cleanup; } reply = zoap_reply_next_unused(replies, NUM_REPLIES); if (!reply) { SYS_LOG_ERR("No resources for waiting for replies."); ret = -ENOMEM; goto cleanup; } zoap_reply_init(reply, &request); reply->reply = reply_cb; /* log the registration attempt */ SYS_LOG_DBG("registration sent [%s]", lwm2m_sprint_ip_addr(&clients[index].reg_server)); ret = lwm2m_udp_sendto(pkt, &clients[index].reg_server); if (ret < 0) { SYS_LOG_ERR("Error sending LWM2M packet (err:%d).", ret); goto cleanup; } zoap_pending_cycle(pending); k_delayed_work_submit(&retransmit_work, pending->timeout); return ret; cleanup: lwm2m_init_message_cleanup(pkt, pending, reply); return ret; } static int sm_do_registration(int index) { int ret = 0; if (clients[index].use_registration && !clients[index].registered && clients[index].has_registration_info) { ret = sm_send_registration(index, true, do_registration_reply_cb); if (!ret) { set_sm_state(index, ENGINE_REGISTRATION_SENT); } else { SYS_LOG_ERR("Registration err: %d", ret); } } return ret; }
static int piggyback_get(struct zoap_resource *resource, struct zoap_packet *request, const struct sockaddr *from) { struct net_pkt *pkt; struct net_buf *frag; struct zoap_packet response; u8_t *payload, code, type; u16_t len, id; int r; code = zoap_header_get_code(request); type = zoap_header_get_type(request); id = zoap_header_get_id(request); printk("*******\n"); printk("type: %u code %u id %u\n", type, code, id); printk("*******\n"); pkt = net_pkt_get_reserve(&zoap_pkt_slab, 0, K_NO_WAIT); if (!pkt) { return -ENOMEM; } frag = net_buf_alloc(&zoap_data_pool, K_NO_WAIT); if (!frag) { return -ENOMEM; } net_pkt_frag_add(pkt, frag); r = zoap_packet_init(&response, pkt); if (r < 0) { return -EINVAL; } zoap_header_set_version(&response, 1); zoap_header_set_type(&response, ZOAP_TYPE_ACK); zoap_header_set_code(&response, ZOAP_RESPONSE_CODE_CONTENT); zoap_header_set_id(&response, id); payload = zoap_packet_get_payload(&response, &len); if (!payload) { return -EINVAL; } /* The response that coap-client expects */ r = snprintk((char *)payload, len, "Type: %u\nCode: %u\nMID: %u\n", type, code, id); if (r < 0 || r > len) { return -EINVAL; } r = zoap_packet_set_used(&response, r); if (r) { return -EINVAL; } do { r = mbedtls_ssl_write(curr_ctx, frag->data, frag->len); } while (r == MBEDTLS_ERR_SSL_WANT_READ || r == MBEDTLS_ERR_SSL_WANT_WRITE); if (r >= 0) { r = 0; } net_pkt_unref(pkt); return r; }