Protocol in Code · BGP Session 05

Validation State Does Not Act By Itself

Session 04 では origin validation が validinvalidnot_found を返すところまで見ました。ここでは GitHub 上の policy.py を開いて、その結果が local policy によってどう action に変わるかを読みます。

IntermediateSession 05policy logicRFC 6811

Session Goal

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

Session 05 のゴールは、validation result と routing action を混ぜずに説明できるようになることです。ここでは invalid が自動で消えるわけではなく、policy が reject / deprioritize / accept を決めることを source から読めるようにします。

  • invalid は validation result であって action ではないと説明できる
  • strict policy と soft policy の違いを説明できる
  • not_found が受理されうると説明できる
  • validation と policy が別レイヤだと説明できる

Core Idea

decide_route_policy() が local action を返す

policy.py では、Session 04 の validation state を受け取り、local policy に従って acceptdeprioritizereject を返します。つまり RPKI invalid は「その route が bad だと分かった」ことまでは教えてくれますが、「だから何をするか」は別の policy decision です。

ここで大事なのは、validation result と routing action を一つのものとして話さないことです。

Read Order

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

  1. PolicyAction を読んで、ありうる action を掴む
  2. ValidationPolicy を読んで、local knob を掴む
  3. decide_route_policy() を読んで、validation state から action への変換を追う
  4. walkthrough script を実行して、同じ validation state でも policy によって action が変わることを確認する

Read The Source

validation result は policy の入力になる

src/protocol_in_code/bgp/policy.py
if validation_state is ValidationState.INVALID:
    if policy.reject_invalid:
        return PolicyAction.REJECT
    return PolicyAction.DEPRIORITIZE

if validation_state is ValidationState.NOT_FOUND and policy.deprioritize_not_found:
    return PolicyAction.DEPRIORITIZE

return PolicyAction.ACCEPT

この code が示しているのは、invalid だから即 drop ではない、ということです。policy が strict なら reject、soft なら deprioritize になります。not_found も同様に、扱いは local policy によって決まります。

Actions

3 つの action を分けて考える

action意味
acceptそのまま通常受理する。
deprioritize捨てはしないが、優先度を下げて扱う。
reject受け入れずに落とす。

Walkthrough

同じ validation result でも action が変わる

GitHub repo 側には Session 05 用の walkthrough script を置いてあります。invalid を soft policy で見る場合、strict policy で見る場合、not_found を permissive / cautious policy で見る場合を並べて、最終 action がどう変わるか確認します。

run locally
cd protocol-in-code
PYTHONPATH=src python3 examples/bgp/session_05_walkthrough.py
実行結果を見るときは、「この route は invalid か」だけではなく、「その invalid を local policy がどう扱うか」を必ず続けて考えます。

Done Check

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

  • invalid は validation result で、reject は policy action だと説明できる
  • soft policy では invalid route が deprioritize されることがあると説明できる
  • not_found は accept されることがあると説明できる
  • validation と policy を別レイヤとして話せる

Course Position

BGP Session Map: 05 / 15

Session 05 は `best path` と `authorization` のあとに、`local action` を切り出す場所です。ここを終えると、次からは route が router の中でどこに住み、どこから外へ出るかを見るブロックに入り、後半では event flow と speaker loop まで閉じます。