Мова програмування P4

Мова програмування P4
P4 - це мова програмування, призначена для програмування правил маршрутизації пакетів. На відміну від мови загального призначення, такої як C або Python, P4 - це предметно-орієнтована мова з рядом конструкцій, оптимізованих для мережної маршрутизації.

P4 — це мова з відкритим вихідним кодом, що ліцензується та підтримується некомерційною організацією, яка називається P4 Language Consortium. Він також підтримується Open Networking Foundation (ONF) та Linux Foundation (LF) - двома найбільшими парасольковими організаціями в проектах з відкритим вихідним кодом у галузі мережевих технологій.
Мова була спочатку придумана у 2013 році та описана у 2014 у документі SIGCOMM CCR під назвою «Незалежне від протоколів, програмування процесора маршрутизації пакетів».

З моменту свого створення P4 експоненційно зростає та розвивається, швидко стаючи стандартом опису передачі пакетів мережевими пристроями, включаючи мережеві адаптери, комутатори та маршрутизатори.

"SDN перетворив мережеву індустрію, а P4 виводить SDN на новий рівень, забезпечуючи програмованість у галузі маршутизації", - сказав Гуру Парулкар, виконавчий директор Open Networking Foundation.

Мова P4 була спочатку створена групою інженерів та дослідників з Google, Intel, Microsoft Research, Barefoot, Princeton та Stanford. Ціль була проста: створити просту у використанні мову, яку розробник програмного забезпечення зможе вивчити за день, і використовувати для точного опису того, як пакети пересилаються в мережі.

З самого початку P4 розроблявся як незалежний від мети (тобто програма, написана на P4, могла бути скомпільована без змін для виконання на різних цілях, таких як ASIC, FPGA, CPU, NPU та GPU).

Також мова протокольно незалежна (тобто програма P4 може описувати існуючі стандартні протоколи або використовуватися для вказівки нових режимів адресації, що настроюються).

У промисловості P4 використовується для програмування пристроїв. Можливо в майбутньому Internet-RFC і стандарти IEEE також включатимуть специфікацію P4.

P4 може використовуватися як для програмованих, так і пристроїв з фіксованою функцією. Наприклад, він використовується для точного запису поведінки конвеєра комутатора в інтерфейсах API інтерфейсу абстракції комутатора (SAI), що використовуються ОС комутатора з відкритим вихідним кодом SONiC. P4 також використовується в проекті ONF Stratum для опису поведінки комутації через безліч стаціонарних та програмованих пристроїв.

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

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

Звичайно, P4 можна використовувати для написання програм, що описують нові способи маршрутизації. Наприклад, P4 широко використовується для телеметрії та вимірювань у дата-центрах, мережах підприємств та постачальників послуг.

Дослідницьке співтовариство також активізувалося. Декілька провідних академічних дослідницьких груп за мережевими технологіями опублікували цікаві нові програми на основі програм P4, включаючи балансування навантаження, узгоджені протоколи та кешування значення ключа. Створюється нова парадигма програмування, інновації переміщаються з апаратного забезпечення до програмного забезпечення, що дозволяє з'явитися безлічі несподіваних, нових та геніальних ідей.

Спільнота розробників зробила значний внесок у розробку коду, включаючи компілятори, конвеєрні програми, поведінкові моделі, API-інтерфейси, тестові середовища, програми та багато іншого. Віддані розробники є в таких компаніях як Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx та ZTE; з університетів, включаючи BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass, and USI; та проекти з відкритим вихідним кодом, у тому числі CORD, FD.io, OpenDaylight, ONOS, OvS, SAI та Stratum, підкреслюють той факт, що P4 є незалежним громадським проектом.

Типова генерація контролерів для мови P4:

Мова програмування P4

Перспективи застосування

Мова програмування P4
Оскільки мова призначена для додатків маршрутизації, список вимог та варіантів дизайну відмінний у порівнянні з мовами програмування загального призначення. Основними рисами мови є:

  1. Незалежність від цільової реалізації;
  2. Незалежність від використовуваного протоколу (-ів);
  3. Реконфігурованість полів.

Незалежність від цільової реалізації

Програми P4 розробляються так, щоб вони не залежали від реалізації, тобто вони можуть бути скомпільовані для багатьох різних типів виконавчих машин, таких як процесори загального призначення, FPGA, системи на кристалі, мережні процесори та ASIC. Ці різні типи машин відомі як цілі P4, і під кожну мету необхідний компілятор для перетворення вихідного коду P4 модель цільового комутатора. Компілятор може бути вбудований в цільовий пристрій, зовнішнє програмне забезпечення або хмарний сервіс. Оскільки багато початкових цілей для програм P4 використовувалися для простої комутації пакетів, дуже часто можна почути термін «комутатор P4», навіть якщо вживання «мета P4» більш вірно.

Незалежність від використовуваного протоколу(ів)

P4 незалежно від протоколів. Це означає, що мова не має вбудованої підтримки найпоширеніших протоколів, таких як IP, Ethernet, TCP, VxLAN або MPLS. Натомість програміст P4 описує формати заголовків та імена полів необхідних протоколів у програмі, які в свою чергу інтерпретуються та обробляються скомпільованою програмою та цільовим пристроєм.

Реконфігурованість полів

Незалежність від протоколу та модель абстрактної мови допускають реконфігурованість – цілі P4 повинні мати можливість змінювати обробку пакетів після розгортання системи. Ця можливість традиційно пов'язана з маршрутизацією у вигляді процесорів загального призначення або мережевих процесорів, а не інтегральних схем з фіксованими функціями.

Хоча в мові немає, що могло б перешкодити оптимізувати роботу певного набору протоколів, ці оптимізації невидимі для автора мови і можуть, зрештою, знизити гнучкість системи та цілі та їх реконфігурованість.

Дані характеристики мови спочатку закладалися її творцями з орієнтацією на повсюдне використання їх у мережевий інфраструктурі.

Вже зараз мова використовується у багатьох компаніях:

1) гіпермасштабні центри обробки даних;

Китайська компанія Tencent є найбільшою інвестиційною компанією у світі та однією з найбільших венчурних компаній. Дочірні компанії Tencent, як у Китаї, так і в інших країнах світу, спеціалізуються на різних галузях високотехнологічного бізнесу, у тому числі різних інтернет-сервісах, розробках у галузі штучного інтелекту та електронних розваг.

P4 та програмована маршрутизація є передовими технологіями, що використовуються в архітектурі мережі компанії.

Будучи одним із творців, Google з гордістю відзначає швидке впровадження P4 у мережевій індустрії та, зокрема, у сфері архітектурного проектування ЦОД.

2) Комерційні підприємства;

Goldman Sachs використовуючи переваги роботи з спільнотою відкритого вихідного коду та розробки загальних стандартів та рішень вже зараз привносить інновації у мережну інфраструктуру та надає найкращі рішення для клієнтів.

3) Виробництво;

Вся мережева індустрія виграє від такої мови, як P4, яка однозначно визначає поведінку переадресації. Також вважають і Cisco, переносячи свої продуктові лінійки використання цієї мови.

Juniper Networks включило P4 і P4 Runtime до ряду продуктів, і забезпечує програмний доступ до вбудованого процесора Juniper та його програмного коду.

Ruijie Networks є активним прихильником P4 та переваг, які вона приносить мережам. За допомогою P4 компанія може створювати та постачати найкращі у своєму класі рішення для широкого кола клієнтів.

4) Телекомунікаційні провайдери;

AT&T була однією з перших прихильників P4, одна з перших використовувала P4 для визначення поведінки, яке хотіло бачити в мережах, і використовує пристрої переадресації P4 у своїй мережі.

У Deutsche Telekom мова використовується для створення прототипів ключових функцій мережі в рамках програми Access 4.0.

5) Напівпровідникова промисловість;

Мова дозволила реалізувати нову парадигму передачі можливостей програмного забезпечення у площину маршрутизації мережі компанією Barefoot.

Xilinx був одним із засновників P4.org і брав активну участь у розробці мови P4 і впровадили його в програмовані платформи на основі FPGA для обладнання SmartNIC і NFV, випустивши один із перших компіляторів P416 як частину дизайну SDNet.

6) Програмне забезпечення.

У компанії VMware вважають, що P4 створює величезну енергію, інновації та співтовариство, яке веде до значних і необхідних перетворень у мережі. VMware спочатку була частиною цього галузевого руху, оскільки нова хвиля інновацій викликана програмними підходами, що розширюють можливості інфраструктури та реалізує їх у новітніх продуктах.

Таким чином, P4 — це не залежить від мети і не залежить від протоколу мова програмування, яка використовується промисловістю та науковою спільнотою для однозначного визначення поведінки маршрутизації пакетів як програми, яка, у свою чергу, може бути скомпільована для кількох цілей. Сьогодні цілі включають апаратні та програмні комутатори, гіпервізорні комутатори, NPU, графічні процесори, FPGA, SmartNIC та ASIC.

Головні риси мови значно розширюють сфери її застосування та забезпечують її швидку імплементацію в архітектурі мереж.

З чого почати

P4 - це відкритий проект, вся актуальна інформація знаходиться на сайті P4.org

Посилання на репозиторій https://github.com/p4lang, де ви можете отримати вихідні коди прикладів та навчальні матеріали.

плагін для Eclipse з підтримкою P4, але можемо порадити P4 Studio Неймовірна ціна на компанії Barefoot.

Мова програмування P4

Розберемо основні абстракції ядра:

Визначення заголовків - З їх допомогою визначаються заголовки протоколу.

У визначенні заголовків задається:

  • опис форматів пакетів та імена полів заголовків
  • фіксовані та змінні дозволені поля

Наприклад

header Ethernet_h{
    bit<48>  dstAddr;
    bit<48>  srcAddr;
    bit<16>  etherType;
}

header IPv4_h{
    bit<4>  version;
    bit<4>  ihl;
    bit<8>  diffserv;
    bit<16>  totalLen;
    bit<16>  identification;
    bit<3>  flags;
    bit<13>  fragOffset;
    bit<8>  ttl;
    bit<8>  protocol;
    bit<16>  hdrChecksum;
    bit<32>  srcAddr;
    bit<32>  dstAddr;
    varbit<320>  options;
}

Парсери — їхнє завдання розбирати заголовки.

Наступний приклад парсера визначить перехід кінцевого стану машини з одного початкового стану в одне із двох кінцевих:

Мова програмування P4

parser MyParser(){
 state  start{transition parse_ethernet;}
 state  parse_ethernet{
    packet.extract(hdr.ethernet);
    transition select(hdr.ethernet.etherType){
        TYPE_IPV4: parse_ipv4;
        default: accept;
        }
    }…
}

таблиці — містять стан машини, що зв'язує ключі користувача з діями. Дії - Опис того, як слід маніпулювати пакетом.

Таблиці містять стани (визначений на управлінському рівні) для пересилання пакетів, описують одиницю дії Match-Action

Зіставлення пакетів проводиться за:

  • Точній відповідності
  • Найдовшому Match із префіксом (LPM)
  • Потрійного зіставлення (маскування)

table ipv4_lpm{
    reads{
        ipv4.dstAddr: lpm;
    } actions {
        forward();
    }
}

Усі можливі дії мають бути визначені у таблицях заздалегідь.

Дії складаються з коду та даних. Дані надходять управлінського рівня (наприклад, IP-адреси/номери портів). Певні, безциклові примітиви можуть бути задані безпосередньо у дії, але кількість команд має бути передбачуваною. Тому дії не можуть містити жодних циклів або умовних операторів.

action ipv4_forward(macAddr_t dstAddr, egressSpec_t port){
    standard_metadata.egress_spec = port;
    hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
    hdr.ethernet.dstAddr = dstAddr;
    hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}

Модулі Match-Action — дії зі створення ключа пошуку, пошуку таблиці, виконання дій.

Типовий приклад модуля наведено на малюнку:

Мова програмування P4

Потік керування - Вказує порядок застосування модулів Match-Action. Це імперативна програма, що визначає логіку високого рівня та послідовність Match-Action. Потік керування пов'язує всі об'єкти, задаючи рівень керування.

Зовнішні об'єкти - Це специфічні об'єкти з чітко прописаною архітектурою та інтерфейсами API. Наприклад, обчислення контрольної суми, регістри, лічильники, лічильники і т.д.

extern register{
    register(bit<32> size);
    void read(out T result, in bit<32> index);
    void write(in bit<32> index, in T value);
}

extern Checksum16{
  Checksum16();    //constructor
  void clear();    //prepare unit for computation
  void update(in T data);    //add data to checksum
  void remove(in T data);  /remove data from existing checksum
  bit<16> get(); //get the checksum for the data added since last clear
}

метадані - Структури даних, пов'язані з кожним пакетом.

Існує 2 види метаданих:

  Користувальницькі метадані (порожня структура для всіх пакетів)
    Ви можете покласти тут все, що ви хочете
    Доступно на всьому протязі pipeline
    зручно для використання у своїх цілях, наприклад, для зберігання хеша пакету

  Внутрішні метадані – забезпечується архітектурою.
    Вхідний порт, вихідний порт визначаються тут
    Мітка часу, коли пакет був поставлений у чергу, глибина черги
    мультикаст хеш/ мультикаст черга
    Пріоритет пакету, важливість пакету
    Специфікація вихідного порту (наприклад, черга виведення)

Компілятор P4

Р4 компілятор (P4C) генерує:

  1. Data plane runtime
  2. API для керування станом машини у data plane

Мова програмування P4

Приклад програмного освітлення мовою P4

Вихідні коди можна завантажити з репозиторію.

p4lang/p4c-bm: створює конфігурацію JSON для bmv2
p4lang/bmv2: програмний комутатор, який розуміє конфігурацію JSON версії bmv2

На малюнку наведено схему компіляції проекту:

Мова програмування P4

Маніпуляції з таблицями, регістрами читання, лічильника:

  • table_set_default <table name> <action name> <action parameters>
  • table_add <table name> <action name> <match fields> => <action
    parameters> [priority]
  • table_delete <table name> <entry handle>


У вихідних кодах наведена програма simple_switch_CLI для зручного використання API програмного освітлення.

Цей та інші приклади ви можете завантажити у репозиторії.

Мова програмування P4

PS На початку літа компанія Intel підписала угоду про придбання Barefoot Networks з тим прицілом, щоб швидко задовольняти потреби користувачів Hyperscale Cloud. Як заявив Navin Shenoy — це дозволить Intel надавати більші робочі навантаження і більше можливостей для клієнтів ЦОДів.

На мою особисту думку не варто забувати, що компанія Intel - лідер з виробництва чіпів FPGA і має чудове середовище Quartus. А отже, можна очікувати, що з приходом в Intel, у компанії Barefoot не тільки поповниться виробнича лінійка, але і Quartus, і P4 Studio чекають серйозні оновлення та поповнення лінійкою Toffino і Toffino 2.

Офіційний учасник спільноти P4 - компанія Чинник груп.

Джерело: habr.com

Додати коментар або відгук