Protocol in Code · BGP Session 12

Export Refresh After Recompute

Session 12 では GitHub 上の export_refresh.py を読み、Loc-RIB の変化が各 peer 向けの advertise / withdraw にどう反映されるかを見ます。

IntermediateSession 12Adj-RIB-Outreconciliation

Session Goal

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

Session 12 のゴールは、installed route が変わったあとに outbound state が別パスで更新されることを説明できるようになることです。best path が変わっただけでは外へ出る route はまだ決まり切っていません。

  • currentdesired の差分として export refresh を見られる
  • advertise と withdraw の分岐を説明できる
  • peer ごとに出る route が違うと説明できる

Bridge

Session 08 と Session 09 をつなぐ

Session 08 では export policy 自体を見ました。Session 09 では recompute を見ました。Session 12 は、その recompute 結果を各 peer 向けに再反映する reconciliation pass です。

Read The Source

Loc-RIB の変化を Adj-RIB-Out の差分に変える

src/protocol_in_code/bgp/export_refresh.py
current = current_by_prefix.get(prefix)
desired = prepare_export(installed, target.peer_type, target.policy)

if desired is None:
    current_by_prefix.pop(prefix, None)
else:
    current_by_prefix[prefix] = desired

ここでは message encoding を作っているのではなく、「この peer に見せるべき outbound state は何か」を計算しています。

Simplification Note

これは prefix 単位の outbound reconciliation です

real router の UPDATE packing や batching までは扱いません。ここでは 1 prefix ごとに、Adj-RIB-Out に何を残し、何を消すかだけに集中します。

Walkthrough

advertise のあとに withdraw が出る

walkthrough では customer には広告し、deny された upstream には出さず、その後 installed path が消えたときに withdraw が出る流れを確認します。

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

Done Check

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

  • Loc-RIB 変化と export refresh を別 step として説明できる
  • peer ごとに desired が違う理由を説明できる
  • Adj-RIB-Out が自動同期ではなく reconciliation の結果だと説明できる

Next Session

次は event ごとにどの branch を通るかを見る

session gate と export refresh は見えました。次は announce、withdraw、peer down の 3 種類がどの順で recompute と refresh を呼ぶかを dispatch として読みます。