SlideShare a Scribd company logo
1 of 15
Download to read offline
Rust-DPDK
Oct 6, 2017
Masaru OKI @masaru0714
Rust?
● ラスト
● システムプログラミング向けに新しく開発されたプログラミング言語。
● http://rust-lang.org/
● スクリプト言語ではなく、ネイティブコードにコンパイルする。
● Rustで書かれたOSというのがある模様。
○ RedoxOS https://www.redox-os.org/
○ intermezzOS https://intermezzos.github.io/
● ツール類の更新等にはrustupコマンドを用いる。
● C/C++ライブラリを呼び出すbinding libraryを生成するツールがある。
● 通常、パッケージ(crate)管理システム (cargo) と連動して動作する。
● 通常、ビルド等にはcargoコマンドを使う (コンパイラ本体はrustc)
● 立ち位置的にはGo言語に近い雰囲気
Rustのインストール
● curl https://sh.rustup.rs -sSf | sh
● $HOME/.cargo/binにインストールされる。
● 必要な環境変数は . $HOME/.cargo/env の実行で設定される。
● sudo不要。コンパイラとかユーザーごと。
● Jenkinsでビルドさせるときは~jenkins/.cargoが必要になる。
● 通常はstable(安定版)がインストールされる。
● beta(ベータ版)をインストールするにはrustup install beta
● nightly(開発版)をインストールするにはrustup install nightly
● RustでC用のTLSを扱うには現時点ではnightly buildが必要。
Rustのプログラム例
fn main () {
let mut a = 1; // 変更可能
let b = 2;
println!(“hello, world. a = {}, b = {}”, a, b),;
a = a + b;
println!(“a + b = {}”, a);
}
● ファンクションの宣言や定義は fn
● 処理ブロックの範囲は { … }
● 各行の区切りはセミコロン
● 通常の変数はimmutable(変更不可)、変更する変数には mut をつける
Rustプログラムのコンパイルと実行
% cd hello
% rustc ./src/main.rs # 実行バイナリ./mainが生成される
% cat Cargo.toml
[package]
name = “hello”
version = “0.0.1”
% cargo run # コンパイルして即実行
% cargo build # target/debug/helloが生成される(実行しない)
% cargo test # テストコードを実行
% cargo clean # target/を削除
言語の詳細
書き始めるときりがないので、下記を参照願います
● The Rust Programming Language
● Rust by Example
C言語用ライブラリをRustで使う
● Rust側で extern “C” で宣言しておけば呼び出せる。
○ Foeign Function Interface (FFI) と呼ばれる。
● 皆がよく使うライブラリはcrateになっていることもある。
extern crate libc;
…
let fp = libc::fopen(...);
● bindgenというツールが提供されていて、これを使えば自作できる
○ C言語ライブラリのヘッダファイルを読み、 structやプロトタイプ宣言等を Rustに変換する
○ 実行ファイルとしても提供されているが、 Rustのcrateとしても提供されている
○ 変換手順をRustで記述できる
○ 自作したライブラリは crateとして呼び出せるようになる
bindgenの変換例
C
typedef unsigned short int sa_family_t;
struct sockaddr
{
__SOCKADDR_COMMON (sa_);
char sa_data[14];
};
extern int bind (int __fd, __CONST_SOCKADDR_ARG
__addr, socklen_t __len)
__THROW;
Rust
pub type sa_family_t = ::std::os::raw::c_ushort;
#[repr(C)]
#[derive(Debug, Copy)]
pub struct sockaddr {
pub sa_family: sa_family_t,
pub sa_data: [::std::os::raw::c_char; 14usize],
}
extern "C" {
pub fn bind(__fd: ::std::os::raw::c_int,
__addr: *const sockaddr,
__len: socklen_t) ->
::std::os::raw::c_int;
}
bindgenの制限
● Cのヘッダで定義されるinline関数は対象外
○ inline関数は単純にスキップされる
○ --generate-inline-functions指定はあるがまともに動かない
○ DPDKはヘッダで定義する inline関数を多用しているので単純変換だけだとまず困る
○ inline関数を使わないようにして C libraryをrebuildしろとか言われる
○ きれいで手のかからない解決策 : なし
○ 自作というか改造板の Rust-DPDKでは、当該コード(の一部)を Rustで再実装した
○ Rustのfnの中でinline関数を呼ぶだけ、というコードを用意している実装もあった
● C static libraryはうまくbinding libraryにできない
○ 一見できていても、リンク時に「 -fPICで作り直せ」と怒られる
■ crate-type=”staticlib”もだめだった
○ Webで探しても、C側をstaticじゃなくする方法ばかりが見つかる
○ いろいろ試してみた限り、あきらめるしかないようだった
DPDK?
● Data Plane Development Kit
● http://dpdk.org/
● 高速なパケットI/O機能を提供する、C言語用ライブラリ。
● 基本的にLinux向け。FreeBSDでは一部機能が提供されないが動く。
DPDKのプログラム例(C言語)
int
hello(void *arg) {
printf(“hello lcore %dn”, rte_lcore_id());
return 0;
}
int
main(int argc, char *argv[]) {
rte_eal_init(argc, argv);
rte_eal_mp_remote_launch(hello, NULL, CALL_MASTER);
rte_eal_mp_wait_lcore();
return 0;
}
悪魔合体!
RustによるDPDKのバインディングはすでにいくつか実装がある。
● https://github.com/libpnet/rust-dpdk
● https://github.com/flier/rust-dpdk
● https://github.com/ANLAB-KAIST/rust-dpdk
● bindgenで変換しただけだったり
● 動くようだけどサンプルのl2fwdを見るとスレッド関数はCだったり
● サンプルがなくてどう書くのか謎だったり
● 更新が止まっていて新しいDPDKと組み合わせられるか謎だったり
しかたがないので、変換しただけのをベースに自分でいじくったものを用意。
● https://github.com/iMasaruOki/rust-dpdk
Rustで書くとこう
extern crate rust_dpdk;
use rust_dpdk::dpdk;
unsafe extern "C" fn hello_thread(_arg: *mut std::os::raw::c_void) -> i32 {
println!("Hello! lcore {}", dpdk::rte_lcore_id());
0
}
fn main() {
unsafe {
let _ = dpdk::eal_init(std::env::args());
let callback: dpdk::lcore_function_t = Some(hello_thread);
let callback_arg: *mut std::os::raw::c_void = std::mem::zeroed();
dpdk::rte_eal_mp_remote_launch(callback,
callback_arg,
dpdk::rte_rmt_call_master_t::CALL_MASTER);
dpdk::rte_eal_mp_wait_lcore();
}
}
まだRustらしくないので
もう少し手直しする予定
(APIを含めて)
手直し中のもの
extern crate dpdk;
use std::os::raw::c_void;
unsafe extern "C" fn hello_thread(_arg: *mut c_void) -> i32 {
println!("Hello! lcore {}", dpdk::lcore::id());
0
}
fn main() {
unsafe {
let _ = dpdk::eal::init(std::env::args());
let callback_arg: *mut c_void = std::mem::zeroed();
dpdk::eal::mp_remote_launch(hello_thread, callback_arg, true);
dpdk::eal::mp_wait_lcore();
}
}
Rust-DPDK(iMasaruOki版)現在のステータス
● DPDK 17.08対応
● マルチコア動作を確認
● l2fwd相当のサンプルを作成し、パケット転送できることを確認
● 動かせることが分かって、ひとまず満足

More Related Content

What's hot

Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門Yoshitaka Seo
 
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェアEmacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェアMasaharu IWAI
 
HTTP2 時代の Web - web over http2
HTTP2 時代の Web - web over http2HTTP2 時代の Web - web over http2
HTTP2 時代の Web - web over http2Jxck Jxck
 
nadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティスnadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティスKazuhiro Nishiyama
 
続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシンt-sin
 
Lagopus performance
Lagopus performanceLagopus performance
Lagopus performanceMasaru Oki
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールAtsuo Ishimoto
 
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017 2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017 unixfreaxjp
 
Open flow tunnel extension on lagopus vswitch
Open flow tunnel extension on lagopus vswitchOpen flow tunnel extension on lagopus vswitch
Open flow tunnel extension on lagopus vswitchMasaru Oki
 
Tricky implementation of Go ARM soft float
Tricky implementation of Go ARM soft floatTricky implementation of Go ARM soft float
Tricky implementation of Go ARM soft floatTetsuyuki Kobayashi
 
Lagopus どれだけ速いのか
Lagopus どれだけ速いのかLagopus どれだけ速いのか
Lagopus どれだけ速いのかMasaru Oki
 
Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Atsuo Ishimoto
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstreamwata2ki
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用Toshiki Tsuboi
 
Trema day 1
Trema day 1Trema day 1
Trema day 1ykuga
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asioTakatoshi Kondo
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)do_aki
 

What's hot (20)

Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門
 
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェアEmacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
 
HTTP2 時代の Web - web over http2
HTTP2 時代の Web - web over http2HTTP2 時代の Web - web over http2
HTTP2 時代の Web - web over http2
 
nadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティスnadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティス
 
続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシン
 
Lagopus 0.2
Lagopus 0.2Lagopus 0.2
Lagopus 0.2
 
Lagopus performance
Lagopus performanceLagopus performance
Lagopus performance
 
Rake
RakeRake
Rake
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
 
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017 2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
 
Open flow tunnel extension on lagopus vswitch
Open flow tunnel extension on lagopus vswitchOpen flow tunnel extension on lagopus vswitch
Open flow tunnel extension on lagopus vswitch
 
Tricky implementation of Go ARM soft float
Tricky implementation of Go ARM soft floatTricky implementation of Go ARM soft float
Tricky implementation of Go ARM soft float
 
Lagopus どれだけ速いのか
Lagopus どれだけ速いのかLagopus どれだけ速いのか
Lagopus どれだけ速いのか
 
Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstream
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
 
Trema day 1
Trema day 1Trema day 1
Trema day 1
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asio
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 

Similar to Rust-DPDK

スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
Docker handson
Docker handsonDocker handson
Docker handsonkoda3
 
[Container Runtime Meetup] runc & User Namespaces
[Container Runtime Meetup] runc & User Namespaces[Container Runtime Meetup] runc & User Namespaces
[Container Runtime Meetup] runc & User NamespacesAkihiro Suda
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門sandai
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇Manabu Ori
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota WatabeInsight Technology, Inc.
 
pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話Akio OBATA
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringMakoto Ohnami
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門sandai
 
WindowsタブレットでLinux、*BSD改造特集と裏技ハッキング in OSC東京2020 #osc20tk Hacking Linux and *...
WindowsタブレットでLinux、*BSD改造特集と裏技ハッキング in OSC東京2020 #osc20tk Hacking Linux and *...WindowsタブレットでLinux、*BSD改造特集と裏技ハッキング in OSC東京2020 #osc20tk Hacking Linux and *...
WindowsタブレットでLinux、*BSD改造特集と裏技ハッキング in OSC東京2020 #osc20tk Hacking Linux and *...Netwalker lab kapper
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouchYohei Sasaki
 

Similar to Rust-DPDK (20)

スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
Docker handson
Docker handsonDocker handson
Docker handson
 
[Container Runtime Meetup] runc & User Namespaces
[Container Runtime Meetup] runc & User Namespaces[Container Runtime Meetup] runc & User Namespaces
[Container Runtime Meetup] runc & User Namespaces
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
DartVM on Android
DartVM on AndroidDartVM on Android
DartVM on Android
 
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe
 
Ansible2.0と実用例
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
 
Node native ext
Node native extNode native ext
Node native ext
 
pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo Spring
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
WindowsタブレットでLinux、*BSD改造特集と裏技ハッキング in OSC東京2020 #osc20tk Hacking Linux and *...
WindowsタブレットでLinux、*BSD改造特集と裏技ハッキング in OSC東京2020 #osc20tk Hacking Linux and *...WindowsタブレットでLinux、*BSD改造特集と裏技ハッキング in OSC東京2020 #osc20tk Hacking Linux and *...
WindowsタブレットでLinux、*BSD改造特集と裏技ハッキング in OSC東京2020 #osc20tk Hacking Linux and *...
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouch
 

More from Masaru Oki

NetBSD移植の昔話
NetBSD移植の昔話NetBSD移植の昔話
NetBSD移植の昔話Masaru Oki
 
Lagopusとvagrant
LagopusとvagrantLagopusとvagrant
LagopusとvagrantMasaru Oki
 
OpenFlowでいろんなプロトコルを 話そうとするとどうなるか
OpenFlowでいろんなプロトコルを 話そうとするとどうなるかOpenFlowでいろんなプロトコルを 話そうとするとどうなるか
OpenFlowでいろんなプロトコルを 話そうとするとどうなるかMasaru Oki
 
今よりも少し(?)昔、 Windowsを作ろうとした話
今よりも少し(?)昔、 Windowsを作ろうとした話今よりも少し(?)昔、 Windowsを作ろうとした話
今よりも少し(?)昔、 Windowsを作ろうとした話Masaru Oki
 
Onieで遊んでみようとした話
Onieで遊んでみようとした話Onieで遊んでみようとした話
Onieで遊んでみようとした話Masaru Oki
 
GPD WINが来た!
GPD WINが来た!GPD WINが来た!
GPD WINが来た!Masaru Oki
 
新生Lagopus2017(仮称)
新生Lagopus2017(仮称)新生Lagopus2017(仮称)
新生Lagopus2017(仮称)Masaru Oki
 
Lagopus as open flow hybrid switch 実践編
Lagopus as open flow hybrid switch 実践編Lagopus as open flow hybrid switch 実践編
Lagopus as open flow hybrid switch 実践編Masaru Oki
 
LagopusでPPPoEを使えるか考えてみた件
LagopusでPPPoEを使えるか考えてみた件LagopusでPPPoEを使えるか考えてみた件
LagopusでPPPoEを使えるか考えてみた件Masaru Oki
 
Ryu+Lagopusで OpenFlowの動きを見てみよう
Ryu+Lagopusで OpenFlowの動きを見てみようRyu+Lagopusで OpenFlowの動きを見てみよう
Ryu+Lagopusで OpenFlowの動きを見てみようMasaru Oki
 
Lagopus match improvements
Lagopus match improvementsLagopus match improvements
Lagopus match improvementsMasaru Oki
 
Lagopus as open flow hybrid switch
Lagopus as open flow hybrid switchLagopus as open flow hybrid switch
Lagopus as open flow hybrid switchMasaru Oki
 
Net bsd advent calendar 2015 bpf
Net bsd advent calendar 2015 bpfNet bsd advent calendar 2015 bpf
Net bsd advent calendar 2015 bpfMasaru Oki
 
Using rump on NetBSD 7.0
Using rump on NetBSD 7.0Using rump on NetBSD 7.0
Using rump on NetBSD 7.0Masaru Oki
 
Rumpを使ってみる
Rumpを使ってみるRumpを使ってみる
Rumpを使ってみるMasaru Oki
 
FreeBSD jail+vnetと戯れた話
FreeBSD jail+vnetと戯れた話FreeBSD jail+vnetと戯れた話
FreeBSD jail+vnetと戯れた話Masaru Oki
 
Open stack+lagopus できるかな
Open stack+lagopus できるかなOpen stack+lagopus できるかな
Open stack+lagopus できるかなMasaru Oki
 

More from Masaru Oki (20)

NetBSD移植の昔話
NetBSD移植の昔話NetBSD移植の昔話
NetBSD移植の昔話
 
Lagopusとvagrant
LagopusとvagrantLagopusとvagrant
Lagopusとvagrant
 
OpenFlowでいろんなプロトコルを 話そうとするとどうなるか
OpenFlowでいろんなプロトコルを 話そうとするとどうなるかOpenFlowでいろんなプロトコルを 話そうとするとどうなるか
OpenFlowでいろんなプロトコルを 話そうとするとどうなるか
 
今よりも少し(?)昔、 Windowsを作ろうとした話
今よりも少し(?)昔、 Windowsを作ろうとした話今よりも少し(?)昔、 Windowsを作ろうとした話
今よりも少し(?)昔、 Windowsを作ろうとした話
 
Onieで遊んでみようとした話
Onieで遊んでみようとした話Onieで遊んでみようとした話
Onieで遊んでみようとした話
 
GPD WINが来た!
GPD WINが来た!GPD WINが来た!
GPD WINが来た!
 
新生Lagopus2017(仮称)
新生Lagopus2017(仮称)新生Lagopus2017(仮称)
新生Lagopus2017(仮称)
 
Lagopus as open flow hybrid switch 実践編
Lagopus as open flow hybrid switch 実践編Lagopus as open flow hybrid switch 実践編
Lagopus as open flow hybrid switch 実践編
 
LagopusでPPPoEを使えるか考えてみた件
LagopusでPPPoEを使えるか考えてみた件LagopusでPPPoEを使えるか考えてみた件
LagopusでPPPoEを使えるか考えてみた件
 
Lagopus 0.2.7
Lagopus 0.2.7Lagopus 0.2.7
Lagopus 0.2.7
 
Ryu+Lagopusで OpenFlowの動きを見てみよう
Ryu+Lagopusで OpenFlowの動きを見てみようRyu+Lagopusで OpenFlowの動きを見てみよう
Ryu+Lagopusで OpenFlowの動きを見てみよう
 
Lagopus match improvements
Lagopus match improvementsLagopus match improvements
Lagopus match improvements
 
Lagopus 0.2.4
Lagopus 0.2.4Lagopus 0.2.4
Lagopus 0.2.4
 
Lagopus as open flow hybrid switch
Lagopus as open flow hybrid switchLagopus as open flow hybrid switch
Lagopus as open flow hybrid switch
 
Net bsd advent calendar 2015 bpf
Net bsd advent calendar 2015 bpfNet bsd advent calendar 2015 bpf
Net bsd advent calendar 2015 bpf
 
Using rump on NetBSD 7.0
Using rump on NetBSD 7.0Using rump on NetBSD 7.0
Using rump on NetBSD 7.0
 
Rumpを使ってみる
Rumpを使ってみるRumpを使ってみる
Rumpを使ってみる
 
FreeBSD jail+vnetと戯れた話
FreeBSD jail+vnetと戯れた話FreeBSD jail+vnetと戯れた話
FreeBSD jail+vnetと戯れた話
 
Lagopus 0.2.2
Lagopus 0.2.2Lagopus 0.2.2
Lagopus 0.2.2
 
Open stack+lagopus できるかな
Open stack+lagopus できるかなOpen stack+lagopus できるかな
Open stack+lagopus できるかな
 

Rust-DPDK

  • 2. Rust? ● ラスト ● システムプログラミング向けに新しく開発されたプログラミング言語。 ● http://rust-lang.org/ ● スクリプト言語ではなく、ネイティブコードにコンパイルする。 ● Rustで書かれたOSというのがある模様。 ○ RedoxOS https://www.redox-os.org/ ○ intermezzOS https://intermezzos.github.io/ ● ツール類の更新等にはrustupコマンドを用いる。 ● C/C++ライブラリを呼び出すbinding libraryを生成するツールがある。 ● 通常、パッケージ(crate)管理システム (cargo) と連動して動作する。 ● 通常、ビルド等にはcargoコマンドを使う (コンパイラ本体はrustc) ● 立ち位置的にはGo言語に近い雰囲気
  • 3. Rustのインストール ● curl https://sh.rustup.rs -sSf | sh ● $HOME/.cargo/binにインストールされる。 ● 必要な環境変数は . $HOME/.cargo/env の実行で設定される。 ● sudo不要。コンパイラとかユーザーごと。 ● Jenkinsでビルドさせるときは~jenkins/.cargoが必要になる。 ● 通常はstable(安定版)がインストールされる。 ● beta(ベータ版)をインストールするにはrustup install beta ● nightly(開発版)をインストールするにはrustup install nightly ● RustでC用のTLSを扱うには現時点ではnightly buildが必要。
  • 4. Rustのプログラム例 fn main () { let mut a = 1; // 変更可能 let b = 2; println!(“hello, world. a = {}, b = {}”, a, b),; a = a + b; println!(“a + b = {}”, a); } ● ファンクションの宣言や定義は fn ● 処理ブロックの範囲は { … } ● 各行の区切りはセミコロン ● 通常の変数はimmutable(変更不可)、変更する変数には mut をつける
  • 5. Rustプログラムのコンパイルと実行 % cd hello % rustc ./src/main.rs # 実行バイナリ./mainが生成される % cat Cargo.toml [package] name = “hello” version = “0.0.1” % cargo run # コンパイルして即実行 % cargo build # target/debug/helloが生成される(実行しない) % cargo test # テストコードを実行 % cargo clean # target/を削除
  • 7. C言語用ライブラリをRustで使う ● Rust側で extern “C” で宣言しておけば呼び出せる。 ○ Foeign Function Interface (FFI) と呼ばれる。 ● 皆がよく使うライブラリはcrateになっていることもある。 extern crate libc; … let fp = libc::fopen(...); ● bindgenというツールが提供されていて、これを使えば自作できる ○ C言語ライブラリのヘッダファイルを読み、 structやプロトタイプ宣言等を Rustに変換する ○ 実行ファイルとしても提供されているが、 Rustのcrateとしても提供されている ○ 変換手順をRustで記述できる ○ 自作したライブラリは crateとして呼び出せるようになる
  • 8. bindgenの変換例 C typedef unsigned short int sa_family_t; struct sockaddr { __SOCKADDR_COMMON (sa_); char sa_data[14]; }; extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) __THROW; Rust pub type sa_family_t = ::std::os::raw::c_ushort; #[repr(C)] #[derive(Debug, Copy)] pub struct sockaddr { pub sa_family: sa_family_t, pub sa_data: [::std::os::raw::c_char; 14usize], } extern "C" { pub fn bind(__fd: ::std::os::raw::c_int, __addr: *const sockaddr, __len: socklen_t) -> ::std::os::raw::c_int; }
  • 9. bindgenの制限 ● Cのヘッダで定義されるinline関数は対象外 ○ inline関数は単純にスキップされる ○ --generate-inline-functions指定はあるがまともに動かない ○ DPDKはヘッダで定義する inline関数を多用しているので単純変換だけだとまず困る ○ inline関数を使わないようにして C libraryをrebuildしろとか言われる ○ きれいで手のかからない解決策 : なし ○ 自作というか改造板の Rust-DPDKでは、当該コード(の一部)を Rustで再実装した ○ Rustのfnの中でinline関数を呼ぶだけ、というコードを用意している実装もあった ● C static libraryはうまくbinding libraryにできない ○ 一見できていても、リンク時に「 -fPICで作り直せ」と怒られる ■ crate-type=”staticlib”もだめだった ○ Webで探しても、C側をstaticじゃなくする方法ばかりが見つかる ○ いろいろ試してみた限り、あきらめるしかないようだった
  • 10. DPDK? ● Data Plane Development Kit ● http://dpdk.org/ ● 高速なパケットI/O機能を提供する、C言語用ライブラリ。 ● 基本的にLinux向け。FreeBSDでは一部機能が提供されないが動く。
  • 11. DPDKのプログラム例(C言語) int hello(void *arg) { printf(“hello lcore %dn”, rte_lcore_id()); return 0; } int main(int argc, char *argv[]) { rte_eal_init(argc, argv); rte_eal_mp_remote_launch(hello, NULL, CALL_MASTER); rte_eal_mp_wait_lcore(); return 0; }
  • 12. 悪魔合体! RustによるDPDKのバインディングはすでにいくつか実装がある。 ● https://github.com/libpnet/rust-dpdk ● https://github.com/flier/rust-dpdk ● https://github.com/ANLAB-KAIST/rust-dpdk ● bindgenで変換しただけだったり ● 動くようだけどサンプルのl2fwdを見るとスレッド関数はCだったり ● サンプルがなくてどう書くのか謎だったり ● 更新が止まっていて新しいDPDKと組み合わせられるか謎だったり しかたがないので、変換しただけのをベースに自分でいじくったものを用意。 ● https://github.com/iMasaruOki/rust-dpdk
  • 13. Rustで書くとこう extern crate rust_dpdk; use rust_dpdk::dpdk; unsafe extern "C" fn hello_thread(_arg: *mut std::os::raw::c_void) -> i32 { println!("Hello! lcore {}", dpdk::rte_lcore_id()); 0 } fn main() { unsafe { let _ = dpdk::eal_init(std::env::args()); let callback: dpdk::lcore_function_t = Some(hello_thread); let callback_arg: *mut std::os::raw::c_void = std::mem::zeroed(); dpdk::rte_eal_mp_remote_launch(callback, callback_arg, dpdk::rte_rmt_call_master_t::CALL_MASTER); dpdk::rte_eal_mp_wait_lcore(); } } まだRustらしくないので もう少し手直しする予定 (APIを含めて)
  • 14. 手直し中のもの extern crate dpdk; use std::os::raw::c_void; unsafe extern "C" fn hello_thread(_arg: *mut c_void) -> i32 { println!("Hello! lcore {}", dpdk::lcore::id()); 0 } fn main() { unsafe { let _ = dpdk::eal::init(std::env::args()); let callback_arg: *mut c_void = std::mem::zeroed(); dpdk::eal::mp_remote_launch(hello_thread, callback_arg, true); dpdk::eal::mp_wait_lcore(); } }
  • 15. Rust-DPDK(iMasaruOki版)現在のステータス ● DPDK 17.08対応 ● マルチコア動作を確認 ● l2fwd相当のサンプルを作成し、パケット転送できることを確認 ● 動かせることが分かって、ひとまず満足