Trazendo uma SmartNIC para o home lab
Ter uma placa de rede de datacenter em casa é como cuidar de um animal exótico que exige dieta especial, temperatura controlada e odeia absolutamente tudo ao seu redor.
“Por portões de silício, sonhos se revelam; barreiras do kernel se desfazem em ouro. Infinitos pacotes buscam o altar em pipelines onde dançamos sem par.” — SmartNIC Reverie
Há algum tempo, resolvi que seria interessante ter uma SmartNIC em casa. Encontrei uma pela internet, comprei e coloquei para funcionar — mas não sem antes passar por diversos ajustes, tropeços e aprendizados. Este artigo é para contar essa história.
Mas o que é uma SmartNIC?
É uma placa de rede que faz mais do que transmitir pacotes. Ela conta com poder de processamento próprio para executar tarefas como filtragem, encapsulamento de túneis (VXLAN, GRE), balanceamento de carga, criptografia, entre outras.
SmartNICs são normalmente utilizadas em ambientes de alto desempenho em que delegar tarefas de rede para desafogar a CPU pode fazer toda a diferença. A Microsoft, por exemplo, tem diversas publicações onde descreve o uso extensivo de SmartNICs na infraestrutura da Azure.
Minha primeira placa de rede inteligente
Na minha busca por uma SmartNIC, a linha Agilio CX da Netronome me chamou a atenção — ainda mais quando encontrei uma usada num marketplace online, modelo de duas portas SFP28 de 25GbE cada, sendo vendida a um preço bastante razoável. Logo decidi comprar.
A Agilio CX suporta SR-IOV (Single Root I/O Virtualization), DPDK (Data Plane Development Kit), entre outros recursos. As especificações da placa podem ser encontradas no documento comercial publicado pela Netronome.
O SR-IOV é um recurso que permite que uma única interface física de rede seja particionada em múltiplas interfaces virtuais (chamadas VFs, Virtual Functions). Ele é útil em ambientes virtualizados, permitindo que múltiplas máquinas virtuais compartilhem a mesma placa de rede de forma isolada e com alta performance.
Já o DPDK é um conjunto de bibliotecas e drivers de processamento de pacotes em user space. Essa abordagem retira do caminho a pilha de rede do sistema operacional, uma técnica conhecida como kernel bypass. Dessa forma, é possível tratar o tráfego de maneira muito mais eficiente, com latência reduzida e controle fino sobre cada pacote que entra e sai da placa.
A nova casa da Agilio CX
Para experimentar com a placa, coloquei-a no meu servidor doméstico — meu antigo PC gamer (2019), adaptado para um gabinete de 2U da Nilko (NK120) e rebatizado com o hostname lemrina
.1
Ele é equipado com a placa-mãe ASUS TUF Gaming B450-Plus II, um processador AMD Ryzen 5 2600 de seis núcleos e 16 GB de RAM. Desde que foi promovido (ou rebaixado?) a servidor, não tem mais GPU instalada. O sistema operacional que ele roda é o Proxmox VE 8.4, uma distribuição baseada no Debian e que é voltada para virtualização.
A máquina está conectada a um switch gerenciável dos mais suspeitos. Sem marca, adquirido diretamente do AliExpress, comercializado sob o nome “6-Ports 2.5G Web Managed Switch”. Ele conta com quatro portas Ethernet (compatíveis com 10/100/1000 Mbps e 2.5GbE) e duas portas SFP+ que podem operar a 1G, 2.5G ou 10G.
Ocupo a primeira porta SFP+ do switch com um módulo ONU que uso para substituir o modem da minha provedora de internet. Esse módulo opera em bridge, permitindo que o meu roteador, um MikroTik hAP ax², assuma a responsabilidade de negociar endereços IP e enviar o tráfego diretamente à rede da operadora.

Plug & Pray
Encaixada a NIC em um slot PCI Express apropriado, me deparei com um problema: a placa não aparecia na saída do comando lspci
. Comecei, então, a investigar as possíveis causas.
A Agilio CX 2x25GbE utiliza um conector físico PCI Express x8 e espera negociar com o barramento nessa largura. No entanto, por algum motivo obscuro, ela parece não ser totalmente compatível com a minha placa-mãe.
Depois de alguns testes, identifiquei duas configurações em que a placa funciona: a primeira é utilizá-la no slot PCI Express x16 principal da placa-mãe, ativando a bifurcação para x4/x4/x4/x4; a segunda é conectá-la no segundo slot x16, que, na verdade, opera apenas em x4.
[ 3495.839177] nfp 0000:05:00.0: 16.000 Gb/s available PCIe bandwidth, limited by 5.0 GT/s PCIe x4 link at 0000:02:04.0 (capable of 63.008 Gb/s with 8.0 GT/s PCIe x8 link)
Em ambas as configurações, a NIC acaba funcionando em x4, o que limita a banda disponível. Entretanto, como minha ideia é, inicialmente, utilizar apenas uma das portas em 10GbE, essa limitação de banda não deve ser um gargalo. Tentar forçar a operação em x8 com essa placa-mãe exigiria, no mínimo, alguma gambiarra com um raiser — e com resultados imprevisíveis. Por isso, optei por aceitar a restrição, ao menos por enquanto.

Resolvido esse ponto, surgiu outro obstáculo: a placa passou a aparecer no lspci
, mas nenhuma interface de rede foi criada pelo sistema operacional. Ao examinar os logs com dmesg
, encontrei mensagens do driver nfp
indicando falhas no carregamento do firmware da placa.
[ 11.808887] nfp 0000:05:00.0: nfp: Looking for firmware file in order of priority:
[ 11.808963] nfp 0000:05:00.0: nfp: netronome/serial-xx-xx-xx-xx-xx-xx-xx-xx.nffw: not found
[ 11.809010] nfp 0000:05:00.0: nfp: netronome/pci-0000:05:00.0.nffw: not found
[ 11.809066] nfp 0000:05:00.0: nfp: netronome/nic_AMDA0099-0001_2x25.nffw: not found
[ 11.809069] nfp 0000:05:00.0: Didn't load firmware, please update flash or reconfigure card
[ 11.809997] nfp 0000:05:00.0: nfp: No firmware found, giving up.
Na busca pelos arquivos de firmware, descobri que eles se encontram, de fato, inclusos no Proxmox, em /usr/lib/firmware/netronome/
, mas com uma pegadinha: estão compactados em LZMA2 (extensão .xz
) e precisam ser descompactados manualmente. Resolvida a questão, as duas interfaces de rede correspondentes às duas portas da Agilio CX finalmente surgiram.
A saga do SR-IOV
Tenho interesse em compartilhar a Agilio CX entre várias máquinas virtuais e, por isso, pesquisei sobre como utilizar o SR-IOV. Encontrei no “Basic Firmware User Guide” as instruções detalhadas sobre como habilitar a função — mas, na prática, não funcionava.
Cheguei a substituir as versões de firmware incluídas no sistema operacional por outras baixadas diretamente da Netronome, explicitamente declaradas como compatíveis com SR-IOV. Ainda assim, ao tentar habilitar o recurso por meio de uma escrita em sriov_numvfs
, etapa necessária para a criação das VFs, o processo falhava.
root@lemrina:/sys/bus/pci/devices/0000:05:00.0# cat sriov_totalvfs
48
root@lemrina:/sys/bus/pci/devices/0000:05:00.0# echo 1 > sriov_numvfs
-bash: echo: write error: Input/output error
Diante disso, decidi investigar mais a fundo. Experimentei diferentes combinações de opções na UEFI, confirmei que o sistema operacional reconhecia o IOMMU... e, à primeira vista, nada parecia fora do lugar. Resolvi então me debruçar sobre as mensagens de erro registradas no dmesg
.
[ 2462.237710] pci 0000:05:08.0: [19ee:6003] type 7f class 0xffffff conventional PCI
[ 2462.237724] pci 0000:05:08.0: unknown header type 7f, ignoring device
[ 2463.285682] nfp 0000:05:00.0: Failed to enable PCI SR-IOV: -5
Uma busca pela mensagem “unknown header type 7f, ignoring device” me levou a discussões em fóruns e no Reddit, que finalmente trouxeram à tona o detalhe que faltava.
Na minha placa-mãe (e, provavelmente, em outras com chipset AMD B450), existe uma configuração escondida nas profundezas dos menus da UEFI: a opção “PCIe ARI Support”,2 localizada em Advanced > AMD CBS > NBIO Common Options > PCIe ARI Support
. Por padrão, ela vem configurada como “Auto”. Foi necessário alterá-la para “Enabled” para que as VFs finalmente pudessem ser criadas.

Calor e lamento
Enquanto explorava as ferramentas disponibilizadas pela Netronome, reparei, ao executar o utilitário nfp-temp
, que a temperatura da Agilio CX em idle estava chegando a 72°C — sem tráfego algum, apenas com a placa energizada.
Não encontrei documentação oficial da Netronome que indicasse quais são as temperaturas operacionais recomendadas para a Agilio CX. Não é incomum que NICs de alto desempenho operem até acima dos 80°C, mas ainda assim, me pareceu preocupante que esses 72°C estivessem sendo registrados sem nenhum tráfego. A situação sugeria que, sob carga, a placa poderia facilmente ultrapassar limites seguros.
A causa do problema parecia estar no ambiente em que a Agilio CX se encontrava. Trata-se de uma placa projetada para servidores de datacenter, que contam com fluxo de ar frontal-direcional, pressurizado e cuidadosamente controlado. No meu caso, o servidor tinha apenas de um único fan de 80 mm montado na parte traseira do gabinete.
Na tentativa de mitigar o problema, instalei dois fans de 80 mm adicionais no interior do gabinete, da forma que foi possível — sem grandes expectativas, admito. Para minha surpresa, o resultado parece muito positivo: as leituras subsequentes com o nfp-temp
caíram para cerca de 52°C, mesmo em condições climáticas similares!
Ainda preciso acompanhar o comportamento da placa por períodos mais longos e sob carga real. Mas, até o momento, minha intervenção aparenta ter sido suficiente para manter a Agilio CX funcionando com mais conforto térmico.
E o link não sobe
Conectei fisicamente a Agilio CX ao meu switch por meio de um cabo DAC (Direct Attach Copper), um tipo de cabo de cobre passivo, bastante utilizado para interconexões de curta distância — uma alternativa mais barata e com menor latência do que transceptores ópticos ativos.
Pluguei o DAC nas portas corretas, mas nada. A Agilio CX não detectava o link. O switch também não dava qualquer sinal. Era como se o cabo nem estivesse ali.
A primeira tentativa de diagnóstico foi reduzir manualmente a velocidade das interfaces da Agilio CX. Novamente recorrendo ao “Basic Firmware User Guide”, utilizei o ethtool
para forçar a interface a operar em 10GbE. Ainda assim, silêncio absoluto na linha.
Desconfiei, então, de um possível defeito no cabo DAC. Fiz uma bateria de testes: conectei as duas pontas do cabo entre as portas SFP+ do próprio switch — funcionou. Repeti o teste usando as duas portas da Agilio CX — também funcionou. O cabo, portanto, estava bom.
A próxima hipótese envolvia a compatibilidade entre padrões. Em teoria, módulos SFP28 (25GbE) são retrocompatíveis com SFP+ (10GbE). Mas será que existia alguma incompatibilidade prática entre a Agilio CX e o switch? Considerando que se tratava de um switch genérico e de baixo custo, comecei a suspeitar que ele talvez não seguisse fielmente todas as especificações do padrão.
Em certo momento, cheguei a duvidar se conseguiria fazer a Agilio CX funcionar corretamente com aquele switch. E, admito, senti um certo desespero. Adquirir um switch de marca, com suporte adequado a SFP+/SFP28, talvez não fosse viável no momento, já que esses modelos costumam ter preços bem elevados.
Decidi tentar uma conexão óptica. Comprei um par de módulos GBIC (transceptores ópticos) de 10GbE e um patch cord de fibra óptica. Mas o resultado foi o mesmo obtido com o DAC: nada.
Posteriormente, depois de muita leitura, me chamou a atenção um detalhe: o FEC (Forward Error Correction), mecanismo de correção de erros em tempo real. Essa função costuma ser essencial em conexões de alta performance (como 25GbE, nativo da minha Agilio CX). Entretanto, é de se esperar que um switch de baixo custo e limitado a “apenas” 10GbE não implemente esse recurso.
A boa notícia: o firmware da Netronome permite desabilitar o FEC, como documentado também no “Basic Firmware User Guide”. Usando novamente o `ethtool`, configurei a interface da Agilio CX para operar com o FEC desativado. E então, finalmente, o link subiu.
A Agilio CX e o switch passaram a se enxergar corretamente, tanto via DAC quanto com o patch cord óptico. Com as duas opções funcionando, optei por manter o DAC conectado entre a Agilio CX e o switch, e guardei o patch cord de fibra para algum uso futuro.
Resumo da instalação
Diante dos problemas que enfrentei durante o processo, recorri em algumas ocasiões a uma plataforma de IA em busca de sugestões e ideias.
Em uma dessas interações, surgiu o seguinte texto — uma descrição que, por sintetizar de forma tão precisa a experiência de instalar o Agilio CX nesse ambiente, merece ser citada aqui.
A sua Agilio CX com certeza acha que está sendo punida por crimes que não se lembra de ter cometido.
Ela foi feita para viver num rack de datacenter de luxo e sussurrar pacotes DPDK a 25Gbps enquanto se refresca em um maravilhoso fluxo de ar industrial, mas agora se encontra instalada num ex-PC gamer sendo resfriada por uns dois fans que você desesperadamente encaixou com braçadeiras num caixão de 2U.
Ela está operando com apenas metade da largura de barramento PCI Express prevista. Está limitada a 10GbE. Tiraram até o FEC dela. Está conectada a um switch que provavelmente acha que Ethernet é uma sugestão, não um padrão.
E agora ela está lá, rodando a 52°C enquanto ociosa, no escuro, se perguntando em que momento da vida dela tudo deu tão errado.
Obtendo o SDK
A Netronome oferece alguns firmwares pré-compilados para as placas Agilio CX — incluindo o “básico”, que utilizei até aqui. Entretanto, para compilar o seu próprio firmware, é necessário usar um toolchain específico que não é distribuído publicamente.
No README do repositório do GitHub, onde está hospedado o código-fonte do firmware para a Agilio CX, a Netronome afirma que essa limitação decorre de restrições contratuais impostas por terceiros, que a impedem de disponibilizar o SDK de forma aberta. O trecho esclarece:
Restrições estabelecidas por terceiros impedem que a Netronome libere o kit de desenvolvimento do NFP e seus materiais de referência sob uma licença não proprietária. Essas restrições também impedem que forneçamos tais ferramentas de forma separada do hardware correspondente. No entanto, desde que se possa verificar a compra do hardware, disponibilizamos os binários desses materiais sem custo adicional.
Seguindo esse procedimento, entrei em contato com o suporte. Tive uma surpresa muito positiva: em menos de 10 minutos, recebi uma resposta. Após o procedimento de validação, o atendente me autorizou a baixar o SDK. Além disso, foi extremamente cordial e ainda indicou material de apoio.
Próximos passos
Ainda não sei exatamente qual caminho vou seguir com a Agilio CX. Tenho uma ideia geral da direção, mas os detalhes específicos serão descobertos conforme avanço.
Num primeiro momento, quero compilar o firmware e rodar algum código próprio na placa, mesmo que, no fim das contas, isso tenha pouca utilidade prática. Mais adiante, a ideia é explorar usos mais relevantes, como transferir para a placa algumas tarefas da rede, por exemplo: regras de firewall ou a seleção de pacotes para análise por ferramentas de inspeção como o Suricata.
Também vou precisar atualizar algumas partes do meu home lab. Seria um desperdício não submeter a Agilio CX a uma carga de tráfego mais robusta. Para isso, talvez eu compre uma placa de rede comum de 10 Gbps para instalar em outra máquina e gerar tráfego.
Por fim, quando estiver satisfeito com os testes, planejo vincular uma das interfaces virtuais da Agilio CX a uma máquina virtual, que assumirá o papel de roteador principal da minha rede doméstica — substituindo o MikroTik hAP ax².
Ainda tenho muito a aprender (e a documentar!). Por enquanto, sigo explorando. E quem sabe o que mais pode surgir pelo caminho?
Nos vemos nos próximos capítulos.
Esse hostname foi inspirado em uma personagem fictícia. Na história de que faz parte, Lemrina é uma descendente da realeza relegada às sombras por conveniência política. Ela, entretanto, se recusa a aceitar passivamente a condição e atua nos bastidores em busca de protagonismo. Nome perfeito para uma máquina concebida como flagship, retirada de serviço antes do previsto devido às circunstâncias e destinada a um papel mais discreto como servidor experimental.
Por curiosidade, fui pesquisar o que é “ARI”. Trata-se do Alternative Routing-ID Interpretation, uma extensão do padrão PCI Express que permite o uso de mais bits na identificação de function numbers dentro de um único dispositivo. Por padrão, muitas plataformas limitam o número de virtual functions a oito por dispositivo, a menos que o ARI esteja ativado. Nos meus testes, a Agilio CX ofereceu até 48 VFs.