今さらSLIPを復習する
Bluetooth LEでインターネット接続をする上で、現状Web Bluetoothで実装できない6LoWPANではなく自前のプロトコルを使うことにした。 ...が、それで実用的なのかどうかをちゃんと検証する必要があるので、一旦古き良きSLIPで試作する。
BLE上のGATTでシリアルポートをやる実装はそれなりに有り、シリアルポート上のインターネット接続としてSLIPは(マイコン向けには)割と現実的な選択と言える。
SLIPの仕様
SLIP自体は超シンプルなプロトコルで、たった6ページのRFCで仕様が説明されている。
機能としては、バイトストリームにパケット境界を与えるためのエスケープシーケンスを定義しているに過ぎない。例えばチェックサムとかプロトコルのネゴシエーションのような機能は提供しない。
(SLIPはBluetoothチップをシリアルで接続する際にも使用されている。ちょっと紛らわしい。)
FIXME: WindowsのSLIPは廃止されているはず(バージョン?)。他のカーネル実装は残っている事が多いがそもそも本物のシリアルポートを使いたいわけではないので一旦無視する。
TUN/TAP実装
旧ContikiやContiki-NGにtunデバイスを使用した実装がある。DHCPリレーや ifconfig
による構成のような余計な機能がついているのでちょっと長い。
- https://github.com/contiki-os/contiki/blob/master/tools/tunslip.c
- https://github.com/contiki-ng/contiki-ng/tree/develop/tools/serial-io
SLIPのエンコードは使っていない & エラー処理一切無いけど単純な実装であれば本来SOのレスくらいに収まる。
lwIPの実装
lwIPのnetifとしてSLIPがある。
600行ほどのコードに纏まっており、(ドキュメントからは判然としないが、) IPv4/IPv6両対応となっている。内部的には slipif_received_bytes
も1バイトづつの逐次処理なので重そう。
デフォルトではMTUは1500バイトに設定される。
uIPの実装
無い。 ...Contiki側に実装されている。
- https://github.com/adamdunkels/uip
- https://github.com/contiki-os/contiki/blob/32b5b17f674232867c22916bb2e2534c8e9a92ff/core/net/ip/slipdev.c
- https://github.com/contiki-os/contiki/blob/32b5b17f674232867c22916bb2e2534c8e9a92ff/core/dev/slip.c
元々uIPはARP等を手動で発行する必要があるので、uIP側としてはEthernetなMACを採用したネットワークと大きな差にならない。