Фильтр пакетов Android

Android Packet Filter (APF) позволяет фреймворку управлять логикой аппаратной фильтрации пакетов во время выполнения. Это позволяет системе экономить энергию за счет отбрасывания пакетов на аппаратном уровне, в то время как фреймворк Android может изменять правила фильтрации во время выполнения в зависимости от состояния сети.

Обзор APF

APF состоит из двух основных компонентов:

  • Интерпретатор APF работает на сетевом оборудовании (обычно, на чипсете Wi-Fi). Интерпретатор APF обрабатывает байт-код APF на пакетах, полученных оборудованием, и принимает решение о том, принимать, отбрасывать или отвечать на них.
  • Код генерации программ APF выполняется на главном процессоре. Этот код создает и обновляет программы APF в соответствии с состоянием сети и устройства.

Методы Wi-Fi HAL позволяют платформе Android устанавливать байт-код программы APF и считывать текущие счетчики. Модуль Network Stack Mainline может обновлять байт-код программы APF в любое время во время работы APF.

В APF реализовано несколько фильтров. Например, APF включает фильтры для отбрасывания запрещенных типов Ether, фильтрацию пакетов объявления маршрутизатора IPv6 (RA), фильтрацию многоадресного и широковещательного трафика, если блокировка многоадресного трафика не удерживается, отбрасывание пакетов DHCP для других хостов, а также отбрасывание нежелательных пакетов протокола разрешения адресов (ARP) и обнаружения соседей (ND). Если микропрограмма поддерживает APFv6, ApfFilter также генерирует правила для ответа на распространенные типы пакетов, которые в противном случае потребовали бы пробуждения ЦП для ответа, такие как запросы ARP и запросы NS. Полный список фильтров определен в ApfFilter .

Поскольку код генерации программы APF является частью модуля Network Stack, вы можете использовать ежемесячные обновления Mainline для добавления новых фильтров и обновления логики фильтрации.

пересмотр APF

Ниже приведен список изменений, внесенных в APF:

  • APFv6: Эта версия, представленная в Android 15, поддерживает фильтрацию пакетов, включает счетчики для отладки и метрик, а также поддерживает передачу пакетов.
  • APFv4: Эта версия, представленная в Android 10, поддерживает фильтрацию пакетов и включает счетчики для отладки и метрики.
  • APFv2: Эта версия, представленная в Android 7, поддерживает фильтрацию пакетов.

интеграция APF

API-интерфейсы APF между интерпретатором APF и оборудованием определены в apf_interpreter.h ( APFv4 , APFv6 ). Код прошивки Wi-Fi вызывает accept_packet() в APFv4 или apf_run() в APFv6, чтобы определить, следует ли отбросить пакет (возвращаемое значение равно нулю) или передать его обработчику приложений (возвращаемое значение равно нулю). Если пакет необходимо передать, apf_run() также возвращает ноль, поскольку этот пакет не нужно передавать обработчику приложений. Если прошивка поддерживает APFv6, она должна реализовывать API-интерфейсы apf_allocate_buffer() и apf_transmit_buffer() . Интерпретатор APF вызывает эти два API-интерфейса во время логики передачи пакета. Инструкции APF имеют переменную длину. Каждая инструкция имеет длину не менее 1 байта. Коды инструкций APF определены в apf.h для APFv4 и встроены непосредственно в apf_interpreter.c для APFv6.

APF использует выделенную память. Память используется как для самой программы APF, так и для хранения данных, и чипсет не должен очищать или записывать в неё данные, за исключением случаев использования методов APF HAL. Байт-код APF использует память для хранения счётчиков принятых и отброшенных пакетов. Вы можете прочитать область данных из фреймворка Android. Инструкции APF эффективны с точки зрения использования памяти, но для максимального использования их потенциала энергосбережения и функциональности требуются сложные динамические правила фильтрации. Эта сложность требует выделенной части памяти на чипсете. Минимальный объём памяти, необходимый для APFv4, составляет 1024 байта, а для APFv6 — 2048 байт. Однако мы настоятельно рекомендуем выделить 4096 байт для APFv6, чтобы обеспечить оптимальную производительность. Интерпретатор APF должен быть скомпилирован в прошивку. Оба интерпретатора APFv4 и APFv6 оптимизированы по размеру кода. В архитектуре arm32 скомпилированный интерпретатор APFv4 занимает около 1,8 КБ, в то время как более сложный интерпретатор APFv6 с добавленными функциями (например, встроенной поддержкой контрольных сумм и встроенным кодом декомпрессии DNS) занимает приблизительно 4 КБ.

Фильтры APF могут работать совместно с другими фильтрами, специфичными для производителя чипсета, в рамках встроенного программного обеспечения. Вы можете выбрать запуск своей логики фильтрации либо до, либо после процесса фильтрации APF. Если пакет отбрасывается до достижения фильтра APF, фильтр APF не обрабатывает этот пакет.

Для проверки корректной работы фильтра APF убедитесь, что при включенном APF микропрограмма предоставляет фильтру APF доступ ко всему пакету, а не только к заголовку.

Образцы программы APF

ApfTest и ApfFilterTest содержат примеры тестовых программ, иллюстрирующих работу каждого APF-фильтра. Для изучения сгенерированной программы измените тестовый пример таким образом, чтобы программа выводилась в виде шестнадцатеричной строки.

Папка testdata содержит примеры программ APFv4 для фильтров APF RA. Папка samples содержит утилиты Python, которые генерируют программы разгрузки APFv6. Для получения более подробной информации см. документацию в файлах утилит Python.

Отладка APF

Чтобы проверить, включена ли функция APF на вашем устройстве, отобразите текущую программу, текущие счетчики и выполните команду adb shell dumpsys network_stack . Ниже приведен пример этой команды:

adb shell dumpsys network_stack
......
IpClient.wlan0 APF dump:
    Capabilities: ApfCapabilities{version: 4, maxSize: 4096, format: 1}
......
    Last program:
      6bfcb03a01b8120c6b9494026506006b907c025e88a27c025988a47c025488b87c024f88cd7c024a88e17c024588e384004408066a0e6bdca4022b000600010800060412147a1e016bd884021f00021a1c6b8c7c021c0000686bd4a402080006ffffffffffff6a266bbca402010004c0a801eb6bf87401f6120c84005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506c2fc393057dd6bf47401cb0a1e52f06bac7c01c600e06bb41a1e7e000001b9ffffffff6bb07e000001aec0a801ff6be868a4019a0006ffffffffffff6bb874019b6bf07401907c001386dd686bd0a4017d0006ffffffffffff6bc874017e0a147a0e3a6b980a267c017000ff6be07401650a366ba87c016200858219886a26a2050fff02000000000000000000000000006ba4740146aa0e84013700e6aa0f8c0130006068a4011b000f33330000000184c9b26aed4c86dd606a12a2f02600b03afffe8000000000000086c9b2fffe6aed4cff02000000000000000000000000000186006a3aa2e9024000123c92e4606a3ea2d70800000000000000006a56a2ce04030440c01a5a92c9601a5e92c4606a62a2bb04000000006a66a2a6102401fa00049c048400000000000000006a76a29d04030440c01a7a9298601a7e9293606c0082a28904000000006c0086a27310fdfd9ed67950000400000000000000006c0096a2690418033c001a9a9264606c009ea24e102401fa00049c048000000000000000006c00aea24404180330001ab2923f606c00b6a22910fdfd9ed67950000000000000000000006c00c6a21f04190300001aca921a606c00cea20410fdfd9ed67950000400000000000000016bc472086be4b03a01b87206b03a01b87201
    APF packet counters:
      TOTAL_PACKETS: 469
      PASSED_DHCP: 4
      PASSED_IPV4: 65
      PASSED_IPV6_NON_ICMP: 64
      PASSED_IPV4_UNICAST: 64
      PASSED_IPV6_ICMP: 223
      PASSED_IPV6_UNICAST_NON_ICMP: 6
      PASSED_ARP_UNICAST_REPLY: 4
      PASSED_NON_IP_UNICAST: 1
      DROPPED_RA: 4
      DROPPED_IPV4_BROADCAST_ADDR: 7
      DROPPED_IPV4_BROADCAST_NET: 27

В результате выполнения команды adb shell dumpsys network_stack в этом примере отображается следующая информация:

  • ApfCapabilities{version: 4, maxSize: 4096, format: 1} : Это означает, что чипы Wi-Fi поддерживают APF (версия 4).
  • Last program : В этом разделе представлен бинарный файл последней установленной программы APF в шестнадцатеричном формате.
  • APF packet counters : В этом разделе показано, сколько пакетов передается или отбрасывается APF, и конкретные причины этого.

Для декодирования и дизассемблирования кода в удобочитаемый язык ассемблера используйте инструмент apf_disassembler . Для компиляции исполняемого файла выполните команду m apf_disassembler . Ниже приведен пример использования инструмента apf_disassembler :

echo "6bfcb03a01b8120c6b949401e906006b907c01e288a27c01dd88a47c01d888b87c01d388cd7c01ce88e17c01c988e384004008066a0e6bdca401af000600010800060412147a1e016bd88401a300021a1c6b8c7c01a00000686bd4a4018c0006ffffffffffff1a266bc07c018900006bf874017e120c84005408000a17821f1112149c00181fffab0d2a108211446a3239a205065a56483ac3146bf47401530a1e52f06bac7c014e00e06bb41a1e7e00000141ffffffff6be868a4012d0006ffffffffffff6bb874012e6bf07401237c001386dd686bd0a401100006ffffffffffff6bc87401110a147a0d3a6b980a267c010300ff6be072f90a366ba87af8858218886a26a2040fff02000000000000000000000000006ba472ddaa0e82d0aeaa0f8c00c9025868a2b60f5a56483ac3140c8126f3895186dd606a12a28b2600783afffe8000000000000002005efffe00026fff02000000000000000000000000000186006a3aa284024000123c94007d02586a3ea2700800000000000000006a56a26704190500001a5a94006002586a5ea23b2020014860486000000000000000006464200148604860000000000000000000646a7ea23204030440c01a8294002b02581a8694002402586c008aa21a04000000006c008ea204102a0079e10abcf60500000000000000006bc472086be4b03a01b87206b03a01b87201" | out/host/linux-x86/bin/apf_disassembler
       0: li    r1, -4
       2: lddw  r0, [r1+0]
       3: add   r0, 1
       5: stdw  r0, [r1+0]
       6: ldh   r0, [12]
       8: li    r1, -108
      10: jlt   r0, 0x600, 504
      15: li    r1, -112
      17: jeq   r0, 0x88a2, 504
      22: jeq   r0, 0x88a4, 504
      27: jeq   r0, 0x88b8, 504
      32: jeq   r0, 0x88cd, 504
      37: jeq   r0, 0x88e1, 504
      42: jeq   r0, 0x88e3, 504
      47: jne   r0, 0x806, 116
......

Для проверки результатов APF в автономном режиме используйте инструмент apf_run . Для компиляции исполняемого файла выполните команду m apf_run . Инструмент apf_run поддерживает интерпретаторы APFv4 и APFv6.

Ниже приведено руководство по команде apf_run . По умолчанию команда apf_run выполняется в интерпретаторе APFv4. Передача аргумента --v6 команде apf_run позволяет ей выполняться в интерпретаторе APFv6. Все остальные аргументы можно использовать как для APFv4, так и для APFv6.

apf_run --help
Usage: apf_run --program <program> --pcap <file>|--packet <packet> [--data <content>] [--age <number>] [--trace]
  --program    APF program, in hex.
  --pcap       Pcap file to run through program.
  --packet     Packet to run through program.
  --data       Data memory contents, in hex.
  --age        Age of program in seconds (default: 0).
  --trace      Enable APF interpreter debug tracing
  --v6         Use APF v6
  -c, --cnt    Print the APF counters
  -h, --help   Show this message.

Вот пример передачи одного пакета в APF для проверки возможности его отбрасывания или передачи.

Для представления необработанного пакета в виде шестнадцатеричной двоичной строки используйте опцию --packet . Для представления области данных, используемой для хранения счетчика APF , используйте опцию --data . Поскольку каждый счетчик имеет длину 4 байта, области данных должны быть достаточно длинными, чтобы исключить переполнение буфера.

out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b9494010c06006b907c010588a27c010088a47c00fb88b87c00f688cd7c00f188e17c00ec88e384003908066a0e6bdca2d40600010800060412147a18016bd882ca021a1c6b8c7ac900686bd4a2b706ffffffffffff6a266bbca2b204c0a814656bf872a8120c84005808000a17821e1112149c00171fffab0d2a108210446a3239a204064651dbcc88ff6bf4727e0a1e52f06bac7a7be06bb41a1e7e0000006effffffff6bb07e00000063c0a814ff6be868a25106ffffffffffff6bb872536bf072497c001086dd686bd0a23806ffffffffffff6bc8723a0a147a0b3a6b980a267a2eff6be072240a366ba87a23858218886a26a2040fff02000000000000000000000000006ba472086be4b03a01b87206b03a01b87201 --packet 5ebcd79a8f0dc244efaab81408060001080006040002c244efaab814c0a8ca1e5ebcd79a8f0d --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Packet passed
Data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001

Чтобы сравнить результаты APF с файлом pcap, полученным с помощью tcpdump, используйте команду apf_run следующим образом:

out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b989401df06006b947c01d888a27c01d388a47c01ce88b87c01c988cd7c01c488e17c01bf88e384004408066a0e6bdca401a5000600010800060412147a1e016bd884019900021a1c6b907c01960000686bd4a401820006ffffffffffff6a266bc0a4017b0004c0a82b056bf874017084005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506fabe589435936bf47401470a1e52f06bb07c014200e06bb81a1e7e00000135ffffffff6bb47e0000012ac0a82bff6be868a401160006ffffffffffff6bbc7401176bf074010c7c001086dd686bd0a2fb06ffffffffffff6bcc72fd0a147a0b3a6b9c0a267af1ff6be072e70a366bac7ae6858218886a26a2040fff02000000000000000000000000006ba872cbaa0e82be8eaa0f8c00b7025868a2a40ffabe5894359352a9874d08aa86dd606a12a2792600583afffe80000000000000f7d4e8ccd81ddb43fe80000000000000f8be58fffe94359386006a3aa272024108123c94006b02586a3ea25e0800000000000000006a56a25504030440c01a5a94004e02581a5e94004702586a62a23e04000000006a66a229102409891f9a26ae6d00000000000000006a76a22004190300001a7a94001902586a7ea204102409891f9a26ae6dba98e781ca9ef9ba6bc872086be4b03a01b87206b03a01b87201 --pcap apf.pcap --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
37 packets dropped
1733 packets passed
Data: 00000000000000000000000000000000000000000200000005000000000000000000000002000000000000001b000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000689000000000000003c00000000000000000000000000000000000006ea

Для проверки возможностей передачи APFv6 используйте команду apf_run следующим образом:

$ apf_run --program 75001001020304050608060001080006040002AA300E3CAA0FBA06AA09BA07AA08BA086A01BA09120C84006F08066A0EA30206000108000604032B12147A27017A020203301A1C820200032D68A30206FFFFFFFFFFFF020E1A267E000000020A000001032C020B1A267E000000020A000001032CAB24003CCA0606CB0306CB090ACB0306C60A000001CA0606CA1C04AA
0A3A12AA1AAA25FFFF032F020D120C84001708000A1782100612149C00091FFFAB0D2A10820207032A02117C000E86DD68A30206FFFFFFFFFFFF021603190A1482020002187A023A02120A36820285031F8216886A26A2020FFF020000000000000000000000000003200214 --packet FFFFFFFFFFFF112233445566080600010800060400011122334455660A0000020000000000000A0000
01 --data 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 --age 0 --v6 --trace
      R0       R1       PC  Instruction
-------------------------------------------------
       0        0        0: data        16, 01020304050608060001080006040002
       0        0       19: debugbuf    size=3644
       0        0       23: ldm         r0, m[15]
       0        0       25: stdw        counter=6, r0
       0        0       27: ldm         r0, m[9]
       0        0       29: stdw        counter=7, r0
       0        0       31: ldm         r0, m[8]
 134d811        0       33: stdw        counter=8, r0
 134d811        0       35: li          r0, 1
       1        0       37: stdw        counter=9, r0
       1        0       39: ldh         r0, [12]
     806        0       41: jne         r0, 0x806, 157
     806        0       46: li          r0, 14
       e        0       48: jbseq       r0, 0x6, 59, 000108000604
       e        0       59: ldh         r0, [20]
       1        0       61: jeq         r0, 0x1, 103
       1        0      103: ldw         r0, [38]
 a000001        0      105: jeq         r0, 0xa000001, 116
 a000001        0      116: allocate    60
 a000001        0      120: pktcopy     src=6, len=6
 a000001        0      123: datacopy    src=3, len=6
 a000001        0      126: datacopy    src=9, len=10
 a000001        0      129: datacopy    src=3, len=6
 a000001        0      132: write       0x0a000001
 a000001        0      137: pktcopy     src=6, len=6
 a000001        0      140: pktcopy     src=28, len=4
 a000001        0      143: ldm         r0, m[10]
      2a        0      145: add         r0, 18
      3c        0      147: stm         r0, m[10]
      3c        0      149: transmit    ip_ofs=255
      3c        0      153: drop        counter=47
Packet dropped
Data: 00000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000100000011d8340100000000000000000000000000000000000000000100000078563412
transmitted packet: 112233445566010203040506080600010800060400020102030405060a0000011122334455660a000002000000000000000000000000000000000000

При использовании параметра --trace инструмент apf_run предоставляет подробный вывод каждого шага выполнения интерпретатора, что полезно для отладки. В этом примере вы вводите в программу APF пакет ARP-запроса. Вывод показывает, что ARP-запрос отбрасывается, но генерируется ответный пакет. Подробная информация об этом сгенерированном пакете отображается в разделе transmitted packet .

Типичные проблемы интеграции

В этом разделе рассматриваются несколько распространенных проблем, возникающих при интеграции APF:

  • Неожиданная очистка области данных: память APF должна быть полностью выделена для APF; изменять область памяти APF разрешено только коду интерпретатора или коду фреймворка (через API HAL).
  • Проблемы с установкой программ APF размером X байт (X <= maxLen ): Прошивка должна поддерживать чтение или запись любой длины программы до maxLen без сбоев, аварий или усечения. При записи не должно изменяться ни одно байто в диапазоне от X до maxLen .
  • Реализация APF в коде драйвера: APF следует реализовывать только во встроенном ПО, а не в коде драйвера. В противном случае, экономии энергии не будет, поскольку процессору придется просыпаться для обработки пакета.
  • Некорректные значения filter_age или filter_age_16384th : Значения filter_age (APFv4) и filter_age_16384th (APFv6) должны быть корректно переданы функциям accept_packet() и apf_run() . Подробную информацию о вычислении filter_age_16384th см. в документации в файле apf_interpreter.h .
  • Функция APF не включается, когда это необходимо: APF должна быть включена, когда экран выключен и Wi-Fi-соединение неактивно или скорость передачи данных составляет менее 10 Мбит/с.
  • Усеченные пакеты, передаваемые в функции accept_packet() или apf_run() : Все одноадресные, широковещательные и многоадресные пакеты, передаваемые в функции accept_packet() или apf_run() должны быть полными. Передача усеченных пакетов в APF недопустима.

Тесты APF

Начиная с Android 15, Android предоставляет тестовые примеры Compatibility Test Suite (CTS) для проверки корректности работы APF-фильтра и интерпретатора APF как на одном устройстве, так и на нескольких устройствах. Вот описание назначения каждого тестового примера:

  • Интеграционный тест ApfFilter и apf_interpreter : проверяет, что ApfFilter генерирует корректный байт-код, а apf_interpreter корректно выполняет этот код, обеспечивая ожидаемые результаты.
  • APF single-device CTS : Использует одно устройство для проверки функциональности APF на чипсете Wi-Fi. Подтверждает, что:
    • APF включается, когда экран выключен и скорость Wi-Fi-соединения составляет менее 10 Мбит/с.
    • Функциональные возможности APF указаны корректно.
    • Операции чтения и записи в области памяти APF проходят успешно, и область памяти неожиданно не изменяется.
    • Аргументы корректно передаются в функции accept_packet() или apf_run() .
    • Встроенная прошивка с поддержкой APFv4/APFv6 может отбрасывать пакеты.
    • Встроенная прошивка с поддержкой APFv6 может отвечать на пакеты.
  • APF multidevice CTS : Использует два устройства (одно отправитель, одно получатель) для проверки работы фильтрации APF. На стороне отправителя генерируются различные типы пакетов, и тест подтверждает, правильно ли они отбрасываются, передаются или на них дается ответ в соответствии с правилами, настроенными в ApfFilter для проверки корректной работы APF.

Дополнительные инструкции по интеграционному тестированию

Кроме того, мы настоятельно рекомендуем включить тестирование APF в ваши наборы тестов интеграции Wi-Fi с встроенным ПО.

Интеграция тестирования APF в наборы интеграционных тестов встроенного ПО для Wi-Fi имеет решающее значение для проверки правильной работы APF в сложных сценариях подключения к Wi-Fi, таких как сценарии «установить соединение перед разрывом» или сценарии роумингового подключения к Wi-Fi. Подробные инструкции по выполнению интеграционных тестов можно найти в следующем разделе.

Предварительные требования

При проведении интеграционных тестов выполните следующие действия:

  • Функция APF должна быть включена во всех тестовых сценариях интеграции (например, при роуминге, установлении соединения перед разрывом).
  • В начале каждого теста очищайте память APF.
  • Во время тестирования устанавливайте или переустанавливайте программы APF каждые 5 минут.

Тестовые сценарии

APF должен быть активен на протяжении всего интеграционного тестирования. В этом документе представлены две программы APF, которые можно установить во время тестирования. Программы представлены в формате шестнадцатеричной строки, и вам необходимо преобразовать шестнадцатеричную строку в двоичный формат и установить программы в микропрограмму, чтобы интерпретатор apf_interpreter мог их выполнить. Во время интеграционного тестирования следует отправлять пакеты, которые, как ожидается, запустят логику фильтрации в программе 1 и программе 2.

Программа APF 1

Когда экран устройства включен, установите программу APF 1. Эта программа может отбрасывать безвредные пакеты, которые не влияют на функциональность устройства. Эти пакеты используются для проверки правильности фильтрации сетевого трафика программой APF.

Логика программы APF 1 следующая:

  1. Увеличивайте и уменьшайте счетчик:
    1. Значения EtherType: 0x88A2 , 0x88A4 , 0x88B8 , 0x88CD , 0x88E1 , 0x88E3
    2. Пакеты обнаружения или запроса DHCP IPv4
    3. RS-пакеты
  2. Передайте и увеличьте счетчик: Все остальные пакеты.

Коды байтов программы APF (1 байт) следующие:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
Программа APF 2

Когда экран устройства выключен, установите программу APF 2. Эта программа фильтрует все пакеты, которые фильтрует программа APF 1 , а также пакеты запросов ping. Чтобы убедиться в правильности установки программы APF 2 , отправьте пакеты ping на тестируемое устройство.

Логика программы APF 2 следующая:

  1. Увеличивайте и уменьшайте счетчик:
    1. Значения EtherType: 0x88A2 , 0x88A4 , 0x88B8 , 0x88CD , 0x88E1 , 0x88E3
    2. Пакеты обнаружения или запроса DHCP IPv4
    3. RS-пакеты
  2. Отбрасывать и увеличивать счетчик: пакеты запросов ICMP ping
  3. Передайте и увеличьте счетчик: Все остальные пакеты

Коды 2-байтовых фрагментов программы APF следующие:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C007488A27C006F88A47C006A88B87C006588CD7C006088E17C005B88E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE87234120C84000E86DD0A1482093A0A368204856BE0721F120C84001008000A17820B01AB0D220E8204086BE472086BDCB03A01B87206B03A01B87201
Проверка данных

Для проверки корректности выполнения программы APF и правильной передачи или отбрасывания пакетов выполните следующие действия:

  • Получайте и проверяйте данные по региону APF каждые 5 минут.
  • Не убирайте со стола все лишнее.
  • Сгенерируйте тестовые пакеты для запуска каждого правила фильтра.
  • Проверьте приращение счетчика, используя следующие ячейки памяти:

    Название контрар Место в памяти
    DROPPED_ETHERTYPE_DENYLISTED [ApfRamSize - 20, ApfRamSize - 16]
    DROPPED_DHCP_REQUEST_DISCOVERY [ApfRamSize - 24, ApfRamSize - 20]
    DROPPED_ICMP4_ECHO_REQUEST [ApfRamSize - 28, ApfRamSize - 24]
    DROPPED_RS [ApfRamSize - 32, ApfRamSize - 28]
    PASSED_PACKET [ApfRamSize - 36, ApfRamSize - 32]

Псевдокод для программы APF 1 и программы APF 2

Приведенный ниже псевдокод подробно объясняет логику программ APF 1 и APF 2:

// ethertype filter
If the ethertype in [0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3]:
    drop packet and increase counter: DROPPED_ETHERTYPE_DENYLISTED

// dhcp discover/request filter
if ethertype != ETH_P_IP:
    skip the filter
if ipv4_src_addr != 0.0.0.0:
    skip the filter
if ipv4_dst_addr != 255.255.255.255
    skip the filter
if not UDP packet:
    skip the filter
if UDP src port is not dhcp request port:
    skip the filter
else:
    drop the packet and increase the counter: DROPPED_DHCP_REQUEST_DISCOVERY

// Router Solicitation filter:
if ethertype != ETH_P_IPV6:
    skip the filter
if not ICMP6 packet:
    skip the filter
if ICMP6 type is not a Router Solicitation:
    skip the filter
else:
    drop the packet and increase the counter: DROPPED_RS

// IPv4 ping filter (only included in Program 2)
if ethertype != ETH_P_IP:
    skip the filter
if it ipv4 protocol is not ICMP:
    skip the filter
if port is not a ping request port
    skip the filter
else:
    drop the packet and increase the counter: DROPPED_ICMP4_ECHO_REQUEST

pass the packet and increase: PASSED_PACKET