Linux bluetooth LE 6lowpan


CSR 8510 A10 なドングルと broadcom BCM20702A1 なドングルどっちも使えたよ！

[MLでのPOST](http://comments.gmane.org/gmane.linux.bluez.kernel/49096) はこんな感じだった。今のところ debugfs 使う以外に手が無いのだよなー。

```bash
In the slave side do this:

$ modprobe bluetooth_6lowpan
$ echo 62 > /sys/kernel/debug/bluetooth/6lowpan_psm
$ hciconfig hci0 leadv

In the master side do this:

$ modprobe bluetooth_6lowpan
$ echo 62 > /sys/kernel/debug/bluetooth/6lowpan_psm
$ echo 'connect E0:06:E6:B7:2A:73 1' > \
                  /sys/kernel/debug/bluetooth/6lowpan_control
```

今の archlinux 4.0.8-3 ではこんな感じ。kernel が ML POST 時点より新しくなって、ちょっとだけ変更されてる。

```bash
In the slave side do this:

$ modprobe bluetooth_6lowpan
$ echo 1 > /sys/kernel/debug/bluetooth/6lowpan_enable
$ hciconfig hci0 up
$ hciconfig hci0 leadv

In the master side do this:

$ modprobe bluetooth_6lowpan
$ echo 1 > /sys/kernel/debug/bluetooth/6lowpan_enable
$ hciconfig hci0 up
$ echo 'connect E0:06:E6:B7:2A:73 1' > \
                  /sys/kernel/debug/bluetooth/6lowpan_control
```

6lowpan_control に入力する文字列の意味が読み取りにくいけど、こんな風になってる（[参考](https://code.google.com/p/android-bluez/wiki/Bluetooth6lowpan)）。

```text
# connect <addr> <addr_type>
connect E0:06:E6:B7:2A:73 1
# disconnect <addr> <addr_type>
disconnect E0:06:E6:B7:2A:73 1
```

addr_type は universal(0) or local(1) bit になってて、数字の割り当ては：

```c
/* BD Address type */
#define BDADDR_BREDR            0x00
#define BDADDR_LE_PUBLIC        0x01
#define BDADDR_LE_RANDOM        0x02
```

で、接続が終わるとおもむろに netdev `bt0` というのが出てくるはず。

```
[root@alpha ~]# ip -d link show bt0
3: bt0: <POINTOPOINT,MULTICAST,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN mode DEFAULT group default
    link/[825] e0:06:e6:ff:fe:b7:2a:73 peer 00:00:00:00:00:00:00:00 promiscuity 0 addrgenmode eui64
```

address generation mode が eui64 で、真ん中に ff:fe が入り込んでますね。`ping6` で通信できるのは確認できる。`btmon` を起動してメッセージを眺めてみると面白い。

```text
[root@bravo ~]# btmon
Bluetooth monitor ver 5.32
= New Index: 5C:F3:70:63:A8:A0 (BR/EDR,USB,hci0)                                                                               [hci0] 0.447015
> ACL Data RX: Handle 64 flags 0x02 dlen 27                                                                                    [hci0] 2.648865
> ACL Data RX: Handle 64 flags 0x01 dlen 27                                                                                    [hci0] 2.648987
> ACL Data RX: Handle 64 flags 0x01 dlen 19                                                                                    [hci0] 2.650382
      Channel: 64 len 69 [PSM 0 mode 0] {chan 0}
        43 00 7a 33 3a 80 00 5b 9b 01 43 00 01 07 f2 b5  C.z3:..[..C.....
        55 a4 1e 09 00 08 09 0a 0b 0c 0d 0e 0f 10 11 12  U...............
        13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22  ............. !"
        23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32  #$%&'()*+,-./012
        33 34 35 36 37                                   34567
< ACL Data TX: Handle 64 flags 0x00 dlen 27                                                                                    [hci0] 2.656375
< ACL Data TX: Handle 64 flags 0x01 dlen 27                                                                                    [hci0] 2.656441
< ACL Data TX: Handle 64 flags 0x01 dlen 19                                                                                    [hci0] 2.656463
      Channel: 64 len 69 [PSM 0 mode 0] {chan 0}
        43 00 7a 33 3a 81 00 5a 9b 01 43 00 01 07 f2 b5  C.z3:..Z..C.....
        55 a4 1e 09 00 08 09 0a 0b 0c 0d 0e 0f 10 11 12  U...............
        13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22  ............. !"
        23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32  #$%&'()*+,-./012
        33 34 35 36 37                                   34567
> HCI Event: Number of Completed Packets (0x13) plen 5                                                                         [hci0] 2.720982
        Num handles: 1
        Handle: 64
        Count: 2
> HCI Event: Number of Completed Packets (0x13) plen 5                                                                         [hci0] 3.005013
        Num handles: 1
        Handle: 64
        Count: 1
```


動かしてみてあれこれ
------------------
6lowpanでコネクション成立するとlescanに応答しなくなるみたい。そういうもの？…（BLEの調べもの）…そういうものらしい。bluetoothはconnection切断後は、idle状態に遷移するということで、再接続したい場合はadvertise状態に遷移させないとダメってことか。

```
echo "disconnect E0:06:E6:B7:2A:73 1' > /sys/kernel/debug/bluetooth/6lowpan_control
```

をやると、このホストでは `bt0: Lost carrier` とメッセージが出る。再度 connect する際は、対向で `hciconfig chi0 leadv` を実行してからやると、再接続できる様子。その際 `bt0: Gained carrier` とメッセージが出る。

…disconnectまわりは怪しい。