はじめに
Crosswork Network Controller (CNC) は、ネットワーク機器が構成するトポロジー情報を受信し、それらを元にユーザに必要なアクションを取ることができるアプリケーションです。例えばトポロジーの可視化として、ルータやリンクを画面に表示することもその一つです。

ネットワーク情報
ネットワークは通常何らかのIGPを使用して構成されます。ベクター型ルーティングプロトコルである、OSPF や ISIS を使用して構成する場合、ルータ間のリンク情報を認識することが出来ますので、CNCではその情報を使用します。従って、IGPには OSPF か ISIS が使用されている必要があります。
すべてのノードがネットワークの経路情報を持っている
ネットワークデザインによりますが、例えば OSPF の場合は一つのArea内の前ルータは、そのArea のネットワークトポロジー情報を保持しています。
以下の例では、ルータ R1 上で保持している router LSA について表示しています。この OSPF Area 0 には、6台のルータが存在することがわかり、またそれぞれのルータがどの様なリンクを持っているかについても情報として保持しています。
RP/0/RP0/CPU0:R1#show ospf database router
OSPF Router with ID (1.1.1.1) (Process ID 100)
Router Link States (Area 0)
LS age: 782
Options: (No TOS-capability, DC)
LS Type: Router Links
Link State ID: 1.1.1.1
Advertising Router: 1.1.1.1
LS Seq Number: 80003bec
Checksum: 0x35eb
Length: 108
AS Boundary Router
Number of Links: 7
Link connected to: a Stub Network
(Link ID) Network/subnet number: 1.1.1.1
(Link Data) Network Mask: 255.255.255.255
Number of TOS metrics: 0
TOS 0 Metrics: 1
Link connected to: another Router (point-to-point)
(Link ID) Neighboring Router ID: 2.2.2.2
(Link Data) Router Interface address: 10.1.2.1
Number of TOS metrics: 0
// snip //
RP/0/RP0/CPU0:eR1#show ospf database router | i "Link State ID"
Link State ID: 1.1.1.1
Link State ID: 2.2.2.2
Link State ID: 3.3.3.3
Link State ID: 4.4.4.4
Link State ID: 5.5.5.5
Link State ID: 6.6.6.6
RP/0/RP0/CPU0:eR1#
RP/0/RP0/CPU0:R1#show ospf database router | i "Link connected to|Link ID|Link Data"
Thu Apr 28 06:26:12.693 UTC
Link connected to: a Stub Network
(Link ID) Network/subnet number: 1.1.1.1
(Link Data) Network Mask: 255.255.255.255
Link connected to: another Router (point-to-point)
(Link ID) Neighboring Router ID: 2.2.2.2
(Link Data) Router Interface address: 10.1.2.1
Link connected to: a Stub Network
(Link ID) Network/subnet number: 10.1.2.0
(Link Data) Network Mask: 255.255.255.0
Link connected to: another Router (point-to-point)
(Link ID) Neighboring Router ID: 3.3.3.3
RP/0/RP0/CPU0:R1#
BGP-LS プロトコル
ルータ上のトポロジー情報をCNCへ取り込む必要がありますが、まずは SR-PCE へBGPを使用して送信します。全ノードが同じ情報を持っていますので、一つのルータから全てを取得できます。
BGP自体は Port 179 を使用したTCP通信であり、そのプロトコル上には MP-BGP として種々のデータを載せることができます。それらは Address Family identifier (AFI) と Subsequent Address Family Identifiers (SAFI) で区別されています。
リンクステート情報を送信するときの AFI/SAFI は、link-state / link-state です。SR-PCEはこのプロトコルを使用して、トポロジー情報を受信します。
SR-PCE
PCE (Path Computation Element) は、PCC (Path Computation Client) へ保持しているトポロジー情報から適切な経路情報を LSP (Label Switching Path) として通知し使用させるものです。
PCE(各ルータ)からは BGP-LS を使用してトポロジー情報を取得します。
また、Cisco IOS-XR では、PCEは TCP Port 8080 でREST サーバを起動しています。このインターフェースを使用して、PCE が持つトポロジー情報へアクセスすることができます。
RP/0/RP0/CPU0:pce1#show run pce
pce
address ipv4 41.41.41.41
api
user cisco
!
!
RP/0/RP0/CPU0:pce1#
CNCは SR-PCE のトポロジー情報をSubscribe
CNCはSR-PCEからトポロジー情報を取得します。この際には、上で紹介した REST が使用されます。SR-PCEが持つ情報は、ネットワークの状況によって刻々と変化しますので、CNCはその度に更新を受信します。
PCEはそのPayloadとして text か gpb (Google Protocol Buffer) を返すことができ、CNCは gpb を使用しています。手動でのテストでは、以下の様に text で取得すると便利です。
$ curl -s http://<PCE IP Address>:8080/topo/subscribe/txt -u cisco:cisco
{
"node_id": "xtc",
"subscription_id": "kv_gpb",
"encoding_path": "Cisco-IOS-XR-infra-xtc-oper:pce/topology-nodes/topology-node",
{
"name": "node-protocol-identifier",
"fields": [
{
"name": "node-name",
"string_value": "R1"
},
{
"name": "ipv4te-router-id",
"string_value": "1.1.1.1"
},