唯一無二の picoTCP リポジトリへようこそ。
picoTCP は、組み込みシステムおよびモノのインターネット向けに設計された、設置面積が小さいモジュール式 TCP/IP スタックです。 Altran Intelligent Systemsによって積極的に開発されています。
このコードは、GNU GPL v2 および GNU GPL v3 の条件に基づいてリリースされています。一部の権利は留保されています。著作権所有者の独自の裁量により、他のライセンスが適用される場合があります。
GitHub wiki の入門ガイドを読んで、プロジェクトで picoTCP を使用する方法を学びましょう。
詳細については、電子メールを送信するか、Twitter、Facebook、または Reddit でお問い合わせください。
picoTCP のコード品質について疑問に思っていますか? TiCS スコアを確認してください
機能テスト: - 単体テスト: - RFC 準拠: - TICS 品質: Coverity Scan ビルド ステータス:
インターフェイスをシンプルに保つことで、新しいプラットフォームや OS への移植の労力が非常に少なくなります。目安として、新しいプラットフォームへの移植は 3 日以内、新しい OS への移植は 1 日で完了します。さらに、本気でやろうと思えば、最初の移植は 1 晩で完了します。プラットフォームが異なれば、コンパイラも異なります。そのため、私たちは多数のコンパイラを使用してスタックを継続的にコンパイルします。次のリストは、現在サポートされているプラットフォーム、デバイス ドライバー、およびコンパイラーの一部を示しています。
picoTCP が動作するプラットフォーム: ARM Cortex-M シリーズ (ST Micro STM、NXP LPC、TI Stellaris、Freescale K64F)、ARM ARM9 シリーズ (ST Micro STR9)、Texas Instruments (MSP430)、Microchip (PIC24、PIC32)、Atmel ( AVR 8bit)、Linux(ユーザー空間(TUN/TAP)、カーネル空間)、 Windows(ユーザースペース(TAP))
picoTCP が動作するネットワーク デバイス: 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、仮想ドライバー (TUN/TAP、VDE、Libpcap)
picoTCP が統合されている (RT)OS : OS なし / ベアメタル、FreeRTOS、mbed-RTOS、Frosted、linux / POSIX、MS DOS、MS Windows
ライブラリ picoTCP は、wolfSSL、mbedTLS、Mongoose RESTful ライブラリ、MicroPython と統合されています。
picoTCP は次の環境でコンパイルされます: GCC、Clang、TCC、ARM-RCVT、IAR、XC-16、XC-32、MSP-GCC、AVR-GCC
残念ながら、一部の部分は GPL と互換性のないコードまたはバイナリに依存しており、一部の部分は商用契約に基づいて開発されており、一部は非常に大まかな概念実証コードで構成されているため、すべてのコードをリリースすることはできません。商用ライセンスでの利用可能性、または移植やドライバー開発のための当社の専門サービスの利用可能性について詳しく知りたい場合は、お気軽に [email protected] までお問い合わせください。
あなたのお気に入りがリストにありませんか? picoTCP を新しいプラットフォームに移植する方法に関する情報と例については、Wiki をチェックしてください。
機能は picoTCP のモジュールとして開発されるため、アプリケーションに必要な機能を選択できます。これにより、インターネット標準に準拠したスタックが可能な限り最小化されます。以下の図は、実装されているすべてのプロトコルの概要を示しています。
この例では Ubuntu 14.04 を使用します。他の Linux ディストリビューションでも同様に動作しますが、一部のパッケージ名を変更する必要がある場合があります。詳細については、「環境のセットアップ」を参照してください。
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 ..
次に、新しいディレクトリ (例: example
) を作成し、次の内容のファイルを作成します。 //: # (以下のコードは CI を通じて取得されます。コード抽出プログラムのコメントはそのままにしておいてください!) //: # (コード抽出プログラムの開始)
#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 ;
}
これを実行して、これをコンパイルしてリンクできます。
gcc -c -o main.o -I../picotcp/build/include main.c
gcc -o main.elf main.o ../picotcp/build/lib/libpicotcp.a
次に、永続的なタップ デバイス、つまり仮想ネットワーク ポートを作成します。毎回これを繰り返す必要はありません。デバイスは再起動するか、 sudo tunctl -d tap0
実行するまで存在します。
sudo tunctl -u < username >
sudo ifconfig tap0 192.168.5.5
これで、 ./main.elf
を実行できるようになり、次のような出力が表示されるはずです。
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 !
アプリケーションの実行中に、次のこともできます。
ping 192.168.5.4
反対方向に ping を送信します。
Wireshark を実行し、tap0 インターフェイスをスニッフィングします。次に、 ./main.elf
を再度実行して、何が起こるかを確認します。 picoTCP から Linux への ARP リクエストとその応答が表示されるはずです。その後、ping リクエストと応答が往復していることがわかります。
IPv6 ルーターの要求、さまざまなブロードキャスト、mDNS、DNS-SD など、他の多くのものが表示される場合があることに注意してください。これは、Linux が新しいネットワーク インターフェイスが起動していることを認識し、あらゆる種類の検出を開始するときです。永続的な TAP デバイスの場合、これは通常、アプリケーションを初めて起動するときにのみ発生します。新しい Wireshark キャプチャを開始し、アプリケーションを再度開始すると、かなりクリーンになるはずです。
これで、 main.c
ファイルにいくつかの変更を加えて、少し実験してみることができます。 ping の統計 (最大、最小、平均時間) を記録します。 UDP ソケットを開き、Linux 上の netcat インスタンスにいくつかの情報を送信します。または、基本的なポート スキャナーを構築して、マシン上でどのポートが開いているかを確認します。
これは非常に簡単な概要にすぎません。詳細については、Wiki を参照してください。
寄稿者は大歓迎です。バグを報告したり、ドキュメントを改善する方法を提案したり、新しいコードを書いたりしてください。
ただし、コードを受け入れる前に、寄稿者ライセンス契約に署名していただく必要があることに注意してください。あなたのコードはあなたの著作権の下に残り、GPLv2 および GPLv3 の下で常に利用可能になります。ただし、この CLA により、商用ライセンスを含む他のライセンスに基づいて picoTCP (お客様のような外部貢献者からのコードを含む) を使用できるようになります。商用プロジェクトを行うことで、picoTCP の品質と機能に投資し続けることができます。