1 /*
2  * Copyright (c) 2016 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef __ZPERF_INTERNAL_H
7 #define __ZPERF_INTERNAL_H
8 
9 #include <limits.h>
10 #include <zephyr/net/net_ip.h>
11 #include <zephyr/net/zperf.h>
12 #include <zephyr/shell/shell.h>
13 #include <zephyr/sys/__assert.h>
14 
15 #define IP6PREFIX_STR2(s) #s
16 #define IP6PREFIX_STR(p) IP6PREFIX_STR2(p)
17 
18 #define MY_PREFIX_LEN 64
19 #define MY_PREFIX_LEN_STR IP6PREFIX_STR(MY_PREFIX_LEN)
20 
21 /* Note that you can set local endpoint address in config file */
22 #if defined(CONFIG_NET_IPV6) && defined(CONFIG_NET_CONFIG_SETTINGS)
23 #define MY_IP6ADDR CONFIG_NET_CONFIG_MY_IPV6_ADDR
24 #define DST_IP6ADDR CONFIG_NET_CONFIG_PEER_IPV6_ADDR
25 #define MY_IP6ADDR_SET
26 #else
27 #define MY_IP6ADDR NULL
28 #define DST_IP6ADDR NULL
29 #endif
30 
31 #if defined(CONFIG_NET_IPV4) && defined(CONFIG_NET_CONFIG_SETTINGS)
32 #define MY_IP4ADDR CONFIG_NET_CONFIG_MY_IPV4_ADDR
33 #define DST_IP4ADDR CONFIG_NET_CONFIG_PEER_IPV4_ADDR
34 #define MY_IP4ADDR_SET
35 #else
36 #define MY_IP4ADDR NULL
37 #define DST_IP4ADDR NULL
38 #endif
39 
40 #define PACKET_SIZE_MAX CONFIG_NET_ZPERF_MAX_PACKET_SIZE
41 
42 #define MY_SRC_PORT 50000
43 #define DEF_PORT 5001
44 #define DEF_PORT_STR STRINGIFY(DEF_PORT)
45 
46 /* Upload defaults */
47 #define DEF_DURATION_SECONDS 1
48 #define DEF_DURATION_SECONDS_STR STRINGIFY(DEF_DURATION_SECONDS)
49 #define DEF_PACKET_SIZE 256
50 #define DEF_PACKET_SIZE_STR STRINGIFY(DEF_PACKET_SIZE)
51 #define DEF_RATE_KBPS 10
52 #define DEF_RATE_KBPS_STR STRINGIFY(DEF_RATE_KBPS)
53 
54 #define ZPERF_VERSION "1.1"
55 
56 enum session_proto {
57 	SESSION_UDP = 0,
58 	SESSION_TCP = 1,
59 	SESSION_PROTO_END
60 };
61 
62 struct zperf_udp_datagram {
63 	uint32_t id;
64 	uint32_t tv_sec;
65 	uint32_t tv_usec;
66 #ifndef CONFIG_NET_ZPERF_LEGACY_HEADER_COMPAT
67 	uint32_t id2;
68 #endif
69 } __packed;
70 
71 BUILD_ASSERT(sizeof(struct zperf_udp_datagram) <= PACKET_SIZE_MAX, "Invalid PACKET_SIZE_MAX");
72 
73 #define ZPERF_FLAGS_VERSION1      0x80000000
74 #define ZPERF_FLAGS_EXTEND        0x40000000
75 #define ZPERF_FLAGS_UDPTESTS      0x20000000
76 #define ZPERF_FLAGS_SEQNO64B      0x08000000
77 
78 struct zperf_client_hdr_v1 {
79 	int32_t flags;
80 	int32_t num_of_threads;
81 	int32_t port;
82 	int32_t buffer_len;
83 	int32_t bandwidth;
84 	int32_t num_of_bytes;
85 };
86 
87 struct zperf_server_hdr {
88 	int32_t flags;
89 	int32_t total_len1;
90 	int32_t total_len2;
91 	int32_t stop_sec;
92 	int32_t stop_usec;
93 	int32_t error_cnt;
94 	int32_t outorder_cnt;
95 	int32_t datagrams;
96 	int32_t jitter1;
97 	int32_t jitter2;
98 };
99 
100 struct zperf_async_upload_context {
101 	struct k_work work;
102 	struct zperf_upload_params param;
103 	zperf_callback callback;
104 	void *user_data;
105 };
106 
time_delta(uint32_t ts,uint32_t t)107 static inline uint32_t time_delta(uint32_t ts, uint32_t t)
108 {
109 	return (t >= ts) ? (t - ts) : (ULONG_MAX - ts + t);
110 }
111 
112 int zperf_get_ipv6_addr(char *host, char *prefix_str, struct in6_addr *addr);
113 struct sockaddr_in6 *zperf_get_sin6(void);
114 
115 int zperf_get_ipv4_addr(char *host, struct in_addr *addr);
116 struct sockaddr_in *zperf_get_sin(void);
117 
118 extern void connect_ap(char *ssid);
119 
120 struct zperf_work {
121 	struct k_work_q *queue;
122 	struct z_thread_stack_element *stack;
123 	struct k_event *start_event;
124 	size_t stack_size;
125 };
126 
127 #define START_EVENT 0x0001
128 extern void start_jobs(void);
129 extern struct zperf_work *get_queue(enum session_proto proto, int session_id);
130 
131 int zperf_prepare_upload_sock(const struct sockaddr *peer_addr, uint8_t tos,
132 			      int priority, int tcp_nodelay, int proto);
133 
134 uint32_t zperf_packet_duration(uint32_t packet_size, uint32_t rate_in_kbps);
135 
136 void zperf_async_work_submit(enum session_proto proto, int session_id, struct k_work *work);
137 void zperf_udp_uploader_init(void);
138 void zperf_tcp_uploader_init(void);
139 
140 void zperf_shell_init(void);
141 
142 #endif /* __ZPERF_INTERNAL_H */
143