Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | /* 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; bool status; send_pkt = net_app_get_net_pkt(ctx, AF_UNSPEC, K_FOREVER); NET_ASSERT(send_pkt); status = net_pkt_append_all(send_pkt, expecting_len, lorem_ipsum, K_FOREVER); if (!status) { NET_ERR("%s: cannot create send pkt", name); net_pkt_unref(send_pkt); return NULL; } 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(); } } |