netmapによる 実践パケット処理プログラミング

Similar documents
160311_icm2015-muramatsu-v2.pptx

04-process_thread_2.ppt

PowerPoint プレゼンテーション


ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014

スライド 1

Microsoft Word - PCI-X_PCIeバスのデータ転送-ver1.0.docx

PowerPoint プレゼンテーション

Boost.Preprocessor でプログラミングしましょう DigitalGhost

TFTP serverの実装

プログラミング実習I

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

Lagopus SDN/OpenFlow switch: yet another SDN/OF switch agent and high-performance software switch

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

bitvisor_summit.pptx

ESOTERIC ASIO USB DRIVER インストールマニュアル Windows 用 システム推奨条件 2 インストールで使用する言語を選択して 次へ ボタンをクリックする Intel Core 2 Duo 以上のプロセッサー搭載コンピュータ 搭載メモリ 1GB 以上 対応 OS Windo

02: 変数と標準入出力

セキュアVMの アーキテクチャ概要

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

pgen :: net_stream net (" eth0 ", pgen :: open_mode :: netif ); uint8_t buf [10000]; size_t recvlen = net. recv (buf, sizeof buf ); pgen :: udp pack (

今週の進捗

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

機能 SB-2000 は無線機とコンピュータを接続するインターフェースです CAT, CI/V を経由したリグ制御 CAT や CI/V のリグ制御のインターフェースを持っています この接続でリグを制御できます RTTY, PSK31, SSTV, FAX, その他のデジタルモードが運用できます広く

Peanut システムで FT8 を使用した画像交換体験記 Shu JA3GQJ FT8 は アマチュア無線の短波帯の弱い信号を処理し DX 通信に最適なモードです そのため 多くのアマチュア無線局で使用されています 私は無線の代わりにピーナッツ (peanut) と呼ばれるシステムを使用してインタ

C#の基本

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

まず,13 行目の HardwareTimer Timer(1); は,HardwareTimer というクラスを利用するという宣言である. この宣言によって Timer というインスタンスが生成される.Timer(1) の 1 は,OpenCM に 4 個用意されているタイマのうち,1 番のタイマ

Microsoft Word - Et100pciS2_02a†iWinXP_PDFŠp†j.doc

ゲームプログラミング講習 第0章 導入

2015/04/01 改定 オムロン DeviceNet ユニット CJ1W-DRM21 に関するコンフィグレーション作業について 1. 概要 DeviceNet ユニット CJ1W-DRM21 を装着したオムロン製 CJ2 シリーズと WAGO-I/0-SYSTEM DeviceNet 対応バスカ

PRIMERGY RX300 S6 SAS コントローラカード <RAID 5> フリーOS 動作確認情報

Taro-82ADAカ.jtd

2016_Sum_H4_0405.ai


スライド 1

gengo1-11

memo

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

CoIDE 用 STM32F4_UART2 の説明 V /03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000

PRIMERGY TX100 S1 未サポートOS動作検証確認情報

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

PRIMERGY TX140 S1 未サポートOS動作検証確認情報

スライド 1

PowerPoint Presentation

Outlook2010 の メール 連絡先 に関連する内容を解説します 注意 :Outlook2007 と Outlook2010 では 基本操作 基本画面が違うため この資料では Outlook2010 のみで参考にしてください Outlook2010 の画面構成について... 2 メールについて

CommonMP Ver1.5 インストール手順書 目 次 1. 概要 目的 必要動作環境 ハードウェア構成 ソフトウェア構成 CommonMP のインストール手順 利用フロー

マウス操作だけで本格プログラミングを - 世界のナベアツをコンピュータで - プログラムというと普通は英語みたいな言葉で作ることになりますが 今回はマウスの操作だけで作ってみます Baltie, SGP System 操作説明ビデオなどは 高校 情

PowerPoint Presentation

PRIMERGY TX1310 M1 未サポートOS動作検証確認情報

TopSE並行システム はじめに

VECLOS Audio Driver インストールマニュアル Windows 用 2 次へ ボタンをクリックする 対応 OS Windows 7 (32bit 版 64bit 版 ) Windows 8( 32bit 版 64bit 版 ) Windows 8.1( 32bit 版 64bit 版

2.RL78 での割り込み処理 ( 割り込み受け付け ) マスクが解除された (xxmk ビットが 0 の ) 割り込み要求信号は 2 つの用途で使用されます 一つ目は,CPU のスタンバイ状態の解除です この動作は, 割り込み優先順位とは全く無関係で, マスクされていない (xxmk=0 の )

# 深く掘り下げる C++ 講座 < 第 2 回 > // 先に先週の内容の解説 r ( キャリッジリターン ) 行の先頭に戻る 語源はタイプライターからだそうです とりあえず 以下に rを使ったくるくる回る顔文字のソース 注 : 以下のソースはmacのターミナル上での動作のみ保証 例 ) #inc

SimulinkによるReal-Time Test環境の構築

プログラミングI第10回

PRIMERGY TX100 S3 未サポートOS動作検証確認情報

PRIMERGY TX150 S7 SAS アレイコントローラカード <RAID 5> フリーOS 動作確認情報

PRIMERGY TX1320 M1 未サポートOS動作検証確認情報

Microsoft Word Proself-guide4STD+Prof.docx

Microsoft PowerPoint - OS07.pptx

PowerPoint プレゼンテーション

メール全文検索アプリケーション Sylph-Searcher のご紹介 SRA OSS, Inc. 日本支社技術部チーフエンジニア Sylpheed 開発者 山本博之 Copyright 2007 SRA OSS, Inc. Japan All right

Microsoft® Windows® Server 2008/2008 R2 の Hyper-V 上でのHP ProLiant用ネットワークチーミングソフトウェア使用手順

動機 もう6学期だし真面目に勉強しようと思った 真面目に授業聞いてみたけどよくわからなかった Amazonみてたら OS自作 という文字列を発見 話し聞いてもよくわからないしもはや自分で作っちゃえばいいんじゃない 駒場祭付近暇だしそこで 一気に作っちゃおう

Transcription:

netmap による 実践パケット処理プログラミング ryo@iij.ad.jp Copyright 2016 Internet Initiative Japan, Inc. 1

netmap とは? a framework for fast packet I/O ピサ大学の Luigi Rizzo 教授が設計した API 送受信パケット用のバッファを予め確保 userland/kernel でその領域を mmap で共有 index 付き ring buffer を使うことによるパケット領域の高速 swap 2

socket そもそも (*BSDで) パケットを入出力する方法 socket(), send()/write(), recv()/read() raw-socket bpf pfil socket(af_inet, SOCK_RAW, ) open( /dev/bpf, ) pfil_add_hook() (kernel) 3

netmap の特徴 bpf と pfil の中間くらいに位置する? (bpf と pfil の良いとこ取り ) userland で動く /dev/netmap を開いて ioctl 等で設定 input/output を横取り / ブロック / 書き換えたりできる kernel userland でメモリコピーが無いので効率が良い 4

netmap は何ができるのか 通常のパケットのフロー 5

netmap は何ができるのか ネットワークインターフェイスへの input/output 6

netmap は何ができるのか ホストスタックへの input/output 7

netmap は何ができるのか インターフェイスからホストスタックへの転送 8

netmap は何ができるのか インターフェイスからインターフェイスの転送 9

Hello World Packet https://github.com/ryo/netmap_sample/ 01_hexdump パケットを dump する ( だけ ) 10

Hello Packet (1) #include <net/netmap_user.h> #define NETMAP_WITH_LIBS してから #include <net/netmap_users.h> すると 便利なマクロや inline 関数等が定義される nm_open() / nm_close() 特にこの nm_open() はめんどくさい初期設定を引き受けてくれるので便利 他にもちょっと便利な関数 ( 今回は未使用 ) nm_inject() パケットを出力する nm_dispatch() パケット受信処理を callback で呼んでくれる nm_nextpkt() ring バッファのポインタを次のパケットへと進める 11

Hello Packet (2) nm_desc = nm_open("netmap:igb0", NULL, 0, NULL); /dev/netmap を open し ioctl でインターフェイス等を設定 ring バッファを mmap し 初期化してくれる netmap:igb0 NICのハードウェアTX/RX ringを開く netmap:igb0^ NICに対応するホストリングのTX/RXを開く netmap:igb0* ハードウェアリングとホストリング両方を開く netmap:igb0-1 NICの1 番目のハードウェアリングだけを開く 他にもいろいろ 詳しくは net/netmap_user.h を参照 12

Hello Packet (3) for (;;) { pollfd[0].fd = nm_desc->fd; pollfd[0].events = POLLIN; poll(pollfd, 1, 100); } ~~~~~~~~ netmap は基本的には poll() で待つ poll() で待ってる間に kernel の netmap ドライバがパケットを入出力してくれる 13

Hello Packet (4) for (i = nm_desc->first_rx_ring; i <= nm_desc->last_rx_ring; i++) { } rxring = NETMAP_RXRING(nm_desc->nifp, i); cur = rxring->cur; for (n = nm_ring_space(rxring); n > 0; n--) { hexdump(netmap_buf(rxring, rxring->slot[cur].buf_idx), rxring->slot[cur].len, NULL, 0); cur = nm_ring_next(rxring, cur); } rxring->head = rxring->cur = cur; RX ring から受信パケットを 1 パケットづつ取り出して hexdump する 最初のループは NIC によっては ring が複数ある場合のため 14

netmap ring の構造 15

netmap ring の構造 ( 全体 ) 16

RX ring から TX ring への転送 RX ring のスロットを TX ring のスロットへ転送したい 17

RX ring から TX ring への転送 RX ring と TX ring のスロットのインデックスを入れ替えるだけでいい ( メモリコピーの必要なし ) 18

NIC ring HOST ring NIC RX を HOST TX へ HOST RX を NIC TX へ 19

netmap_slot の swap https://github.com/ryo/netmap_sample/ 02_nic2host indexだけを入れ替える /* swap buf_idx */ tmp = txring->slot[cur].buf_idx; txring->slot[cur].buf_idx = rxring->slot[src].buf_idx; rxring->slot[src].buf_idx = tmp; /* set len */ sizeは上書きでok txring->slot[cur].len = rxring->slot[src].len; indexを書き換え /* update flags */ た場合に必要 txring->slot[cur].flags = NS_BUF_CHANGED; rxring->slot[src].flags = NS_BUF_CHANGED; 20

NIC から NIC への転送 ( 複数 NIC) nm_open() で複数インターフェイスを開くと packet buffer が独立してしまう ring buffer swap できない?! 21

NIC から NIC への転送 ( 複数 NIC) 2 つめの nm_open() に 親として 1 つめの nm_desc を渡して パケットバッファを共有する 22

NIC から NIC への転送 https://github.com/ryo/netmap_sample/ 03_nic2nic NM_OPEN_NO_MMAP と 親として nm_desc1 を指定することにより 2 つの netmap ディスクリプタでパケットバッファが共有される 23

簡易 firewall 応用編 ここで TX に渡す / 渡さないを取捨選択する 24

簡易 firewall https://github.com/ryo/netmap_sample/ 04_firewall ここでパケットのテスト 25

簡易 firewall https://github.com/ryo/netmap_sample/ 04_firewall パケットは ether header 含む ether header から辿っていく 26

簡易 firewall https://github.com/ryo/netmap_sample/ 04_firewall フィルタルールの定義 27

簡易 firewall https://github.com/ryo/netmap_sample/ 04_firewall フィルタルールを順番にテスト 28

NIC のマルチキュー CPU core はたくさんある パケット処理は 1 core(1 プロセス ) で動く 1 つの core の CPU 使用量だけ増え 他の core は処理空き パケットの処理を分散させられないか? NIC に複数のキューを持たせればいい NIC マルチキュー (RSS:Receive Side Scaling) 29

NIC のマルチキューと netmap Intel 等の NIC が対応している キューの数は 4 8 netmap では キューの数の分の ring が見える ( デバイスドライバにもよる ) netmap でキューを独立に操作するには? nm_open で指定するデバイス名の後ろに数字を付ける netmap:igb0 NIC のハードウェア TX/RX ring を開く netmap:igb0^ NIC に対応するホストリングの TX/RX を開く netmap:igb0* ハードウェアリングとホストリング両方を開く netmap:igb0-1 NIC の 1 番目のハードウェアリングだけを開く 30

マルチプロセッサにおけるチューニング https://github.com/ryo/netmap_sample/ 05_multiqueue RING の数だけ thread を作る 一度 nm_open して RING の数を調べる 31

TIPS ( あるいはバッドノウハウ ) netmap 対応ドライバが必要 現状 em(4), igb(4), ixgbe(4), lem(4), re(4) のみ対応 bridge 等の動作をさせるには 別途 promiscuous モードにするなどの操作が必要 プログラムで面倒みましょう ハードウェアオフローディングと相性が悪い ifconfig txcsum tso 等しておく 32

今回解説しなかったこと Appendix vale - a Virtual Local Ethernet と呼ばれる仮想イーサネットスイッチを持っている vale:foo 等で作成 使用可能 netmap pipe と呼ばれる netmap ring を使った 1 対 1 pipe 機能を持つ bpf のように観測だけ行う MONITOR モードも持っている (NR_MONITOR_{TX,RX} 33

まとめ netmap_user.h の nm_open を使えば簡単に扱える netmap ring からパケットバッファへはインデックスを介して間接アクセスされる それにより メモリコピーせずにスロットの swap で高速に転送が可能 複数の NIC を扱う場合は nm_open に NM_OPEN_NO_MMAP を指定して親子関係を作ってパケットバッファを共有させる 高速化するには ハードウェア RING を別々に nm_open して マルチキューマルチコア化 34