blob: cf47bc0d9056d796f6502c5847e956dbdf472236 [file] [log] [blame]
/* echo-client.c - Networking echo client */
/*
* Copyright (c) 2017 Intel Corporation.
* Copyright (c) 2018 Nordic Semiconductor ASA.
*
* SPDX-License-Identifier: Apache-2.0
*/
/*
* The echo-client application is acting as a client that is run in Zephyr OS,
* and echo-server is run in the host acting as a server. The client will send
* either unicast or multicast packets to the server which will reply the packet
* back to the originator.
*
* In this sample application we create four threads that start to send data.
* This might not be what you want to do in your app so caveat emptor.
*/
#if 1
#define SYS_LOG_DOMAIN "echo-client"
#define NET_SYS_LOG_LEVEL SYS_LOG_LEVEL_DEBUG
#define NET_LOG_ENABLED 1
#endif
#include <zephyr.h>
#include <errno.h>
#include <stdio.h>
#include <net/socket.h>
#include <net/tls_credentials.h>
#include "common.h"
#include "ca_certificate.h"
#define APP_BANNER "Run echo client"
#define INVALID_SOCK (-1)
/* Generated by http://www.lipsum.com/
* 2 paragraphs, 171 words, 1210 bytes of Lorem Ipsum
*/
const char lorem_ipsum[] =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse "
"eleifend odio sit amet scelerisque tincidunt. In orci ligula, egestas "
"ut neque sit amet, fringilla malesuada dolor. Fusce rhoncus nunc in "
"lacus tincidunt lobortis. Donec aliquam lectus gravida fermentum "
"egestas. Curabitur eu ex pretium, dapibus massa in, pretium tellus. "
"Suspendisse ac efficitur magna, ut convallis nisl. Duis sed sapien "
"odio. Aliquam efficitur sed tellus sit amet eleifend. Sed facilisis "
"ligula aliquam erat ornare hendrerit. Aenean tincidunt nunc a nulla "
"vestibulum mollis. Vivamus fringilla euismod nisi sit amet malesuada. "
"Vivamus consequat ultricies metus sed feugiat. Aenean malesuada "
"cursus sem."
"\n"
"Vestibulum tempor diam et aliquam tristique. Nullam condimentum felis "
"et convallis finibus. Aliquam erat volutpat. Nam et blandit tortor. "
"Nullam pharetra arcu aliquam, suscipit mi eu, faucibus lacus. "
"Pellentesque eleifend nulla sit amet purus maximus, et elementum "
"lectus fringilla. Praesent consectetur diam eget tellus molestie "
"tempor. Class aptent taciti sociosqu ad litora torquent per conubia "
"nostra, per inceptos himenaeos. Nam tincidunt urna augue, nec cursus "
"arcu eleifend nec. Donec semper tellus in leo nullam."
"\n";
const int ipsum_len = sizeof(lorem_ipsum) - 1;
struct configs conf = {
.ipv4 = {
.proto = "IPv4",
.udp.sock = INVALID_SOCK,
.tcp.sock = INVALID_SOCK,
},
.ipv6 = {
.proto = "IPv6",
.udp.sock = INVALID_SOCK,
.tcp.sock = INVALID_SOCK,
},
};
struct pollfd fds[4];
int nfds;
static void prepare_fds(void)
{
if (conf.ipv4.udp.sock >= 0) {
fds[nfds].fd = conf.ipv4.udp.sock;
fds[nfds].events = POLLIN;
nfds++;
}
if (conf.ipv4.tcp.sock >= 0) {
fds[nfds].fd = conf.ipv4.tcp.sock;
fds[nfds].events = POLLIN;
nfds++;
}
if (conf.ipv6.udp.sock >= 0) {
fds[nfds].fd = conf.ipv6.udp.sock;
fds[nfds].events = POLLIN;
nfds++;
}
if (conf.ipv6.tcp.sock >= 0) {
fds[nfds].fd = conf.ipv6.tcp.sock;
fds[nfds].events = POLLIN;
nfds++;
}
}
static void wait(void)
{
/* Wait for event on any socket used. Once event occurs,
* we'll check them all.
*/
if (poll(fds, nfds, K_FOREVER) < 0) {
NET_ERR("Error in poll:%d", errno);
}
}
static void init_app(void)
{
NET_INFO(APP_BANNER);
#if defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)
int err = tls_credential_add(CA_CERTIFICATE_TAG,
TLS_CREDENTIAL_CA_CERTIFICATE,
ca_certificate,
sizeof(ca_certificate));
if (err < 0) {
NET_ERR("Failed to register public certificate: %d", err);
}
#endif
}
void main(void)
{
int ret;
init_app();
if (IS_ENABLED(CONFIG_NET_TCP)) {
ret = start_tcp();
if (ret < 0) {
goto quit;
}
}
if (IS_ENABLED(CONFIG_NET_UDP)) {
ret = start_udp();
if (ret < 0) {
goto quit;
}
}
prepare_fds();
while (true) {
if (IS_ENABLED(CONFIG_NET_TCP)) {
ret = process_tcp();
if (ret < 0) {
goto quit;
}
}
if (IS_ENABLED(CONFIG_NET_UDP)) {
ret = process_udp();
if (ret < 0) {
goto quit;
}
}
wait();
}
quit:
NET_INFO("Stopping...");
if (IS_ENABLED(CONFIG_NET_UDP)) {
stop_udp();
}
if (IS_ENABLED(CONFIG_NET_TCP)) {
stop_tcp();
}
}