Willkommen im einzigen picoTCP-Repository.
picoTCP ist ein modularer TCP/IP-Stack mit geringem Platzbedarf, der für eingebettete Systeme und das Internet der Dinge entwickelt wurde. Es wird aktiv von Altran Intelligent Systems weiterentwickelt.
Dieser Code wird unter den Bedingungen von GNU GPL v2 und GNU GPL v3 veröffentlicht. Einige Rechte vorbehalten. Andere Lizenzen können nach alleinigem Ermessen der Urheberrechtsinhaber gelten.
Erfahren Sie, wie Sie picoTCP in Ihrem Projekt verwenden, indem Sie den Leitfaden „Erste Schritte“ in unserem GitHub-Wiki durchgehen.
Für weitere Informationen senden Sie uns eine E-Mail oder kontaktieren Sie uns auf Twitter, Facebook oder Reddit.
Fragen Sie sich über die Codequalität von picoTCP? Überprüfen Sie unseren TiCS-Score
Funktionstests: - Unit-Tests: - RFC-Konformität: - TICS-Qualität: Coverity Scan Build-Status:
Durch die Einfachheit der Schnittstellen ist der Portierungsaufwand auf neue Plattformen und Betriebssysteme sehr gering. Um Ihnen einen Anhaltspunkt zu geben: Die Portierung auf eine neue Plattform kann in 3 Tagen oder weniger durchgeführt werden, ein neues Betriebssystem in einem einzigen Tag und wenn Sie wirklich verrückt werden, können Sie eine erste Portierung an einem einzigen Abend durchführen. Unterschiedliche Plattformen bedeuten unterschiedliche Compiler, deshalb kompilieren wir unseren Stack kontinuierlich mit einer Reihe davon. Die folgende Liste zeigt einige der derzeit unterstützten Plattformen, Gerätetreiber und Compiler.
Plattformen picoTCP läuft auf : ARM Cortex-M-Serie (ST Micro STM, NXP LPC, TI Stellaris, Freescale K64F), ARM ARM9-Serie (ST Micro STR9), Texas Instruments (MSP430), Microchip (PIC24, PIC32), Atmel ( AVR 8bit), Linux (Benutzerbereich (TUN/TAP), Kernelbereich), Windows (Benutzerbereich (TAP))
Netzwerkgeräte, mit denen picoTCP gearbeitet hat : BCM43362 (IEEE 802.11), MRF24WG (IEEE 802.11), LPC Ethernet ENET/EMAC (IEEE 802.3), Stellaris Ethernet (IEEE 802.3), STM32 Ethernet (IEEE 802.3), Wiznet W5100 (IEEE 802.3), USB CDC-ECM (CDC1.2), PPP, virtuelle Treiber (TUN/TAP, VDE, Libpcap)
(RT)Betriebssysteme picoTCP wurde integriert in : Kein Betriebssystem / Bare Metal, FreeRTOS, mbed-RTOS, Frosted, Linux / POSIX, MS DOS, MS Windows
Bibliotheken picoTCP wurde integriert mit : wolfSSL, mbedTLS, Mongoose RESTful-Bibliothek, MicroPython
Compiler picoTCP kompiliert unter : GCC, Clang, TCC, ARM-RCVT, IAR, XC-16, XC-32, MSP-GCC, AVR-GCC
Leider können wir nicht den gesamten Code veröffentlichen, da einige Teile von Code oder Binärdateien abhängen, die nicht GPL-kompatibel sind, einige Teile im Rahmen eines kommerziellen Vertrags entwickelt wurden und einige aus sehr grobem Proof-of-Concept-Code bestehen. Wenn Sie mehr über die Verfügbarkeit unter der kommerziellen Lizenz oder die Möglichkeit erfahren möchten, unsere Expertendienste für die Portierung oder Treiberentwicklung zu nutzen, kontaktieren Sie uns gerne unter [email protected].
Ihr Favorit ist nicht in der Liste? Schauen Sie sich das Wiki an, um Informationen und Beispiele zur Portierung von picoTCP auf eine neue Plattform zu erhalten!
Funktionen werden in picoTCP als Module entwickelt, sodass Sie die gewünschten Funktionen für Ihre Anwendung auswählen können. Dadurch entsteht der kleinstmögliche Stack, der weiterhin den Internetstandards entspricht. Das folgende Schema gibt einen Überblick über alle implementierten Protokolle.
In diesem Beispiel wird Ubuntu 14.04 verwendet. Es funktioniert auch auf anderen Linux-Distributionen, allerdings müssen Sie möglicherweise einige Paketnamen ändern. Weitere Informationen finden Sie unter Einrichten der Umgebung.
sudo apt-get install git check vde2 libvdeplug2-dev libpcap0.8-dev openvpn wireshark
git clone https://github.com/tass-belgium/picotcp
cd picotcp
make TAP=1
cd ..
Erstellen Sie dann ein neues Verzeichnis, z. B. example
, und erstellen Sie eine Datei mit folgendem Inhalt: //: # (Der Code unten wird durch unser CI gezogen – bitte lassen Sie die Kommentare zum Code-Extraktor intakt!) //: # (Start des Code-Extraktors)
#include
#include
#include
#include
#include
#define NUM_PING 10
static int finished = 0 ;
/* gets called when the ping receives a reply, or encounters a problem */
void cb_ping ( struct pico_icmp4_stats * s )
{
char host [ 30 ];
pico_ipv4_to_string ( host , s -> dst . addr );
if ( s -> err == 0 ) {
/* if all is well, print some pretty info */
printf ( "%lu bytes from %s: icmp_req=%lu ttl=%lu time=%lu msn" , s -> size ,
host , s -> seq , s -> ttl , ( long unsigned int ) s -> time );
if ( s -> seq >= NUM_PING )
finished = 1 ;
} else {
/* if something went wrong, print it and signal we want to stop */
printf ( "PING %lu to %s: Error %dn" , s -> seq , host , s -> err );
finished = 1 ;
}
}
int main ( void ){
int id ;
struct pico_ip4 ipaddr , netmask ;
struct pico_device * dev ;
/* initialise the stack. Super important if you don't want ugly stuff like
* segfaults and such! */
pico_stack_init ();
/* create the tap device */
dev = pico_tap_create ( "tap0" );
if (! dev )
return -1 ;
/* assign the IP address to the tap interface */
pico_string_to_ipv4 ( "192.168.5.4" , & ipaddr . addr );
pico_string_to_ipv4 ( "255.255.255.0" , & netmask . addr );
pico_ipv4_link_add ( dev , ipaddr , netmask );
printf ( "starting pingn" );
id = pico_icmp4_ping ( "192.168.5.5" , NUM_PING , 1000 , 10000 , 64 , cb_ping );
if ( id == -1 )
return -1 ;
/* keep running stack ticks to have picoTCP do its network magic. Note that
* you can do other stuff here as well, or sleep a little. This will impact
* your network performance, but everything should keep working (provided
* you don't go overboard with the delays). */
while ( finished != 1 )
{
usleep ( 1000 );
pico_stack_tick ();
}
printf ( "finished !n" );
return 0 ;
}
Jetzt können wir dies kompilieren und verknüpfen, indem wir es ausführen
gcc -c -o main.o -I../picotcp/build/include main.c
gcc -o main.elf main.o ../picotcp/build/lib/libpicotcp.a
Als Nächstes erstellen wir ein dauerhaftes Tap-Gerät – einen virtuellen Netzwerkport. Sie müssen dies nicht jedes Mal wiederholen, das Gerät bleibt bestehen, bis Sie es neu starten oder bis Sie sudo tunctl -d tap0
aufrufen
sudo tunctl -u < username >
sudo ifconfig tap0 192.168.5.5
Jetzt sollten Sie in der Lage sein, ./main.elf
auszuführen und eine Ausgabe wie folgt zu sehen
Protocol ethernet registered (layer: 2).
Protocol ipv4 registered (layer: 3).
Protocol ipv6 registered (layer: 3).
Protocol icmp4 registered (layer: 4).
Protocol icmp6 registered (layer: 4).
Protocol igmp registered (layer: 4).
Protocol udp registered (layer: 4).
Protocol tcp registered (layer: 4).
Device tap0 created.
Assigned ipv4 192.168.5.4 to device tap0
starting ping
64 bytes from 192.168.5.5: icmp_req=1 ttl=64 time=5 ms
64 bytes from 192.168.5.5: icmp_req=2 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=3 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=4 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=5 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=6 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=7 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=8 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=9 ttl=64 time=0 ms
64 bytes from 192.168.5.5: icmp_req=10 ttl=64 time=0 ms
finished !
Während die Anwendung ausgeführt wird, können Sie sie auch ausführen
ping 192.168.5.4
um Pings in die andere Richtung zu senden.
Führen Sie Wireshark aus und schnüffeln Sie an der tap0-Schnittstelle. Führen Sie dann ./main.elf
erneut aus und sehen Sie, was passiert. Sie sollten eine ARP-Anfrage von picoTCP an Linux und eine Antwort sehen. Danach sollten Sie sehen, dass die Ping-Anfragen und -Antworten hin und her gehen.
Beachten Sie, dass Sie manchmal viele andere Dinge sehen können, IPv6-Router-Anforderungen, verschiedene Broadcasts, mDNS, DNS-SD usw. – dies ist der Zeitpunkt, an dem Ihr Linux erkennt, dass die neue Netzwerkschnittstelle aktiv ist, und alle möglichen Entdeckungen startet. Beim persistenten TAP-Gerät passiert dies in der Regel nur beim ersten Start der Anwendung. Starten Sie eine neue Wireshark-Erfassung und starten Sie die Anwendung erneut. Sie sollte jetzt viel sauberer sein.
Jetzt könnten Sie einige Änderungen an der Datei main.c
vornehmen und ein wenig experimentieren! Führen Sie einige Statistiken über Ihre Pings (maximal, minimal, durchschnittliche Zeit). Öffnen Sie einen UDP-Socket und senden Sie einige Daten an eine Netcat-Instanz auf Ihrem Linux. Oder erstellen Sie einen einfachen Port-Scanner, um zu sehen, welche Ports auf Ihrem Computer geöffnet sind.
Dies ist nur ein sehr kurzer Überblick, weitere Informationen finden Sie in unserem Wiki.
Mitwirkende sind herzlich willkommen. Melden Sie einen Fehler, schlagen Sie eine Möglichkeit zur Verbesserung unserer Dokumentation vor oder schreiben Sie neuen Code.
Beachten Sie jedoch, dass wir Sie vor der Annahme Ihres Codes bitten würden, unsere Lizenzvereinbarung für Mitwirkende zu unterzeichnen. Ihr Code unterliegt weiterhin Ihrem Urheberrecht und ist immer unter GPLv2 und GPLv3 verfügbar. Diese CLA ermöglicht uns jedoch die Nutzung von picoTCP (einschließlich Code von externen Mitwirkenden wie Ihnen) unter anderen Lizenzen, einschließlich unserer kommerziellen Lizenz. Durch die Durchführung kommerzieller Projekte können wir weiterhin in die Qualität und Funktionen von picoTCP investieren.