how to run p4 bmv2

22
How to Run P4 Behavior Model v2 ~ An P4 Software Switch Reference Implementation ~ Twitter: @ebiken How to Run P4 Behavior Model v2 | 2017/08/06 1

Upload: kentaro-ebisawa

Post on 22-Jan-2018

1.382 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: How to run P4 BMv2

How to RunP4 Behavior Model v2~ An P4 Software Switch Reference Implementation ~

Twitter: @ebiken

How to Run P4 Behavior Model v2 | 2017/08/06 1

Page 2: How to run P4 BMv2

• data plane 記述言語である “P4” 対応のハードウェア実装(ASIC, SmartNIC etc.)が増えつつあるが、数十万~数百万円と、P4とは何かをまず試してみるにはコスト的に敷居が高い。

• また、各ハードウェア実装(以降ターゲット)によってサポートされるP4機能が異なるため、P4言語そのものを試すには制約が少ないソフトウェア実装が好ましい。

• そのため、P4を初めて試す際や、P4を用いたアプリケーションのPOC等を実施する際には、P4コミュニティで実装がすすめられているリファレンス実装である “P4 BMv2 (Behavior Model version 2)” を用いると有効である。

• 本文書では、P4 BMv2を用いてP4のコンパイルおよびP4スイッチを動作させるための手順を紹介する。

About this document

How to Run P4 Behavior Model v2 | 2017/08/06 2

Page 3: How to run P4 BMv2

• 既存パケット処理専用ASICの課題(P4のモチベーション)• パケット処理を高速(Tbps)かつ安価に実施する場合、専用ASICが利用される。• 新しいプロトコル・処理方法に対応したASICの開発には2~3年必要。• 標準化完了~対応製品利用可能まで5年程度必要。• ネットワーク製品の進化がユーザーニーズに追い付かなくなっていた。

How to Run P4 Behavior Model v2 | 2017/08/06 3

P4について

Reference:• “The P4 Language Specification”• Version 1.0.3 | November 2, 2016

• プログラム可能なパケット処理専用ASICの開発• パケット処理(Dataplane)の基本動作(Parse/Match/Action)をプログラム可能なASICとプログラム言語(P4)を設計。

• P4 : Programming Protocol-Independent Packet Processors• 仕様提唱企業:Barefoot Networks

• P4は「データプレーン定義言語」であるため、様々なターゲットプラットフォームへコンパイル可能• P4対応 Ethernet Switch (ASIC)• SmartNIC (NPU, FPGA)• Software (CPU)

Page 4: How to run P4 BMv2

• Ethernet Switchは通常 “parser”, “match/action”, “de-parser” で構成されるが、match/actionのパイプラインがいくつあるか (Input only, In/Outetc.)、利用可能なaction、メタデータやレジストリなどの違いがある。• de-parser => 送信前にパケットヘッダを組み立てるコンポーネント

• P4 BMv2ではこれらのアーキテクチャの変更が可能となっている。• アーキテクチャは C++11でプログラムする。

• サンプルとして以下3つのアーキテクチャが付属している。

• l2_switch | simple_router | simple_switch

• P4言語を試すときは、上記付属アーキテクチャから1つを選んで使用。

How to Run P4 Behavior Model v2 | 2017/08/06 4

Switch Architecture

Page 5: How to run P4 BMv2

• P4仕様には現在2つのバージョンが存在する。

• それぞれ2014年、2016年にリリースされた仕様となるが、どちらとも現在(2017年7月)も

メンテナンスが継続されており、定期的に修正版がリリースされている。バージョン番号はそれぞれ独立して version x.y.zの形式でアサインされているため、"P4_14 Version 1.0.4", "P4_16 Version 1.0.0" のように P4_14 / P4_16 を明確に記載する必要がある。

• P4バージョンと仕様書の場所• https://p4lang.github.io/p4-spec/• P4_14:2014年リリースの仕様• P4_16:2016年リリースの仕様

本文書では、サポートされるハードウェア実装の多い “P4_14”を用いる。

How to Run P4 Behavior Model v2 | 2017/08/06 5

P4のバージョンと入手先

Page 6: How to run P4 BMv2

• P4はパケット処理のデータプレーンを定義するプログラム言語であり、実際のパ

ケット処理には以下モジュールが必要となる。

How to Run P4 Behavior Model v2 | 2017/08/06 6

P4動作に必要なモジュール

P4 Source Code パケット処理データプレーンの定義。パーサーやテーブル、アクションなどの定義

P4 Compiler P4をTarget上で実行可能な形式(Dataplane runtime)にコンパイルする。Target毎に提供される。

TargetP4 Dataplane runtime を読み込み、定義された通りにパケット処理を実施するASIC(Barefoot), SmartNIC/NPU(Netronome), FPGA(Xilinx, Intel/Altera), Software(BMv2, eBPF) etc.

Notes• Target実装毎にサポート状況はそれぞれ異なるため注意が

必要である。例えばNetronome SmartNIC (NFP)は現在

(2017年8月)P4_14のみをサポートしている。

• P4_16の仕様書では、P4対応Dataplaneだけでなく Control-

plane を含めて Targetと呼んでいる。

• また、P4は「どのようにパケットを解析するか」「どのような

テーブルを持つか」「どのようなアクションが可能か」の定義

であり、スイッチ・ルーターと同様に「アドレス」「テーブルエ

ントリ(ルール)」などの設定を投入するコントロールプレー

ン(Network OS等)が必要である。

P4 Source Code

Dataplaneruntime

P4 Compiler

P4 対応 Dataplane

Control-plane(protocol agents)

Target

API definition

参照:P4_16 v1.0.0 Figure 2. Programming a target with P4.

Page 7: How to run P4 BMv2

• P4 source code はスイッチのパイプライン(パーサー、テーブル構成やアクション)を定義しているのに対し、それらを設定(エントリを投入・変更・削除)するAPIが存在する。

• BMv2 API (現状)• BMv2 APIとして “Thrift API” が用意されている• BMv2用のCLIが付属しており、Thrift API経由でBMv2を操作する• https://github.com/p4lang/behavioral-model/blob/master/tools/runtime_CLI.py

• BMv2 API (将来プラン)• Targetに依存しない gRPC / protobuf を利用した API が検討されている• Targetに依存しないため、その上で開発したCLIなどはBMv2以外の実装(Switch ASIC, SmartNICなど)でも利用可能になる予定である

• https://github.com/p4lang/PI• https://github.com/p4lang/PI/blob/master/proto/p4/p4runtime.proto

How to Run P4 Behavior Model v2 | 2017/08/06 7

CLI / API (Configuration Interface)

Page 8: How to run P4 BMv2

(各モジュールの説明は以降のスライドに記載)

• P4コミュニティのレポジトリは以下GitHubに保存されている。• https://github.com/p4lang/

• P4 Compiler• p4c: https://github.com/p4lang/p4c

• Target• bmv2 : https://github.com/p4lang/behavioral-model.git

• P4 Source Code• samples : https://github.com/p4lang/tutorials

How to Run P4 Behavior Model v2 | 2017/08/06 8

各モジュールの入手場所

Page 9: How to run P4 BMv2

How to Run P4 Behavior Model v2 | 2017/08/06 9

各モジュールの入手場所 (P4 Compiler)

p4c-bm• https://github.com/p4lang/p4c-bm

• P4_14 対応のオフィシャルコンパイラ

.

p4c• https://github.com/p4lang/p4c

• P4_16, P4_14 対応のコンパイラ

• (p4c-bmより新しい)

• p4c ... 標準コンパイラ

• p4c-ebpf ... eBPFへコンパイル可能なCをP4から出力する

• .p4 ファイルを入力とし .json (dataplane runtime) を出力する

• p4c-bm, p4c の2種類存在

新しいプロジェクトではp4cを利用していくことを推奨

Page 10: How to run P4 BMv2

• P4 Software Switch (Behavior Model)• bmv2 : https://github.com/p4lang/behavioral-model.git

• BMv2には以下3つのTarget実装のサンプルが付属する。• https://github.com/p4lang/behavioral-model/tree/master/targets• simple_router : 最も簡単な実装。• l2_switch : Multicast 対応のためのレプリケーションエンジンを含む• simple_switch : 標準 P4 target

• (参考)• 古いBM(メンテ停止済み)も p4lang レポに存在しているが、古いチュートリアル実行等以外では利用しないことを推奨

• https://github.com/p4lang/p4c-behavioral

How to Run P4 Behavior Model v2 | 2017/08/06 10

各モジュールの入手場所 (Target)

Page 11: How to run P4 BMv2

• P4 Source Code

• チュートリアル等で利用されたサンプルを入手可能

• https://github.com/p4lang/tutorials

•各ターゲットの下にも存在する

How to Run P4 Behavior Model v2 | 2017/08/06 11

各モジュールの入手場所 (P4 Source Code)

Page 12: How to run P4 BMv2

• Protocol Agent•例えば Layer 2 switch (MAC Learning)を動作させるためには、未学習のパケットを解釈し、MAC Tableにエントリを追加する Agent (CPUで動作)が必要

• P4 Source Code と同じ場所にサンプルが存在する。• https://github.com/p4lang/behavioral-

model/tree/master/targets/l2_switch/learn_client

• CLI• runtime_CLI (python) が各 Targetの下、および以下場所に存在

• https://github.com/p4lang/behavioral-model/blob/master/tools/runtime_CLI.py

• (各 Target下の runtime_CLIと同じ実装)

How to Run P4 Behavior Model v2 | 2017/08/06 12

各モジュールの入手場所(その他)

Page 13: How to run P4 BMv2

Install/Build 手順Ubuntu 16.04 を用いて確認した Install/Build 手順

How to Run P4 Behavior Model v2 | 2017/08/06 13

Page 14: How to run P4 BMv2

• README.md に記載されている手順にて実施:• https://github.com/p4lang/p4c/blob/master/README.md

作業内容

1. aptをアップデート

2. 依存パッケージをインストール

3. GitHubから p4c repository をクローン

4. ビルド

5. compiler と P4 shared headers をインストール (optional)• p4c: /usr/local/bin• P4 headers: /usr/local/share/p4c

How to Run P4 Behavior Model v2 | 2017/08/06 14

p4c (compiler)

Page 15: How to run P4 BMv2

How to Run P4 Behavior Model v2 | 2017/08/06 15

p4c (compiler)作業ログ1. apt をアップデート$ sudo apt update$ sudo apt upgrade

2. 依存パッケージをインストール$ sudo apt-get install g++ git automake libtool libgc-dev bison flex libfl-dev libgmp-dev libboost-dev libboost-iostreams-dev pkg-config python python-scapy python-ipaddr tcpdump> For documentation building:> $ sudo apt-get install -y doxygen graphviz texlive-full

> Google Protocol Buffers. Install newest tag in the 3.0 series.$ sudo apt-get install autoconf automake libtool curl make g++ unzip$ git clone https://github.com/google/protobuf.git$ cd protobuf/

> under ~/protobuf$$ git checkout v3.0.2$ ./autogen.sh$ ./configure$ make$ make check$ sudo make install$ sudo ldconfig # refresh shared library cache.> If required: $ sudo apt autoremove

3. GitHub から p4c repository をクローン> Clone p4c repository from GitHub$ mkdir p4lang$ cd p4lang~/p4lang$ git clone --recursive https://github.com/p4lang/p4c.git

4. ビルド> build p4c$ ./bootstrap.sh$ cd build$ make -j4$ make check -j4

5. compiler と P4 shared headers をインストール (optional)> Install$ sudo make install

Page 16: How to run P4 BMv2

• README.md に記載されている手順にて実施:• https://github.com/p4lang/behavioral-model/blob/master/README.md

1. GitHubから bmv2 (behavioral-model) repository をクローン

2. 依存パッケージをインストール• packages: thrift / nanomsg / nnpy

• Ubuntu の場合、`install_deps.sh` script を利用して一括インストール可能

3. ビルド

4. テスト実行

How to Run P4 Behavior Model v2 | 2017/08/06 16

bmv2 (behavior model)

Page 17: How to run P4 BMv2

How to Run P4 Behavior Model v2 | 2017/08/06 17

bmv2 (behavior model)1. GitHub から bmv2 (behavioral-model) repository をクローン

$ git clone https://github.com/p4lang/behavioral-model.git bmv2$ cd bmv2

2. 依存パッケージをインストール

> under ~/bmv2$$ ./install_deps.sh script

3. ビルド

> Build$ ./autogen.sh$ ./configure$ make -j2$ sudo make install # if you need to install bmv2

4.テスト実行

> Run test$ make check

Page 18: How to run P4 BMv2

サンプル(Layer 2 switch の実行)

How to Run P4 Behavior Model v2 | 2017/08/06 18

Page 19: How to run P4 BMv2

• P4 Program のコンパイル、Agentの利用、設定の投入、等、P4 Applicationを動作させるために必要な基本的な手順すべてが含まれるため、サンプルとして ”Target: l2_switch” を用いた Layer 2 (mac learning) switchの動作手順を記載します。

How to Run P4 Behavior Model v2 | 2017/08/06 19

Layer 2 switch using P4 BMv2

host1 host2

l2_switch (BMv2)

veth0: 172.20.0.1/24

vtap1vtap0

veth1: 172.20.0.1/24learn_client runtime_CLI

Notes• Two veth/vtap pair are created.• host1/host2 are network

namespace (netns) to emulate hosts connected to switch.

• learn_client runs outside of l2_switch (BMv2) and receives packets from l2_switch / updatetable entries dynamically.

• runtime_CLI are used to set initial table entries on l2_switch, and check table entries on runtime.

Page 20: How to run P4 BMv2

1. veth/vtap pair, netns hostsの作成

2. l2_switch の起動

3. learn_clientの起動

4. CLIの起動・設定の投入

5. host間で ping による疎通確認

6. Table Entryの確認

How to Run P4 Behavior Model v2 | 2017/08/06 20

Layer 2 switch using P4 BMv2 (steps)

Page 21: How to run P4 BMv2

How to Run P4 Behavior Model v2 | 2017/08/06 21

Layer 2 switch using P4 BMv2 (作業ログ)1. veth/vtap pair, netns hostsの作成

# Create netns hostsip netns add host0ip netns add host1# Create vethip link add veth0 type veth peer name vtap0ip link add veth1 type veth peer name vtap1# Connect veth between host0 and host1ip link set veth0 netns host0ip link set veth1 netns host1ip link set dev vtap0 upip link set dev vtap1 up# Link up loopback and vethip netns exec host0 ip link set veth0 upip netns exec host0 ifconfig lo upip netns exec host1 ip link set veth1 upip netns exec host1 ifconfig lo up# Set IP addressip netns exec host0 ip addr add 172.20.0.1/24 dev veth0ip netns exec host1 ip addr add 172.20.0.2/24 dev veth1ip link set dev vtap0 upip link set dev vtap1 up

2. l2_switch の起動

$ cd bmv2/targets/l2_switch~/bmv2/targets/l2_switch$ sudo ./l2_switch l2_switch.json -i 0@vtap0 -i 1@vtap1 --nanolog ¥ipc:///tmp/bm-0-log.ipc --log-console -L debug --notifications-addr ¥ipc:///tmp/bmv2-0-notifications.ipc

3. learn_clientの起動

~/bmv2/targets/l2_switch/learn_client$ sudo ./learn_client

4. CLI の起動・設定の投入

~/bmv2/targets/l2_switch$ ./runtime_CLItable_set_default smac mac_learntable_set_default dmac broadcastmc_mgrp_create 1mc_node_create 0 1mc_node_create 1 2mc_node_associate 1 0mc_node_associate 1 1

Page 22: How to run P4 BMv2

How to Run P4 Behavior Model v2 | 2017/08/06 22

Layer 2 switch using P4 BMv2 (作業ログ)5. host 間で ping による疎通確認

# ip netns exec host0 ping 172.20.0.2# ip netns exec host1 ping 172.20.0.1

6. Table Entry の確認

RuntimeCmd: table_dump smac==========TABLE ENTRIES**********Dumping entry 0x0Match key:* ethernet.srcAddr : EXACT 32e7c817d3c5Action entry: _nop -**********Dumping entry 0x1Match key:* ethernet.srcAddr : EXACT fe698f981f3bAction entry: _nop -==========Dumping default entryAction entry: mac_learn -==========

RuntimeCmd: table_dump dmac==========TABLE ENTRIES**********Dumping entry 0x0Match key:* ethernet.dstAddr : EXACT 32e7c817d3c5Action entry: forward - 00**********Dumping entry 0x1Match key:* ethernet.dstAddr : EXACT fe698f981f3bAction entry: forward - 01==========Dumping default entryAction entry: broadcast -==========