XDP (eXpress Data Path), англ. Швидкий шлях даних — це високопродуктивний метод обробки даних, доданий в ядрі Linux версії 4.8[1], що базується на технології eBPF. Головна ідея методу XDP — дати можливість користувачу виконати власну eBPF-програму на ранньому етапі приймання (англ. RX path) пакету даних. Програма виконується в драйвері мережевої карти одразу після отримання переривання процесором та перед виділенням процесорним ядром додаткових буферів пам'яті (для економії ресурсів та часу), що використовуються мережевим стеком[en].

XDP
Тип Фільтрація пакетів
Автор Brenden Blanco, Tom Herbert
Перший випуск 2016
Операційна система Linux
Мова програмування C
Ліцензія GPL

Завдяки цим рішенням, XDP дозволяє обробляти до 26 мільйонів пакетів на секунду одним фізичним ядром ЦП на загальнодоступному апаратному забезпеченні.[2] Оскільки eBPF-програми виконуються в просторі ядра[en] операційної системи, з міркувань безпеки вони проходять автоматичну верифікацію[3] програмним забезпеченням ядра, яке виконує статичний аналіз eBPF коду, а саме: доступ поза виділеним адресним простором, циклічне виконання, глобальні змінні. У випадку невідповідності одному з параметрів безпеки — завантаження eBPF-програми в ядро не дозволяється.

Обробка пакетів у ядрі: XDP оминає мережевий стек та виділення пам'яті під метадані отриманого пакета

eBPF-програмі дозволено модифікувати пакет даних, код її завершення[en] визначає подальші дії над пакетом даних, що будуть виконані мережевим стеком:

  • XDP_PASS: дозволити проходження пакету в мережевий стек
  • XDP_DROP: припинити обробку пакету (скинути пакет)
  • XDP_ABORTED: припинити обробку пакету з винятком (англ. trace point exception)
  • XDP_TX: переслати пакет через мережний інтерфейс, з якого він був отриманий
  • XDP_REDIRECT: переслати пакет до іншого мережного інтерфейсу або сокету AF_XDP

XDP має три можливі режими роботи[4]:

  1. прямого виконання (англ. Native) — мережевий драйвер виконує eBPF програму безпосередньо;
  2. вивантаження (англ. Offloaded) — eBPF-програма вивантажується до мережевої карти, де виконується для кожного отриманого пакету. Є найбільш продуктивним режимом, оскільки зменшує навантаження на процесор. Підтримується, зокрема, мережевими картами Netronome[en][5], позаяк Intel та Mellanox Technologies[en][6] працюють над реалізацію його у своїх продуктах;
  3. загальний (англ. Generic) — оскільки не всі мережні драйвери підтримують режим прямого виконання, також реалізовано режим з точкою виконання в мережному стеці.[7] Є найповільнішим режимом роботи XDP, який було створено для можливості написання та відлагодження XDP програм на системах з мережевими картами без підтримки перших двох режимів роботи.

AF_XDP ред.

Разом з XDP у версії ядра 4.18 було представлено нове сімейство сокетів, AF_XDP,[8] (формальна назва — AF_PACKETv4, не була включена в основну гілку ядра),[9] які по суті є оптимізованим для високошвидкісної роботи сирим сокетом (англ. raw socket); швидкодія при цьому досягається за рахунок відсутності копіювання пакету між ядром і застосунком користувача.

Сокет може використовуватись для отримання та надсилання пакетів, що забезпечує роботу високошвидкісних мережевих програм з простору користувача.[10]

Підтримка XDP різними версіями Linux ядра ред.

Окрім безпосередньої підтримки функціоналу ядром системи, XDP може підтримуватись на рівні драйвера мережевої карти. Оскільки основний приріст швидкості XDP програма отримує завдяки якомога більш ранньому виконанню в мережевому стеку, підтримка на рівні драйвера мережевої карти є необхідною умовою для досягнення високої швидкодії. Відповідно, мережеві карти вищого сегменту підтримують XDP на рівні драйвера.[11]

Функціонал / Драйвер Версія ядра
Базова архітектура XDP 4.8
Команда: скидання пакету (drop)
Команда: пропускання в стек (pass)
Команда: пересилка з вхідного порта
Пряма модифікація мережевого пакету
Драйвер: Mellanox mlx4
Драйвер: Mellanox mlx5 4.9
Драйвер: Netronome nfp 4.10
Драйвер: QLogic (Cavium) qed*
Драйвер: virtio_net
Драйвер: Broadcom bnxt_en 4.11
Драйвер: Intel ixgbe* 4.12
Драйвер: Cavium thunderx
Загальний режим виконання (Generic XDP)
Драйвер: Intel i40e 4.13
Команда: пересилка пакету до іншого

мережевого інтерфейсу

4.14
Підтримка tap-інтерфейсів
Підтримка veth-інтерфейси
Драйвер: Intel ixgbevf 4.17
Драйвер: Freescale dpaa2 5.0
Драйвер: Socionext netsec 5.3
Драйвер: TI cpsw
Драйвер: Intel ice 5.5
Драйвер: Solarflare sfc
Драйвер: Marvell mvneta
Драйвер: Microsoft hv_netvsc 5.6
Драйвер: Amazon ena
Драйвер: xen-netfront 5.9
Драйвер: Intel igb 5.10

Примітки ред.

  1. [GIT] Networking - David Miller. lore.kernel.org. Архів оригіналу за 14 травня 2019. Процитовано 14 травня 2019.
  2. Høiland-Jørgensen, Toke (3 травня 2019), Source text and experimental data for our paper describing XDP: tohojo/xdp-paper, процитовано 21 травня 2019
  3. A thorough introduction to eBPF [LWN.net]. lwn.net. Архів оригіналу за 18 вересня 2020. Процитовано 14 травня 2019.
  4. BPF and XDP Reference Guide — Cilium 1.8.90 documentation. docs.cilium.io. Архів оригіналу за 18 вересня 2020. Процитовано 27 вересня 2020.
  5. BPF, eBPF, XDP and Bpfilter… What are these things and what do they mean for the enterprise? - Netronome. www.netronome.com (англ.). Архів оригіналу за 24 вересня 2020. Процитовано 14 травня 2019.
  6. XDP acceleration using NIC metadata (PDF). Архів оригіналу (PDF) за 25 серпня 2020. Процитовано 26 вересня 2020.
  7. net: Generic XDP. www.mail-archive.com. Архів оригіналу за 14 травня 2019. Процитовано 14 травня 2019.
  8. kernel/git/torvalds/linux.git - Linux kernel source tree. git.kernel.org. Процитовано 16 травня 2019.
  9. Questions about AF_PACKET V4 and AF_XDP. Kernel.org. Архів оригіналу за 6 вересня 2019.
  10. Accelerating networking with AF_XDP [LWN.net]. lwn.net. Архів оригіналу за 18 вересня 2020. Процитовано 16 травня 2019.
  11. Список драйверів мережевих карт, що підтримують XDP (Англійська) . 23 серпня 2020. Архів оригіналу за 25 жовтня 2020.

Зовнішні посилання ред.