Selamat datang di satu-satunya repositori picoTCP.
picoTCP adalah tumpukan TCP/IP modular berukuran kecil yang dirancang untuk sistem tertanam dan Internet of Things. Ini secara aktif dikembangkan oleh Altran Intelligent Systems .
Kode ini dirilis berdasarkan ketentuan GNU GPL v2 dan GNU GPL v3. Beberapa hak dilindungi undang-undang. Lisensi lain mungkin berlaku atas kebijakan pemegang hak cipta.
Pelajari cara menggunakan picoTCP dalam proyek Anda dengan membaca panduan Memulai di wiki GitHub kami.
Untuk informasi lebih lanjut kirimkan email kepada kami atau hubungi kami di Twitter, Facebook atau Reddit.
Ingin tahu tentang kualitas kode picoTCP? Periksa skor TiCS kami
Tes fungsional: - Tes unit : - Kepatuhan RFC : - Kualitas TICS : Status Coverity Scan Build:
Dengan menjaga antarmuka tetap sederhana, upaya porting ke platform dan OS baru menjadi sangat rendah. Sebagai indikasi: porting ke platform baru dapat dilakukan dalam 3 hari atau kurang, OS baru dalam satu hari dan jika Anda benar-benar gila, Anda dapat melakukan port awal dalam satu malam. Platform yang berbeda, berarti kompiler yang berbeda, itu sebabnya kami terus mengkompilasi tumpukan kami dengan banyak kompiler. Daftar berikut menunjukkan beberapa platform, driver perangkat, dan kompiler yang saat ini didukung.
Platform picoTCP berjalan pada : seri ARM Cortex-M (ST Micro STM, NXP LPC, TI Stellaris, Freescale K64F), seri ARM ARM9 (ST Micro STR9), Texas Instruments (MSP430), Microchip (PIC24, PIC32), Atmel ( AVR 8bit), Linux (Ruang pengguna (TUN/TAP), Ruang Kernel), Windows (Ruang pengguna (TAP))
Perangkat jaringan picoTCP telah bekerja dengan : 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, driver virtual (TUN/TAP, VDE, Libpcap)
(RT)OS picoTCP telah terintegrasi ke dalam : No OS / Bare metal, FreeRTOS, mbed-RTOS, Frosted, linux / POSIX, MS DOS, MS Windows
Perpustakaan picoTCP telah terintegrasi dengan : wolfSSL, mbedTLS, perpustakaan Mongoose RESTful, MicroPython
Kompiler picoTCP mengkompilasi di bawah : GCC, Clang, TCC, ARM-RCVT, IAR, XC-16, XC-32, MSP-GCC, AVR-GCC
Sayangnya kami tidak dapat merilis semua kodenya, karena beberapa bagian bergantung pada kode atau binari yang tidak kompatibel dengan GPL, beberapa bagian dikembangkan berdasarkan kontrak komersial, dan beberapa terdiri dari kode bukti konsep yang sangat kasar. Jika Anda ingin mengetahui lebih banyak tentang ketersediaan di bawah lisensi komersial, atau kemungkinan menggunakan layanan ahli kami untuk porting atau pengembangan driver, jangan ragu untuk menghubungi kami di [email protected].
Favoritmu tidak ada dalam daftar? Lihat wiki untuk informasi dan contoh tentang cara mem-porting picoTCP ke platform baru!
Fitur dikembangkan sebagai modul di picoTCP, memungkinkan Anda memilih fitur yang Anda inginkan dalam aplikasi Anda. Hal ini menghasilkan tumpukan sekecil mungkin yang tetap sesuai dengan standar internet. Skema di bawah ini memberikan gambaran umum tentang semua protokol yang diterapkan.
Contoh ini menggunakan Ubuntu 14.04. Ini juga berfungsi pada distribusi linux lain, meskipun Anda mungkin perlu mengubah beberapa nama paket. Lihat menyiapkan lingkungan untuk mengetahui informasi lebih lanjut.
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 ..
Kemudian buatlah direktori baru, misal example
, dan buat file dengan isi sebagai berikut : //: # (Kode di bawah ini ditarik melalui CI kita - silakan biarkan komentar kode ekstraktor tetap utuh!) //: # (kode ekstraktor dimulai)
#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 ;
}
Sekarang kita dapat mengkompilasinya dan menghubungkannya dengan menjalankannya
gcc -c -o main.o -I../picotcp/build/include main.c
gcc -o main.elf main.o ../picotcp/build/lib/libpicotcp.a
Selanjutnya kita akan membuat perangkat tap persisten - port jaringan virtual. Anda tidak perlu mengulanginya setiap kali, perangkat akan tetap ada sampai Anda reboot, atau sampai Anda pergi sudo tunctl -d tap0
sudo tunctl -u < username >
sudo ifconfig tap0 192.168.5.5
Sekarang, Anda seharusnya dapat menjalankan ./main.elf
, dan melihat hasilnya
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 !
Saat aplikasi sedang berjalan, Anda juga dapat menjalankannya
ping 192.168.5.4
untuk mengirim ping ke arah lain.
Jalankan wireshark, dan hirup antarmuka tap0. Kemudian jalankan ./main.elf
lagi, dan lihat apa yang terjadi. Anda akan melihat permintaan ARP dari picoTCP ke Linux, dan balasannya. Setelah itu Anda akan melihat permintaan ping dan balasan bolak-balik.
Catatan, kadang-kadang Anda mungkin melihat banyak hal lain, permintaan router IPv6, berbagai siaran, mDNS, DNS-SD, dll - ini adalah saat Linux Anda menyadari bahwa antarmuka jaringan baru sudah aktif, dan memulai segala macam penemuan. Dengan perangkat TAP yang persisten, hal ini biasanya hanya terjadi saat pertama kali Anda memulai aplikasi. Mulai tangkapan wireshark baru, dan mulai aplikasi lagi, sekarang seharusnya lebih bersih.
Sekarang Anda dapat membuat beberapa perubahan pada file main.c
, dan bereksperimen sedikit! Simpan beberapa statistik ping Anda (maks, min, waktu rata-rata). Buka soket UDP, kirim beberapa barang ke instance netcat di linux Anda. Atau buat pemindai port yang belum sempurna, lihat port apa yang terbuka di mesin Anda.
Ini hanyalah ikhtisar singkat, info lebih lanjut dapat ditemukan di wiki kami.
Kontributor sangat diharapkan. Laporkan bug, sarankan cara untuk meningkatkan dokumentasi kami, atau tulis beberapa kode baru.
Namun perlu diingat bahwa, sebelum menerima kode Anda, kami akan meminta Anda untuk menandatangani Perjanjian Lisensi Kontributor kami. Kode Anda tetap berada di bawah hak cipta Anda, dan akan selalu tersedia di bawah GPLv2 dan GPLv3. Namun, CLA ini memungkinkan kami untuk menggunakan picoTCP (termasuk kode dari kontributor eksternal seperti Anda) di bawah lisensi lain, termasuk lisensi komersial kami. Dengan mengerjakan proyek komersial, kami dapat terus berinvestasi pada kualitas dan fitur picoTCP.