# rtnet-preempt_rt
**Repository Path**: Byron-Hope/rtnet-preempt_rt
## Basic Information
- **Project Name**: rtnet-preempt_rt
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-11
- **Last Updated**: 2025-11-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## RTnet (UDP) on PREEMPT_RT Linux
Please read the whole doc to have an impression.
#### Features:
* ported to raspberry pi 4 (bcmgenet), orange pi one (stmmac),
realtek (8139too), microchip (enc28j60)
* note: the bbb driver from this repository is not ported to rtnet-preempt_rt,
I do not remember exactly why I have included it at that time (2 years ago)
* rtnet UDP socket, bind, recvmsg, sendto, recvfrom, sendmsg, select, poll system calls
(the system calls names are appended with _rtnet(), but you can rename them);
* timeout possible for recv;
* sockets with AF_INET (UDP) or AF_PACKET (raw) family;
* rtnetproxy for ssh and scp (but uses RT driver bandwidth)
* also see the help docs in the rtnet-geek repository.
* TODO: port routing, rtcfg, rtmac, tdma and nomac if there will be interest
* improvements can be made around the variable msg_in_userspace,
like avoiding multiple packet copies
#### Paper
* if you use our work, please cite us:
L. -C. Duca and A. Duca, "Achieving Hard Real-Time Networking on PREEMPT_RT Linux with RTnet"
2020 International Symposium on Fundamentals of Electrical Engineering (ISFEE),
2020, pp. 1-4, doi: 10.1109/ISFEE51261.2020.9756165.
* https://ieeexplore.ieee.org/document/9756165
#### 0. Download linux-5.9.tar.xz
https://cdn.kernel.org/pub/linux/kernel
#### 1a. Apply patch (includes PREEMPT_RT)
```
cd linux-5.9
patch -p1 < ../rtnet-v11b-preempt_rt-linux-5.9.patch
```
#### 1b. Add the _rtnet() system calls
- rpi-4
```
cp ../rpi-4/unistd.h include/uapi/asm-generic/
```
- x86_64 qemu
```
cp ../x86_64/syscall_64.tbl arch/x86/entry/syscalls/
```
- orangepi-one
```
cp ../orangepi-one/syscall.tbl arch/arm/tools/
```
- beaglebone black (patch with bbb rtnet driver including PREEMPT_RT)
```
cp ../bbb/am335x-bone-common.dtsi arch/arm/boot/dts/
cp ../bbb/syscall.tbl arch/arm/tools/
```
- microchip enc28j60 on raspberry pi zero
(needs RT SPI drivers, see https://github.com/laurentiuduca/real-time-spi)
```
cp ../rpi-zero-enc28j60/bcm2835-rpi.dtsi arch/arm/boot/dts/
cp ../bbb/syscall.tbl arch/arm/tools/
```
#### 2. Use buildroot to setup a rootfs for the target board
#### 3. Configure linux
###### Note for rpi 4 (choose the 64 bits version)
- SSH is disabled by default; can be enabled by creating a file with name "ssh" in boot partition
- cmdline.txt: root=/dev/mmcblk1p2 rootwait console=tty1 console=ttyS1,115200
https://gist.github.com/lategoodbye/c7317a42bf7f9c07f5a91baed8c68f75
https://www.raspberrypi.org/forums/viewtopic.php?t=249579
###### defconfig
rpi-4
```
make ARCH=arm64 defconfig
```
orangepi-one
```
make ARCH=arm sunxi_defconfig
```
bbb
```
make ARCH=arm omap2plus_defconfig
```
rpi-0
- cmdline.txt: root=/dev/mmcblk0p2 rootwait console=tty1 console=ttyS1,115200
```
make ARCH=arm bcm2835_defconfig
```
qemu x86_64
```
make ARCH=x86_64 x86_64_defconfig
```
###### In the kernel configuration, set the following settings as enabled [*] or disabled []
- CONFIG_PREEMPT_RT_FULL: General setup → Preemption Model (Fully Preemptible Kernel (RT)) → Fully Preemptible Kernel (RT)
(Depends on: && EXPERT [=y] && ARCH_SUPPORTS_RT [=y] && KVM=[n])
- Enable HIGH_RES_TIMERS: General setup → Timers subsystem → High Resolution Timer Support (Actually, this should already be enabled in the standard configuration.)
CONFIG_HZ_PERIODIC=n, CONFIG_NO_HZ=n, CONFIG_NO_HZ_FULL=y
- Kernel features - Processor type and features → [] Multi-core scheduler support (CONFIG_SCHED_MC)
- [] ACPI Support
- Power management and ACPI options / CPU Power Management --->
CPU Frequency scaling ---> [ ] CPU Frequency scaling
CPU idle ---> [ ] CPU idle PM support
- rtnet is in the net folder and must compile into kernel its driver
(there must be selected in-kernel ipv4, icmp and udp from the protocol stack
and proxy as a module):
```
Select Networking Support - RTnet,
Protocol Stack -> (32) Size of central RX-FIFO,
Real-Time IPv4, ICMP support, (32) Maximum host routing table entries,
UDP support, Real-Time Packet Socket Support.
The rest must be unselected.
Drivers -> the driver for the target computer
Add-Ons -> IP protocol proxy for Linux
```
- be sure to disable the non-RTnet network drivers from net/ethernet
Device Drivers -> Network device support -> Ethernet driver support -> Broadcom, STMicroelectronics devices, TI, etc
#### 4. Compile linux
- x86_64 qemu
```
make -j5 ARCH=x86_64 INSTALL_MOD_PATH=/home/user/modules CONFIG_DEBUG_INFO=y bzImage modules modules_install
```
- rpi-4
```
make -j5 ARCH=arm64 CROSS_COMPILE="..." CONFIG_DEBUG_INFO=y INSTALL_MOD_PATH=/home/laur/lucru/rtnet/modules Image bcm2711-rpi-4-b.dtb modules modules_install
```
- orangepi-one
```
make -j5 ARCH=arm CROSS_COMPILE="..." CONFIG_DEBUG_INFO=y INSTALL_MOD_PATH=/home/laur/lucru/rtnet/modules zImage sun8i-h3-orangepi-one.dtb modules modules_install
```
- bbb
```
make -j5 ARCH=arm CROSS_COMPILE="..." CONFIG_DEBUG_INFO=y INSTALL_MOD_PATH=/home/laur/lucru/rtnet/modules zImage am335x-boneblack.dtb modules modules_install
```
- rpi-0
```
make -j5 ARCH=arm CROSS_COMPILE="..." CONFIG_DEBUG_INFO=y INSTALL_MOD_PATH=/home/laur/lucru/rtnet/modules zImage bcm2835-rpi-zero-w.dtb modules modules_install
```
#### 5. Boot qemu x86_64 emulator or boot target board
- qemu x86_64 emulator (see x86_64/qemu/config-qemu.txt)
```
sudo qemu-system-x86_64 -m 1G --enable-kvm -M q35 -kernel bzImage -hda rootfs-50 -append "console=tty1 console=ttyS0 root=/dev/sda rw" -device rtl8139,netdev=bridgeid,mac=52:54:00:11:22:44 -netdev bridge,br=br0,id=bridgeid -serial stdio
sudo qemu-system-x86_64 -m 1G -M q35 -kernel bzImage -hda rootfs-50 -append "console=tty1 console=ttyS0 root=/dev/sda rw" -device rtl8139,netdev=bridgeid,mac=52:54:00:11:22:44 -netdev bridge,br=br0,id=bridgeid -serial stdio
with empty password (ENTER).
```
#### 6. After booting qemu or target, read start-modules.sh (a better name would be setup-rtnet.sh)
- on the target:
```
./start-modules.sh:
```
which equivalates to
```
set -x
mount -t debugfs debugfs /sys/kernel/debug
/root/rtifconfig rteth0 up 192.168.1.70
## now you should wait for the interface to be set up
/root/rtifconfig rtlo up 127.0.0.1
ifconfig rtproxy up 192.168.1.70
/root/rtroute solicit 192.168.1.30 dev rteth0
/root/rtroute solicit 192.168.1.40 dev rteth0
/root/rtroute solicit 192.168.1.50 dev rteth0
/root/rtroute solicit 192.168.1.60 dev rteth0
```
- on the development host:
```
ping 192.168.1.70
```
#### 7. There are provided tftp client (both x86_64 and arm) and server (for x86_64).
If you do not use rtnetproxy for scp or ssh, you can use tftp.
On the development host:
```
cp zImage /tmp/
./tftpd -d -P 8086
```
On the target, to get zImage:
```
./tftpc 192.168.1.100 -P 8086 -g zImage -o
```
On the target, to copy to server:
```
./tftpc 192.168.1.100 -P 8086 -p filename -o
```
You will find filename in /tmp
#### 8. Testing
Please read rtt-laur.c and rtt-sender.c/rtt-responder.c for UDP sockets
and raw_recv.c and raw_send.c for raw sockets.
###### 8a. Hello world
on one computer:
```
./rtt-laur.out
```
on another computer
```
./rtt-laur.out -d 192.168.1.20
```
###### 8b. Test RTT
On one computer
```
./rtt-responder.out
```
on another computer
```
./rtt-sender -d 192.168.1.20
```
###### 8.c. Test raw sockets
On one computer
```
./raw_recv
```
on another computer
```
./raw_send
```
Success,
laurentiu [dot] duca [at] gmail [dot] com