TCP/IP on BitVisor
表 祐志, 島田 恭平, 芹川 大地, 深井 貴明
筑波大学

Thursday, December 5, 13

BitVisorで時々ある要求
設定をリモートから変更したい
ネットの情報を使わせたい

クラウドサービスと連携させたい
2
Thursday, December 5, 13

現状はUDPのみ？
UDP？？
？？？
3

Thursday, December 5, 13

今回TCPを可能にしたTCP

4
Thursday, December 5, 13

どうやってTCP実装する？

• フルスクラッチか• 既存TCPスタックの移植するか5
Thursday, December 5, 13

どうやってTCP実装する？
知人曰く「Cで簡易実装1000行，RFC791,793本格実装4000行〜」• フルスクラッチ• 既存TCPスタックの移植

6
Thursday, December 5, 13

どうやってTCP実装する？
知人曰く「Cで簡易実装1000行，RFC791,793本格実装4000行〜」• フルスクラッチ• 既存TCPスタックの移植こちらを採用
7
Thursday, December 5, 13

どの既存スタックを移植するか？
某開発者向け情報サイトによると...

8
Thursday, December 5, 13

どの既存スタックを移植するか？
Q. 移植しやすい既存TCP/IPスタックは？

9
Thursday, December 5, 13

どの既存スタックを移植するか？
Q. 移植しやすい既存TCP/IPスタックは？

10
Thursday, December 5, 13

lwIPと呼ばれる TCP/IP スタックがいいどの既存スタックを移植するか？
Q. 移植しやすい既存TCP/IPスタックは？

11
Thursday, December 5, 13lwIPいいね．

どの既存スタックを移植するか？
lwIPすごい．
Q. 移植しやすい既存TCP/IPスタックは？

12
Thursday, December 5, 13

どの既存スタックを移植するか？
Q. 移植しやすい既存TCP/IPスタッ
クは？

lwIPに満足！

13
Thursday, December 5, 13

どの既存スタックを移植するか？
Q. 移植しやすい既存TCP/IPスタッlwIPいいね．

クは？

lwIPに満足！

14
Thursday, December 5, 13

どの既存スタックを移植するか？
Q. 移植しやすい既存TCP/IPスタッlwIPいいね．

クは？

lwIPに満足！

lwIPを移植しよう
15
Thursday, December 5, 13

lwIP: lightweight IP• オープンソースの軽量 TCP/IP スタック
• 柔軟な移植が可能• 修正BSDライセンス• 対応プロトコルも豊富 (DHCP, DNS...)
16
Thursday, December 5, 13

lwIPの構造
Raw API

App側

Netconn API

Socket API

lwIP Core(IP,UDP,TCP,ICMP,DHCP...)

Platform側(BitVisor)

型・エンデバイス

セマフォ・ディアン

ドライバ

条件変数

17
Thursday, December 5, 13

スレッド 割り込み タイマー

lwIPの構造
Raw API

App側

Netconn API

Socket API

lwIP Core(IP,UDP,TCP,ICMP,DHCP...)

Platform側(BitVisor)
18
Thursday, December 5, 13型・エン

デバイス

セマフォ・

ディアン

ドライバ

条件変数

スレッド 割り込み タイマー

Platform 側で定義・実装してほしい部分

BitVisor への移植
Raw API

App側

Netconn API

Socket API

lwIP Core(IP,UDP,TCP,ICMP,DHCP...)

Platform側(BitVisor)
19
Thursday, December 5, 13型・エン

デバイス

セマフォ・

ディアン

ドライバ

条件変数

スレッド 割り込み タイマー

実は全部実装しなくてもよいので最低限実装

BitVisor への移植
最も単純なRaw API

App側Socket API
API のみ提供

Netconn API

lwIP Core(IP,UDP,TCP,ICMP,DHCP...)

Platform側(BitVisor)
20
Thursday, December 5, 13型・エンデバイス

セマフォ・ディアン

ドライバ

条件変数

スレッド 割り込み タイマー

実は全部実装しなくてもよいので最低限実装

Platform側でやったこと• lwIP の不要な機能を無効化• 大量のマクロを適切にdef/undefする• lwIP に型・エンディアンを教える• デバイスドライバを実装• パケット受信はポーリング or ピギーバックのみ• IntelPRO/1000, IntelX540, RealTek8169,
BroadcomNetXtreme5764M に対応
21
Thursday, December 5, 13

Raw API について
• lwIPで提供するもっとも低級なAPI• Event Driven• Single Thread で実行する必要あり
22
Thursday, December 5, 13

TCP通信のためのAPI• tcp_new()• tcp_connect(callback)• tcp_close()• tcp_accept(callback)• tcp_write()• tcp_sent(callback)• tcp_recv(callback)• tcp_recved()

接続制御系

データ送受信系

23
Thursday, December 5, 13

接続制御系• tcp_new()• tcp_connect(callback)• tcp_close()•

tcp_accept(callback)24

Thursday, December 5, 13

通信コンテキストの生成
サーバへ接続要求（完了時に callback）
接続終了
クライアントからの接続要求時に callbackデータ送受信系
データの送信•• tcp_sent(callback)• tcp_recv(callback)• tcp_recved()

データ送信完了時にtcp_write()

callback
データ受信時にcallback
データ受信完了を送信元に通知 (ACK)25
Thursday, December 5, 13

Single Thread で使う
tcpip_thread () {init();

スタックやドライバの初期化・設定

tcp_new();
接続開始
tcp_connect(callbackA);
tcp_sent(callbackB);（クライアントの例）
tcp_recv(callbackC);
受信パケットを lwIP に渡す
while (true) {（lwIPが必要に応じて各callback呼ぶ）
netif_poll();}

}

再送処理

tcp_tmr();Thursday, December 5, 13

26

いくつかのサンプルプログラムを作って動作確認してみた...

27
Thursday, December 5, 13

サンプルプログラム①
BitVisor HTTP Server
ゲストOS

HTTP GET

ブラウザ経由でBitVisor の設定を表示・変更可能
28
Thursday, December 5, 13

サンプルプログラム②
cURLVisor
インターネットの情報

ゲストOS

HTTP GETを取得可能

ちなみに29
Thursday, December 5, 13

DNSアドレス解決対応

サンプルプログラム③
2012年冬...

？？？

30
Thursday, December 5, 13

サンプルプログラム③
2012年冬...

？？？

BitVisorが...

31
Thursday, December 5, 13

サンプルプログラム③
2012年冬...

？？？

BitVisorが...
つぶやく

32

島田ら BitVisorSummit’12

Thursday, December 5, 13

サンプルプログラム③
TwitVisor
ゲストOSaツイート（抜群の安定感）

OAuth 処理
JSON パーサ

タイムライン
取得

Thursday, December 5, 13

33

クラウドサービスと連携できることを確認

One more thing...

Thursday, December 5, 13

サンプルプログラム④FlickVisor
ゲストOS

ScreenshotをVRAMから取得

Flickrに投稿

より大きなデータの送信でも大丈夫な事を確認

35
Thursday, December 5, 13

コード公開中• Bitbucket にて（http://goo.gl/COqhgb）• Git レポジトリを公開• master branch：TCP/IPスタック本体• その他 branch：サンプルコード• Wiki に詳細あり
36
Thursday, December 5, 13

まとめ• TCP/IPスタック lwIP を BitVisor に移植• インターネットやクラウドサービスと通信できる事を確認• コード公開中
37
Thursday, December 5, 13

38
Thursday, December 5, 13