Protocol in Code · BGP Session 13

Event Dispatch

Session 13 では GitHub 上の events.py を読み、announce / withdraw / peer down の 3 種類がどの control-plane branch を通るかを見ます。

IntermediateSession 13event flowdispatch

Session Goal

このセッションで終わらせたいこと

Session 13 のゴールは、control plane を event-driven に読む入口を作ることです。route state の更新は常に同じではなく、何が起きたかによって branch が変わります。

  • announce / withdraw / peer down を別イベントとして話せる
  • peer down が複数 prefix を同時に触りうると説明できる
  • event ごとに gate、recompute、refresh の順が違うと説明できる

Design Choice

dispatch branch を小さく保つために helper に委譲しています

この session の主題は event split そのものです。announce、withdraw、peer down がそれぞれどの branch を通るかを見やすくするために、prefix-level decision は helper に委譲しています。

Read The Source

event type ごとに呼ぶ関数列が違う

src/protocol_in_code/bgp/events.py
announce:
  gate peer
  recompute prefix
  refresh exports

withdraw:
  remove received path
  recompute prefix
  refresh exports

peer down:
  remove whole peer table
  recompute affected prefixes
  refresh exports

この session では、個々の route 属性よりも「どの event がどの branch を選ぶか」を見るのが重要です。

Walkthrough

announce、withdraw、peer down を順に通す

walkthrough では、announce で best path を作り、withdraw で消し、別 peer の announce で戻し、最後に peer down でまとめて失う流れを並べています。

run locally
cd protocol-in-code
PYTHONPATH=src python3 examples/bgp/session_13_walkthrough.py

Done Check

Session 13 を終えたと言える条件

  • event type によって control-plane path が変わると説明できる
  • peer down が 1 prefix ではなく peer table 全体に効くと説明できる
  • dispatch layer と decision layer を分けて説明できる

Next Session

次は 1 prefix を policy-aware な decision set にする

dispatch は見えました。次は 1 つの prefix に複数 peer の route があるとき、validation と policy を通した candidate set をどう作るかを見ます。