4 ms·
I don't really intend to promote this yet but anyway here's my in-progress TCP/IP stack implementation: https://github.com/ambrop72/aprinter/tree/master/aipsta
by ambrop7 9y ago
I don't really intend to promote this yet but anyway here's my in-progress TCP/IP stack implementation:
https://github.com/ambrop72/aprinter/tree/master/aipstack https://github.com/ambrop72/aprinter/tree/master/aipstack
It is written in C++14, is platform-independent and works within a single-threaded reactor environment. Microcontrollers are the primary target for example the stack does no dynamic memory allocation at all. I consider the TCP part to be "pretty complete" at this point, it even has PMTUD which lwIP lacks. The TCP code is also quite commented.
- Matthias247 9y agoC++14, single-threaded and no dynamic allocations sound like good key parameters! I think reasonable alternatives to lwip for embedded systems would be a good thing.
- CyberDildonics 9y agoCan something like this be used on a linux PC? Does the input come from reading in a file handle of raw ethernet input like these tutorials?
- unmole 9y agoThe easiest way would be using a tun/tap interface.
- ambrop7 9y agoIt is already possible. The current test setup involves my APrinter software (firmware for 3d printers) ported to run on Linux including its web interface. It does indeed use a TAP interface and yes it reads/writes Ethernet frames (the stack does implement Ethernet/ARP). Linux specific code is here: https://github.com/ambrop72/aprinter/tree/master/aprinter/hal/linux https://github.com/ambrop72/aprinter/tree/master/aprinter/ha... However note that the LinuxTapEthernet is not directly for my TCP/IP stack but there is a driver abstraction in between, which is also the part that configures/instantiates the stack (aprinter/net/IpStackNetwork.h). It is possible to try it out if you have the Nix package manager (since the configuration/build system is based on that): python -B config_system/generator/generate.py | nix-build - -o ~/aprinter-build ./aprinter-build/aprinter.elf -ttap0 That will result in trying to get an IP address using DHCP (yes DHCP client is included). Static IP can be configured using these commands: M926 INetworkDhcpEnabled V0 M926 INetworkIpAddress V192.168.64.10 M926 INetworkIpNetmask V255.255.255.0 M926 INetworkIpGateway V192.168.64.1 M930 The software will run a command line usable via nc on port 23, and also an HTTP server on port 80. To get the HTTP server to actually serve files, an SD card image with FAT filesystem needs to be created and the web interface files put into it (I can explain if anyone wants to try). What is to be done is a minimal example for integrating the stack and corresponding documentation. For example how to integrate with the reactor, which is abstract from the perspective of the stack but must follow a specific interface. The stack itself only uses timers since other event sources would be used for I/O by e.g. interface drivers. Currently there are two event loops provided, one for Linux based on epoll (aprinter/system/LinuxEventLoop.h) and one that uses busy looping meant for microcontrollers (aprinter/system/BusyEventLoop.h).