lwIPのTCP/IPとネットワークデバイス間インターフェイスについて、いくつかの実装を調査してみました 。
まとめ
- lwip/src/netif/etherif.c を ネットワークデバイスに合わせて実装する。
- デバイスドライバは4つの関数を実装する。
- low_level_init()
- ethernetif_init()から呼ばれる。
- network deviceのmtu, flagsを設定する。
- low_level_output() 送信用関数。 * TCP/IPプロトコルスタックから呼ばれる。 * TCP/IPプロトコルスタックから来たパケットをドライバに送信する。パケットはlinked listになっており、一度に複数のパケットをまとめて送信することができる。
- ethernetif_recv() 受信用関数
- 受信ポーリングのループorネットワークデバイスの受信割り込みから呼ばれる。
- 受信したパケット用のpbufを確保して、コピーして、netif->input()でTCP/IPプロトコルスタックへ渡す。
- ethernetif_init() 初期化
- netif_add()から呼ばれる。
- netif->outputとnetif->linkoutputを設定する。
githubあるソースコードから下記の実装を調査しました。
ESP8266 SDK based on FreeRTOS
- third_party/lwip/netif/ethernetif.c
- low_level_init()
- low_level_output()
- ethernetif_input()
- ethernetif_init()
Realtek Ameba
- component/common/network/lwip/lwip_v1.4.1/port/realtek/freertos/ethernetif.c
- low_level_init()
- low_level_output()
- ethernetif_recv()
- ethernetif_init()
Marvell wmsdk
- src/platform/net/lwip/netif.c
- low_level_init()
- low_level_output()
- netif_input()
- netif_init()
Rockchip RKnanoD
inno
- Web/Lwip/lwip-1.4.1/src/netif/ethernetif_inno.c
- low_level_init()
- low_level_output()
- ethernetif_input()
- ethernetif_init()
rk903
- Web/Lwip/lwip-1.4.1/src/netif/ethernetif_rk903.c
- low_level_init()
- low_level_output()
- ethernetif_input()
- ethernetif_init()
Broadcom WICED
- WICED/network/LwIP/WWD/wwd_network.c
- low_level_init()
- low_level_output()
- host_network_process_ethernet_data()
- ethernetif_init()