lwIPは、当初Adam Dunkelsによって開発されたTCP/IPプロトコル・スイートの小規模な独立した実装であり、フル・スケールのTCPを維持しつつ、リソース使用量を削減することに主眼を置いています。そのため、数十キロバイトの空きRAMと約40キロバイトのコードROMの容量を持つ組み込みシステムでの使用に適しています。
現在、lwIP 2.1.2はKinetisおよびMCUXpresso SDK 2.6内のI.MX RTファミリに移植されています。
特長:
lwIPには次のプロトコルが付属します。
IPv4およびIPv6(複数のネットワーク・インタフェースを介したパケット転送を含む)
ネットワークのメンテナンスとデバッグ用のICMP
マルチキャスト・トラフィック管理用のIGMP
MLD(IPv6でマルチキャスト・リスナーを検出)
ND(IPv6のネイバー・ディスカバリとステートレス・アドレス自動設定)
DHCP および DHCPv6。
UDP(ユーザーデータグラムプロトコル)
TCP (トランスミッション制御プロトコル)
パフォーマンス向上のためのRaw/ネイティブAPI
オプションのBerkeley(ソケットAPIなど)
TLS:TCPベースのプロトコルに対してほぼ透過的なTLSを提供するオプションの階層化TCP
PPPoSとPPPoE
DNS(mDNSなどのドメイン名リゾルバを含む)
6LoWPAN
lwIPスタック構成
SDK_2.6.1_EVKB-IMXRT1050を例にしましょう
(SDK_2.6.1_EVKB-IMXRT1050\middleware\lwipにあるlwIPコード)
port:このフォルダには、lwIPスタックをベア・メタルとFreeRTOS上で実行可能なアダプタ・コードが含まれています。
Enet_ethernetif.c/h:基礎となるunderlying MCUXpresso SDKイーサネット・ドライバにlwIPスタックを適合させます(phy initとethernetif_inputのように)。
cc.c/h:typedef、およびパッキング用のコンパイラ・ヒントとプラットフォーム固有の診断出力を提供します。
Perf.h:アーキテクチャ固有のパフォーマンス測定。現在、「NULL」に定義されており、今後使用するために留保されています。
Src:安定的な最新のlwIP 2.1.2が格納されています。ソースコードは、こちらのリンクdownload.savannah.gnu.org/releases/lwip/からダウンロードできます。
--api: netconn および socket API ファイル
--core: LwIPコアファイル
--include: LwIP インクルードファイル
--netif: ネットワークインターフェースファイル
LwIP APIs overview
lwIPは、プログラマがTCP/IPコードとの通信用に使用可能な3つのアプリケーション・プログラミング・インターフェース(API)を備えています。
Raw API:スレッドセーフではないAPIで、最大のパフォーマンスと最小限のメモリフットプリントを実現するコールバックスタイル。プログラムの実行はコールバック関数によって駆動され、そのアプリケーションに関連するアクティビティが発生すると lwIP コアによって呼び出されます。特定のアプリケーションは、受信データの利用可能、送信データの送信完了、エラー通知、ポーリングタイマーの期限切れ、接続の切断などのイベントについて、コールバック関数を通じて通知を受け取るように登録できます。アプリケーションは、これらのイベントのいずれかまたはすべての処理を実行するためのコールバック関数を提供できます。
シーケンシャル・スタイルAPI:ブロッキング関数。割高ですが、TCPIP以外のあらゆるスレッドから呼び出すことができます。通常のシーケンシャル・プログラムでlwIPスタックを使用する方法となり、BSDソケットAPIとよく似ています。実行モデルは、ブロック式の「open-read-write-close」に基づきます。TCP/IPスタックは本質的にイベント・ベースであるため、TCP/IPコードとアプリケーション・プログラムは異なる実行コンテキスト(スレッド)に配置する必要があります。
ソケットAPI:BSDスタイルのソケットAPI。ソケットAPIは既存のアプリケーションの互換性APIであり、現在はシーケンシャルAPIの上に構築されています。他のプラットフォームで動作するソケットAPIアプリケーションを実行するために必要なすべての機能を提供することを目的としています。
TCP Raw API
|
| API関数 | 形容 |
| TCP接続のセットアップ
| 新しいTCP PCBを作成します | |
| TCP PCBをローカルIPアドレスとポートにバインドします。 | ||
| TCP PCBでリスニングプロセスを開始します。 | ||
| 新しいTCP接続が到達したときに呼び出されるコールバック関数を 割り当てます。 | ||
| リモートTCPホストの接続用です。 | ||
| TCPデータの送信 | 送信データをキューに追加します。 | |
| キューに入れられたデータを強制的に送信します | ||
| 送信データがリモート・ホストに認識されたときに呼び出される コールバック関数を割り当てます。 | ||
| TCPデータを受信中 | 新しいデータが届いたときに呼び出されるコールバック関数を設定しま す。 | |
| アプリケーションが次パケットを処理時に呼び出す必要があります。 受信データパケット(TCPウィンドウ管理用)。 | ||
| アプリケーションポーリング | 定期的に呼び出されるコールバック関数を設定します。 次の状況の有無を確認するためにアプリケーションによって使用されます。 送信する必要があるアプリケーションデータが残っています または、閉じる必要がある接続がある場合。 | |
| 接続の終了とアボート | リモートホストとの TCP 接続を閉じます。 | |
| TCP接続をアボートします。 | ||
| エラーのため、lwIPによってアボートされる接続を処理するために、 コールバック関数を割り当てます(例:メモリ 不足エラー)。 |
UDP Raw API
| API | 形容 |
| udp_bind | UDP PCB をローカル IP アドレスとポートにバインドします。 |
| udp_new | 新しい UDP PCB を作成します。 |
| udp_send | UDPデータを送信します。 |
| udp_recv | データグラムの受信時に呼び出されるコールバック関数を指定します。 |
| udp_remove | UDP PCBを削除し、割り当てを解除します。 |
| udp_connect | UDP PCBのリモートIPアドレスとポートをセットアップします。 |
| udp_disconnect | UDP PCBのリモート IPとポートを削除します。 |
Netconn API
| 新しい接続を作成します。 | |
| TCP 接続をリスニング・モードに設定します。 | |
| 接続されたTCP netconn上でデータを送信します。 | |
| リスニングTCP接続で着信接続を受け入れます。 | |
| TCP 接続を削除せずに閉じます。 | |
| 現在接続中のリモートIP/ポートにデータを送信します(適用外: TCP 接続)。 | |
| 接続をローカル IP アドレスとポートにバインドします。 | |
| netconnからデータを受信します。 | |
| リモート IP アドレスとポートに接続します。 | |
| … |
|
Socket API
| マクロ | API | 説明 |
| accept | lwip_accept | ソケット上の新しい接続を受け入れます。 |
| lwip_bind | IPアドレスとポートにソケットをバインドします。 | |
|
| ||
| lwip_getpeername |
| |
| lwip_getsockname |
| |
| lwip_setsockopt |
| |
| lwip_close |
| |
| lwip_connect | ソケットをリモートホストのIPアドレスとポートに接続します。 | |
| ソケット接続を待ち受ける | ||
| lwip_recv |
| |
| lwip_recvmsg |
| |
| lwip_recvfrom |
| |
| lwip_send |
| |
| lwip_sendmsg |
| |
| lwip_sendto |
| |
| lwip_socket | 新しいソケットを作成します。 | |
| lwip_poll |
| |
| lwip_ioctl |
| |
| lwip_inet_ntop |
| |
| lwip_inet_pton |
| |
| lwip_read | ソケットからデータを読み取ります。 | |
| lwip_readv |
| |
| lwip_write | ソケットにデータを書き込む | |
| lwip_writev |
| |
| lwip_close | ソケットを閉じます(ソケットは削除されます)。 | |
|
| ||
| lwip_ioctl |
| |
|
|
|
|
LwIP 設定
構成ファイルはアプリケーションのソース・フォルダ「lwipopts.h」に配置されます。
lwipopts.hは、lwIPとそのすべてのモジュールを完全に構成するために使用可能なユーザーファイルです。lwIPが提供するすべてのオプションを定義する必要はありません。オプションを定義しない場合は、デフォルト値が使用されます。つまり、lwipopts.hによりlwIPの動作の多くを上書きすることができます。
MCUXpresso SDK における LwIP デモ
MCUXpresso SDK には、さまざまな API セットを使用する多くのデモが付属しています。
| 名称 | 形容 |
| Lwip_tcpecho | ベア・メタルKSDKまたはFreeRTOSを使用した、lwIP TCP/IPスタック上のTCPエコー・デモ。TCPプロトコルを使用し、エコー・サーバとして機能します。 |
| Lwip_udpecho | ベア・メタルKSDKまたはFreeRTOSを使用した、lwIP TCP/IPスタック上のUDPエコー・デモ。UDPプロトコルを使用し、エコー・サーバとして機能します。 |
| Lwip_ping | ICMPプロトコルを使用したlwIP TCP/IPスタック上のPingデモ。 |
| lwip_nghttp2cli_mbedTLS | FreeRTOSを使用して、lwIP TCP/IPおよびMbedTLSスタック上にセットアップされたNGHTTP2クライアント。 FreeRTOS |
| lwip_mqtt | セキュアでないソケット経由でMQTTブローカーに接続するMQTTクライアント。 |
| lwip_iperf | PCをクライアントまたはサーバとして、ネットワーク・パフォーマンス測定用のIPerfアプリケーションを使用して帯域幅を確認します。 |
| lwip_httpsrv | ベア・メタルSDKまたはFreeRTOSを使用した、lwIP TCP/IPスタック上のHTTPサーバ。 |
| lwip_httpscli_mbedTLS | FreeRTOSを使用して、lwIP TCP/IPとMbedTLSスタック上にセットアップされたHTTPSクライアント。 FreeRTOS |
| lwip_dhcp_usb | lwIP TCP/IPおよびUSBスタック上のDHCPとpingのデモ。 |
| lwip_dhcp | DHCPクライアントで、進行中のステータスを出力します。 |