Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 25 additions & 33 deletions include/net/lwm2m.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
#ifndef ZEPHYR_INCLUDE_NET_LWM2M_H_
#define ZEPHYR_INCLUDE_NET_LWM2M_H_

#include <net/net_app.h>
#include <net/coap.h>
#include <kernel.h>
#include <net/coap_sock.h>

/* LWM2M Objects defined by OMA */

Expand All @@ -32,38 +32,32 @@
*
* @details Context structure for the LwM2M high-level API.
*
* @param net_app_ctx Related network application context.
* @param net_init_timeout Used if the net_app API needs to do some time
* consuming operation, like resolving DNS address.
* @param net_timeout How long to wait for the network connection before
* giving up.
* @param remote_addr Stored remote IP address of the LwM2M client
*/
struct lwm2m_ctx {
/** Net app context structure */
struct net_app_ctx net_app_ctx;
s32_t net_init_timeout;
s32_t net_timeout;
/** destination address storage */
struct sockaddr remote_addr;

/** Private CoAP and networking structures */
struct coap_pending pendings[CONFIG_LWM2M_ENGINE_MAX_PENDING];
struct coap_reply replies[CONFIG_LWM2M_ENGINE_MAX_REPLIES];
struct k_delayed_work retransmit_work;

#if defined(CONFIG_NET_APP_DTLS)
/** Pre-Shared Key Information*/
unsigned char *client_psk;
size_t client_psk_len;
char *client_psk_id;
size_t client_psk_id_len;

/** DTLS support structures */
char *cert_host;
u8_t *dtls_result_buf;
size_t dtls_result_buf_len;
struct k_mem_pool *dtls_pool;
k_thread_stack_t *dtls_stack;
size_t dtls_stack_len;
#if defined(CONFIG_LWM2M_DTLS_SUPPORT)
/** DTLS settings */
int tls_tag;
#endif
bool use_dtls;

/** Current security object index */
int sec_obj_inst;
bool bootstrap_mode;

/** Packet Flow Settings */
bool handle_separate_response;

/** Socket File Descriptor */
int sock_fd;
};

typedef void *(*lwm2m_engine_get_data_cb_t)(u16_t obj_inst_id,
Expand Down Expand Up @@ -216,16 +210,16 @@ int lwm2m_engine_set_res_data(char *pathstr, void *data_ptr, u16_t data_len,
int lwm2m_engine_get_res_data(char *pathstr, void **data_ptr, u16_t *data_len,
u8_t *data_flags);

int lwm2m_engine_start(struct lwm2m_ctx *client_ctx,
char *peer_str, u16_t peer_port);
int lwm2m_engine_start(struct lwm2m_ctx *client_ctx);

/* LWM2M RD Client */

/* Client events */
enum lwm2m_rd_client_event {
LWM2M_RD_CLIENT_EVENT_NONE,
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_FAILURE,
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_COMPLETE,
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_FAILURE,
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_COMPLETE,
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_TRANSFER_COMPLETE,
LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE,
LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE,
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE,
Expand All @@ -238,9 +232,7 @@ enum lwm2m_rd_client_event {
typedef void (*lwm2m_ctx_event_cb_t)(struct lwm2m_ctx *ctx,
enum lwm2m_rd_client_event event);

int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx,
char *peer_str, u16_t peer_port,
const char *ep_name,
lwm2m_ctx_event_cb_t event_cb);
void lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx, const char *ep_name,
lwm2m_ctx_event_cb_t event_cb);

#endif /* ZEPHYR_INCLUDE_NET_LWM2M_H_ */
23 changes: 17 additions & 6 deletions samples/net/lwm2m_client/overlay-dtls.conf
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
CONFIG_NET_APP_DTLS=y
CONFIG_LWM2M_DTLS_SUPPORT=y
CONFIG_LWM2M_PEER_PORT=5684

CONFIG_MBEDTLS=y
CONFIG_MBEDTLS_BUILTIN=y
CONFIG_MBEDTLS_ENABLE_HEAP=y
# Special MbedTLS changes
CONFIG_MBEDTLS_HEAP_SIZE=8192
CONFIG_MBEDTLS_CFG_FILE="config-coap.h"
CONFIG_LWM2M_PEER_PORT=5684
CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=1500
CONFIG_MBEDTLS_CIPHER_CCM_ENABLED=y

# Disable RSA, we don't parse certs: saves flash/memory
CONFIG_MBEDTLS_KEY_EXCHANGE_RSA_ENABLED=n
# Enable PSK instead
CONFIG_MBEDTLS_KEY_EXCHANGE_PSK_ENABLED=y

CONFIG_NET_SOCKETS_SOCKOPT_TLS=y
CONFIG_NET_SOCKETS_TLS_MAX_CONTEXTS=4
CONFIG_NET_SOCKETS_ENABLE_DTLS=y

# MbedTLS needs a larger stack
CONFIG_MAIN_STACK_SIZE=2048
1 change: 0 additions & 1 deletion samples/net/lwm2m_client/overlay-wncm14a2a.conf
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ CONFIG_NET_CONFIG_PEER_IPV4_ADDR="5.39.83.206"

# extend retry timing to 20 seconds for LTE/LTE-M
CONFIG_COAP_INIT_ACK_TIMEOUT_MS=20000
CONFIG_COAP_NET_PKT=y

# Hack: disable IPv6 for now
CONFIG_NET_IPV6=n
Expand Down
3 changes: 1 addition & 2 deletions samples/net/lwm2m_client/prj.conf
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@ CONFIG_NET_BUF_RX_COUNT=10
CONFIG_NET_BUF_TX_COUNT=10
CONFIG_NET_MAX_CONTEXTS=5

CONFIG_NET_LOG=y
CONFIG_NET_SHELL=y

CONFIG_COAP=y
CONFIG_COAP_NET_PKT=y
CONFIG_NET_CONFIG_NEED_IPV6=y
CONFIG_NET_CONFIG_NEED_IPV4=y
CONFIG_NET_CONFIG_SETTINGS=y
Expand Down
106 changes: 51 additions & 55 deletions samples/net/lwm2m_client/src/lwm2m-client.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,15 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
#define CONFIG_NET_CONFIG_PEER_IPV6_ADDR ""
#endif

#if defined(CONFIG_NET_IPV6)
#define SERVER_ADDR CONFIG_NET_CONFIG_PEER_IPV6_ADDR
#elif defined(CONFIG_NET_IPV4)
#define SERVER_ADDR CONFIG_NET_CONFIG_PEER_IPV4_ADDR
#else
#error LwM2M requires either IPV6 or IPV4 support
#endif


#define WAIT_TIME K_SECONDS(10)
#define CONNECT_TIME K_SECONDS(10)

Expand Down Expand Up @@ -61,21 +70,8 @@ static u32_t led_state;

static struct lwm2m_ctx client;

#if defined(CONFIG_NET_APP_DTLS)
#if !defined(CONFIG_NET_APP_TLS_STACK_SIZE)
#define CONFIG_NET_APP_TLS_STACK_SIZE 30000
#endif /* CONFIG_NET_APP_TLS_STACK_SIZE */

#define HOSTNAME "localhost" /* for cert verification if that is enabled */

/* The result buf size is set to large enough so that we can receive max size
* buf back. Note that mbedtls needs also be configured to have equal size
* value for its buffer size. See MBEDTLS_SSL_MAX_CONTENT_LEN option in DTLS
* config file.
*/
#define RESULT_BUF_SIZE 1500

NET_APP_TLS_POOL_DEFINE(dtls_pool, 10);
#if defined(CONFIG_LWM2M_DTLS_SUPPORT)
#define TLS_TAG 1

/* "000102030405060708090a0b0c0d0e0f" */
static unsigned char client_psk[] = {
Expand All @@ -84,11 +80,7 @@ static unsigned char client_psk[] = {
};

static const char client_psk_id[] = "Client_identity";

static u8_t dtls_result[RESULT_BUF_SIZE];
NET_STACK_DEFINE(NET_APP_DTLS, net_app_dtls_stack,
CONFIG_NET_APP_TLS_STACK_SIZE, CONFIG_NET_APP_TLS_STACK_SIZE);
#endif /* CONFIG_NET_APP_DTLS */
#endif /* CONFIG_LWM2M_DTLS_SUPPORT */

static struct k_sem quit_lock;

Expand Down Expand Up @@ -205,8 +197,35 @@ static int firmware_block_received_cb(u16_t obj_inst_id,
static int lwm2m_setup(void)
{
struct float32_value float_value;
int ret;
char *server_url;
u16_t server_url_len;
u8_t server_url_flags;

/* setup SECURITY object */

/* Server URL */
ret = lwm2m_engine_get_res_data("0/0/0",
(void **)&server_url, &server_url_len,
&server_url_flags);
if (ret < 0) {
return ret;
}

snprintk(server_url, server_url_len, "coap%s//%s%s%s",
IS_ENABLED(CONFIG_LWM2M_DTLS_SUPPORT) ? "s:" : ":",
strchr(SERVER_ADDR, ':') ? "[" : "", SERVER_ADDR,
strchr(SERVER_ADDR, ':') ? "]" : "");

/* Security Mode */
lwm2m_engine_set_u8("0/0/2",
IS_ENABLED(CONFIG_LWM2M_DTLS_SUPPORT) ? 0 : 3);
#if defined(CONFIG_LWM2M_DTLS_SUPPORT)
lwm2m_engine_set_string("0/0/3", (char *)client_psk_id);
lwm2m_engine_set_opaque("0/0/5",
(void *)client_psk, sizeof(client_psk));
#endif /* CONFIG_LWM2M_DTLS_SUPPORT */

/* setup SERVER object */

/* setup DEVICE object */
Expand Down Expand Up @@ -292,12 +311,16 @@ static void rd_client_event(struct lwm2m_ctx *client,
/* do nothing */
break;

case LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_FAILURE:
LOG_DBG("Bootstrap failure!");
case LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_FAILURE:
LOG_DBG("Bootstrap registration failure!");
break;

case LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_COMPLETE:
LOG_DBG("Bootstrap registration complete");
break;

case LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_COMPLETE:
LOG_DBG("Bootstrap complete");
case LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_TRANSFER_COMPLETE:
LOG_DBG("Bootstrap transfer complete");
break;

case LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE:
Expand Down Expand Up @@ -342,38 +365,11 @@ void main(void)
}

(void)memset(&client, 0x0, sizeof(client));
client.net_init_timeout = WAIT_TIME;
client.net_timeout = CONNECT_TIME;

#if defined(CONFIG_NET_APP_DTLS)
client.client_psk = client_psk;
client.client_psk_len = 16;
client.client_psk_id = (char *)client_psk_id;
client.client_psk_id_len = strlen(client_psk_id);
client.cert_host = HOSTNAME;
client.dtls_pool = &dtls_pool;
client.dtls_result_buf = dtls_result;
client.dtls_result_buf_len = RESULT_BUF_SIZE;
client.dtls_stack = net_app_dtls_stack;
client.dtls_stack_len = K_THREAD_STACK_SIZEOF(net_app_dtls_stack);
#endif /* CONFIG_NET_APP_DTLS */

#if defined(CONFIG_NET_IPV6)
ret = lwm2m_rd_client_start(&client, CONFIG_NET_CONFIG_PEER_IPV6_ADDR,
CONFIG_LWM2M_PEER_PORT, CONFIG_BOARD,
rd_client_event);
#elif defined(CONFIG_NET_IPV4)
ret = lwm2m_rd_client_start(&client, CONFIG_NET_CONFIG_PEER_IPV4_ADDR,
CONFIG_LWM2M_PEER_PORT, CONFIG_BOARD,
rd_client_event);
#else
LOG_ERR("LwM2M client requires IPv4 or IPv6.");
ret = -EPROTONOSUPPORT;
#if defined(CONFIG_LWM2M_DTLS_SUPPORT)
client.tls_tag = TLS_TAG;
#endif
if (ret < 0) {
LOG_ERR("LWM2M init LWM2M RD client error (%d)", ret);
return;
}

/* client.sec_obj_inst is 0 as a starting point */
lwm2m_rd_client_start(&client, CONFIG_BOARD, rd_client_event);
k_sem_take(&quit_lock, K_FOREVER);
}
Loading