Спецификация структурированной политики
Политики импорта и экспорта (рассылки и приема маршрутной информации) могут быть структурированы. Применение структурированной политики рекомендуется для продвинутых пользователей 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}); } |
Так как AS226 находится в as-foo и 128.9.0.0/16 заключен в AS226, выражение упрощается:
| 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; |
| } |
В случае оператора refine, результирующий набор формируется с помощью декартова произведения для двух сторон следующим образом. Для каждой политики
l левой стороны и для каждой политики
r правой стороны, пиринг результирующей политики является пересечением множеств пирингов r и l. Фильтр результирующей политики соответствует пересечению фильтров l и r. Действие результирующей политики есть действие l, за которым следует действие r. Если общие пиринги отсутствуют, или если множество пересечения фильтров является пустым, результирующая политика не формируется. Рассмотрим следующий пример:
| 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; } |
где воспринимаются только маршруты с длиной от 0 до 18, а значение
med сделано равным 0, для того чтобы блокировать влияние med на все пиринги. Кроме того, из AS1 импортируются только маршруты AS1, а маршруты автономной системы AS1, импортированные от 1.1.1.1, предпочтительнее других пирингов. Это эквивалентно:
| 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; } |
Описанный выше синтаксис и семантика применима также к структурированным описаниям экспортной политики с ключевым словом "from", замененным на "to", а "accept" - на "announce".