Commit 74a56b05 authored by Andreas Chmielewski's avatar Andreas Chmielewski Committed by Fabio Baltieri
Browse files

net: lwm2m: separate closing context from closing socket



Separate closing lwm2m context from closing socket. This patch is required
for the rd client to take more control over lwm2m context and the socket.
The goal is to close the socket and to keep the lwm2m context if this is
needed.

Signed-off-by: default avatarAndreas Chmielewski <andreas.chmielewski@grandcentrix.net>
parent 3cdff65e
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -1185,6 +1185,19 @@ int lwm2m_update_device_service_period(uint32_t period_ms);
 */
bool lwm2m_engine_path_is_observed(const char *pathstr);

/**
 * @brief Stop the LwM2M engine
 *
 * LwM2M clients normally do not need to call this function as it is called
 * within lwm2m_rd_client. However, if the client does not use the RD
 * client implementation, it will need to be called manually.
 *
 * @param[in] client_ctx LwM2M context
 *
 * @return 0 for success or negative in case of error.
 */
int lwm2m_engine_stop(struct lwm2m_ctx *client_ctx);

/**
 * @brief Start the LwM2M engine
 *
+22 −2
Original line number Diff line number Diff line
@@ -862,7 +862,7 @@ int lwm2m_socket_start(struct lwm2m_ctx *client_ctx)
	} else if ((client_ctx->remote_addr).sa_family == AF_INET6) {
		addr_len = sizeof(struct sockaddr_in6);
	} else {
		lwm2m_engine_context_close(client_ctx);
		lwm2m_engine_stop(client_ctx);
		return -EPROTONOSUPPORT;
	}

@@ -891,10 +891,30 @@ int lwm2m_socket_start(struct lwm2m_ctx *client_ctx)
	}
	return 0;
error:
	lwm2m_engine_context_close(client_ctx);
	lwm2m_engine_stop(client_ctx);
	return ret;
}

int lwm2m_socket_close(struct lwm2m_ctx *client_ctx)
{
	int sock_fd = client_ctx->sock_fd;

	lwm2m_socket_del(client_ctx);
	client_ctx->sock_fd = -1;
	if (sock_fd >= 0) {
		return close(sock_fd);
	}

	return 0;
}

int lwm2m_engine_stop(struct lwm2m_ctx *client_ctx)
{
	lwm2m_engine_context_close(client_ctx);

	return lwm2m_socket_close(client_ctx);
}

int lwm2m_engine_start(struct lwm2m_ctx *client_ctx)
{
	char pathstr[MAX_RESOURCE_LEN];
+2 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ int lwm2m_engine_validate_write_access(struct lwm2m_message *msg,
				       struct lwm2m_engine_obj_field **obj_field);

/* LwM2M context functions */
int lwm2m_engine_context_close(struct lwm2m_ctx *client_ctx);
void lwm2m_engine_context_close(struct lwm2m_ctx *client_ctx);
void lwm2m_engine_context_init(struct lwm2m_ctx *client_ctx);

/* Message buffer functions */
@@ -82,6 +82,7 @@ uint8_t lwm2m_firmware_get_update_result(void);
/* Network Layer */
int lwm2m_socket_add(struct lwm2m_ctx *ctx);
void lwm2m_socket_del(struct lwm2m_ctx *ctx);
int lwm2m_socket_close(struct lwm2m_ctx *client_ctx);
int lwm2m_socket_start(struct lwm2m_ctx *client_ctx);
int lwm2m_engine_connection_resume(struct lwm2m_ctx *client_ctx);
int lwm2m_open_socket(struct lwm2m_ctx *client_ctx);
+1 −9
Original line number Diff line number Diff line
@@ -172,9 +172,8 @@ static void free_block_ctx(struct lwm2m_block_context *ctx)
	ctx->tkl = 0U;
}

int lwm2m_engine_context_close(struct lwm2m_ctx *client_ctx)
void lwm2m_engine_context_close(struct lwm2m_ctx *client_ctx)
{
	int sock_fd = client_ctx->sock_fd;
	struct lwm2m_message *msg;
	sys_snode_t *obs_node;
	struct observe_node *obs;
@@ -201,13 +200,6 @@ int lwm2m_engine_context_close(struct lwm2m_ctx *client_ctx)
#if defined(CONFIG_LWM2M_QUEUE_MODE_ENABLED)
	client_ctx->buffer_client_messages = true;
#endif
	lwm2m_socket_del(client_ctx);
	client_ctx->sock_fd = -1;
	if (sock_fd >= 0) {
		return close(sock_fd);
	} else {
		return 0;
	}
}

void lwm2m_engine_context_init(struct lwm2m_ctx *client_ctx)
+1 −1
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ static void do_transmit_timeout_cb(struct lwm2m_message *msg);
 */
static void cleanup_context(void)
{
	lwm2m_engine_context_close(&context.firmware_ctx);
	lwm2m_engine_stop(&context.firmware_ctx);

	k_sem_give(&lwm2m_pull_sem);
}
Loading