Skip to content

Instantly share code, notes, and snippets.

@testpilot031
Last active February 4, 2019 15:36
Show Gist options
  • Save testpilot031/429fcc77a3af2c02599a26dcfed1e6fd to your computer and use it in GitHub Desktop.
Save testpilot031/429fcc77a3af2c02599a26dcfed1e6fd to your computer and use it in GitHub Desktop.
srv6, netlink

Ubuntu17.10 で実行

openconfigd からインストール

sudo update sudo apt install -y telnet mlocate vim binutils build-essential sysstat golang git mkdir ~/go mkdir ~/go/bin

$HOMEディレクトリ直下にある.bashrcに以下追記

export GOPATH="$HOME/go" export PATH="$GOPATH/bin:$PATH"

あとでbash上で実行もしておく

export GOPATH="$HOME/go" export PATH="$GOPATH/bin:$PATH"

あとはGitHubのとおり

どこのフォルダで実行するかは重要なので適当なフォルダ配下ではやらない https://github.com/coreswitch/openconfigd/tree/0cfb7663db2c21805c8620292834e5461ae25b66 cd $GOPATH/bin go get github.com/coreswitch/openconfigd/openconfigd go get github.com/coreswitch/openconfigd/cli_command cd $GOPATH/src/github.com/coreswitch/openconfigd/cli ./configure make sudo make install cd $GOPATH/src/github.com/coreswitch/openconfigd/bash_completion.d sudo cp cli /etc/bash_completion.d/

動作確認

openconfigd & cli ubuntu> show version Developer Preview version of openconfigd

Ubuntu17.10 で実行
### openconfigd
#!/bin/bash
sudo apt update
sudo apt install -y telnet mlocate vim binutils build-essential sysstat golang git autoconf
mkdir ~/go
mkdir ~/go/bin
echo -e 'export GOPATH="$HOME/go"\nexport PATH="$GOPATH/bin:$PATH"' >> ~/.bashrc
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"
cd $GOPATH/bin
# openconfigd
go get github.com/coreswitch/openconfigd/openconfigd
go get github.com/coreswitch/openconfigd/cli_command
cd $GOPATH/src/github.com/coreswitch/openconfigd/cli
./configure
make
sudo make install
cd $GOPATH/src/github.com/coreswitch/openconfigd/bash_completion.d
sudo cp cli /etc/bash_completion.d/
# zebra ribd
cd $GOPATH/bin
go get github.com/coreswitch/zebra/rib/ribd
go get github.com/coreswitch/openconfigd/quagga/quaggad
# proccess start
echo 'sudo ${GOPATH}/bin/openconfigd -y ${GOPATH}/src/github.com/coreswitch/openconfigd/yang &' >> ~/.bashrc
echo 'sudo ${GOPATH}/bin/ribd &' >> ~/.bashrc
echo 'sudo /usr/lib/quagga/bgpd --config_file /dev/null --pid_file /tmp/bgpd.pid --socket /var/run/zserv.api &' >> ~/.bashrc
echo 'sudo ${GOPATH}/bin/quaggad &' >> ~/.bashrc
https://www.slideshare.net/kentaroebisawa/onic2017
# zebraは現時点ではisisが実装されていない。
Vagrntfile ubuntu17.10
cd /root/go/src/github.com/coreswitch/openconfigd/bash_completion.d
sudo cp cli /etc/bash_completion.d/
echo -e "hostname zebra\npassword zebra\nenable password zebra" > /etc/quagga/zebra.conf
echo -e "hostname bgpd\npassword zebra\nenable password zebra" > /etc/quagga/bgpd.conf
echo -e "hostname isisd\npassword zebra\nenable password zebra" > /etc/quagga/isisd.conf
echo -e "service integrated-vtysh-config" > /etc/quagga/vtysh.conf
service zebra start
service bgpd start
service isisd start
service ufw stop
service zebra start
service bgpd start
service isisd start
service ufw stop
service zebra enable
service bgpd enable
service isisd enable
service firewalld ufw
service zebra restart
service bgpd restart
service isisd restart
ribd起動、rpcのポートは2699とでる。
INFO Starting RPC component at port 2699
=====================
念のため
> Does Quagga support netconf? If yes, how to enable and configure it?
No.
https://lists.quagga.net/pipermail/quagga-users/2015-May/014014.html
https://github.com/coreswitch/openconfigd
https://github.com/coreswitch/openconfigd/tree/master/quagga
sudo ${GOPATH}/bin/openconfigd -y ${GOPATH}/src/github.com/coreswitch/openconfigd/yang &
sudo ${GOPATH}/bin/ribd &
sudo /usr/lib/quagga/bgpd --config_file /dev/null --pid_file /tmp/bgpd.pid --socket /var/run/zserv.api &
sudo ${GOPATH}/bin/quaggad &
http://www.cs.virginia.edu/~cs458/material/zebra-manual-Sept2002.pdf

vagrant box add centos7.2 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box

次に進むと「Setup Wizard」の画面となり、GNS3のサーバタイプの選択と構築に映る。 GNS3のサーバタイプには

Local GNS3 VM Local server Remote server がある。 今回は、自分のコンピュータ上の仮想マシンで動作する環境である「Local GNS3 VM」で構築を行っていく。

そのため、VirtualBoxにGNS3 VMのVMイメージを取得していく。 以下のサイトからイメージを取得する。 https://github.com/GNS3/gns3-gui/releases/tag/v1.5.4

GNS3がv1.5.4であり、VirtualBox上に構築することから GNS3.VM.VirtualBox.1.5.4.zipを取得する。

解凍すると、GNS3 VM.ovaができるので このイメージをVirtualBoxにインポートしていく。

importして起動でエラー出る Kernel driver not installed (rc=-1908)

Make sure the kernel module has been loaded successfully.

where: suplibOsInit what: 3 VERR_VM_DRIVER_NOT_INSTALLED (-1908) - The support driver is not installed. On linux, open returned ENOENT.

Uninstall & install

VirtualBoxの再インストールとmac側のダウンロードしたアプリケーションの実行許可:許可 で起動

VirtualBox 5.2.10 Oracle VM VirtualBox Extension Packもinstall 仮想マシーンの設定でネットワークを見ると、ホストオンリーアダプタの設定が「未選択」になっているじゃありませんか。

解決方法は下記。

「Oracle VM Virtual Boxマネージャー」→「環境設定」→「ネットワーク」で「+」という画像をクリック。 そうすると、「Virutal Box Host-Only Ethernet Adapter」が追加されます。

起動出来たがTimeOutする

vagrant box add centos7.2 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box vagrant init centos7.2 vagrant up vagrant ssh sudo yum -y install quagga

https://qiita.com/taijijiji/items/4cdb62317896f5509101

zebra.conf hostname router password zebra enable password zebra

bgpd.conf hostname router password zebra enable password zebra

次に以下のコマンドで起動します。

systemctl start zebra

systemctl start bgpd

sudo yum install telnet

config.vm.provision :shell, :path => "provision.sh"

-- mode: ruby --

vi: set ft=ruby :

Vagrant.configure(2) do |config| config.vm.box = "centos7.2"

  config.vm.define :quagga01 do | quagga01 |
      quagga01.vm.hostname = 'quagga01'
      quagga01.vm.network "private_network", ip: "192.168.33.13"
      config.vm.provision :shell, :path => "provision.sh"
      config.vm.synced_folder "./quagga/quagga01 ", "/etc/quagga",
        create: true, owner: "root", group: "root"
      config.vm.provision :shell, :inline => "systemctl start zebra & systemctl start bgpd"
  end
  config.vm.define :quagga02 do | quagga02 |
      quagga02.vm.hostname = 'quagga02'
      quagga02.vm.network "private_network", ip: "192.168.33.14"
      config.vm.provision :shell, :path => "provision.sh"
      config.vm.synced_folder "./quagga/quagga02", "/etc/quagga",
        create: true, owner: "root", group: "root"
      config.vm.provision :shell, :inline => "systemctl start zebra & systemctl start bgpd"
  end
  config.vm.define :quagga03 do | quagga03 |
      quagga03.vm.hostname = 'quagga03'
      quagga03.vm.network "private_network", ip: "192.168.33.15"
      config.vm.provision :shell, :path => "provision.sh"
      config.vm.synced_folder "./quagga/quagga03", "/etc/quagga",
        create: true, owner: "root", group: "root"
      config.vm.provision :shell, :inline => "systemctl start zebra & systemctl start bgpd"
  end

end

イントロダクション quagga は 石黒邦宏氏が開発したルーティングソフトウェア GNU zebra の派生ソフトウェアで,FreeBSD, NetBSD, Linux, Solaris などの UNIX で動作し,OSPFv2, OSPFv3, RIP v1, RIP v2, RIPng, BGP-4 などのルーティングプロトコルが実装されている.quagga をインストールすることによって PC をソフトウェアルータとして動作させることが可能になる.

quagga にはいくつかのルーティングデーモンが含まれている.zebra は quagga のコアデーモンで,UNIX のカーネル上に抽象化レイヤを構築し,後に挙げるルーティングデーモンに対して API(Zserv API) を提供する.また static ルーティングなどの設定を行う.ripd は RIPv1 と RIPv2,ospfd は OSPFv2,ospf6d は OSPFv3(IPv6),ripngd は RIPng(IPv6),bgpd は BGPv4+(IPv6) を実装したデーモン (Zserv clients) である.

また,quagga は Cisco のルータやスイッチに使用されている基本ソフトウェア,IOS のコマンドラインに良く似たコマンドラインを持つため,Cisco のネットワーク機器を扱う練習台としても利用されている.

各種設定方法などのドキュメントはこちらから確認することができる. http://www.hongo.wide.ad.jp/exp/2012w/quagga.html

事前準備

/etc/quagga 配下に以下のファイルをおく 1.vtysh.conf
service integrated-vtysh-config

2.zebra.conf, 3.isisd.conf hostname router password zebra enable password zebra

OS起動後

confファイルに問題無ければプロセスが起動出来る systemctl start zebra systemctl start isisd systemctl enable zebra systemctl enable isisd

参考

待ち受けポート telnet localhost 2601 の様にすると各processにアクセス出来る

zebra: 2601 ripd: 2602 ripng: 2603 ospfd: 2604 bgpd: 2605 ospf6d:2606 isisd: 2608

GNS3

GNS3上ではeth0とかで表示するされるので対応表を書く ubuntu | GNS3 enp0s3 : eth0 enp0s8 : eth1 enp0s9 : eth2 enp0s10 : eth3 enp0s16 : eth4

QuaggaのCLI操作

vtysh

以下の様に設定 quagga02# show running-config Building configuration...

Current configuration: ! hostname zebra hostname isisd ! service integrated-vtysh-config ! password zebra enable password zebra ! interface en ipv6 nd suppress-ra ! interface enp0s3 ipv6 nd suppress-ra ! interface enp0s8 ipv6 nd suppress-ra shutdown ! interface enp0s9 ipv6 nd suppress-ra ! interface enp0s10 ip address 10.0.100.1/24 ip router isis F00 ipv6 nd suppress-ra ! interface enp0s16 ip address 172.0.0.2/24 ip router isis F00 ipv6 nd suppress-ra ! interface lo ! router isis F00 net 01.0023.0000.0000.0000.0000.0000.0000.1900.0002.00 metric-style wide ! line vty ! end

設定した後

ISISにてルートが運ばれて来ているのを確認 quagga02# show ip route Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, A - Babel, > - selected route, * - FIB route

K>* 0.0.0.0/0 via 10.0.2.2, enp0s3 C>* 10.0.2.0/24 is directly connected, enp0s3 C>* 10.0.100.0/24 is directly connected, enp0s10 I>* 10.0.200.0/24 [115/20] via 172.0.0.1, enp0s16, 00:07:19 C>* 127.0.0.0/8 is directly connected, lo I 172.0.0.0/24 [115/20] via 172.0.0.1 inactive, 00:07:19 C>* 172.0.0.0/24 is directly connected, enp0s16

疑問

L1ルータ    ・・・ is-type level-1 L1/L2ルータ  ・・・ is-type level-1-2 L2ルータ    ・・・ is-type level-2-only の指定ができてエラーでないが、configに反映されない

isis動作確認

Showing ISIS information show isis summary show isis hostname show isis interface show isis topology

参考URL https://www.nongnu.org/quagga/docs/docs-multi/ISIS-Configuration-Examples.html http://atnetwork.info/ccnp1/is-is4.html

MPLS

server側での作業

sudo add-apt-repository ppa:gns3/ppa sudo apt update sudo apt install gns3

sudo apt-get install python3-setuptools python3-netifaces sudo apt-get install python3-dev

sudo add-apt-repository ppa:gns3/ppa -y $ sudo dpkg --add-architecture i386 $ sudo apt update $ sudo apt upgrade -y $ sudo apt install -y virtualbox openssh-server vagrant gns3-iou gns3-server systemd スクリプトの設置と有効化 $ sudo vi /etc/systemd/system/myproject.service [Unit] Description=GNS3 server Wants=network-online.target After=network.target network-online.target

[Service] Type=forking User=root Group=root PermissionsStartOnly=true ExecStartPre=/bin/mkdir -p /var/log/gns3 /var/run/gns3 ExecStartPre=/bin/chown -R root:root /var/log/gns3 /var/run/gns3 ExecStart=/usr/bin/gns3server --log /var/log/gns3/gns3.log
--pid /var/run/gns3/gns3.pid --daemon Restart=on-abort PIDFile=/var/run/gns3/gns3.pid

[Install] WantedBy=multi-user.target

$ sudo systemctl daemon-reload $ sudo systemctl enable gns3

https://www.pochio.net/2017/09/ubuntu-1604-lts-gns3.html

rootでgns3を起動するのでrootで仮想ルータを作っておく Vagrantとvirtualboxを入れてるのでvagrantを利用しvirtualboxに仮想ルータ(サーバ)を作成しておく。

vagrant plugin install vagrant-cachier プラグインインストール後、初vagrant up real 7m15.318s user 0m18.793s sys 0m9.969s

vagrant destroy

プラグインインストール後、再vagrant up

real 6m56.186s user 0m18.658s sys 0m10.000s

client側でgns3を立ち上げ、 preference > server > main server でserver側のIPアドレスを設定する ユーザー名、パスワードは入力しても使われていない様子

templateにサーバー側にある仮想サーバの設定 start VM in headless modeにチェック(チェック入れないとGNS3からの起動に失敗する) Enable ACPI shutdownにチェック

  • ASIC SDK/API
  • NetworkOS

全体像

ASIC SDK/API

Broadcom OpenNSL

calvium OpenXPS

Mellanox OpenEthernet

SAI

  • 共通で使える規格(?)

https://www.slideshare.net/kentaroebisawa/open-networking-management-data-plane

NetworkOS

OpenSwitch (ops)

Open Network Linux

http://stereocat.hatenablog.com/entry/20151026/1445865563

Agent

FBOSS


FBOSS

C:\Users\vietnam\Downloads\fboss-master\fboss\agent\TunIntf.cpp(279,38) [SJIS]: throw NlError(err, "can't open rtnetlink.");

→netlink使っている

C:\Users\vietnam\Downloads\fboss-master\fboss\agent\hw\bcm\BcmError.h(32,57) [SJIS]: : FbossError(std::forward(args)..., ": ", opennsl_errmsg(err)),

→資料には載っていたがOpen NSL使われている

Open NSL

netlinkで検索してもヒットしない linux_dma.c, linux-kernel-bde.c のファイルがある。

Install

  1. Building OpenNSL
  2. Building example Applications
  3. Downloading and running OpenNSL sample applications

1. Building

  1. Extract the code tarball into the destination directory say opennsl_root.
  2. Go to output directory. For Wedge Network Switch platform, it is opennsl_root/opennsl/output/wedge
  3. Set KERNEL_SRC to point to the kernel headers. Wedge Network Switch platform is supported with CentOS 6.5 Linux distribution. [Eg: export KERNEL_SRC==/usr/src/kernels/2.6.32-431.el6.x86_64 or 2.6.32-504.8.1.el6.x86_64 ]
  4. Issue "make" to create an OpenNSL shared library object, linux kernel modules. [Note]: OpenNSL requires MAKE version 3.82. MAKE version 4.0 is not supported. To force the MAKE version, set the following variable. "export MAKEVER=3.82"
  5. The deliverables folder : opennsl_root/opennsl/output/wedge/build shall have the following files.

a) Linux kernel module : linux-kernel-bde.ko

b) Linux user module : linux-user-bde.ko

c) KNET driver module : linux-bcm-knet.ko

d) OpenNSL shared object library : libopennsl.so

→カーネルモジュール、共有ライブラリ

2. Building example Applications

→省略

3. Downloading and running OpenNSL sample applications

  1. cd to target deliverables directory. For Wedge Network Switch platform, it is opennsl_root/opennsl/output/wedge/build.

  2. Use the following commands to update the linux kernel modules

    • i ) Execute "lsmod" to list the installed linux kernel modules.
    • ii ) Remove the linux kernel and user modules by using "rmmod" command.
    • iii) Install linux kernel modules built for OpenNSL platform by using the following commands. Please ensure that the modules are removed before inserting it using 'rmmod' command.

→ もともとあるKernelモジュールをアンロードして、以下のようにモジュールを追加する

    > mknod /dev/linux-kernel-bde c 127 0
    
    > mknod /dev/linux-user-bde c 126 0
    
    > mknod /dev/linux-bcm-knet c 122 0
    
    > insmod linux-kernel-bde.ko
    
    > insmod linux-user-bde.ko
    
    > insmod linux-bcm-knet.ko

lsmod: ロードされているモジュール一覧 mknod: 特殊ファイルや通常のファイルを作成する 要するに新しいドライバを追加するコマンド。

  • /dev/linux-kernel-bde:ファイル名
  • c :キャラクタ型デバイス
  • 127 :メジャー番号
  • 0 :マイナー番号

ブロックデバイスとキャラクターデバイスって?

  • デバイスファイルに対して入出力の要求が行なわれる。
  • カーネル内に組み込まれたデバイスドライバが起動される。
  • 必要な入出力処理が行われる。
  • このとき、データの受渡しに バッファを使用するものをブロックデバイス(blockデバイス)
  • バッファリングなしで入出力を行なうものをキャラクタデバイス(rawデバイス)

マイナー・メジャー番号って?

  • メジャー番号:カーネルがデバイスに関係するドライバを識別。装置により、決まっているものがある。(例:USB=180)
  • マイナー番号:カーネルは関知せず、ドライバ内で識別。 http://kreisel.fam.cx/webmaster/clog/2009-10-04-1.html

insmod :カーネルモジュールのロード。modprobeはカーネルモジュールのロードまたはアンロード。

  1. Install OpenNSL shared library. The destination directory to install the shared library depends on the host environment configuration. Install the library files in a location included in the system's library search path.

    mv libopennsl.so.1 /usr/lib

    cd /usr/lib

    ln -sf libopennsl.so.1 libopennsl.so

  2. Download the wedge platform configuration files to switch. Set the OPENNSL_CONFIG_FILE path to point to the relevant configuration file based on the wedge switch variant. Refer to OpenNSL documentation, section "Customizing OpenNSL platform" for more details.

    export OPENNSL_CONFIG_FILE=config.wedge100 (For wedge100)

    export OPENNSL_CONFIG_FILE=config.wedge40 (For wedge40)

  3. cd to the target deliverables directory and run the sample application.

    chmod +x sample_application

    ./sample_application

a) Linux kernel module : linux-kernel-bde.ko

  • Linux Kernel BD、詳細な説明なし

b) Linux user module : linux-user-bde.ko

  • User BDE Helper Module、詳細な説明なし

c) KNET driver module : linux-bcm-knet.ko

  • このモジュールは、Broadcom XGSスイッチデバイス用のLinuxネットワークドライバを実装しています。
  • ドライバは同時に、多数の仮想Linuxネットワークデバイスと、ユーザ空間に実装されたTx / Rx APIを提供します。
  • このモジュールは基本的なRx DMAレートコントロールを実装しています。 レートは1秒あたりのパケット数で指定され、異なる最大パケットレートを使用するよう異なるRx DMAチャネルを設定することができます。   パケットレートはモジュールパラメータとして設定でき、procファイルシステムを介して動的に変更することもできます(構文は関数ヘッダコメントに記述されています)。

d) OpenNSL shared object library : libopennsl.so

  • Cファイル見つからない

Linuxとドライバ

USB や SDIO のように稼動中の抜き差し(ホットプラグ)に対応したバスの場合、新しいデバイスの挿入検出ごとに UEVENT と呼ばれるカーネルイベントが発生します。PCI のように稼動中の抜き差し不可能な場合でも、起動直後のバス探索(プローブ)によってデバイスが検索され、やはり UEVENT が発生します。 UEVENT には検出されたデバイスを示す ID 文字列が付加され、これをデバイス・エイリアスと呼んでいます。デバイス・エイリアスは "pci:v0000168Cd0000002A" のような文字列で、小文字がカテゴリを、大文字が数値を示しています。この場合は "pci:" が PCI デバイスであること、"v0000168C" がベンダー ID=0x168C (Qualcom Atheros) であること、d0000002A がデバイス ID=0x2A (AR9280 チップセット) であることを意味しています。

デバイス検出に伴うドライバのロードは通常、rules.d/80-drivers.rules で処理されます。

/lib/udev/rules.d/80-drivers.rules

do not edit this file, it will be overwritten on update

ACTION=="remove", GOTO="drivers_end"

ENV{MODALIAS}=="?", RUN{builtin}+="kmod load $env{MODALIAS}" SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN{builtin}+="kmod load tifm_sd" SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", RUN{builtin}+="kmod load tifm_ms" SUBSYSTEM=="memstick", RUN{builtin}+="kmod load ms_block mspro_block" SUBSYSTEM=="i2o", RUN{builtin}+="kmod load i2o_block" SUBSYSTEM=="module", KERNEL=="parport_pc", RUN{builtin}+="kmod load ppdev" KERNEL=="mtdro", ENV{MTD_FTL}=="smartmedia", RUN{builtin}+="kmod load sm_ftl"

LABEL="drivers_end"

ドライバのロードは RUN{builtin}="kmod load $env{MODALIAS}" によって処理されます。 kmodはmodprobe と互換。

modinfo とエイリアス 上で「modprobe はモジュール名を引数として動作する」と書きましたが、実は modprobe はデバイス・エイリアスを引数としても動作します。AR9280 に対応するドライバが ath9k.ko だとしたら、"modprobe ath9k" と書いても "modprobe pci:v0000168Cd0000002A" と書いても同じ動きになります。 これにも仕掛けがあって、/lib/modules//modules.alias にエイリアスとモジュール名の対応関係がずらりと書かれており、modprobe はこれを参照してデバイス・エイリアスからモジュール名を逆引きし、そのモジュール名を今度は modules.dep から参照して該当するファイル名および依存情報を調べています。modules.alias も modules.dep 同様バイナリ版の modules.alias.bin がペアになっており、やはり depmod コマンドによって生成されます。

これらの情報...ドライバ毎の対応するエイリアスや依存モジュールの情報は、ドライバファイルの *.ko 自身に埋め込まれています。それを調べるのが「modinfo」コマンドで、例えば ath9k.ko に対して modinfo を実行すると以下のような結果が表示されます。

modinfo e1000|more

filename: /lib/modules/4.4.0-119-generic/kernel/drivers/net/ethernet/intel/e1000/e1000.ko version: 7.3.21-k8-NAPI license: GPL description: Intel(R) PRO/1000 Network Driver author: Intel Corporation, [email protected] srcversion: 9695902D12379E95A2112CA alias: pci:v00008086d00002E6Esvsdbcsci* alias: pci:v00008086d000010B5svsdbcsci* alias: pci:v00008086d00001099svsdbcsci* alias: pci:v00008086d0000108Asvsdbcsci* alias: pci:v00008086d0000107Csvsdbcsci* alias: pci:v00008086d0000107Bsvsdbcsci* alias: pci:v00008086d0000107Asvsdbcsci* alias: pci:v00008086d00001079svsdbcsci* alias: pci:v00008086d00001078svsdbcsci* alias: pci:v00008086d00001077svsdbcsci* alias: pci:v00008086d00001076svsdbcsci* alias: pci:v00008086d00001075svsdbcsci* alias: pci:v00008086d00001028svsdbcsci* alias: pci:v00008086d00001027svsdbcsci* alias: pci:v00008086d00001026svsdbcsci* alias: pci:v00008086d0000101Esvsdbcsci* alias: pci:v00008086d0000101Dsvsdbcsci* alias: pci:v00008086d0000101Asvsdbcsci* alias: pci:v00008086d00001019svsdbcsci* alias: pci:v00008086d00001018svsdbcsci* alias: pci:v00008086d00001017svsdbcsci* alias: pci:v00008086d00001016svsdbcsci* alias: pci:v00008086d00001015svsdbcsci* alias: pci:v00008086d00001014svsdbcsci* alias: pci:v00008086d00001013svsdbcsci* alias: pci:v00008086d00001012svsdbcsci* alias: pci:v00008086d00001011svsdbcsci* alias: pci:v00008086d00001010svsdbcsci* alias: pci:v00008086d0000100Fsvsdbcsci* alias: pci:v00008086d0000100Esvsdbcsci* alias: pci:v00008086d0000100Dsvsdbcsci* alias: pci:v00008086d0000100Csvsdbcsci* alias: pci:v00008086d00001009svsdbcsci* alias: pci:v00008086d00001008svsdbcsci* alias: pci:v00008086d00001004svsdbcsci* alias: pci:v00008086d00001001svsdbcsci* alias: pci:v00008086d00001000svsdbcsci* depends: intree: Y vermagic: 4.4.0-119-generic SMP mod_unload modversions retpoline parm: TxDescriptors:Number of transmit descriptors (array of int) parm: RxDescriptors:Number of receive descriptors (array of int) parm: Speed:Speed setting (array of int) parm: Duplex:Duplex setting (array of int) parm: AutoNeg:Advertised auto-negotiation setting (array of int) parm: FlowControl:Flow Control setting (array of int) parm: XsumRX:Disable or enable Receive Checksum offload (array of int) parm: TxIntDelay:Transmit Interrupt Delay (array of int) parm: TxAbsIntDelay:Transmit Absolute Interrupt Delay (array of int) parm: RxIntDelay:Receive Interrupt Delay (array of int) parm: RxAbsIntDelay:Receive Absolute Interrupt Delay (array of int) parm: InterruptThrottleRate:Interrupt Throttling Rate (array of int) parm: SmartPowerDownEnable:Enable PHY smart power down (array of int) parm: copybreak:Maximum size of packet that is copied to a new buffer on receive (uint) parm: debug:Debug level (0=none,...,16=all) (int)

"alias:" には対応するデバイス・エイリアスがずらりと列挙されており、depmod はこれを抽出して modules.alias ファイルを作っています。また "depends:" には ath9k.ko (この場合e1000)の動作に必要となる親モジュールの一覧が列挙されており、depmod はこれを抽出して modules.dep ファイルを作っています。

http://www.silex.jp/blog/wireless/2015/08/linux.html

parmとは

parm フィールドは、parameter_name:description/ の形式で 1 つのモジュールパラメーターを表します。 parameter_name は、コマンドラインまたは /etc/modprobe.d/ ディレクトリの .conf ファイルのオプション行でモジュールパラメーターとして使用している場合に使用する構文と同一です。 description は、パラメーターが使用する括弧内の値の種類 (int、unit、array of int など) に対する期待値と併せて、パラメーターが実行する内容の簡単な説明です

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/sec-displaying_information_about_a_module

Linuxのカーネルモジュール

Linuxでは、これらを解決するため、カーネルモジュールという仕組みを導入している。 カーネルモジュールは、実行時にカーネルの一部の機能をモジュール化したものであり、必要に応じてロードする。 これにより、特定のアーキテクチャでしか利用されない処理や不要なデバイスドライバなどの機能を取り外す事ができるため、 メモリの節約が行えると共に、起動時間の高速化を可能とする。

カーネルモジュールの配置位置の確認 カーネルモジュールもカーネルイメージと同様、ファイルシステム上に配置される。

以下のOSでは、ブートイメージが3つ存在する。

ls /boot/vmlinuz*

/boot/vmlinuz-2.6.21-1.3228.fc7
/boot/vmlinuz-2.6.23.17-88.fc7
/boot/vmlinuz-2.6.21-7.fc7xen

これらにそれぞれ対応するカーネルモジュールは、以下のディレクトリへそれぞれ配置されている。

ls /lib/modules/

2.6.21-1.3228.fc7 2.6.21-7.fc7xen 2.6.23.17-88.fc7

実行中のシステムは、以下の通りである。

uname -r

2.6.23.17-88.fc7

したがって、利用されるカーネルモジュールは、 ディレクトリ「/lib/modules/2.6.23.17-88.fc7」に配置されることが理解できる。

以下のようにコマンドを実行すると、カーネルモジュールの配置ディレクトリをより簡単に取得できる。

echo /lib/modules/uname -r

/lib/modules/2.6.23.17-88.fc7

http://kwkw.wiki.fc2.com/wiki/Linux%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB

DMA

ネットワークドライバの仕事は、基本的にはプロトコルスタックから受け取ったパケットをデバイスに渡し、デバイスがDMAで書き込んできたパケットをプロトコルスタックに移譲するだけである。 その前にまずはデバイスをネットワークインターフェースとして認識できるようにしよう。この手順が終われば、ifconfigでネットワークインターフェースとして登録したり、IPアドレスを設定したりできるようになる。

http://lv4.hateblo.jp/entry/linux_network_driver

「DMA」とはDirect Memory Accessの略です。CPUを使わずに、バスを通じて周辺機能(アナログ機能、通信機能など)とメモリ間(フラッシュメモリ、ROM、RAM)のデータ転送を直接行う機能のことです。 RAMからデータを取り出して通信機能へ送る場合  通常、データ転送はCPUが行いますが、DMAを搭載しているマイコンでは、DMAがCPUに代わって、データを転送してくれます(図1参照)。

 そのためCPUは算術/論理演算などのCPUでしかできない仕事だけすればよくなります。結果的に、DMAを搭載することで、マイコンの性能を総合的に上げることができるのです。

 DMAの最大の利点は、ハードウェアを使って直接データ転送するので、高速・大容量のデータ転送が可能になることです。転送元と転送先は、メモリと周辺機能で自由に選択できます(ただし、マイコンによっては制限があります)。しかし、1本しかないバスをCPUと分け合って使うため、バスの使用権の調整が必要になります。

 この“バスの調整”は英語で「バスアービトレーション(Bus Arbitration)」と呼ばれ、日本語では「バス権の調停」と呼ばれています。

bcm-knet.ko (bcm-knet.c)

/*

$Id: bcm-knet.c,v 1.90 Broadcom SDK $ $Copyright: (c) 2005 Broadcom Corp. All Rights Reserved.$ /

/*

This module implements a Linux network driver for Broadcom XGS switch devices. The driver simultaneously serves a number of vitual Linux network devices and a Tx/Rx API implemented in user space.

このモジュールは、Broadcom XGSスイッチデバイス用のLinuxネットワークドライバを実装しています。 ドライバは同時に、多数の仮想Linuxネットワークデバイスと、ユーザ空間に実装されたTx / Rx APIを提供します。

Packets received from the switch device are sent to either a virtual Linux network device or the user mode Rx API based on a set of packet filters.susp

スイッチデバイスから受信したパケットは、一連のパケットフィルタに基づいて、仮想LinuxネットワークデバイスまたはユーザモードRx APIのいずれかに送信されます..susp

Packets from the virtual Linux network devices and the user mode Tx API are multiplexed with priority given to the Tx API.

仮想LinuxネットワークデバイスからのパケットとユーザモードTx APIは、Tx APIに与えられた優先度で多重化されます。

A message-based IOCTL interface is used for managing packet filters and virtual Linux network interfaces.

メッセージベースのIOCTLインターフェイスは、パケットフィルタと仮想Linuxネットワークインターフェイスを管理するために使用されます。

A virtual network interface can be configured to work in RCPU mode, which means that packets from the switch device will be encasulated with a RCPU header and a block of meta data that basically contains the core DCB information. Likewise, packets received from the Linux network stack are assumed to be RCPU encapsulated when going out on an interface in RCPU mode.

仮想ネットワークインタフェースは、RCPUモードで動作するように構成することができます。つまり、スイッチデバイスからのパケットは、基本的にコアDCB情報を含むRCPUヘッダーとメタデータブロックでカプセル化されます。 同様に、Linuxネットワークスタックから受信したパケットは、RCPUモードのインタフェースを出るときにカプセル化されたRCPUとみなされます。

The module implements basic Rx DMA rate control. The rate is specified in packets per second, and different Rx DMA channels can be configured to use different maximum packet rates. The packet rate can be configure as a module parameter, and it can also be changed dynamically through the proc file system (syntax is described in function header comment).

このモジュールは基本的なRx DMAレートコントロールを実装しています。 レートは1秒あたりのパケット数で指定され、異なる最大パケットレートを使用するよう異なるRx DMAチャネルを設定することができます。   パケットレートはモジュールパラメータとして設定でき、procファイルシステムを介して動的に変更することもできます(構文は関数ヘッダコメントに記述されています)。

To support multiple instance, each instance has its event queue.

To support pci hot-plug in this module, the resource update should be handled when the PCI device is re-plugged. NOTE: the KNET detach should be invoked befere removing the device.

For a list of supported module parameters, please see below. /


参考:Linux の Kernel

Linux Kernel 4.10 より SRv6 が マージされたので、今回ではその実装を用いてSRv6を試してみます。Ubuntu 17.04 が Linux Kernel 4.10 を採用しているので、今回はこれを利用して環境の構築と動作確認をします。 http://skjune12.hatenadiary.com/entry/2017/12/16/223455

  1. Zebra 2.0 SRv6 CLI on Linux dataplane | Kentaro Ebisawa [email protected] | ENOG#49@嵐渓荘 2018/02/23 35 Linux Source Code (where to look) Linux Kernel Source Code include/uapi/linux/ rtnetlink.h lwtunnel.h seg6_genl.h seg6.h seg6_hmac.h seg6_iptunnel.h seg6_local.h net/core/ lwtunnel.c net/ipv6/ seg6.c seg6_hmac.c seg6_iptunnel.c seg6_local.c iproute2 ip/ ipseg6.c iproute_lwtunnel.h iproute_lwtunnel.c git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git https://www.slideshare.net/kentaroebisawa/zebra-srv6-cli-on-linux-dataplane-enog49

http://segment-routing.org/index.php/Implementation/AdvancedConf

https://www.slideshare.net/obonaventure/implementing-ipv6-segment-routing-in-the-linux-kernel

memo

OpenNSLはlinux上で動作するが、その際カーネルモジュールをすべてアンロードしOpenNSLに同梱されているカーネルモジュールをロードする。 → netlinkはどうなるのか、使えるのか → CPU処理、ASIC処理分けれるのか不明 → CPU-(PCIe)-ASIC-NIC と思われる。

CPU

  • routing protocol 処理
  • routing table UPDATE

↓↑ routing table UPDATE, 不明パケット処理(?)

ASIC

  • rougting table
  • arp table
  • packet header 解析

↓↑ フレーム

NIC

上記補足:NICよりフレーム来た時にASICでパケットヘッダを見て、テーブルにどこ送ったらいいか書いてあったらそこに送る。(ASICのみで処理完了)。CPUはルーティングテーブルの更新、ルーティングプロトコルの処理。なのでASICはルーティングプロトコルのパケットはCPUに送る処理が必要。

データプレーンとは

  • ヘッダ解析:イーサネットヘッダを解析
  • テーブル参照:宛先アドレスをKEYにMACテーブルを参照
  • 変更・転送:学習済みポートへ転送

https://www.slideshare.net/kentaroebisawa/onic2017

ASIC

具体的には、一連の通信(フロー)の最初のパケットを通常のルータと同じようにCPUで処理し、送信するインターフェイスを決定。FDB(Forwarding DataBase)に書き込み、その後のパケットはASICで機械的に転送していくというフローキャッシュ方法が一般的だ(図9)。

http://ascii.jp/elem/000/000/444/444681/index-7.html

→ 明確にこれはASICで処理するみたいなプログラムは不要?!

RIB表与FIB表、ARP表与FDB表

p4 https://speakerdeck.com/imasaruoki/p4-tiyotutodiao-betemita

p.2 http://enog.jp/wp-content/uploads/2017/02/ENOG-ProgrammableASIC-20170224-final.pdf

主な機能 SmartTable Single-chip solution for common fixed top-of-rack (ToR), aggregation and line-card switching applications

Single design meets the needs of multiple markets including enterprise and cloud data centers as well as carrier-access applications

SmartTable and SmartBuffer technologies enable large-scale data centers with 10,000+ end user nodes

https://jp.broadcom.com/products/ethernet-connectivity/switching/strataxgs/bcm56850-series#overview

参考 https://books.google.co.jp/books?id=6qMrY1zUgwQC&pg=PA33&lpg=PA33&dq=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF+ASIC%E5%87%A6%E7%90%86&source=bl&ots=MhiEhoRy2t&sig=H3DL1omKVbHIkxosCkwj4KYQbMc&hl=ja&sa=X&ved=0ahUKEwj-3cCo2cfaAhXEoZQKHU25AF0Q6AEIkwEwCQ#v=onepage&q=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%20ASIC%E5%87%A6%E7%90%86&f=false

| base kernel |

| kernel mojule | [ linux-kernel-bde.ko ]|[ linux-user-bde.ko ]|

| OpenNSL shared object library | [ libopennsl.so ]


| device-driver |[ linux-bcm-knet.ko ]


| nic |

Broadband Forum

Juniper FireFlyについて

2014年には使えていた様子。 http://kashigeru.hatenablog.com/entry/2014/01/30/094048

Juniper vSRX (formerly known as Firefly Perimeter) is one of the recent software additions for Juniper Networks. This will enable network and security administrators to dynamically deploy and scale firewall protection with the breadth and depth required to address key security challenges unique to virtualize and cloud environments.

This article will help customers in accessing the evaluation software for vSRX, in case they do not own any of these products yet.

Juniper’s new software evaluation program makes it easier for you to try the vSRX security solution and see for yourself how it protects virtualized \and cloud environments while maintaining maximum capacity and performance.

To access the evaluation software, please click on the following link: (login required) vSRX: http://www.juniper.net/us/en/dm/free-vsrx-trial

You will be able to download the trial version (60 days) of vSRX as long as you have access to the Juniper Networks Customer Support Center site.

https://kb.juniper.net/InfoCenter/index?page=content&id=KB29394 FireFly は使えなくなっていてvSRXになっている。 60日の評価版なら使える。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment