1 pontos por GN⁺ 2024-07-05 | 1 comentários | Compartilhar no WhatsApp
  • Para reproduzir uma arquitetura em que o Linux controla diretamente o chip de switch, como dentro de roteadores de consumo, foi projetada uma PCB de switch gigabit baseada no RTL8367S e conectada ao DSA/switchdev
  • O RTL8367S escolhido é um chip de switch gigabit de 7 portas com PHY integrado em 5 portas e, em vez de uma porta de CPU dedicada, a porta 0 é ligada por cabo de rede à Ethernet da placa Linux
  • No processo de criação do hardware, os trilhos de alimentação foram simplificados para 3.3V e 1.1V, e foram testados caminhos de configuração como pinos de boot, EEPROM, flash SPI e porta serial
  • Para a conexão com o Linux, foram necessárias uma placa PINE64 A64-lts, opções customizadas de kernel e alterações na Device Tree, e após o boot lan1~lan4 aparecem sob eth0 como interfaces de rede locais
  • Essa abordagem funciona bem com ferramentas existentes como Linux bridge e ethtool, mas é difícil de usar diretamente em PCs, servidores comuns ou interfaces de rede USB por causa de restrições de Device Tree e GPIO

Switches gerenciados e a arquitetura Linux DSA

  • Um switch gerenciado típico permite mudar configurações e verificar o estado das portas por uma interface web, e equipamentos mais caros também oferecem interfaces adicionais como telnet ou console serial
  • O switch dentro de um roteador de consumo também pode ser visto como uma categoria separada de switch gerenciado
    • O roteador é um pequeno dispositivo Linux com um chip de switch interno
    • Uma ou mais portas são conectadas internamente à CPU, e as demais ficam expostas como portas físicas
  • Com os subsistemas DSA e switchdev do Linux, as portas conectadas ao switch passam a funcionar como se fossem portas de rede “locais” reais
  • Entre o SoC do roteador e o switch são necessárias conexões como SGMII ou RGMII e um barramento de gerenciamento como SMI ou MDIO
  • Switches prontos comuns não expõem externamente as conexões de chip necessárias, o que dificulta controlá-los dessa forma

Construção de uma placa de switch baseada no RTL8367S

  • O switch gigabit feito manualmente usa o chip Realtek RTL8367S
    • É um chip de switch gigabit de 5 portas amplamente usado
    • Na prática, tem uma estrutura de 7 portas, com PHY integrado em 5 portas e 2 portas para conexão com a CPU
  • Como o datasheet fornece apenas informações mínimas, também foram consultados esquemas de dispositivos com chips Realtek semelhantes e documentação de projeto Ethernet
  • No início parecia que seriam necessárias cerca de 7 redes de alimentação, mas foi possível agrupar redes com faixas de tensão sobrepostas e usar apenas reguladores de 3.3V e 1.1V
  • Como o Linux switchdev não exige que a conexão com a CPU seja necessariamente por uma porta de CPU dedicada, neste projeto a porta 0 é ligada por cabo à placa Linux
    • Do ponto de vista do driver switchdev, isso parece como se não houvesse um PHY Ethernet no meio

Configuração do chip de switch e tentativas na PCB

  • O RTL8367S tem vários caminhos de configuração, mas só com o datasheet era difícil identificar a configuração mínima para fazê-lo operar como um switch dumb comum
    • Oito pinos lidos na inicialização são compartilhados com os pinos de LED das portas
    • O barramento i2c pode ser usado para conectar um chip EEPROM, mas compartilha pinos com o barramento SMI necessário
    • O barramento SPI pode ligar um flash NOR para armazenar registradores de configuração ou o firmware do núcleo 8051 embutido
    • A avaliação foi que a porta serial provavelmente não funcionaria sem firmware 8051
  • A primeira placa foi encomendada diretamente, e a abordagem foi alterar conexões de solda até encontrar as condições de funcionamento
    • Foi incluído o footprint para o chip de flash, mas no fim ele não foi necessário
    • Foram colocados jumpers de solda nos pinos de configuração
    • Os LEDs foram excluídos porque era difícil torná-los configuráveis
  • Documentos de projeto para Ethernet gigabit enfatizam controle de impedância e casamento preciso de comprimentos, mas o projeto de switches baratos reais não parecia seguir isso de forma tão rígida
  • O ponto considerado mais importante foi o casamento de skew entre os pares de rede
    • Não pareceu útil igualar entre si o comprimento total dos 4 pares de rede
    • Mesmo dentro do cabo de rede, os 4 pares já têm comprimentos bem diferentes por causa das diferentes taxas de torção
  • Na revisão inicial da placa, o tratamento dos capacitores que referenciam ao terra o center tap do transformador no lado do switch estava errado, e a Ethernet não funcionava
    • Nos testes, uma trilha pequena foi cortada para eliminar o curto com o terra
    • Na configuração de teste, funcionou mesmo com o center tap flutuando
    • O capacitor correspondente foi adicionado ao projeto final

O switch concluído e a conexão com o Linux

  • A placa concluída é um switch gigabit com um formato um pouco incomum
    • 4 portas apontam para um lado
    • 1 porta aponta para o lado oposto e é usada para conectar a placa Linux
    • A alimentação é fornecida por um pin header de 2.54 mm
    • Também foi adicionado o footprint de um conector USB Type-C para permitir alimentação sem fios DuPont
  • A placa Linux escolhida para testes foi a PINE64 A64-lts
    • A posição dos conectores combina aproximadamente com o layout desejado
    • Como eram necessárias mudanças na Device Tree, era importante usar uma plataforma que não fosse x86
  • O kernel foi recompilado porque os módulos relacionados ao switch normalmente não vêm ativados
    • CONFIG_NET_DSA: Distributed Switch Architecture
    • CONFIG_NET_DSA_TAG_RTL8_4: marcação de portas para chips de switch Realtek
    • CONFIG_NET_SWITCHDEV: sistema de drivers de switch de rede
    • CONFIG_NET_DSA_REALTEK, CONFIG_NET_DSA_REALTEK_SMI, CONFIG_NET_DSA_REALTEK_RTL8365MB: drivers do chip de switch em si
  • Em vez de carregar um overlay de Device Tree pelo U-Boot, foi aplicado um patch diretamente na Device Tree da placa A64-lts
    • O driver é carregado com a string de compatibilidade realtek,rtl8365rb
    • Esse driver suporta vários chips de switch Realtek, incluindo o RTL8367S usado aqui
    • A definição de porta de CPU do exemplo da documentação foi removida, e foram definidas 5 portas comuns do switch
  • port@0 é a porta voltada para trás e conectada ao &emac da A64-lts
    • As demais portas são ligadas aos respectivos PHYs internos do chip de switch
    • No topo da Device Tree, são definidos 3 GPIOs ligados a SDA/SCL e Reset

Ferramentas de rede do Linux e limitações

  • Após o boot, no Linux aparecem o dispositivo eth0 normal e também as interfaces de portas do switch definidas na Device Tree
    • lan1@eth0
    • lan2@eth0
    • lan3@eth0
    • lan4@eth0
  • Para funcionar de fato, é preciso executar ip link set eth0 up e também ativar cada interface lan
  • A integração com as ferramentas padrão de rede do Linux é natural
    • Ao colocar várias portas lan em uma bridge Linux, o switchdev faz o bridging dessas portas dentro do próprio chip de switch
    • O Linux não precisa encaminhar esse tráfego diretamente
    • É possível ver informações de link com ethtool lan3
    • ethtool -S lan3 retorna informações de estado padrão, incluindo pacotes totalmente tratados pelo switch
  • Ainda assim, há muitas limitações para uso em ambientes comuns
    • É preciso construir o próprio switch de rede ou abrir um switch existente e encontrar as conexões necessárias
    • PCs e servidores comuns não usam configuração baseada em Device Tree, e normalmente também não oferecem pinos GPIO controlados pelo kernel
    • Interfaces de rede USB não têm um node handle de Device Tree para serem designadas como porta conduit, o que dificulta usar essa abordagem
  • Algumas limitações talvez possam ser contornadas, mas seria necessária mais documentação sobre como carregar o switchdev em ambientes que não sejam dispositivos ARM ou dispositivos USB especiais que exponham GPIO

1 comentários

 
GN⁺ 2024-07-05
Comentários do Hacker News
  • Dá para ver algo do tipo: “switches de rede são dispositivos simples, os pacotes só entram e saem; felizmente, as pessoas encontraram uma forma de complicar isso e inventaram o switch gerenciável”, mas switches caros têm ASICs bastante sofisticados
    Por exemplo, um par de switches Dell OS9 antigos é um equipamento empilhável antigo com 48 portas de 10 Gb/s e 4 portas ópticas QSFP+ de 40 Gb/s, e cada switch consegue processar até 1,28 Tb/s
    Hoje dá para encontrá-los por cerca de £1800, incluindo VAT, e eles duram praticamente para sempre
    Esse tipo de iniciativa é legal, mas também é preciso levar em conta que empresas como a Netgear vendem switches 1Gb de 8 portas com PoE em todas as portas por cerca de £125
    Do ponto de vista econômico do projeto, se você calcular seu tempo a £20–50 por hora, um produto pronto pode fazer mais sentido; mas, se o objetivo é o projeto em si, não é preciso se preocupar com o preço
    (1) https://i.dell.com/sites/doccontent/shared-content/data-shee...
    (2) https://www.etb-tech.com/dell-force10-s4820t-10gbe-switch-os...
    • Já trabalhei com esse tipo de ASIC de switch da Broadcom; não era da classe 40Gb, era algo como 4x10Gbps + 24x1Gbps + PCIe para a CPU
      O preço do ASIC era dentro do esperado e, embora eu não saiba o número exato, imagino que fosse algo na casa de algumas centenas de dólares
      A documentação da interface de software era muito ruim, e como era uma biblioteca que dava suporte a todos os ASICs de switch da Broadcom, havia arquivos .a de centenas de MB cheios de funções que apenas retornavam erros de “não suportado neste dispositivo”, e não havia como saber antes de chamá-las diretamente
  • Projeto interessante
    Para usos mais simples, dá para comprar roteadores compatíveis com OpenWRT que em geral usam chips de switch gerenciáveis, e o OpenWRT oferece uma boa interface para configurar VLANs e várias outras opções
    • Hoje em dia, o OpenWRT também pode ser instalado em alguns switches, como a série Zyxel GS1900
      Porém, o suporte a recursos como PoE ou portas 10Gb/SFP+ pode ser limitado, e não sei ao certo qual é o estado atual
  • A primeira vez que vi um uso criativo de switches da família RTL83 foi em https://spritesmods.com/?art=rtl8366sb, e depois houve outros casos parecidos
    Mas este projeto se aproxima mais de um switch gerenciável feito do zero do que de “colocar um cérebro externo em um switch não gerenciável”
    • Sim, é o lendário sprite_tm; já li aquele post enquanto escrevia eu mesmo um firmware para Raspberry Pi que gerenciava um switch via USB
  • Fico curioso sobre qual é a vantagem em comparação com conectar vários adaptadores gigabit a uma máquina Linux e colocar todos em uma bridge
    Imagino que o desempenho no lado do hardware seja melhor, mas não sei se houve testes mostrando a diferença real
    • A diferença provavelmente é uma combinação de vazão, latência, consumo de energia e recursos
      Com adaptadores USB, você logo esbarra na largura de banda máxima, já que o USB é um barramento compartilhado em vários sentidos, e ainda mais porque os dados precisam entrar na CPU e depois sair de novo
      Ao fazer switching por software, soma-se o tempo para processar cada pacote e reenviá-lo ao lugar correto, além da latência das próprias interfaces
      Cada adaptador tem seu próprio PHY de rede e hardware, o que aumenta o consumo de energia, e com o processamento extra o consumo total cresce ainda mais
      Também se aproveitam menos o offloading por hardware e outras melhorias de desempenho, fazendo com que o sistema inteiro se envolva mais na movimentação dos pacotes
      Em termos de recursos, depende do hardware escolhido; alguns adaptadores USB gigabit baratos não lidavam direito com coisas como VLAN
      Por outro lado, usando várias placas PCIe, os recursos podem ficar bem melhores, mas a partir desse ponto isso se aproxima mais de roteamento do que de switching
    • Se a maior parte do tráfego for comutada, esta abordagem é mais eficiente; se a maior parte precisar de roteamento, vários adaptadores separados são mais eficientes
    • Como nas outras respostas, esta abordagem provavelmente tem menor consumo de energia, e a latência ao passar pelo switch também deve ser menor do que em uma bridge por software
      Mesmo se o sistema operacional do host morrer, o switching pode continuar funcionando, e combinando watchdog com recuperação dá para criar um sistema com disponibilidade melhor que uma bridge por software, ainda que alguns recursos fiquem indisponíveis por um curto período
      Isso, claro, pressupõe que o próprio chip do switch não morra nem trave
      Dependendo do objetivo, se você quiser inspecionar todo o tráfego que passa pelo switch, 4 interfaces claramente são melhores
      Se o switch baseado no host também se comunica bastante, 4 interfaces oferecem 4 Gbps ao host, uma vantagem em relação a uma única interface de 1 Gbps
      Placas corporativas quad 1G usadas podem ser compradas no eBay por menos de US$ 15, e eu prefiro a Silicom quad bypass 1g PEG4BPI-SD
      O recurso de bypass é interessante e incomum, por isso elas são mais baratas, mas em geral, depois de configuradas uma vez como “NIC padrão”, dá para conectá-las em outro lugar sem grandes problemas
      Nos modelos iniciais, o fornecedor e o subfornecedor do PCI ID aparecem como Silicom, o que dificulta o uso; já a placa -SD usa o ID de fornecedor da Intel e subfornecedor da Silicom, então o driver genérico é associado
      Portas 4x10G exigem mais gerenciamento, e dependendo do sistema host a vazão de bridging por software pode não ser suficiente
      Placas 10G quad-port são difíceis de encontrar, mas placas 2x10G podem ser encontradas por um preço razoável se você esperar
    • Nesse método, a CPU entra no caminho dos dados
      Um switch faz a comutação de pacotes no ASIC, não na CPU, então isso passa a depender do desempenho da CPU e normalmente não é uma forma eficiente de usar os recursos de computação disponíveis
    • Com velocidades tão baixas e tão poucas portas, um circuito de switch por hardware não é estritamente necessário
      Ainda assim, ignorando o esforço de projeto e fabricação, o custo total do hardware pode ficar abaixo de US$ 100, e possivelmente sai mais barato do que um computador com várias interfaces
      Dito isso, redes de 1 Gb/s já estão bem antigas

É possível criar um switch de rede gerenciável maior e mais rápido usando apenas peças prontas por pouco mais de US$ 200
Por exemplo, usando um Odroid H4+ com 2 portas e uma placa de expansão M.2 que adiciona 4 portas Ethernet, dá para fazer um switch de 6 portas a 2,5 Gb/s
Outra opção é usar um mini PC com CPU N100 e 4 portas de 2,5 Gb/s, que pode ser comprado nessa faixa de preço de várias fabricantes chinesas
Um mini PC parecido com 6 portas de 2,5 Gb/s é um pouco mais caro e pode passar um pouco de US$ 300

  • Fico me perguntando o que aconteceu com o OpenFlow
    Parecia perfeito para esse tipo de dispositivo, mas perdi o interesse porque era quase impossível montar um ambiente de laboratório
    • Seria possível criar um cliente OpenFlow usando esse chip de switch como plano de dados, mas talvez não seja a melhor opção, porque é bem provável que a maioria dos recursos que se pretende usar no OpenFlow não consiga aproveitar o caminho rápido em hardware, que é relativamente limitado
    • OpenFlow era uma solução um pouco errada para o problema; uma solução mais adequada seria algo na linha de switchdev ou SAI
    • Pelo que sei, o OpenFlow tentou ser genérico demais, não mapeava bem para o hardware real e, no fim, acabou tendo muitos vazamentos de abstração
  • Pelo que li, ao criar um switch de 10 Gbps, os fabricantes dos chips aceleradores não oferecem suporte a drivers abertos, então é muito difícil não depender de alguns blobs binários
    Acho que esses chips são necessários porque fazer switching pela CPU pesa bastante
    • O Marvell 88E6393X funciona em modo “simples/gerenciamento externo” sem firmware
      Pode ser usado com o switchdev do Linux, como o dispositivo deste artigo
  • Fico curioso se ele oferece suporte a rSTP
    • Parece que não; aparentemente só STP comum e talvez MSTP
  • Sem má intenção, e posso ter entendido algo errado
    Você usou um diagrama de blocos da RouterBoard como modelo para mostrar como o switch de hardware se conecta ao restante do sistema, mas depois parece argumentar que dispositivos desse tipo são impossíveis ou difíceis de lidar
    Fico curioso se você já tentou realmente adquirir uma RouterBoard aqui
    Provavelmente dá para compilar OpenWRT para a maioria das RouterBoards, e a 2011 deve ser bem comum até no mercado de usados
    A pergunta melhor é se o objetivo era criar do zero desde o começo, ou se houve algum motivo específico para descartar a ideia de usar hardware de terceiros
    • Tenho vários desses equipamentos e eles são ótimos para seu propósito original, mas não são tão bons para rodar software customizado
      Usei o diagrama do RB2011 porque achei simples e bem explicado
      Tecnicamente, o RB1100AHx4, que usa o mesmo chip de switch, seria um exemplo melhor, mas ele confunde mais porque usa as duas portas de CPU juntas e afirma que 2 links de 1,25 Gbps são um link de 2,5 Gbps, ignorando o overhead de codificação
      O motivo de fazer do zero é que o custo é razoável e esse dispositivo precisa caber na caixa de gravação de vídeo do FOSDEM
      Há alguns problemas específicos desse projeto que precisam ser resolvidos: expor 4 portas de rede no painel frontal do gabinete e, ao mesmo tempo, conectá-las ao SBC interno
      Dentro do gabinete não há muito espaço para colocar um passthrough até o switch sem cabos de loop externos para o SBC, e usar um switch simples também não permite monitorar o sistema
      Como fazemos várias dessas caixas, acaba sendo uma solução razoável; se ignorarmos o tempo de projeto, é viável por ser trabalho voluntário
    • A RouterBoard RB2011 está presa à antiga versão OpenWrt 19.07: https://openwrt.org/toh/mikrotik/rb2011
      O problema parece ter alguma relação com a NAND e, se bem me lembro, há algo diferente em relação a outras RouterBoards compatíveis
      Alguém propôs uma nova solução para esse problema, mas ela ainda não foi incorporada: https://forum.openwrt.org/t/wiki-cleanup-for-mikrotik-rb2011... e outros threads