6lowpanのカーネル実装部分のメモ
– Bluetoothでの 6lowpan(IPv6 over bluetooth)のメイン部分
net/bluetooth/6lowpan.c
基本的にはl2capにbluetoothの足回りは依存していて、l2cap以上の上物を書けばOKという作り。l2capとIP層との繋ぎまで。l2capの実装は ”net/bluetooth/l2cap_core.c” とかを参照。
6LoWPANのRFCは現在絶賛ドラフト中。rfc7400のヘッダ圧縮も入っている。
– PAN内のPeer(Bluetooth同士)の扱い
6LoWPAN内のPeerの管理は “linux2.6/include/linux/list.h” を使った単純リスト構造。Peerの検索はlist。あれまぁDHT/Chordにしたら?とか一瞬思ったけど、そもそもBluetoothって同時接続で激しいルーティングする感じでも無いし、listでも十分と思われ。Peerはもちろん複数持ってもOK。
パケットがbt%dデバイスから送信時(ndo_start_xmit=bt_xmit)は、Peerが1個の場合はすぐに送信。2個以上の時は、OSのルーティングテーブルによろしく(bt%dが出来るから)。
– 6lowpanヘッダ処理
net/6lowpan/iphc.c
IPv6をBluetooth上に投げる時にヘッダ圧縮(rfc7400)。圧縮といってもヘッダを省く位な感じ。この時にHop Limitの処理も入る。超過したらソケットバッファからdropされる。
別のディレクトリになっているのは、必ずしもbluetoothのみを対象にする訳では無いという現れかな。
– bt%dで作成されるデバイス
setup_netdev, netdev_setup
ARPHRD_6LOWPAN
IFF_POINTOPOINT
– /sys/kernel/debug/bluetooth/6lowpan_psm
bluetoothのデバイスで、周辺のbtのlistenの開始・終了セット
-> bt_6lowpan_listen
– /sys/kernel/debug/bluetooth/6lowpan_control
実際のbt%dの作成とl2capで対向のBluetoothに接続
-> lowpan_control_write
– bt%dへの読み書き
bt_xmit -> send_pkt : Bluetooth上でl2capで送信
chan_recv_cb -> recv_pkt : l2capからの受信
メインの構造は以上で、あとはヘッダ処理とかsetup/init系。6lowpan/bluetooth合わせても2000行程度だからサクサク読めるはず。