SlideShare ist ein Scribd-Unternehmen logo
1 von 7
Downloaden Sie, um offline zu lesen
NetBSD Advent Calendar 2015
BPFを使ってパケットを送受信
Dec 8, 2015
Masaru OKI @masaru0714
BPF?
Berkeley Packet Filter。
昔から*BSDにある、パケットキャプチャの仕組み。
injectといってパケットを送信することもできる。らしい。
bpf(4)にいろいろ説明が書いてある。
以降、C言語を使ったBPFでのパケット送受信について大雑把に解説する。
自分がハマったところは太字にしている。あちこちにある。うっかりさんである。
BPFによるキャプチャの準備
1. fd = open(“/dev/bpf”, O_RDWR); で、スペシャルファイルをオープンする。
2. ioctl(fd, BIOCSBLEN, &len); で、バッファサイズを設定する。
バッファには複数パケットの情報が詰めて書き込まれる。
インタフェースを指定する前に設定する必要がある。
3. ioctl(fd, BIOCSSEESENT, &onoff); で送信方向をキャプチャするか指定。
受信方向については常にキャプチャされる。デフォルトは送信方向もキャプチャ。
※FreeBSDではBIOCSDIECTIONを使う。送信方向のみキャプチャもできる。
4. ioctl(fd, BIOCSETIF, &ifreq); で対象インタフェース名を指定。
ifreq.ifr_nameにインタフェース名を書き込んでおく。
5. 必要に応じて ioctl(fd, BIOCPROMISC, NULL); しておく。
パケットの受信
1. read(fd, buf, buflen); する。buflenはBIOCSBLENと同じ値でないとエラーになる。
2. bufの中身はstruct bpf_hdr + パケットデータ、が収まるだけ連続している。
3. パケットデータのサイズは bh_caplenにホストバイトオーダで書かれている。
bpf_hdr bpf_hdr bpf_hdr bpf_hdr
struct bpf_hdr {
struct bpf_timeval bh_tstamp; /* time stamp */
uint32_t bh_caplen; /* length of captured portion */
uint32_t bh_datalen; /* original length of packet */
uint16_t bh_hdrlen; /* length of bpf header (this struct
plus alignment padding) */
};
パケットの送信
ふつうに生データをwriteするだけ。1回のwriteで1パケット。bpf_hdrはつけない。
FCSはカーネルが計算してくれる。
ioctl(fd, BIOCSSEESENT, &onoff); で送信方向のキャプチャを切っておかないと、送った
データそのものを受信する。tcpdumpみたいに全部キャプチャするのであれば問題ない
が、パケット送受信するプログラムの場合はハマるので注意。
パケットの受信待ち
fdをふつうにselectやpollで待てる。
送信でブロックを避けたい場合もselectやpollを使う。
OSによるBPF実装の差異
● BPFではfilterを設定できるが、NetBSDではfilterのJITコンパイラが使える。
● FreeBSDではzero copy bpfなるものが用意されている。
● 他は未調査……
● スライドで解説したコードはNetBSD, FreeBSD共通で使える。
● 昔の*BSDは “/dev/bpf0”, “/dev/bpf1”, … を使っていた(重複open不可)らしいが、
NetBSDやFreeBSDは “/dev/bpf” を複数回openして別I/Fを送受信できる。
おしまい。

Weitere ähnliche Inhalte

Andere mochten auch

richards keynote
richards keynote richards keynote
richards keynote
richardskd
 

Andere mochten auch (20)

Lagopus+pcap pmd
Lagopus+pcap pmdLagopus+pcap pmd
Lagopus+pcap pmd
 
Lagopus 0.2.2
Lagopus 0.2.2Lagopus 0.2.2
Lagopus 0.2.2
 
Lagopus 0.2.4
Lagopus 0.2.4Lagopus 0.2.4
Lagopus 0.2.4
 
Lagopus 0.2
Lagopus 0.2Lagopus 0.2
Lagopus 0.2
 
GPD WINが来た!
GPD WINが来た!GPD WINが来た!
GPD WINが来た!
 
新生Lagopus2017(仮称)
新生Lagopus2017(仮称)新生Lagopus2017(仮称)
新生Lagopus2017(仮称)
 
OpenFlowでいろんなプロトコルを 話そうとするとどうなるか
OpenFlowでいろんなプロトコルを 話そうとするとどうなるかOpenFlowでいろんなプロトコルを 話そうとするとどうなるか
OpenFlowでいろんなプロトコルを 話そうとするとどうなるか
 
60分でわかるソケットプログラミング
60分でわかるソケットプログラミング60分でわかるソケットプログラミング
60分でわかるソケットプログラミング
 
Volcanic Eruption Communication Model (Final Revision)
Volcanic Eruption Communication Model (Final Revision)Volcanic Eruption Communication Model (Final Revision)
Volcanic Eruption Communication Model (Final Revision)
 
PARADIGMAS URBANOS. Guía sitio 2016
PARADIGMAS URBANOS. Guía sitio 2016PARADIGMAS URBANOS. Guía sitio 2016
PARADIGMAS URBANOS. Guía sitio 2016
 
8 Issues and My Answers in Pilipinas Debates 2016
8 Issues and My Answers in Pilipinas Debates 20168 Issues and My Answers in Pilipinas Debates 2016
8 Issues and My Answers in Pilipinas Debates 2016
 
The One Who Deserves (Silent Protest)
The One Who Deserves (Silent Protest)The One Who Deserves (Silent Protest)
The One Who Deserves (Silent Protest)
 
richards keynote
richards keynote richards keynote
richards keynote
 
Thailand (Economic Setting)
Thailand (Economic Setting)Thailand (Economic Setting)
Thailand (Economic Setting)
 
8 Tui Bei Tu Parallelisms to Philippine History
8 Tui Bei Tu Parallelisms to Philippine History8 Tui Bei Tu Parallelisms to Philippine History
8 Tui Bei Tu Parallelisms to Philippine History
 
Frances. POWERPOINT.
Frances. POWERPOINT.Frances. POWERPOINT.
Frances. POWERPOINT.
 
Location shoot
Location shootLocation shoot
Location shoot
 
Myanmar: Political Setting
Myanmar: Political SettingMyanmar: Political Setting
Myanmar: Political Setting
 
cgfh
cgfhcgfh
cgfh
 
Historia del Cine
Historia del CineHistoria del Cine
Historia del Cine
 

Mehr von Masaru Oki

Mehr von Masaru Oki (20)

NetBSD移植の昔話
NetBSD移植の昔話NetBSD移植の昔話
NetBSD移植の昔話
 
Rust-DPDK
Rust-DPDKRust-DPDK
Rust-DPDK
 
Rust-DPDK
Rust-DPDKRust-DPDK
Rust-DPDK
 
Lagopusとvagrant
LagopusとvagrantLagopusとvagrant
Lagopusとvagrant
 
今よりも少し(?)昔、 Windowsを作ろうとした話
今よりも少し(?)昔、 Windowsを作ろうとした話今よりも少し(?)昔、 Windowsを作ろうとした話
今よりも少し(?)昔、 Windowsを作ろうとした話
 
Onieで遊んでみようとした話
Onieで遊んでみようとした話Onieで遊んでみようとした話
Onieで遊んでみようとした話
 
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 どれだけ速いのか
Lagopus どれだけ速いのかLagopus どれだけ速いのか
Lagopus どれだけ速いのか
 
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
 
Rumpを使ってみる
Rumpを使ってみるRumpを使ってみる
Rumpを使ってみる
 
FreeBSD jail+vnetと戯れた話
FreeBSD jail+vnetと戯れた話FreeBSD jail+vnetと戯れた話
FreeBSD jail+vnetと戯れた話
 
Open stack+lagopus できるかな
Open stack+lagopus できるかなOpen stack+lagopus できるかな
Open stack+lagopus できるかな
 
SDNソフトウェアスイッチlagopus for FreeBSD
SDNソフトウェアスイッチlagopus for FreeBSDSDNソフトウェアスイッチlagopus for FreeBSD
SDNソフトウェアスイッチlagopus for FreeBSD
 
Xeon dとlagopusと、pktgen dpdk
Xeon dとlagopusと、pktgen dpdkXeon dとlagopusと、pktgen dpdk
Xeon dとlagopusと、pktgen dpdk
 
Running lagopus on Xeon D
Running lagopus on Xeon DRunning lagopus on Xeon D
Running lagopus on Xeon D
 
Using Xeon D 10GBase-T
Using Xeon D 10GBase-TUsing Xeon D 10GBase-T
Using Xeon D 10GBase-T
 
DPDK QoS
DPDK QoSDPDK QoS
DPDK QoS
 

Net bsd advent calendar 2015 bpf