Спецификация структурированной политики
Политики импорта и экспорта (рассылки и приема маршрутной информации) могут быть структурированы. Применение структурированной политики рекомендуется для продвинутых пользователей RPSL. Синтаксис спецификации структурированной политики выглядит следующим образом:
<import-factor> ::= | from <peering-1> [action <action-1>] | |
. . . | ||
from <peering-N> [action <action-N>] | ||
accept <filter>; | ||
<import-term> ::= | <import-factor> | | |
LEFT-BRACE | ||
<import-factor> | ||
. . . | ||
<import-factor> | ||
RIGHT-BRACE | ||
<import-expression> ::= | <import-term> | | |
<import-term> EXCEPT <import-expression> | | | |
<import-term> REFINE <import-expression> | ||
import: | [protocol <protocol1>] [into <protocol2>] | |
<import-expression> |
В конце <import-factor> должна быть точка с запятой. Если спецификация политики не структурирована эта точка с запятой является опционной. Синтаксис и семантика для <import-factor> определена в разделе 6.1. <import-term> представляет собой либо последовательность <import-factor>, заключенную в фигурные скобки, либо один <import-factor>. Семантика <import-term> заключается в объединении <import-factor> с использованием правила порядка спецификаций. <import-expression> представляет собой либо один <import-term>, либо <import-term>, за которым следуют ключевые слова "except" и "refine", с завершающим <import-expression>. Заметим, что данное определение допускает вложенные выражения. Следовательно, могут существовать исключения к исключениям, уточнения к уточнениям или даже уточнения к исключениям и т.д.
Семантика для оператора except имеет вид. Результатом операции исключения является еще один член <import-term>. Результирующий набор политики содержит описание политики правой стороны, но его фильтры модифицированы так, что остаются только маршруты, соответствующие левой стороне. Политика левой стороны, в конце концов, включается, а ее фильтры модифицируются так, чтобы исключить маршруты, соответствующие левой стороне. Заметим, что фильтры модифицированы во время этого процесса, но действия скопированы один к одному. При нескольких уровнях вложения операции (принять или уточнить) выполняются справа налево.
Рассмотрим следующий пример:
import: | from AS1 action pref = 1; | accept as-foo; | |
except | { | ||
from AS2 action pref = 2; | accept AS226; | ||
except | { | ||
from AS3 action pref = 3; | accept {128.9.0.0/16}; |
}
}
где маршрут 128.9.0.0/16 порождается AS226, а AS226 является членом набора AS as-foo. В этом примере, маршрут 128.9.0.0/16 воспринят от AS3, любой другой маршрут (не 128.9.0.0/16) порожденный AS226 воспринимается от AS2, и любые другие маршруты AS из as-foo получены от AS1. Можно прийти к тому же заключению, используя алгебраические выкладки, определенные выше. Рассмотрим спецификацию внутреннего исключения:
from AS2 action pref = 2; accept AS226;
except { from AS3 action pref = 3; accept {128.9.0.0/16};}
Эквивалентно
{ from AS3 action pref = 3; accept AS226 AND {128.9.0.0/16};
from AS2 action pref = 2; accept AS226 AND NOT {128.9.0.0/16};}
Следовательно, исходное выражение эквивалентно:
import: | from AS1 action pref = 1; accept as-foo; |
except { from AS3 action pref = 3; accept AS226 AND {128.9.0.0/16}; | |
from AS2 action pref = 2; accept AS226 AND NOT {128.9.0.0/16}; } |
import: | { from AS3 action pref = 3; |
accept as-foo AND AS226 AND {128.9.0.0/16}; | |
from AS2 action pref = 2; | |
accept as-foo AND AS226 AND NOT {128.9.0.0/16}; | |
from AS1 action pref = 1; | |
accept as-foo AND NOT | |
(AS226 AND NOT {128.9.0.0/16} OR AS226 AND {128.9.0.0/16}); } |
import: | { |
from AS3 action pref = 3; accept {128.9.0.0/16}; | |
from AS2 action pref = 2; accept AS226 AND NOT {128.9.0.0/16}; | |
from AS1 action pref = 1; accept as-foo AND NOT AS226; | |
} |
import: | { from AS-ANY action pref = 1; accept community(3560:10); |
from AS-ANY action pref = 2; accept community(3560:20); | |
} refine { from AS1 accept AS1; | |
from AS2 accept AS2; | |
from AS3 accept AS3; } |
Здесь любому маршруту с community 3560:10 присваивается предпочтение 1 а любому маршруту с community 3560:20 присваивается предпочтение 2 вне зависимости от того, откуда они импортированы. Однако только маршруты AS1 импортированы из AS1, и только маршруты AS2 импортированы из AS2, и только маршруты AS3 импортированы из AS3, ни один маршрут не импортирован из каких-либо других AS. К тому же заключению можно прийти, используя алгебраические методы, описанные выше. То есть, это пример эквивалентен:
import: | { |
from AS1 action pref = 1; accept community(3560:10) AND AS1; | |
from AS1 action pref = 2; accept community(3560:20) AND AS1; | |
from AS2 action pref = 1; accept community(3560:10) AND AS2; | |
from AS2 action pref = 2; accept community(3560:20) AND AS2; | |
from AS3 action pref = 1; accept community(3560:10) AND AS3; | |
from AS3 action pref = 2; accept community(3560:20) AND AS3; } |
import: | { |
from AS-ANY action med = 0; accept {0.0.0.0/0^0-18}; | |
} refine { | |
from AS1 at 1.1.1.1 action pref = 1; accept AS1; | |
from AS1 action pref = 2; accept AS1; } |
import: | { | |
from AS1 at 1.1.1.1 action med=0; pref=1; | ||
accept {0.0.0.0/0^0-18} AND AS1; | ||
from AS1 action med=0; pref=2; | ||
accept {0.0.0.0/0^0-18} AND AS1; } |