VPPでSRv6を動かしてみた


1. はじめに
2. VPPってなに？
3. VPP install編
4. SRv6設定してみた
5. おわりに

## はじめに

この記事はシスコの同志による[Cisco Systems Japan Advent Calendar 2017](https://qiita.com/advent-calendar/2017/cisco)の14日目です。

今年一年間Segment Routingばかりやっていたので、最後にSRv6を動かしてみたいと思います。
Segment Routing自体の説明はこちらをご参照ください。
[Segment Routingチュートリアル](https://www.janog.gr.jp/meeting/janog40/program/sr)

現時点でSRv6が動くのは製品含めてほとんどないため、Open sourceのSoftwareである[VPP(Vector Packet Processing)](https://wiki.fd.io/view/VPP)を使ってみました。


## VPPってなに？

VPPとは[FD.io](https://wiki.fd.io/view/Main_Page)プロジェクトで管理しているOpen sourceの仮想スイッチ&ルータです。
世界で一番最初にSRv6を実装したルータじゃないかなと思います。
とにかく色んな機能をサポートしているので、色々遊べると思います。
https://wiki.fd.io/view/VPP/Features


## VPP install編

まずInstallから、Ubuntu/Centos等のためにAptもYumも用意されていますが、とりあえずUbuntu16.04でやってみることにしました。
以下のリンク通りに進めようと思いましたが、最新Versionだとはまってしまい、うまくいきませんでした。

Adventカレンダーなので14日に投稿すべくとりあえず稼働実績があるstable.1609でやってみることにします。
以下の手順でさくさくと進めてみます。
*FD.io:* [VPP/Installing VPP binaries from packages](https://wiki.fd.io/view/VPP/Installing_VPP_binaries_from_packages)

```
tkamata@tkamata-ubuntu:~$ export UBUNTU="xenial"
tkamata@tkamata-ubuntu:~$ export RELEASE=".stable.1609"
tkamata@tkamata-ubuntu:~$ sudo rm /etc/apt/sources.list.d/99fd.io.list
tkamata@tkamata-ubuntu:~$ echo "deb [trusted=yes] https://nexus.fd.io/content/repositories/fd.io$RELEASE.ubuntu.$UBUNTU.main/ ./" | sudo tee -a /etc/apt/sources.list.d/99fd.io.list
tkamata@tkamata-ubuntu:~$ sudo apt-get update
tkamata@tkamata-ubuntu:~$ sudo apt-get install vpp vpp-plugins
```

Installがちゃんと成功していると以下のコマンドで起動確認が可能

```
tkamata@tkamata-ubuntu:~$ sudo service vpp status
* vpp.service - vector packet processing engine
   Loaded: loaded (/lib/systemd/system/vpp.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2017-12-13 06:35:44 PST; 1min 28s ago
  Process: 922 ExecStartPre=/sbin/modprobe uio_pci_generic (code=exited, status=0/SUCCESS)
  Process: 910 ExecStartPre=/bin/rm -f /dev/shm/db /dev/shm/global_vm /dev/shm/vpe-api (code=exited, status=0/SUCCESS)
 Main PID: 943 (vpp_main)
   CGroup: /system.slice/vpp.service
           `-943 /usr/bin/vpp -c /etc/vpp/startup.conf

Dec 13 06:35:45 tkamata-ubuntu vpp[943]: vl_msg_api_config:670: BUG: multiple registrations of 'vl_api_memif_details_t_handler'
Dec 13 06:35:45 tkamata-ubuntu vpp[943]: load_one_plugin:63: Loaded plugin: /usr/lib/vpp_api_test_plugins/memif_test_plugin.so
Dec 13 06:35:45 tkamata-ubuntu vpp[943]: load_one_plugin:63: Loaded plugin: /usr/lib/vpp_api_test_plugins/ioam_pot_test_plugin.so
Dec 13 06:35:45 tkamata-ubuntu vpp[943]: vlib_pci_bind_to_uio: Skipping PCI device 0000:00:03.0 as host interface ens160 is up
Dec 13 06:35:49 tkamata-ubuntu vpp[943]: linux_epoll_file_update:102: epoll_ctl: Operation not permitted (errno 1)
Dec 13 06:35:49 tkamata-ubuntu vpp[943]: linux_epoll_file_update:102: epoll_ctl: Operation not permitted (errno 1)
Dec 13 06:35:49 tkamata-ubuntu vpp[943]: 0: dpdk_ipsec_process:239: not enough Cryptodevs, default to OpenSSL IPsec
Dec 13 06:35:49 localhost vpp[943]: 0: dpdk_lib_init:182: DPDK drivers found no ports...
```

` sudo vppctl` コマンドでVPPのコマンドを実施可能(VPPにTelnetもできます)

```
tkamata@tkamata-ubuntu:~$ sudo vppctl show int
              Name               Idx       State          Counter          Count
local0                            0        down
```

VPPの設定は基本的には以下のStartup.confに記載されています

```
tkamata@tkamata-ubuntu:~$ cat /etc/vpp/startup.conf
unix {
  nodaemon
  log /tmp/vpp.log
  full-coredump
}

api-trace {
  on
}

api-segment {
  gid vpp
}
```

17点台では本当は上記設定だけでFlushしてあるIFを自動でvppに追加してくれるはずですが、追加できずハマってしまったので、16点台で手動でPCI IDを追加します。

まずPCI IDを確認します。

```
tkamata@tkamata-ubuntu:~$ sudo lshw -class network -businfo
Bus info Device Class Description
====================================================
pci@0000:02:01.0 eth32 network 82545EM Gigabit Ethernet Controller (Copper)
pci@0000:03:00.0 eth160 network VMXNET3 Ethernet Controller
```

次に/etc/vpp/startup.confに以下を追記します。

```
dpdk {
        socket-mem 2048
        dev 0000:02:01.0
}
```

ens 32のIF設定を初期化してからVPPをRestartするとVPPでIFが認識されるのでIP addressを設定してみます。

```
tkamata@tkamata-ubuntu:~$ sudo ifconfig ens32 down
tkamata@tkamata-ubuntu:~$ sudo ip addr flush dev ens32
tkamata@tkamata-ubuntu:~$ sudo service vpp stop
tkamata@tkamata-ubuntu:~$ sudo service vpp start
tkamata@tkamata-ubuntu:~$ sudo vppctl show int
              Name               Idx       State          Counter          Count
GigabitEthernet2/0/0              1        down
local0                            0        down
tkamata@tkamata-ubuntu:~$ sudo vppctl set int ip address GigabitEthernet2/0/0 192.168.1.1/24

tkamata@tkamata-ubuntu:~$ sudo vppctl set int state GigabitEthernet2/0/0 up

tkamata@tkamata-ubuntu:~$ sudo vppctl show int
              Name               Idx       State          Counter          Count
GigabitEthernet2/0/0              1         up
local0                            0        down

tkamata@tkamata-ubuntu:~$ sudo vppctl show int addr
GigabitEthernet2/0/0 (up):
  192.168.1.1/24
local0 (dn):

```

上記の要領で複数台設定してみれば疎通が確認できます。

## SRv6設定してみた
SRv6の設定例は以下にあるのでガリガリ設定してみます。

[VPP/Segment Routing for IPv6](https://wiki.fd.io/view/VPP/Segment_Routing_for_IPv6:_Overlay_VPN_with_Underlay_Optimization)

完全に上記の例の通りにやってみます。

```
tkamata@tkamata-ubuntu:~$ vppctl set sr encaps source addr C1::

tkamata@tkamata-ubuntu:~$ vppctl sr policy add bsid C1::999:1 next C2:: encap

tkamata@tkamata-ubuntu:~$ vppctl sr steer l3 B::/112 via sr policy bsid C1::999:1

tkamata@tkamata-ubuntu:~$ vppctl show sr pol
SR policies:
[0].-	BSID: c1::999:1
	Behavior: Encapsulation
	Type: Default
	FIB table: 0
	Segment Lists:
  	[0].- < c2::, c4::6 > weight: 1
-----------

tkamata@tkamata-ubuntu:~$ vppctl show sr steering policies
SR steering policies:
Traffic		SR policy BSID
L3 b::/112	c1::999:1

```


```
tkamata@tkamata-ubuntu4:~$ vppctl show sr localsid
SRv6 - My LocalSID Table:
=========================
	Address: 	c4::6
	Behavior: 	DX6 (Endpoint with decapsulation and IPv6 cross-connect)
	Iface:  	GigabitEthernet2/0/0
	Next hop: 	b:c5::b
	Good traffic: 	[0 packets : 0 bytes]
	Bad traffic:  	[0 packets : 0 bytes]
--------------------

```

パケット通ってないっす。。けどなんかちゃんと動きそうな出力でした。
上記以外ちゃんとしたManualないので、ここで一度諦め。
次回新しいイメージでリトライしてみます。

## 終わりに

とりあえずSRv6にトライしてみましたが、ここまで来るのになぜか突然VPPが落ちること複数回とまだまだVPPが不安定でManualも充実していないので、今後に期待というところでした。