• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..--

docker/03-Aug-2024-536380

libcoap/03-Aug-2024-24,48116,307

mbedtls-2.4.0/03-Aug-2024-174,048123,507

python-websocket-server/03-Aug-2024-840631

systemd/03-Aug-2024-5640

tinydtls-0.8.2/03-Aug-2024-25,52417,937

virtual-hub/03-Aug-2024-586444

.gitignoreD03-Aug-20242.2 KiB111100

MakefileD03-Aug-20242.3 KiB8659

README NAT.mdD03-Aug-20242.8 KiB8160

README.dockerD03-Aug-20241.6 KiB5535

README.legacyD03-Aug-20245.9 KiB238150

README.mdD03-Aug-20247.6 KiB265218

avahi-daemon.confD03-Aug-20241,017 5022

avahi-daemon.shD03-Aug-202445 41

big-file.htmlD03-Aug-20241.5 KiB1614

ca.crtD03-Aug-20241.1 KiB2019

client.crtD03-Aug-20241,001 1817

client_privkey.pemD03-Aug-20241.6 KiB2827

coap-client.cD03-Aug-202447.3 KiB1,9121,506

dnsmasq.confD03-Aug-2024483 2111

dnsmasq.shD03-Aug-202443 41

dnsmasq_nat.confD03-Aug-2024195 127

docker.confD03-Aug-20241 KiB4328

docker.conf.stopD03-Aug-2024153 53

dtls-client.cD03-Aug-202422 KiB666508

dtls-server.cD03-Aug-202411 KiB463326

echo-apps-cert.pemD03-Aug-20241.1 KiB1918

echo-apps-key.pemD03-Aug-20241.6 KiB2827

echo-client.cD03-Aug-202422.6 KiB771647

echo-server.cD03-Aug-202414.1 KiB630492

http-server.pyD03-Aug-2024806 3424

https-server.pemD03-Aug-20242.7 KiB4746

https-server.pyD03-Aug-20241.4 KiB5228

index.htmlD03-Aug-2024178 98

loop-ppp-dev.shD03-Aug-2024929 3410

loop-pppd.shD03-Aug-20241 KiB4018

loop-radvd.shD03-Aug-20241.7 KiB7445

loop-slip-tap.shD03-Aug-20241.2 KiB4822

loop-slip.shD03-Aug-20241.1 KiB4521

loop-socat.shD03-Aug-2024927 339

monitor_15_4.cD03-Aug-202410.1 KiB507383

nat.confD03-Aug-2024685 2916

nat.conf.stopD03-Aug-2024229 75

nat.pngD03-Aug-202463 KiB

net-capture.pyD03-Aug-20243.6 KiB12393

net-setup.shD03-Aug-20242.9 KiB14095

radvd_native_posix.confD03-Aug-2024577 3426

radvd_slip.confD03-Aug-2024577 3426

start-leshan.shD03-Aug-2024822 1911

stop-leshan.shD03-Aug-2024152 52

stunnel.confD03-Aug-20241.1 KiB4841

stunnel.shD03-Aug-2024739 256

stunnel_sc.confD03-Aug-2024721 3227

tcptest.pyD03-Aug-20243.4 KiB11979

throughput-client.cD03-Aug-202418 KiB596497

tunslip6.cD03-Aug-202427.7 KiB1,172952

websocket-console.pyD03-Aug-2024586 3017

zephyr-websocket-server.pyD03-Aug-2024943 3018

zeth-tunnel.confD03-Aug-20242.4 KiB7048

zeth-tunnel.conf.stopD03-Aug-2024507 2015

zeth-vlan.confD03-Aug-20241.8 KiB6343

zeth.confD03-Aug-2024502 2112

zeth.conf.stopD03-Aug-202498 63

zeth0-gptp.confD03-Aug-2024139 74

zeth1-gptp.confD03-Aug-2024140 74

README NAT.md

1# Create NAT and routing for Zephyr native network on Linux
2
3This page describes how you can set up a networking rules that allows you to run Zephyr applications
4build to native_posix or QEMU targets and get them to access public Internet.
5
6
7
8![Network overview](nat.png)
9
10Zephyr applications, when build on native_posix or various qemu targets,
11run simulated Ethernet driver that attaches itself to a network interface called zeth.
12This is Linux TAP interface so it can send and receive Ethernet frames.
13
14In order to have networking with Zephyr, you need to configure IP address on linux kernel side,
15set up the routing and have NAT (Network Address Translation / IP masquerading) for outbound
16traffic.
17
18Optionally, having dnsmasq to serve as small stand-alone DHCP and DNS server helps.
19When running dnsmasq, it must bind into the zeth interface, so it does not serve any
20requests coming from outside network.
21
22## Building the Zephyr application for native networking
23
24At minimun, you need following Kconfig settings for your *native_posix* application to have
25working network
26
27```
28# General network requirements
29CONFIG_NETWORKING=y
30CONFIG_NET_IPV4=y
31CONFIG_NET_TCP=y
32CONFIG_NET_UDP=y
33CONFIG_NET_SOCKETS=y
34
35# Native posix requirements
36CONFIG_ENTROPY_GENERATOR=y
37CONFIG_TEST_RANDOM_GENERATOR=y
38
39CONFIG_NET_L2_ETHERNET=y
40CONFIG_ETH_NATIVE_POSIX=y
41CONFIG_ETH_NATIVE_POSIX_RANDOM_MAC=y
42
43# IPv4 config
44CONFIG_NET_CONFIG_SETTINGS=y
45CONFIG_NET_CONFIG_NEED_IPV4=y
46CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1"
47CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2"
48CONFIG_DNS_RESOLVER=y
49CONFIG_DNS_RESOLVER_MAX_SERVERS=1
50CONFIG_DNS_SERVER_IP_ADDRESSES=y
51CONFIG_DNS_SERVER1="192.0.2.2"
52```
53
54## Running the native_posix app
55
56You can test your configuration for example in `zephyr/samples/net/sockets/http_get` by creating
57a file called `boards/native_posix.conf` with the content from the sample above.
58
59```sh
60cd zephyr/samples/net/sockets/http_get
61# create boards/native_posix.conf
62
63# Building the application
64west build -b native_posix -- -DOVERLAY_CONFIG=overlay-tls.conf
65
66# Run the application
67# Note that you need to run it realtime (-rt) so responses don't timeout,
68# otherwise it would run faster.
69# Also any TLS/DTLS traffic needs proper seed or random generator,
70# $RANDOM is adequate enough for testing purposes, not secure though,
71./build/zephyr/zephyr.elf -rt -seed=$RANDOM
72
73# Run application that use shell, for example lwm2m_client
74# These spawn the shell and logs into a virtual serial port on /dev/pts/X
75# it is easier to open a x-terminal to this serial port when you start the application
76./build/zephyr/zephyr.elf -rt -seed=$RANDOM -attach_uart
77```
78
79You might need to supply also `-attach_uart_cmd` parameter, in case default X-terminal is not
80installed. For example `-attach_uart_cmd='x-terminal-emulator -e screen %s &'` works.
81

README.docker

1# Testing with net-tools and Docker
2
3* Create Docker image
4
5	cd docker/
6	docker build -t net-tools .
7
8* Setup network interfaces, IP addresses and routes
9
10	sudo ./net-setup.sh --config docker.conf start
11
12* Run Docker image
13
14  Set the docker internal network name to the value $DOCKER_USER_INTERFACE
15  in docker.config above, default is 'net-tools0'. The bridge network that
16  docker creates will be printed on standard out, it's bridge interface
17  name will be br-XXXXXXXXXXXX. Check that the IPv4 and IPv6 addresses
18  given on the docker command line match the subnets in 'docker.conf'.
19
20  Interactively:
21
22	docker run --hostname=zephyr --name=net-tools \
23	       --ip=192.0.2.2 --ip6=2001:db8::2 \
24	       --rm -it --network=net-tools0 net-tools sh
25
26        exit with Ctrl-p ctrl-q to execute tests from the command line
27
28  Non-interactively
29
30	docker run --hostname=zephyr --name=net-tools \
31	       --ip=192.0.2.2 --ip6=2001:db8::2 \
32	       --rm -dt --network=net-tools0 net-tools sh
33
34* Run Qemu / native-posix image
35
36	rm -rf build && mkdir build
37
38	cmake -GNinja -DBOARD=native_posix -B build
39	   or
40	cmake -GNinja -DBOARD=qemu_x86 -DOVERLAY_CONFIG=overlay-e1000.conf \
41	   -B build
42
43	ninja -C build run
44
45* Execute tests like echo-client
46
47	docker container exec net-tools /net-tools/echo-client 2001:db8::1
48	docker container exec net-tools /net-tools/echo-client -t 2001:db8::1
49	docker container exec net-tools /net-tools/echo-client 192.0.2.1
50	docker container exec net-tools /net-tools/echo-client -t 192.0.2.1
51
52* Remove the network setup:
53
54	sudo ./net-setup.sh --config docker.conf stop
55

README.legacy

1The comments and instructions below are for legacy IP stack in Zephyr.
2
3tunslip6
4========
5
6tunslip6 can be used in host side to create a tun device that
7is connected to a unix socket that qemu is providing. This
8way it is possible to pass packets between host and target
9system via slip protocol.
10
11You need to connect tunslip6 to the second qemu serial line
12through a UNIX socket (qemu option -serial unix:/tmp/slip-socket).
13
141) Start socat
15
16$ socat PTY,link=/tmp/slip.dev UNIX-LISTEN:/tmp/slip.sock
17
182) Start qemu, use the listener demo app. Note that you need to
19   set CONFIG_NETWORKING_UART=y in your configuration.
20
21   You might need to set the platform and ARCH like this if simple_uart
22   driver is not found in your default platform.
23
24$ make PLATFORM_CONFIG=basic_cortex_m3 ARCH=arm \
25     QEMU_EXTRA_FLAGS="-serial none -serial unix:/tmp/slip.sock" qemu
26
27  or just simply
28
29$ make qemu
30
313) Start tunslip6
32
33$ sudo ./tunslip6 -s `readlink /tmp/slip.dev` 2001:db8::1/64
34
354) Send data to listener
36
37$ nc -u -6 2001:db8::2 4242 <<EOF
38foobar
39EOF
40
41There are also convenience scripts for running socat, radvd and
42tunslip6 processes called loop-socat.sh, loop-radvd.sh and
43loop-slip.sh. So to simplify things you need three terminals
44for doing this:
45
46Terminal 1:
47$ ./loop-socat.sh
48
49Terminal 2:
50$ sudo ./loop-slip.sh
51
52Terminal 3:
53$ sudo ./loop-radvd.sh
54
55After running these scripts you do not need to manual restart
56them when qemu process stops.
57
58
59radvd
60=====
61In order the IPv6 stateless address auto configuration (SLAAC)
62to work, you need to run radvd or similar tool in host side.
63There is an example radvd.conf file present in the tools directory.
64
65$ sudo radvd -d 1 -C radvd.conf -m stderr
66
67
68tunslip
69=======
70
71tunslip if for IPv4 networks and it can be used in host side
72to create a tun device that is connected to a unix socket that
73qemu is providing. This way it is possible to pass packets
74between host and target system via slip protocol.
75
76You need to connect tunslip to the second qemu serial line
77through a UNIX socket (qemu option -serial unix:/tmp/slip-socket).
78
791) Start socat
80
81$ socat PTY,link=/tmp/slip.dev UNIX-LISTEN:/tmp/slip.sock
82
832) Start qemu, use the listener demo app. Note that you need to
84   set CONFIG_NETWORKING_UART=y in your configuration.
85
86   You might need to set the platform and ARCH like this if simple_uart
87   driver is not found in your default platform.
88
89$ make PLATFORM_CONFIG=basic_cortex_m3 ARCH=arm \
90     QEMU_EXTRA_FLAGS="-serial none -serial unix:/tmp/slip.sock" qemu
91
923) Start tunslip
93
94$ sudo ./tunslip -s `readlink /tmp/slip.dev` 192.0.2.1 255.255.255.0
95
964) Send data to listener
97
98$ nc -u 192.0.2.2 4242 <<EOF
99foobar
100EOF
101
102
103echo-client
104===========
105
106echo-client is a tool that is run in Linux host side and
107which sends pre-defined UDP data packets to echo-server
108application that is running in qemu side. This client
109process verifies that it is able to receive data correctly
110from the echo-server and thus verify that the upper layer
111networking components in Zephyr IP stack work properly.
112
113You needs to setup the slip connection (see the steps 1 to 3)
114in tunslip6 section of this document.
115
116Example:
117
118$ ./echo-client 2001:db8::2
119
120In order to send multicast IPv6 packets, one needs to
121give the network interface as a parameter.
122
123$ ./echo-client -i tun0 ff84::2
124
125
126echo-server
127===========
128
129echo-server is a tool that is run in Linux host side and
130which waits UDP data sent by echo-client application that
131is running in qemu side.
132
133You needs to setup the slip connection (see the steps 1 to 3)
134in tunslip6 section of this document. Make sure that the Linux
135host firewall is not blocking the packets that the echo-client
136running in qemu is sending via tun0 device.
137
138Example:
139
140$ sudo ./echo-server -i tun0
141
142
143dtls-client
144===========
145
146dtls-client is a tool that is run in Linux host side and
147which connects to dtls-server running in qemu.
148
149You needs to setup the slip connection (see the steps 1 to 3)
150in tunslip6 section of this document.
151
152Example:
153
154$ make dtls-client
155
156$ ./dtls-client -b 2001:db8::1 2001:db8::2
157
158
159dtls-server
160===========
161
162dtls-server is a tool that is run in Linux host side and
163which waits DTLS data sent by dtls-client application that
164is running in qemu side.
165
166You needs to setup the slip connection (see the steps 1 to 3)
167in tunslip6 section of this document.
168
169Example:
170
171$ make dtls-server
172
173$ ./dtls-server -i tun0
174
175monitor_15_4
176============
177
178monitor_15_4 is a tool that is run in Linux host side and
179which reads data from pipes which is written buy 15.4 test
180application from qemu. This is T juntion tool which reads
181and writes data from pipes and feed into pipes (this way
182both qemus communicate each other) and same time data
183written in PCAP format for wireshark monitoring.
184
185Please also read samples/network/test_15_4/README for
186how to configure and run two qemus.
187
188Make and run this tool
189
190$ make
191
192Usage : monitor_15_4 <sample pcap file> [<pipe_1> <pipe_2>]
193
194$ monitor_15_4 sample.pcap
195
196or
197
198$ monitor_15_4 sample.pcap /tmp/ip-15-4-1 /tmp/ip-15-4-2
199
200
201coap-client
202===========
203
204coap-client is a tool that is run in Linux host side and
205which connects to coap-server running in qemu.
206
207You needs to setup the slip connection (see the steps 1 to 3)
208in tunslip6 section of this document.
209
210Example:
211
212$ make coap-client
213
214If you want to use DTLS then run client like this
215$ sudo ./coap-client -i tun0 2001:db8::2
216
217For non-DTLS case, run client like this
218$ sudo ./coap-client -n -i tun0 2001:db8::2
219
220
221coap-observe-client
222===================
223
224You can test the coap-observe-client that is running in qemu
225using the coap-server example server that is found in libcoap.
226So get libcoap package which can be found here
227https://github.com/obgm/libcoap.git
228Compile and install the libcoap library in host.
229
230You needs to setup the slip connection (see the steps 1 to 3)
231in tunslip6 section of this document.
232
233$ /home/user/libcoap/examples/coap-server -A 2001:db8::1 -p 5683
234
235Then in the samples/network/coap_observe_client directory, say
236
237$ make qemu
238

README.md

1[![Run Status](https://api.shippable.com/projects/58ffb2b81fb3ec0700e1602f/badge?branch=master)](https://app.shippable.com/github/zephyrproject-rtos/net-tools)
2
3# Networking Tools
4
5The comments and instructions below are for the new IP stack in Zephyr.
6
7Here are instructions how to communicate between Zephyr that is running
8inside QEMU, and host device that is running Linux.
9
10For setting up routing and NAT rules to allow access to external networks, please see
11the [README NAT.md](README%20NAT.md)
12
13You need to run *socat* and *tunslip* to create a minimally working
14network setup.
15
16There are convenience scripts (_loop-socat.sh_ and _loop-slip-tap.sh_) for
17running socat and tunslip6 processes. For running these, you need two
18terminals.
19
20Terminal 1:
21```
22$ ./loop-socat.sh
23```
24
25Terminal 2:
26```
27$ sudo ./loop-slip-tap.sh
28```
29
30After running these scripts you do not need to manually restart
31them when qemu process stops.
32
33In the Qemu side, you need to compile the kernel with proper config.
34Minimally you need these settings active in your project config file.
35```
36CONFIG_NETWORKING=y
37CONFIG_NET_IPV6=y
38CONFIG_NET_IPV4=y
39CONFIG_NET_YAIP=y
40CONFIG_NET_UDP=y
41CONFIG_NET_LOG=y
42CONFIG_NET_SLIP=y
43CONFIG_SLIP_TAP=y
44CONFIG_SYS_LOG=y
45CONFIG_SYS_LOG_SHOW_COLOR=y
46CONFIG_NANO_TIMEOUTS=y
47CONFIG_TEST_RANDOM_GENERATOR=y
48```
49
50After you have the loop scripts and Qemu running running you can communicate
51with the Zephyr.
52
53If your have echo-server running in the Qemu, then you can use the echo-client
54tool in net-tools directory to communicate with it.
55```
56# ./echo-client -i tap0 2001:db8::1
57```
58The IP stack responds to ping requests if properly configured.
59```
60$ ping6 -I tap0 -c 1 2001:db8::1
61```
62You can attach wireshark to tap0 interface to see what data is being
63transferred.
64
65If building with CONFIG_NET_TCP=y in your project config file, it's possible
66to run the echo-server sample in Zephyr, and then test the TCP stack using
67the supplied tcptest.py script:
68```
69$ ./tcptest.py tap0 2001:db8::1
70```
71This script will send numbers to the echo-server program, read them back,
72and compare if it got the exact bytes back.  Transmission errors, timeouts,
73and time to get the response are all recorded and printed to the standard
74output.
75
76Be sure to use Python 3, as it requires a function from the socket module
77that's only available in this version (wrapper around if_nametoindex(3)).
78
79
80## Using net-setup.sh script to setup host side ethernet interface
81
82The net-setup.sh script can setup an ethernet interface to the host.
83User is able to setup a configuration file that will contain
84commands to setup IP addresses and routes to the host interface.
85This net-setup.sh script will need to be run as a root user.
86
87If no parameters are given, then "zeth" network interface and "zeth.conf"
88configuration file are used. The script waits until user presses CTRL-c
89and then removes the network interface.
90```
91$ net-setup.sh
92```
93```
94$ net-setup.sh --config zeth-vlan.conf
95```
96```
97$ net-setup.sh --config my-own-config.conf --iface foobar
98```
99
100It is also possible to let the script return and then stop the network
101interface later. Is can be done by first creating the interface with
102"start" or "up" command, and then later remove the interface with
103"stop" or "down" command.
104```
105$ net-setup.sh start
106do your things here
107$ net-setup.sh stop
108```
109```
110$ net-setup.sh --config my-own-config.conf up
111do your things here
112$ net-setup.sh --config my-own-config.conf down
113```
114
115Any extra parameters that the script does not know, are passed directly
116to "ip" command.
117```
118$ net-setup.sh --config my-own-config.conf --iface foo user bar
119```
120
121## Using encrypted SSL link with echo-* programs
122
123Install stunnel
124
125Fedora:
126```
127$ dnf install stunnel
128```
129Ubuntu:
130```
131$ apt-get install stunnel4 -y
132```
133Finally run the stunnel script in Linux
134```
135$ ./stunnel.sh
136```
137And connect echo-client to this SSL tunnel (note that the IP address
138is the address of Linux host where the tunnel end point is located).
139```
140$ ./echo-client -p 4243 2001:db8::2 -t
141```
142If you are running echo-client in Zephyr QEMU, then run echo-server like
143this:
144```
145$ ./echo-server -p 4244 -i tap0
146```
147
148If you want to re-create the certificates in echo-server and echo-client in
149Zephyr net samples, then they can be created like this (note that you do not
150need to do this as the certs have been prepared already in echo-server and
151echo-client sample sources):
152```
153$ openssl genrsa -out echo-apps-key.pem 2048
154$ openssl req -new -x509 -key echo-apps-key.pem -out echo-apps-cert.pem \
155    -days 10000 -subj '/CN=localhost'
156```
157The cert that is to be embedded into test_certs.h in echo-server and
158echo-client, can be generated like this:
159```
160$ openssl x509 -in echo-apps-cert.pem -outform DER | \
161    hexdump -e '8/1 "0x%02x, " "\n"' | sed 's/0x  ,//g'
162```
163The private key to be embedded into test_certs.h in echo-server can be
164generated like this:
165```
166$ openssl pkcs8 -topk8 -inform PEM -outform DER -nocrypt \
167    -in echo-apps-key.pem | hexdump -e '8/1 "0x%02x, " "\n"' | \
168    sed 's/0x  ,//g'
169```
170
171If you want to re-create the signed certificates in echo-server in Zephyr
172net samples and echo-client in net-tools, then they can be created like this
173(note that you do not need to do this as the certs have been prepared already
174in echo-server and echo-client sources):
175```
176CA
177--
178$ openssl genrsa -out ca_privkey.pem 2048
179$ openssl req -new -x509 -days 36500 -key ca_privkey.pem -out ca.crt -subj "/CN=exampleCA"
180
181Convert to DER format
182$ openssl x509 -in ca.crt -outform DER -out ca.der
183```
184
185```
186Client
187------
188$ openssl genrsa -out client_privkey.pem 2048
189$ openssl req -new -key client_privkey.pem -out client.csr -subj "/CN=exampleClient"
190$ openssl x509 -req -CA ca.crt -CAkey ca_privkey.pem -days 36500 -in client.csr -CAcreateserial -out client.crt
191```
192
193```
194Server
195------
196$ openssl genrsa -out server_privkey.pem 2048
197$ openssl req -new -key server_privkey.pem -out server.csr -subj "/CN=localhost"
198$ openssl x509 -req -CA ca.crt -CAkey ca_privkey.pem -days 36500 -in server.csr -CAcreateserial -out server.crt
199
200Convert to DER format
201$ openssl x509 -in server.crt -outform DER -out server.der
202$ openssl pkcs8 -topk8 -inform PEM -outform DER -nocrypt -in server_privkey.pem -out server_privkey.der
203```
204
205Copy ca.crt, client.crt and client_privkey.pem to net-tools.
206Copy ca.der, server.der and server_privkey.der to samples/net/sockets/echo-server/src/.
207
208Enable NET_SAMPLE_CERTS_WITH_SC in samples/net/sockets/echo-server and build the sample.
209Use stunnel_sc.conf in stunnel.sh to run echo-client with signed certificates.
210
211## Using DTLS link with echo-* programs
212
213For DTLS client functionality, you can do this
214
215```
216$ ./dtls-client -c echo-apps-cert.pem 2001:db8::1
217```
218or
219```
220$ ./dtls-client -c echo-apps-cert.pem 192.0.2.1
221```
222For DTLS server functionality, you can do this
223
224```
225$ ./dtls-server
226```
227
228## TLS connecitivity errors
229
230If you see this error print in zephyr console
231
232[net/app] [ERR] _net_app_ssl_mainloop: Closing connection -0x7180 (SSL - Verification of the message MAC failed)
233
234Then increasing the mbedtls heap size might help. So you can set the option
235CONFIG_MBEDTLS_HEAP_SIZE to some higher value.
236
237Example:
238```
239CONFIG_MBEDTLS_HEAP_SIZE=30000
240```
241
242## PPP Connectivity
243
244You can test the PPP connectivity running in Qemu in Zephyr using pppd that is
245running in Linux host. You need to run *socat* and *pppd* to create
246a minimally working network setup.
247
248There are convenience scripts (_loop-ppp-dev.sh_ and _loop-pppd.sh_) for
249running socat and pppd processes. For running these, you need two
250terminals.
251
252Terminal 1:
253```
254$ ./loop-ppp-dev.sh
255```
256
257Terminal 2:
258```
259$ sudo ./loop-pppd.sh
260```
261
262After this, start PPP enabled Zephyr application. For example Zephyr
263*echo-server* sample in samples/net/sockets/echo_server has _overlay-ppp.conf_
264file that enables PPP support.
265