Open5

今さらSLIPを復習する

okuokuokuoku

Bluetooth LEでインターネット接続をする上で、現状Web Bluetoothで実装できない6LoWPANではなく自前のプロトコルを使うことにした。 ...が、それで実用的なのかどうかをちゃんと検証する必要があるので、一旦古き良きSLIPで試作する。

BLE上のGATTでシリアルポートをやる実装はそれなりに有り、シリアルポート上のインターネット接続としてSLIPは(マイコン向けには)割と現実的な選択と言える。

okuokuokuoku

SLIPの仕様

SLIP自体は超シンプルなプロトコルで、たった6ページのRFCで仕様が説明されている。

https://datatracker.ietf.org/doc/html/rfc1055

機能としては、バイトストリームにパケット境界を与えるためのエスケープシーケンスを定義しているに過ぎない。例えばチェックサムとかプロトコルのネゴシエーションのような機能は提供しない。

(SLIPはBluetoothチップをシリアルで接続する際にも使用されている。ちょっと紛らわしい。)

okuokuokuoku

FIXME: WindowsのSLIPは廃止されているはず(バージョン?)。他のカーネル実装は残っている事が多いがそもそも本物のシリアルポートを使いたいわけではないので一旦無視する。

TUN/TAP実装

旧ContikiやContiki-NGにtunデバイスを使用した実装がある。DHCPリレーや ifconfig による構成のような余計な機能がついているのでちょっと長い。

SLIPのエンコードは使っていない & エラー処理一切無いけど単純な実装であれば本来SOのレスくらいに収まる。

https://raspberrypi.stackexchange.com/questions/51248/why-doesnt-ipv6-over-slip-work

okuokuokuoku

lwIPの実装

lwIPのnetifとしてSLIPがある。

https://www.nongnu.org/lwip/2_1_x/group__slipif.html

600行ほどのコードに纏まっており、(ドキュメントからは判然としないが、) IPv4/IPv6両対応となっている。内部的には slipif_received_bytes も1バイトづつの逐次処理なので重そう。

デフォルトではMTUは1500バイトに設定される。

https://github.com/lwip-tcpip/lwip/blob/239918ccc173cb2c2a62f41a40fd893f57faf1d6/src/netif/slipif.c#L77-L80