<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cellular and WiFi Stack Management on a custom nRF9160 board</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/113655/cellular-and-wifi-stack-management-on-a-custom-nrf9160-board</link><description>Hello! We have developed a custom board featuring an nRF9160 and an ESP32-C3-MINI-1 co-processor, which is flashed with AT-firmware (version 3.2.0.0). Our current application runs an LWM2M client that connects to an LWM2M server and sends data. We currently</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 23 Sep 2024 07:56:16 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/113655/cellular-and-wifi-stack-management-on-a-custom-nrf9160-board" /><item><title>RE: Cellular and WiFi Stack Management on a custom nRF9160 board</title><link>https://devzone.nordicsemi.com/thread/503366?ContentTypeID=1</link><pubDate>Mon, 23 Sep 2024 07:56:16 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:564f3134-0e43-4d03-86df-0ae95b0fd07d</guid><dc:creator>kris_01</dc:creator><description>&lt;p&gt;Additionally, we received an answer from &lt;strong&gt;rlubos&lt;/strong&gt; on Zephyr&amp;#39;s discord:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;What you described in the devzone ticket did sound like a bug , as with &lt;strong&gt;SO_BINDTODEVICE&lt;/strong&gt; being used with dispatcher, socket priorities should not be used at all, given proper interface names are provided (which seems to be true in your case), so it shouldn&amp;#39;t be needed to change priorities.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;It turned out that in NCS 2.5.0 we indeed had a bug, incorrect macro was used to register the offload socket implementation, so the dispatcher wrongly treated the nRF91 LTE interface as a native one. This was fixed a few months ago in sdk-nrf:&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;a href="https://github.com/nrfconnect/sdk-nrf/commit/f26d29161dd3553ee68ca7ed77704933a58ad994"&gt;github.com/.../f26d29161dd3553ee68ca7ed77704933a58ad994&lt;/a&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Cherry-picking this commit into v2.5.0-branch (or switching to NCS 2.6.0) should resolve the issue you see.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Cellular and WiFi Stack Management on a custom nRF9160 board</title><link>https://devzone.nordicsemi.com/thread/498566?ContentTypeID=1</link><pubDate>Fri, 16 Aug 2024 07:57:52 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a54cdfb9-94df-436b-a750-d910b7c7fbb8</guid><dc:creator>kris_01</dc:creator><description>&lt;p&gt;Hi Simon, we made some progress on this.&lt;br /&gt;&lt;br /&gt;We are now able to use the WiFi and LTE interfaces simultaneously, at least with non-TLS sockets.&lt;br /&gt;&lt;br /&gt;After reading through the Zephyr documentation, we learned about the&lt;br /&gt;&lt;a href="https://docs.zephyrproject.org/latest/connectivity/networking/api/sockets.html#dealing-with-multiple-offloaded-interfaces" rel="noopener noreferrer" target="_blank"&gt;socket dispatcher&lt;/a&gt;, which enables the application to specify which network implementation a socket should be bound to.&lt;br /&gt;&lt;br /&gt;As shown in the first example in the above-linked documentation, a socket first needs to be created&lt;br /&gt;Then, the &lt;code&gt;SO_BINDTODEVICE&lt;/code&gt; option, with the interface name, is set with &lt;code&gt;setsockopt&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;The names are not arbitrary, but rather the names of the network interfaces. For WiFi, the name is&lt;br /&gt;&lt;code&gt;wlan0&lt;/code&gt; and for LTE, the name is &lt;code&gt;net0&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;With that information, we started integrating the offloaded socket dispatcher into the&lt;br /&gt;&lt;code&gt;nrf/samples/net/udp&lt;/code&gt; sample, as it seemed to be the simplest sample to begin with.&lt;br /&gt;&lt;br /&gt;I will post the code below, but here are the important changes:&lt;br /&gt;&lt;br /&gt;- &lt;code&gt;CONFIG_NET_SOCKETS_OFFLOAD&lt;/code&gt; and &lt;code&gt;CONFIG_NET_SOCKETS_OFFLOAD_DISPATCHER&lt;/code&gt; must be enabled.&lt;br /&gt;- The &lt;code&gt;CONFIG_NET_IF_MAX_IPV4_COUNT&lt;/code&gt; must be set to 2, since we have two interfaces which require&lt;br /&gt;&amp;nbsp; their IPs.&lt;br /&gt;- Various &lt;code&gt;CONFIG_WIFI_*&lt;/code&gt; and &lt;code&gt;CONFIG_WIFI_ESP_AT_*&lt;/code&gt; options must be enabled.&lt;br /&gt;- You &lt;strong&gt;can&amp;#39;t&lt;/strong&gt; use the &lt;code&gt;NET_EVENT_L4_CONNECTED&lt;/code&gt; event as a trigger to create both WiFi and LTE&lt;br /&gt;&amp;nbsp; sockets, since it is emitted only once when the first interface is connected. Instead the&lt;br /&gt;&amp;nbsp; &lt;code&gt;NET_EVENT_IF_UP&lt;/code&gt; event must be used, as it is emitted for each interface.&lt;br /&gt;&lt;br /&gt;We thought that the above changes would be enough, however, during our initial tests we saw that:&lt;br /&gt;&lt;br /&gt;- If only &lt;strong&gt;esp32 wifi&lt;/strong&gt; and &lt;strong&gt;socket dispatcher&lt;/strong&gt; are enabled, then the &lt;code&gt;setsockopt&lt;/code&gt; and the following&lt;br /&gt;&amp;nbsp; &lt;code&gt;connect&lt;/code&gt; calls are successful.&lt;br /&gt;- If only &lt;strong&gt;nRF91&amp;#39;s LTE&lt;/strong&gt; and &lt;strong&gt;socket dispatcher&lt;/strong&gt; are enabled, then the &lt;code&gt;setsockopt&lt;/code&gt; and the following&lt;br /&gt;&amp;nbsp; &lt;code&gt;connect&lt;/code&gt; calls are successful.&lt;br /&gt;- If &lt;strong&gt;all three&lt;/strong&gt; are enabled and the &lt;code&gt;setsockopt&lt;/code&gt; is given the &lt;code&gt;wlan0&lt;/code&gt; interface, &lt;strong&gt;then the nRF91&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; socket implementation is used instead&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;The last case was very tricky to figure out and we had to dig into the Zephyr source code to find&lt;br /&gt;out what exactly was happening.&lt;br /&gt;&lt;br /&gt;By using the debugger and inspecting the&lt;br /&gt;&lt;a href="https://github.com/zephyrproject-rtos/zephyr/blob/main/subsys/net/lib/sockets/socket_dispatcher.c" rel="noopener noreferrer" target="_blank"&gt;socket_dispatcher.c&lt;/a&gt; we found out that:&lt;br /&gt;&lt;br /&gt;- When the &lt;code&gt;setsockopt&lt;/code&gt; is called with the &lt;code&gt;SO_BINDTODEVICE&lt;/code&gt; option and the &lt;code&gt;wlan0&lt;/code&gt; interface name&lt;br /&gt;&amp;nbsp; the following functions get called:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; - &lt;code&gt;sock_dispatch_setsockopt_vmeth&lt;/code&gt;&lt;br /&gt;&amp;nbsp; - &lt;code&gt;sock_dispatch_native&lt;/code&gt;&lt;br /&gt;&amp;nbsp; - &lt;code&gt;sock_dispatch_find&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;- &lt;code&gt;sock_dispatch_find&lt;/code&gt; iterates through registered sockets. The order of the sockets is determined&lt;br /&gt;&amp;nbsp; by their priority that was given when they were registered with &lt;code&gt;NET_SOCKET_REGISTER&lt;/code&gt;.&lt;br /&gt;- &lt;strong&gt;nRF91&amp;#39;s LTE&lt;/strong&gt; uses &lt;strong&gt;an offloaded socket interface&lt;/strong&gt;, which has a default priority of 40.&lt;br /&gt;- &lt;strong&gt;ESP32 AT&lt;/strong&gt; uses a &lt;strong&gt;native Zephyr socket interface&lt;/strong&gt;, which has a default priority of 50.&lt;br /&gt;&lt;br /&gt;This means that &lt;code&gt;sock_dispatch_find&lt;/code&gt; will always return the nRF91&amp;#39;s LTE socket implementation first.&lt;br /&gt;&lt;br /&gt;The solution was to set the &lt;code&gt;CONFIG_NET_SOCKETS_PRIORITY_DEFAULT&lt;/code&gt; to a value lower than 40, so that&lt;br /&gt;the native Zephyr socket implementation is used by default.&lt;br /&gt;&lt;br /&gt;I find it interesting that around line 300 there is a check that decides how to handle the socket&lt;br /&gt;creation based on whether the interface is native or offloaded. Even if we are requesting a socket&lt;br /&gt;with a native interface, the offloaded interfaces can be used if their priority is higher.&lt;br /&gt;&lt;br /&gt;I feel like this is a bug, but I am not sure.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;We will attempt to do the same with secure sockets (TLS/DTLS).&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Below are all the relevant files, if someone uses this don&amp;#39;t forget to adjust the overlay and the&lt;br /&gt;WiFi SSID and password. Keep in mind, we used the &lt;code&gt;nrf/samples/net/udp&lt;/code&gt; (NCS version 2.5.0) as a basis for this.&lt;br /&gt;&lt;br /&gt;main.c:&lt;br /&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/logging/log.h&amp;gt;
#include &amp;lt;zephyr/logging/log_ctrl.h&amp;gt;
#include &amp;lt;zephyr/sys/reboot.h&amp;gt;

#include &amp;lt;zephyr/net/conn_mgr_connectivity.h&amp;gt;
#include &amp;lt;zephyr/net/conn_mgr_monitor.h&amp;gt;
#include &amp;lt;zephyr/net/net_if.h&amp;gt;
#include &amp;lt;zephyr/net/socket.h&amp;gt;
#include &amp;lt;zephyr/net/wifi_mgmt.h&amp;gt;

#include &amp;lt;stdio.h&amp;gt;

LOG_MODULE_REGISTER(udp_sample, CONFIG_UDP_SAMPLE_LOG_LEVEL);

#define UDP_IP_HEADER_SIZE 28

#define CONN_LAYER_EVENT_MASK (NET_EVENT_CONN_IF_FATAL_ERROR)

static struct net_mgmt_event_callback conn_cb;
static struct net_mgmt_event_callback iface_up_cb;

static int lte_fd;
static int wifi_fd;

static struct sockaddr_storage host_addr;

/* Forward declarations */
static void wifi_work_fn(struct k_work *work);

/* Work item used to schedule periodic UDP transmissions. */
static K_WORK_DELAYABLE_DEFINE(wifi_work, wifi_work_fn);

static void lte_work_fn(struct k_work *work);

static K_WORK_DELAYABLE_DEFINE(lte_work, lte_work_fn);

static void wifi_work_fn(struct k_work *work)
{
	int err;
	char buffer[] = &amp;quot;wifi&amp;quot;;

	LOG_INF(&amp;quot;WIFI: Transmitting UDP/IP payload of %d bytes to the &amp;quot;
		&amp;quot;IP address %s, port number %d&amp;quot;,
		sizeof(buffer) + UDP_IP_HEADER_SIZE, CONFIG_SERVER_ADDRESS, CONFIG_SERVER_PORT);

	err = send(wifi_fd, buffer, sizeof(buffer), 0);
	if (err &amp;lt; 0) {
		LOG_ERR(&amp;quot;Failed to transmit UDP packet, %d&amp;quot;, -errno);
		return;
	}

	(void)k_work_reschedule(&amp;amp;wifi_work, K_SECONDS(5));
}

static void lte_work_fn(struct k_work *work)
{
	int err;
	char buffer[] = &amp;quot;lte&amp;quot;;

	LOG_INF(&amp;quot;LTE: Transmitting UDP/IP payload of %d bytes to the &amp;quot;
		&amp;quot;IP address %s, port number %d&amp;quot;,
		sizeof(buffer) + UDP_IP_HEADER_SIZE, CONFIG_SERVER_ADDRESS, CONFIG_SERVER_PORT);

	err = send(lte_fd, buffer, sizeof(buffer), 0);
	if (err &amp;lt; 0) {
		LOG_ERR(&amp;quot;Failed to transmit UDP packet, %d&amp;quot;, -errno);
		return;
	}

	(void)k_work_reschedule(&amp;amp;lte_work, K_SECONDS(5));
}

static int server_addr_construct(void)
{
	int err;

	struct sockaddr_in *server4 = ((struct sockaddr_in *)&amp;amp;host_addr);

	server4-&amp;gt;sin_family = AF_INET;
	server4-&amp;gt;sin_port = htons(CONFIG_SERVER_PORT);

	err = inet_pton(AF_INET, CONFIG_SERVER_ADDRESS, &amp;amp;server4-&amp;gt;sin_addr);
	if (err &amp;lt; 0) {
		LOG_ERR(&amp;quot;inet_pton, error: %d&amp;quot;, -errno);
		return err;
	}

	return 0;
}

static int prv_socket_create(struct net_if *iface)
{
	LOG_WRN(&amp;quot;Create socket for iface %s&amp;quot;, iface-&amp;gt;config.name);

	int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (fd &amp;lt; 0) {
		LOG_ERR(&amp;quot;Failed to create UDP socket: %d&amp;quot;, -errno);
		return -1;
	}

	struct ifreq ifreq = {.ifr_name = {0}};

	strncpy(ifreq.ifr_name, iface-&amp;gt;config.name, sizeof(ifreq.ifr_name));

	setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &amp;amp;ifreq, sizeof(ifreq));

	return fd;
}

static int prv_connect(int fd)
{
	int err;

	err = connect(fd, (struct sockaddr *)&amp;amp;host_addr, sizeof(struct sockaddr_in));
	if (err &amp;lt; 0) {
		LOG_ERR(&amp;quot;Connect, error: %d&amp;quot;, -errno);
		return err;
	}

	return 0;
}

static void iface_up_handler(struct net_mgmt_event_callback *cb, uint32_t mgmt_event,
			     struct net_if *iface)
{
	LOG_WRN(&amp;quot;Iface name %s&amp;quot;, iface-&amp;gt;config.name);

	int fd = prv_socket_create(iface);

	if (mgmt_event == NET_EVENT_IF_UP) {
		if (strcmp(iface-&amp;gt;config.name, &amp;quot;wlan0&amp;quot;) == 0) {
			wifi_fd = fd;
			prv_connect(wifi_fd);
			k_work_reschedule(&amp;amp;wifi_work, K_NO_WAIT);
		} else if (strcmp(iface-&amp;gt;config.name, &amp;quot;net0&amp;quot;) == 0) {
			lte_fd = fd;
			prv_connect(lte_fd);
			k_work_reschedule(&amp;amp;lte_work, K_NO_WAIT);
		}
	}
}

static void connectivity_event_handler(struct net_mgmt_event_callback *cb, uint32_t event,
				       struct net_if *iface)
{
	if (event == NET_EVENT_CONN_IF_FATAL_ERROR) {
		LOG_ERR(&amp;quot;NET_EVENT_CONN_IF_FATAL_ERROR&amp;quot;);
		return;
	}
}

int wifi_connect(char *ap_name, char *psk)
{
	int err;
	struct net_if *iface = net_if_get_default();

	/* Set up connection parameters */
	static struct wifi_connect_req_params cnx_params;
	cnx_params.ssid = (uint8_t *)ap_name;
	cnx_params.ssid_length = strlen(ap_name);

	/* No need to select channel, so pass any */
	cnx_params.channel = WIFI_CHANNEL_ANY;

	/* if passkey is NULL, the AP is unsecured */
	if (!psk) {
		cnx_params.security = WIFI_SECURITY_TYPE_NONE;
	} else {
		cnx_params.psk = (uint8_t *)psk;
		cnx_params.psk_length = strlen(psk);
		cnx_params.security = WIFI_SECURITY_TYPE_PSK;
	}

	err = net_mgmt(NET_REQUEST_WIFI_CONNECT, iface, &amp;amp;cnx_params,
		       sizeof(struct wifi_connect_req_params));
	if (err) {
		LOG_ERR(&amp;quot;Connection request failed, err: %d&amp;quot;, err);
		return -ENOEXEC;
	}

	return 0;
}

int main(void)
{
	int err;

	LOG_INF(&amp;quot;UDP sample has started&amp;quot;);

	net_mgmt_init_event_callback(&amp;amp;conn_cb, connectivity_event_handler, CONN_LAYER_EVENT_MASK);
	net_mgmt_add_event_callback(&amp;amp;conn_cb);

	net_mgmt_init_event_callback(&amp;amp;iface_up_cb, iface_up_handler, NET_EVENT_IF_UP);
	net_mgmt_add_event_callback(&amp;amp;iface_up_cb);

	err = server_addr_construct();
	if (err) {
		LOG_INF(&amp;quot;server_addr_construct, error: %d&amp;quot;, err);
		return err;
	}

	LOG_INF(&amp;quot;Bringing network interface up and connecting to the network&amp;quot;);

	wifi_connect(CONFIG_AP_SSID, CONFIG_AP_PSK);

	err = conn_mgr_all_if_up(true);
	if (err) {
		LOG_ERR(&amp;quot;conn_mgr_all_if_up, error: %d&amp;quot;, err);
		return err;
	}

	return 0;
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;prj.conf:&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;# General configurations
CONFIG_LOG=y
CONFIG_LOG_INFO_COLOR_GREEN=y
CONFIG_CONSOLE=y
CONFIG_RTT_CONSOLE=y
CONFIG_USE_SEGGER_RTT=y

# CONFIG_SHELL=y
# CONFIG_SHELL_LOG_BACKEND=y
# CONFIG_SHELL_BACKEND_RTT=y
# CONFIG_SEGGER_RTT_BUFFER_SIZE_DOWN=128

CONFIG_DEBUG_OPTIMIZATIONS=y
CONFIG_DEBUG_THREAD_INFO=y
CONFIG_DEBUG_INFO=y

# For communication with ESP-32
CONFIG_SERIAL=y

# Network
CONFIG_NETWORKING=y
CONFIG_NET_NATIVE=y
CONFIG_NET_IPV4=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_CONNECTION_MANAGER=y
CONFIG_NET_CONNECTION_MANAGER_MONITOR_STACK_SIZE=4096
# Increase this to avoid stack overflow in net_mgmt
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096

# Increase this to allow more than one IPv4 address
CONFIG_NET_IF_MAX_IPV4_COUNT=2

# Heap and stacks
CONFIG_HEAP_MEM_POOL_SIZE=1024
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048

# ESP specific flags
CONFIG_WIFI_LOG_LEVEL_DBG=y
CONFIG_WIFI=y
CONFIG_WIFI_ESP_AT=y
CONFIG_WIFI_ESP_AT_SCAN_RESULT_RSSI_ORDERED=y
CONFIG_WIFI_ESP_AT_PASSIVE_MODE=y
CONFIG_WIFI_ESP_AT_IP_DHCP=y
CONFIG_WIFI_ESP_AT_VERSION_2_0=y
CONFIG_WIFI_ESP_AT_DNS_USE=y
# For ESP-AT DNS
CONFIG_DNS_RESOLVER=y

# Offload and dispatcher
CONFIG_NET_SOCKETS_OFFLOAD=y
CONFIG_NET_SOCKETS_OFFLOAD_DISPATCHER=y

# Setting the priority of native sockets to less than the offloaded sockets,
# so that ESP does NOT use nrf91 socket offloading.
# Default priority is 50
CONFIG_NET_SOCKETS_PRIORITY_DEFAULT=2

# Modem LIB forces nrf91 socket offloading
CONFIG_NRF_MODEM_LIB=y

CONFIG_NET_L2_ETHERNET=y
CONFIG_NET_UDP=y
CONFIG_NET_DHCPV4=y

############################################################# LTE #############################################################
# Modem related configurations
CONFIG_LTE_CONNECTIVITY_LOG_LEVEL_DBG=y
CONFIG_NRF_MODEM_LIB_NET_IF_AUTO_START=n
CONFIG_NRF_MODEM_LIB_ON_FAULT_APPLICATION_SPECIFIC=y

# Disable Duplicate Address Detection (DAD)
# due to not being properly implemented for offloaded interfaces.
CONFIG_NET_IPV6_NBR_CACHE=n
CONFIG_NET_IPV6_MLD=n

# Zephyr NET Connection Manager and Connectivity layer.
CONFIG_LTE_CONNECTIVITY=y
CONFIG_LTE_CONNECTIVITY_AUTO_DOWN=n

# PSM
CONFIG_LTE_PSM_REQ=y
CONFIG_LTE_PSM_REQ_RPTAU=&amp;quot;00100001&amp;quot;
CONFIG_LTE_PSM_REQ_RAT=&amp;quot;00000000&amp;quot;

# eDRX
CONFIG_LTE_EDRX_REQ=n
CONFIG_LTE_EDRX_REQ_VALUE_LTE_M=&amp;quot;1001&amp;quot;

# RAI
CONFIG_LTE_RAI_REQ=n
CONFIG_LTE_RAI_REQ_VALUE=&amp;quot;4&amp;quot;

CONFIG_AT_MONITOR_HEAP_SIZE=1024
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Parameters such as WiFi AP, SSID, server address, and port are defined in Kconfig.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Cellular and WiFi Stack Management on a custom nRF9160 board</title><link>https://devzone.nordicsemi.com/thread/497267?ContentTypeID=1</link><pubDate>Wed, 07 Aug 2024 06:38:23 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:6db4a7b1-2731-44e1-9c77-f99da7b4b027</guid><dc:creator>Simonr</dc:creator><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;p&gt;I&amp;#39;m sorry, but we don&amp;#39;t have much more than the &lt;a href="https://docs.nordicsemi.com/bundle/ncs-latest/page/zephyr/connectivity/networking/index.html"&gt;networking documentation&lt;/a&gt; on setting up our devices. We can leave the case open if someone in the community would like to chime in though.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Simon&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Cellular and WiFi Stack Management on a custom nRF9160 board</title><link>https://devzone.nordicsemi.com/thread/497136?ContentTypeID=1</link><pubDate>Tue, 06 Aug 2024 11:30:18 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e6c3cb82-0695-4798-9291-d5ce7dc7f821</guid><dc:creator>kris_01</dc:creator><description>&lt;p&gt;Hi Simon.&lt;br /&gt;&lt;br /&gt;Thanks for your reply, the problem is &lt;strong&gt;not&lt;/strong&gt; RF co-existance &lt;strong&gt;but&lt;/strong&gt; network stack co-existance.&lt;br /&gt;&lt;br /&gt;We also looked at the &lt;a href="https://docs.nordicsemi.com/bundle/ncs-2.3.0/page/nrf/samples/nrf9160/modem_shell/README.html#esp8266_wi-fi_support" rel="noopener noreferrer" target="_blank"&gt;cellular/modem_shell&lt;/a&gt; sample for the &lt;strong&gt;nRF9160dk&lt;/strong&gt; where there is support for the WiFi configuration with the &lt;strong&gt;ESP8266&lt;/strong&gt; chip running AT firmware.&lt;br /&gt;&lt;br /&gt;This setup seems to be quite similar to ours, however we can&amp;#39;t understand how we could adapt this to our use-case.&lt;br /&gt;Could your provide some details on that? Specifically, what network stack configurations are required and what APIs should we use to accomplish this?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Cellular and WiFi Stack Management on a custom nRF9160 board</title><link>https://devzone.nordicsemi.com/thread/497127?ContentTypeID=1</link><pubDate>Tue, 06 Aug 2024 10:43:11 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:bf8ad9e5-ce09-47f3-af5e-9fa3e44c57fa</guid><dc:creator>Simonr</dc:creator><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;p&gt;On the LTE side, you can use the AT command AT%COEX, and I assume you can use the &lt;a href="https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/samples/mpsl/timeslot/README.html"&gt;MPSL timeslots&lt;/a&gt;&amp;nbsp;for the multiprotocol service layer. For the ESP32 co-processor we here at Nordic don&amp;#39;t have any experience with, so I don&amp;#39;t have much in terms of advice here.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Simon&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>