Skip to content

Commit 5204b0e

Browse files
author
Michael Scott
committed
net: lwm2m: add RD client callbacks for app
Applications may want to be notified when various events happen in the LwM2M rd client. Let's implement an event callback which sends: connect, disconnect and update events. Signed-off-by: Michael Scott <[email protected]>
1 parent 3025b15 commit 5204b0e

File tree

3 files changed

+112
-6
lines changed

3 files changed

+112
-6
lines changed

include/net/lwm2m.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,26 @@ int lwm2m_engine_start(struct lwm2m_ctx *client_ctx,
198198

199199
/* LWM2M RD Client */
200200

201+
/* Client events */
202+
enum lwm2m_rd_client_event {
203+
LWM2M_RD_CLIENT_EVENT_NONE,
204+
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_FAILURE,
205+
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_COMPLETE,
206+
LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE,
207+
LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE,
208+
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE,
209+
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE,
210+
LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE,
211+
LWM2M_RD_CLIENT_EVENT_DISCONNECT
212+
};
213+
214+
/* Event callback */
215+
typedef void (*lwm2m_ctx_event_cb_t)(struct lwm2m_ctx *ctx,
216+
enum lwm2m_rd_client_event event);
217+
201218
int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx,
202219
char *peer_str, u16_t peer_port,
203-
const char *ep_name);
220+
const char *ep_name,
221+
lwm2m_ctx_event_cb_t event_cb);
204222

205223
#endif /* __LWM2M_H__ */

samples/net/lwm2m_client/src/lwm2m-client.c

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,50 @@ static int lwm2m_setup(void)
241241
return 0;
242242
}
243243

244+
static void rd_client_event(struct lwm2m_ctx *client,
245+
enum lwm2m_rd_client_event client_event)
246+
{
247+
switch (client_event) {
248+
249+
case LWM2M_RD_CLIENT_EVENT_NONE:
250+
/* do nothing */
251+
break;
252+
253+
case LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_FAILURE:
254+
SYS_LOG_DBG("Bootstrap failure!");
255+
break;
256+
257+
case LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_COMPLETE:
258+
SYS_LOG_DBG("Bootstrap complete");
259+
break;
260+
261+
case LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE:
262+
SYS_LOG_DBG("Registration failure!");
263+
break;
264+
265+
case LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE:
266+
SYS_LOG_DBG("Registration complete");
267+
break;
268+
269+
case LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE:
270+
SYS_LOG_DBG("Registration update failure!");
271+
break;
272+
273+
case LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE:
274+
SYS_LOG_DBG("Registration update complete");
275+
break;
276+
277+
case LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE:
278+
SYS_LOG_DBG("Deregister failure!");
279+
break;
280+
281+
case LWM2M_RD_CLIENT_EVENT_DISCONNECT:
282+
SYS_LOG_DBG("Disconnected");
283+
break;
284+
285+
}
286+
}
287+
244288
void main(void)
245289
{
246290
int ret;
@@ -265,10 +309,12 @@ void main(void)
265309

266310
#if defined(CONFIG_NET_IPV6)
267311
ret = lwm2m_rd_client_start(&client, CONFIG_NET_APP_PEER_IPV6_ADDR,
268-
CONFIG_LWM2M_PEER_PORT, CONFIG_BOARD);
312+
CONFIG_LWM2M_PEER_PORT, CONFIG_BOARD,
313+
rd_client_event);
269314
#elif defined(CONFIG_NET_IPV4)
270315
ret = lwm2m_rd_client_start(&client, CONFIG_NET_APP_PEER_IPV4_ADDR,
271-
CONFIG_LWM2M_PEER_PORT, CONFIG_BOARD);
316+
CONFIG_LWM2M_PEER_PORT, CONFIG_BOARD,
317+
rd_client_event);
272318
#else
273319
SYS_LOG_ERR("LwM2M client requires IPv4 or IPv6.");
274320
ret = -EPROTONOSUPPORT;

subsys/net/lib/lwm2m/lwm2m_rd_client.c

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ struct lwm2m_rd_client_info {
106106

107107
char ep_name[CLIENT_EP_LEN];
108108
char server_ep[CLIENT_EP_LEN];
109+
110+
lwm2m_ctx_event_cb_t event_cb;
109111
};
110112

111113
static K_THREAD_STACK_DEFINE(lwm2m_rd_client_thread_stack,
@@ -120,10 +122,31 @@ static u8_t client_data[256]; /* allocate some data for the RD */
120122
static struct lwm2m_rd_client_info clients[CLIENT_INSTANCE_COUNT];
121123
static int client_count;
122124

123-
static void set_sm_state(int index, u8_t state)
125+
static void set_sm_state(int index, u8_t sm_state)
124126
{
127+
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
128+
129+
/* Determine if a callback to the app is needed */
130+
if (sm_state == ENGINE_BOOTSTRAP_DONE) {
131+
event = LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_COMPLETE;
132+
} else if (clients[index].engine_state == ENGINE_UPDATE_SENT &&
133+
sm_state == ENGINE_REGISTRATION_DONE) {
134+
event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE;
135+
} else if (sm_state == ENGINE_REGISTRATION_DONE) {
136+
event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE;
137+
} else if ((sm_state == ENGINE_INIT ||
138+
sm_state == ENGINE_DEREGISTERED) &&
139+
(clients[index].engine_state > ENGINE_BOOTSTRAP_DONE &&
140+
clients[index].engine_state < ENGINE_DEREGISTER)) {
141+
event = LWM2M_RD_CLIENT_EVENT_DISCONNECT;
142+
}
143+
125144
/* TODO: add locking? */
126-
clients[index].engine_state = state;
145+
clients[index].engine_state = sm_state;
146+
147+
if (event > LWM2M_RD_CLIENT_EVENT_NONE && clients[index].event_cb) {
148+
clients[index].event_cb(clients[index].ctx, event);
149+
}
127150
}
128151

129152
static bool sm_is_registered(int index)
@@ -200,14 +223,31 @@ static void sm_handle_timeout_state(struct lwm2m_message *msg,
200223
enum sm_engine_state sm_state)
201224
{
202225
int index;
226+
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
203227

204228
index = find_rd_client_from_msg(msg, clients, CLIENT_INSTANCE_COUNT);
205229
if (index < 0) {
206230
SYS_LOG_ERR("Can't find RD client from msg: %p!", msg);
207231
return;
208232
}
209233

234+
if (clients[index].engine_state == ENGINE_BOOTSTRAP_SENT) {
235+
event = LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_FAILURE;
236+
} else if (clients[index].engine_state == ENGINE_REGISTRATION_SENT) {
237+
event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE;
238+
} else if (clients[index].engine_state == ENGINE_UPDATE_SENT) {
239+
event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE;
240+
} else if (clients[index].engine_state == ENGINE_DEREGISTER_SENT) {
241+
event = LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE;
242+
} else {
243+
/* TODO: unknown timeout state */
244+
}
245+
210246
set_sm_state(index, sm_state);
247+
248+
if (event > LWM2M_RD_CLIENT_EVENT_NONE && clients[index].event_cb) {
249+
clients[index].event_cb(clients[index].ctx, event);
250+
}
211251
}
212252

213253
/* force re-update with remote peer(s) */
@@ -820,7 +860,8 @@ static void lwm2m_rd_client_service(void)
820860

821861
int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx,
822862
char *peer_str, u16_t peer_port,
823-
const char *ep_name)
863+
const char *ep_name,
864+
lwm2m_ctx_event_cb_t event_cb)
824865
{
825866
int index, ret = 0;
826867

@@ -843,6 +884,7 @@ int lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx,
843884
index = client_count;
844885
client_count++;
845886
clients[index].ctx = client_ctx;
887+
clients[index].event_cb = event_cb;
846888
set_sm_state(index, ENGINE_INIT);
847889
strncpy(clients[index].ep_name, ep_name, CLIENT_EP_LEN - 1);
848890
SYS_LOG_INF("LWM2M Client: %s", clients[index].ep_name);

0 commit comments

Comments
 (0)