net: lwm2m: introduce lwm2m context structure

The LwM2M library does not use net_app APIs internally.  To help
this effort let's establish a user facing structure "lwm2m_ctx"
(similar to http_client_ctx and mqtt_ctx) and start it off by
wrappering the net_context structure.

Future patches will add user setup options to this structure and
eventually remove the net_context structure in favor of a net_app_ctx.

Signed-off-by: Michael Scott <michael.scott@linaro.org>
This commit is contained in:
Michael Scott 2017-08-23 22:33:38 -07:00 committed by Jukka Rissanen
commit 728ab4229a
5 changed files with 47 additions and 35 deletions

View file

@ -25,6 +25,16 @@
#define IPSO_OBJECT_TEMP_SENSOR_ID 3303
#define IPSO_OBJECT_LIGHT_CONTROL_ID 3311
/**
* LwM2M context structure
*
* @details Context structure for the LwM2M high-level API.
*/
struct lwm2m_ctx {
/** Net context structure */
struct net_context *net_ctx;
};
/* callback can return 1 if handled (don't update value) */
typedef void *(*lwm2m_engine_get_data_cb_t)(u16_t obj_inst_id,
size_t *data_len);
@ -149,11 +159,11 @@ int lwm2m_engine_register_post_write_callback(char *path,
int lwm2m_engine_register_exec_callback(char *path,
lwm2m_engine_exec_cb_t cb);
int lwm2m_engine_start(struct net_context *net_ctx);
int lwm2m_engine_start(struct lwm2m_ctx *client_ctx);
/* LWM2M RD Client */
int lwm2m_rd_client_start(struct net_context *net_ctx,
int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx,
struct sockaddr *peer_addr,
const char *ep_name);

View file

@ -57,10 +57,12 @@ static struct device *led_dev;
static u32_t led_state;
#if defined(CONFIG_NET_IPV6)
static struct net_app_ctx udp6;
static struct net_app_ctx app_udp6;
static struct lwm2m_ctx udp6;
#endif
#if defined(CONFIG_NET_IPV4)
static struct net_app_ctx udp4;
static struct net_app_ctx app_udp4;
static struct lwm2m_ctx udp4;
#endif
static struct k_sem quit_lock;
@ -284,7 +286,7 @@ void main(void)
}
#if defined(CONFIG_NET_IPV6)
ret = setup_net_app_ctx(&udp6, CONFIG_NET_APP_PEER_IPV6_ADDR);
ret = setup_net_app_ctx(&app_udp6, CONFIG_NET_APP_PEER_IPV6_ADDR);
if (ret < 0) {
goto cleanup_ipv6;
}
@ -295,15 +297,14 @@ void main(void)
goto cleanup_ipv6;
}
ret = lwm2m_engine_start(udp6.ipv6.ctx);
udp6.net_ctx = app_udp6.ipv6.ctx;
ret = lwm2m_engine_start(&udp6);
if (ret < 0) {
SYS_LOG_ERR("Cannot init LWM2M IPv6 engine (%d)", ret);
goto cleanup_ipv6;
}
ret = lwm2m_rd_client_start(udp6.ipv6.ctx, &udp6.ipv6.remote,
ep_name);
ret = lwm2m_rd_client_start(&udp6, &app_udp6.ipv6.remote, ep_name);
if (ret < 0) {
SYS_LOG_ERR("LWM2M init LWM2M IPv6 RD client error (%d)",
ret);
@ -314,7 +315,7 @@ void main(void)
#endif
#if defined(CONFIG_NET_IPV4)
ret = setup_net_app_ctx(&udp4, CONFIG_NET_APP_PEER_IPV4_ADDR);
ret = setup_net_app_ctx(&app_udp4, CONFIG_NET_APP_PEER_IPV4_ADDR);
if (ret < 0) {
goto cleanup_ipv4;
}
@ -325,14 +326,14 @@ void main(void)
goto cleanup_ipv4;
}
ret = lwm2m_engine_start(udp4.ipv4.ctx);
udp4.net_ctx = app_udp4.ipv4.ctx;
ret = lwm2m_engine_start(&udp4);
if (ret < 0) {
SYS_LOG_ERR("Cannot init LWM2M IPv4 engine (%d)", ret);
goto cleanup_ipv4;
}
ret = lwm2m_rd_client_start(udp4.ipv4.ctx, &udp4.ipv4.remote,
ep_name);
ret = lwm2m_rd_client_start(&udp4, &app_udp4.ipv4.remote, ep_name);
if (ret < 0) {
SYS_LOG_ERR("LWM2M init LWM2M IPv4 RD client error (%d)",
ret);
@ -346,13 +347,13 @@ void main(void)
#if defined(CONFIG_NET_IPV4)
cleanup_ipv4:
net_app_close(&udp4);
net_app_release(&udp4);
net_app_close(&app_udp4);
net_app_release(&app_udp4);
#endif
#if defined(CONFIG_NET_IPV6)
cleanup_ipv6:
net_app_close(&udp6);
net_app_release(&udp6);
net_app_close(&app_udp6);
net_app_release(&app_udp6);
#endif
}

View file

@ -2592,12 +2592,12 @@ static void lwm2m_engine_service(void)
}
}
int lwm2m_engine_start(struct net_context *net_ctx)
int lwm2m_engine_start(struct lwm2m_ctx *client_ctx)
{
int ret = 0;
/* set callback */
ret = net_context_recv(net_ctx, udp_receive, 0, NULL);
ret = net_context_recv(client_ctx->net_ctx, udp_receive, 0, NULL);
if (ret) {
SYS_LOG_ERR("Could not set receive for net context (err:%d)",
ret);

View file

@ -33,7 +33,7 @@ static u8_t transfer_state;
static struct k_work firmware_work;
static char firmware_uri[PACKAGE_URI_LEN];
static struct sockaddr firmware_addr;
static struct net_context *firmware_net_ctx;
static struct lwm2m_ctx firmware_ctx;
static struct k_delayed_work retransmit_work;
#define NUM_PENDINGS CONFIG_LWM2M_ENGINE_MAX_PENDING
@ -83,7 +83,7 @@ static int transfer_request(struct zoap_block_context *ctx,
struct zoap_reply *reply = NULL;
int ret;
ret = lwm2m_init_message(firmware_net_ctx, &request, &pkt,
ret = lwm2m_init_message(firmware_ctx.net_ctx, &request, &pkt,
ZOAP_TYPE_CON, ZOAP_METHOD_GET,
0, token, tkl);
if (ret) {
@ -256,7 +256,7 @@ static void firmware_transfer(struct k_work *work)
#endif
ret = net_context_get(firmware_addr.sa_family, SOCK_DGRAM, IPPROTO_UDP,
&firmware_net_ctx);
&firmware_ctx.net_ctx);
if (ret) {
NET_ERR("Could not get an UDP context (err:%d)", ret);
return;
@ -270,7 +270,7 @@ static void firmware_transfer(struct k_work *work)
#if defined(CONFIG_NET_IPV6)
if (firmware_addr.sa_family == AF_INET6) {
ret = net_context_bind(firmware_net_ctx,
ret = net_context_bind(firmware_ctx.net_ctx,
(struct sockaddr *)&any_addr6,
sizeof(any_addr6));
}
@ -278,7 +278,7 @@ static void firmware_transfer(struct k_work *work)
#if defined(CONFIG_NET_IPV4)
if (firmware_addr.sa_family == AF_INET) {
ret = net_context_bind(firmware_net_ctx,
ret = net_context_bind(firmware_ctx.net_ctx,
(struct sockaddr *)&any_addr4,
sizeof(any_addr4));
}
@ -290,7 +290,8 @@ static void firmware_transfer(struct k_work *work)
}
SYS_LOG_DBG("Attached to port: %d", port);
ret = net_context_recv(firmware_net_ctx, firmware_udp_receive, 0, NULL);
ret = net_context_recv(firmware_ctx.net_ctx,
firmware_udp_receive, 0, NULL);
if (ret) {
SYS_LOG_ERR("Could not set receive for net context (err:%d)",
ret);
@ -305,8 +306,8 @@ static void firmware_transfer(struct k_work *work)
return;
cleanup:
if (firmware_net_ctx) {
net_context_put(firmware_net_ctx);
if (firmware_ctx.net_ctx) {
net_context_put(firmware_ctx.net_ctx);
}
}
@ -319,8 +320,8 @@ int lwm2m_firmware_cancel_transfer(void)
int lwm2m_firmware_start_transfer(char *package_uri)
{
/* free up old context */
if (firmware_net_ctx) {
net_context_put(firmware_net_ctx);
if (firmware_ctx.net_ctx) {
net_context_put(firmware_ctx.net_ctx);
}
if (transfer_state == STATE_IDLE) {

View file

@ -93,7 +93,7 @@ enum sm_engine_state {
struct lwm2m_rd_client_info {
u16_t lifetime;
struct net_context *net_ctx;
struct lwm2m_ctx *ctx;
struct sockaddr bs_server;
struct sockaddr reg_server;
u8_t engine_state;
@ -402,7 +402,7 @@ static int sm_do_bootstrap(int index)
clients[index].bootstrapped == 0 &&
clients[index].has_bs_server_info) {
ret = lwm2m_init_message(clients[index].net_ctx,
ret = lwm2m_init_message(clients[index].ctx->net_ctx,
&request, &pkt, ZOAP_TYPE_CON,
ZOAP_METHOD_POST, 0, NULL, 0);
if (ret) {
@ -516,7 +516,7 @@ static int sm_send_registration(int index, bool send_obj_support_data,
/* remember the last reg time */
clients[index].last_update = k_uptime_get();
ret = lwm2m_init_message(clients[index].net_ctx,
ret = lwm2m_init_message(clients[index].ctx->net_ctx,
&request, &pkt, ZOAP_TYPE_CON,
ZOAP_METHOD_POST, 0, NULL, 0);
if (ret) {
@ -658,7 +658,7 @@ static int sm_do_deregister(int index)
struct zoap_reply *reply = NULL;
int ret;
ret = lwm2m_init_message(clients[index].net_ctx,
ret = lwm2m_init_message(clients[index].ctx->net_ctx,
&request, &pkt, ZOAP_TYPE_CON,
ZOAP_METHOD_DELETE, 0, NULL, 0);
if (ret) {
@ -846,7 +846,7 @@ static void set_ep_ports(int index)
#endif
}
int lwm2m_rd_client_start(struct net_context *net_ctx,
int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx,
struct sockaddr *peer_addr,
const char *ep_name)
{
@ -864,7 +864,7 @@ int lwm2m_rd_client_start(struct net_context *net_ctx,
/* TODO: use server URI data from security */
index = client_count;
client_count++;
clients[index].net_ctx = net_ctx;
clients[index].ctx = client_ctx;
memcpy(&clients[index].reg_server, peer_addr, sizeof(struct sockaddr));
memcpy(&clients[index].bs_server, peer_addr, sizeof(struct sockaddr));
set_ep_ports(index);