samples: net: socket_echo_select: add support for TI CC32xx

TI CC32xx does not support binding the same port to multiple sockets,
but instead uses the IPv6 socket to handle both IPv4 and IPv6
connections. This commit modifies the sample to reflect this.
In addition, Kconfig options are overridden in order for the sample
to take advantage of wifi and socket offloading on this platform.

Signed-off-by: Vincent Wan <vwan@ti.com>
This commit is contained in:
Vincent Wan 2020-07-24 16:09:02 -07:00 committed by Carles Cufí
commit dd5c33361b
3 changed files with 59 additions and 7 deletions

View file

@ -0,0 +1,20 @@
# Networking Config:
CONFIG_NET_NATIVE=n
# Enable SimpleLink WiFi Driver and Socket Offload
CONFIG_WIFI=y
CONFIG_WIFI_SIMPLELINK=y
CONFIG_NET_SOCKETS_OFFLOAD=y
# Disable unneeded settings from the base prj.conf:
CONFIG_NET_CONFIG_SETTINGS=n
CONFIG_NET_CONFIG_MY_IPV4_ADDR=""
CONFIG_NET_CONFIG_PEER_IPV4_ADDR=""
CONFIG_NET_CONFIG_MY_IPV6_ADDR=""
CONFIG_NET_CONFIG_PEER_IPV6_ADDR=""
# Debugging
CONFIG_NET_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
CONFIG_DEBUG=y
CONFIG_ASSERT=y

View file

@ -0,0 +1,20 @@
# Networking Config:
CONFIG_NET_NATIVE=n
# Enable SimpleLink WiFi Driver and Socket Offload
CONFIG_WIFI=y
CONFIG_WIFI_SIMPLELINK=y
CONFIG_NET_SOCKETS_OFFLOAD=y
# Disable unneeded settings from the base prj.conf:
CONFIG_NET_CONFIG_SETTINGS=n
CONFIG_NET_CONFIG_MY_IPV4_ADDR=""
CONFIG_NET_CONFIG_PEER_IPV4_ADDR=""
CONFIG_NET_CONFIG_MY_IPV6_ADDR=""
CONFIG_NET_CONFIG_PEER_IPV6_ADDR=""
# Debugging
CONFIG_NET_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
CONFIG_DEBUG=y
CONFIG_ASSERT=y

View file

@ -95,7 +95,8 @@ void main(void)
{
int res;
static int counter;
int serv4, serv6;
#if !defined(CONFIG_SOC_SERIES_CC32XX)
int serv4;
struct sockaddr_in bind_addr4 = {
.sin_family = AF_INET,
.sin_port = htons(BIND_PORT),
@ -103,12 +104,16 @@ void main(void)
.s_addr = htonl(INADDR_ANY),
},
};
#endif
int serv6;
struct sockaddr_in6 bind_addr6 = {
.sin6_family = AF_INET6,
.sin6_port = htons(BIND_PORT),
.sin6_addr = IN6ADDR_ANY_INIT,
};
FD_ZERO(&readfds);
#if !defined(CONFIG_SOC_SERIES_CC32XX)
serv4 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serv4 < 0) {
printf("error: socket: %d\n", errno);
@ -120,6 +125,10 @@ void main(void)
printf("Cannot bind IPv4, errno: %d\n", errno);
}
setblocking(serv4, false);
listen(serv4, 5);
pollfds_add(serv4);
#endif
serv6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (serv6 < 0) {
printf("error: socket(AF_INET6): %d\n", errno);
@ -141,14 +150,8 @@ void main(void)
printf("Cannot bind IPv6, errno: %d\n", errno);
}
FD_ZERO(&readfds);
setblocking(serv4, false);
setblocking(serv6, false);
listen(serv4, 5);
listen(serv6, 5);
pollfds_add(serv4);
pollfds_add(serv6);
printf("Async select-based TCP echo server waits for connections on "
@ -174,7 +177,16 @@ void main(void)
continue;
}
int fd = i;
#if defined(CONFIG_SOC_SERIES_CC32XX)
/*
* On TI CC32xx, the same port cannot be bound to two
* different sockets. Instead, the IPv6 socket is used
* to handle both IPv4 and IPv6 connections.
*/
if (fd == serv6) {
#else
if (fd == serv4 || fd == serv6) {
#endif
/* If server socket */
int client = accept(fd, (struct sockaddr *)&client_addr,
&client_addr_len);