Network: Cisco VPP (Vector Packet Processing)

  • Очень много презентаций о VPP на сайте fd.io
      • Разобрал только эту “How to Push Extreme Limits of Performance and Scale with Vector Packet Processing Technology”
  • Netgate TNSR – один из известных комерческих проектов, использующих VPP
  • Есть даже аппаратные ускорения VPP на базе спец. чипов типа DPU Marvell® OCTEON 10 DPU Platform, помимо множества других offload (ML, encryption, TPM) и программируемости

  • VPP is a rapid packet processing development platform for highly performing network applications. It creates a vector of packet indices and processes them using a directed graph of nodes – resulting in a highly performant solution (14 MPPS on single Core).
      • At 10GE, 64B frames can arrive at 14.88Mfps – that’s 67nsec per frame (1 млр наносекунд/14млн).
      • With 2 GHz CPU that’s 134 clock cycles per frame (2млрд герц/14млн). (в презе была некорректная логика расчета, удалил)
      • BUT it takes ~70nsec to access memory – too slow for required time budget.
    • Efficiency of dealing with packets within the computer is essential
      • Moving packets: receiving on physical interfaces (NICs) and virtual interfaces (VNFs) => Need optimized drivers for both; should not rely on memory access.
      • Processing packets: Header manipulation, encaps/decaps, lookups, classifiers, counters => Need packet processing optimized for CPU platforms

  • Ships as part of both embedded & server products, in volume

  • Active development since 2002 OMG
  • Кеймы применения разные – облачные сценарии (SDN, NFV, Cloud); Universal CPE, Cloud Load Balancer, BRAS (Broadband network gateway), Intrusion Prevention System (IPS, по факту известно мне только о IDS)

 

  • VPP в контексте vlan очень похож на cisco ASR – vlan нет, но есть сабинтерфейсв и bridge domains, так же есть и l2vpn!
  • yandex использует VPP (linkmeup telecom 98)
  • Kaspersky разрабатывает dataplane NGFW на базе VPP (публичные вакансии)
  • (dpdk, vpp) VPP не обязательно использует DPDK, у него есть свои native драйвера, с которыми он даже работает лучше, но в основном все используют с DPDK (и яндекс, но поглядывают на native; linkmeup telecom 98)
    • vpp больше фреймворк
    • dpdk больше набор библиотек, причем некоторые функции dpdk поддерживают векторизацию
  • В vpp есть плагин с constant time lookup для ACL, который интересен для firewall с большим количеством rules
  • (linkmeup 98) По сути работает близко к napi, только вместо прерываний VPP эвристически ожидает следующие пакеты (десятки) того же потока/одного вектора и соответственно весь этот набор пакетов требует только одного lookup/решения/графа, если эвристика VPP не сработала – пакет обрабатывается «как обычно» (чаще срабатывает 🙂 )
    • Нужно минимизировать использование if в пакетной обработке т.к. каждый if стоит дорог при том что без них совсем невозможно 🙂 (грубо на глаз 1 if = -50к пакетов Cisco VPP)

 

пример настройки простого VPP маршрутизатора

Перейдем сначала к настройке DUT. Открываем сессию SSH и производим базовую настройку. Проверяем что порты DUT находятся в DPDK:

root@intel-corei7-64:~# python3 /usr/bin/dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
0000:01:00.0 'Ethernet Controller E810-C for SFP 1593' drv=uio_pci_generic unused=ice
0000:01:00.1 'Ethernet Controller E810-C for SFP 1593' drv=uio_pci_generic unused=ice
0000:01:00.2 'Ethernet Controller E810-C for SFP 1593' drv=uio_pci_generic unused=ice
0000:01:00.3 'Ethernet Controller E810-C for SFP 1593' drv=uio_pci_generic unused=ice
0000:02:00.0 'I210 Gigabit Network Connection 1533' drv=uio_pci_generic unused=

Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (11) I219-LM 0d4c' if=eth0 drv=e1000e unused=uio_pci_generic *Active*

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'DMA' devices detected
=========================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

No 'ML' devices detected
========================

После заходим в консоль VPP и производим простую настройку. Сначала перезагружаем VPP чтобы сбросить сетевые настройки:

$ systemctl restart vpp

Далее настраиваем интерфейсы DUT с VLAN:

$ vppctl create sub-interfaces TwentyFiveGigabitEthernet1/0/0 3003 dot1q 3003 exact-match
$ vppctl create sub-interfaces TwentyFiveGigabitEthernet1/0/1 3004 dot1q 3004 exact-match
$ vppctl create sub-interfaces TwentyFiveGigabitEthernet1/0/2 3005 dot1q 3005 exact-match
$ vppctl create sub-interfaces TwentyFiveGigabitEthernet1/0/3 3006 dot1q 3006 exact-match

Поднимаем их:

$ vppctl set interface state TwentyFiveGigabitEthernet1/0/0 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/0.3003 up

$ vppctl set interface state TwentyFiveGigabitEthernet1/0/1 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/1.3004 up

$ vppctl set interface state TwentyFiveGigabitEthernet1/0/2 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/2.3005 up

$ vppctl set interface state TwentyFiveGigabitEthernet1/0/3 up
$ vppctl set interface state TwentyFiveGigabitEthernet1/0/3.3006 up

Прописываем IP-адреса:

$ vppctl set interface ip address TwentyFiveGigabitEthernet1/0/0.3003 fd00:1::1/64
$ vppctl set interface ip address TwentyFiveGigabitEthernet1/0/1.3004 fd00:2::1/64
$ vppctl set interface ip address TwentyFiveGigabitEthernet1/0/2.3005 fd00:3::1/64
$ vppctl set interface ip address TwentyFiveGigabitEthernet1/0/3.3006 fd00:4::1/64

Далее необходимо вручную прописать ND-записи, чтобы маршрутизатор знал своих “соседей”:

$ vppctl set ip neighbor TwentyFiveGigabitEthernet1/0/0.3003 fd00:1::2 {trex_port0_mac}
$ vppctl set ip neighbor TwentyFiveGigabitEthernet1/0/1.3004 fd00:2::2 {trex_port1_mac}
$ vppctl set ip neighbor TwentyFiveGigabitEthernet1/0/2.3005 fd00:3::2 {trex_port2_mac}
$ vppctl set ip neighbor TwentyFiveGigabitEthernet1/0/3.3006 fd00:4::2 {trex_port3_mac}

Прописываем маршруты:

$ vppctl ip route add fd00:cafe::/32 via fd00:1::2 TwentyFiveGigabitEthernet1/0/0.3003
$ vppctl ip route add fd00:feed::/32 via fd00:2::2 TwentyFiveGigabitEthernet1/0/1.3004
$ vppctl ip route add fd00:beef::/32 via fd00:3::2 TwentyFiveGigabitEthernet1/0/2.3005
$ vppctl ip route add fd00:deaf::/32 via fd00:4::2 TwentyFiveGigabitEthernet1/0/3.3006

Leave a Reply