Protocol in Code · BGP Session 07

Import Policy Rewrites Inputs

Session 07 では GitHub 上の import_policy.py を読み、peer が送ってきた path が best-path に入る前に local policy でどう書き換えられるか、あるいは落とされるかを見ます。

IntermediateSession 07import policypre best-path

Session Goal

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

Session 07 のゴールは、best-path に入る candidate が peer から来たままの姿とは限らないことを説明できるようになることです。local policy が local_prefweight を変えたり、条件次第で path 自体を落としたりすることを source から読めるようにします。

  • import policy が best-path の前にあると説明できる
  • local_prefweight の書き換えを説明できる
  • early drop があると説明できる
  • same path が import 後に別物になると説明できる

Bridge

local policy は best-path の入力を変える

Session 05 では validation result と action を分けました。Session 07 ではさらに、その route が best-path に到達する前にも local decision があることを見ます。ここでは final reject だけでなく、rewrite も policy の仕事です。

「どの path が best か」を読む前に、「どの shape の path が比較に入るのか」を読めるようになるのがこのセッションです。

Design Choice

validation と import の境界は toy pipeline で接続します

この lesson は `import policy は best-path の前` を主題にしていますが、toy pipeline では validation result が import の drop 判定に入る場面も扱います。ここでは「比較に入る candidate を local policy が整える」という役割を先に掴むことを優先します。

Read Order

この順番で読むと迷いにくい

  1. ImportPolicy を読んで local knob を掴む
  2. apply_import_policy() を読み、早い段階の return を見る
  3. replace() で何を書き換えているか確認する
  4. walkthrough を実行して rewrite と drop を並べて見る

Read The Source

drop と rewrite の両方を見る

src/protocol_in_code/bgp/import_policy.py
if candidate.next_hop in policy.reject_next_hops:
    return None

if validation_state is ValidationState.INVALID and policy.reject_invalid:
    return None

updated = replace(updated, local_pref=policy.local_pref_override)
updated = replace(updated, weight=policy.weight)

ここでは None が「この path は comparison に入らない」ことを表します。一方で return された candidate は、peer 由来の input に local rewrite が入った後の candidate です。

What Changes

書き換え対象と早期 drop を分けて考える

item意味
local_pref_overridebest-path に入る前の local preference を変える。
weightvendor-local な優先度を先に足す。
reject_next_hops特定 next hop の path を early drop する。
reject_invalidinvalid route を comparison 前に落とす。

Walkthrough

同じ path が policy で別の入力になる

walkthrough では 1 本の path に対して、local_pref を上げる場合、weight を付ける場合、next-hop rule で落とす場合、invalid を reject する場合を順に見ます。

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

Done Check

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

  • import policy が best-path より前の layer だと説明できる
  • local_prefweight が local rewrite されると説明できる
  • candidate が comparison 前に落ちることがあると説明できる
  • best-path が見るのは peer 原本ではなく import 後の input だと説明できる

Next Session

次は local route が peer ごとにどう出ていくかを見る

Session 07 では comparison 前の candidate を整えました。次の Session 08 では、Loc-RIB に残った route が peer ごとにどう変形されるかを export policy として読みます。