Honor the device MTU when sending data. Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
163 lines
3.8 KiB
C
163 lines
3.8 KiB
C
/* echo-client.c - Networking echo client */
|
|
|
|
/*
|
|
* Copyright (c) 2017 Intel Corporation.
|
|
*
|
|
* 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/net_pkt.h>
|
|
#include <net/net_core.h>
|
|
#include <net/net_context.h>
|
|
|
|
#include <net/net_app.h>
|
|
|
|
#include "common.h"
|
|
|
|
#define APP_BANNER "Run echo client"
|
|
|
|
/* Generated by http://www.lipsum.com/
|
|
* 3 paragraphs, 176 words, 1230 bytes of Lorem Ipsum
|
|
*/
|
|
const char lorem_ipsum[] =
|
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
|
"Vestibulum id cursus felis, sit amet suscipit velit. Integer "
|
|
"facilisis malesuada porta. Nunc at accumsan mauris. Etiam vehicula, "
|
|
"arcu consequat feugiat venenatis, tellus velit gravida ligula, quis "
|
|
"posuere sem leo eget urna. Curabitur condimentum leo nec orci "
|
|
"mattis, nec faucibus dui rutrum. Ut mollis orci in iaculis "
|
|
"consequat. Nulla volutpat nibh eu velit sagittis, a iaculis dui "
|
|
"aliquam."
|
|
"\n"
|
|
"Quisque interdum consequat eros a eleifend. Fusce dapibus nisl "
|
|
"sit amet velit posuere imperdiet. Quisque accumsan tempor massa "
|
|
"sit amet tincidunt. Integer sollicitudin vehicula tristique. Nulla "
|
|
"sagittis massa turpis, ac ultricies neque posuere eu. Nulla et "
|
|
"imperdiet ex. Etiam venenatis sed lacus tincidunt hendrerit. In "
|
|
"libero nisl, congue id tellus vitae, tincidunt tristique mauris. "
|
|
"Nullam sed porta massa. Sed condimentum sem eu convallis euismod. "
|
|
"Suspendisse lobortis purus faucibus, gravida turpis id, mattis "
|
|
"velit. Maecenas eleifend sapien eu tincidunt lobortis. Sed elementum "
|
|
"sapien id enim laoreet consequat."
|
|
"\n"
|
|
"Aenean et neque aliquam, lobortis lectus in, consequat leo. Sed "
|
|
"quis egestas nulla. Quisque ac risus quis elit mollis finibus. "
|
|
"Phasellus efficitur imperdiet metus."
|
|
"\n";
|
|
|
|
int ipsum_len = sizeof(lorem_ipsum) - 1;
|
|
|
|
struct configs conf = {
|
|
.ipv4 = {
|
|
.proto = "IPv4",
|
|
},
|
|
.ipv6 = {
|
|
.proto = "IPv6",
|
|
},
|
|
};
|
|
|
|
static struct k_sem quit_lock;
|
|
struct k_sem tcp_ready;
|
|
|
|
void panic(const char *msg)
|
|
{
|
|
if (msg) {
|
|
NET_ERR("%s", msg);
|
|
}
|
|
|
|
k_sem_give(&quit_lock);
|
|
|
|
for (;;) {
|
|
k_sleep(K_FOREVER);
|
|
}
|
|
}
|
|
|
|
static inline int init_app(void)
|
|
{
|
|
NET_INFO(APP_BANNER);
|
|
|
|
k_sem_init(&quit_lock, 0, UINT_MAX);
|
|
|
|
return 0;
|
|
}
|
|
|
|
struct net_pkt *prepare_send_pkt(struct net_app_ctx *ctx,
|
|
const char *name,
|
|
int *expecting_len)
|
|
{
|
|
struct net_pkt *send_pkt;
|
|
|
|
send_pkt = net_app_get_net_pkt(ctx, AF_UNSPEC, K_FOREVER);
|
|
|
|
NET_ASSERT(send_pkt);
|
|
|
|
*expecting_len = net_pkt_append(send_pkt, *expecting_len, lorem_ipsum,
|
|
K_FOREVER);
|
|
|
|
return send_pkt;
|
|
}
|
|
|
|
void main(void)
|
|
{
|
|
int ret;
|
|
|
|
init_app();
|
|
|
|
if (IS_ENABLED(CONFIG_NET_TCP)) {
|
|
if (IS_ENABLED(CONFIG_NET_UDP)) {
|
|
k_sem_init(&tcp_ready, 0, 1);
|
|
}
|
|
|
|
ret = start_tcp();
|
|
if (ret < 0) {
|
|
goto quit;
|
|
}
|
|
|
|
/* We start the UDP after the TCP is connected properly.
|
|
* This is done like this so that UDP does not use all the
|
|
* buffers as it is basically flooding the link with UDP
|
|
* data.
|
|
*/
|
|
if (IS_ENABLED(CONFIG_NET_UDP)) {
|
|
k_sem_take(&tcp_ready, K_FOREVER);
|
|
}
|
|
}
|
|
|
|
if (IS_ENABLED(CONFIG_NET_UDP)) {
|
|
start_udp();
|
|
}
|
|
|
|
k_sem_take(&quit_lock, K_FOREVER);
|
|
|
|
quit:
|
|
NET_INFO("Stopping...");
|
|
|
|
if (IS_ENABLED(CONFIG_NET_UDP)) {
|
|
stop_udp();
|
|
}
|
|
|
|
if (IS_ENABLED(CONFIG_NET_TCP)) {
|
|
stop_tcp();
|
|
}
|
|
}
|