> другое дело что подобный подход не применим на target, и возможно какое-то
> подобие виртуальной машины было-бы востребовано, но опять=же возникает вопрос почему было
> не расширить тот-самый bpf-jit функциями позволяющими работать с памятью и sk_buff
> и менять содержимое.- Зачем всю функциональность запихивать в виртуальную машину?
- Зачем убирать возможность работы native-C модулей? Нужно унифицировать *-tables? Ну так унифицируйте. Не хватает возможности внятно конфигурировать это дело? Да, понятно, меняйте синтаксис правил.
Рассмотрим примерчик:
table filter {
chain input {
type filter hook input priority 0;
}
что такое "type filter hook input priority 0;" ? Это указание использовать "chain input" в стандартном хуке input - т.е. для пакетов входящих соединений.
Зачем тогда делать "table filter {}" c вложенным "chain input {}" ? Это чистый синтаксический сахар, который сделан "по образу и подобию iptables".
Т.е. читать этот пример надо так:
table MY_FILTER_CHAINS {
chain MY_INPUT_CHAIN_NAME {
type filter hook input priority 0;
}
и уже становится понятно, почему возникает "дублирование" слов filter и input в "type filter hook input".
Идем дальше.
"type filter hook input priority 0;"
Про "type" всё чуть более ясно - они видимо предполагают делать на его основе проверку, чего можно пихать в chain, а чего нельзя, например запретить пихать nat-правила в filter.
Но его (type) можно было бы сделать опциональным, ведь фильтровать, например, ведь можно где угодно :-)
А что мешало "hook" вынести за пределы chain {} ?
Например, что будет в случае:
table filter {
chain input {
type filter hook input priority 0;
}
table otherfilter {
chain otherinput {
type filter hook input priority 0;
}
да, умный юзерспейс должен будет обнаружить два приоритета 0...
а почему бы не сделать
hook filter.input {
priority 0 table MY_FILTER_CHAINS chain MY_INPUT_CHAIN_NAME;
}
Тогда можно было бы
hook filter.input {
priority 0 table MY_FILTER_CHAINS chain MY_INPUT_CHAIN_NAME;
priority 5 table MY_FILTER_CHAINS chain MY_OTHER_CHAIN_NAME;
}
hook filter.forward {
priority 0 table MY_FILTER_CHAINS chain MY_INPUT_CHAIN_NAME;
}
А в некоем идеале слоя совместимости и так:
hook filter.forward {
priority 0 iptables;
}
где iptables - имя "некоего native-C модуля".
=)