No Linux, as VLANs e as pontes são construções completamente separadas, e as pontes do Linux não são "com reconhecimento de VLAN".
Quando você cria uma interface de VLAN, o Linux marca / desmarca pacotes nessa interface antes de passá-los para / da interface física subjacente ("tronco"). No entanto, você ainda pode usar a interface física subjacente para enviar pacotes não marcados ("VLAN nativa").
Quando você cria uma ponte, o Linux alterna os pacotes entre as interfaces associadas, sem qualquer preocupação com as tags da VLAN (ou a falta delas) nos pacotes. Se você anexar uma interface de tronco a uma ponte, a ponte terá todo o prazer em alternar os pacotes marcados com VLAN sem nenhuma consideração pelas marcas. Quando você habilita o STP em uma ponte, o Linux gera pacotes STP não marcados e os coloca na ponte.
Quando uma ponte é anexada a uma interface física que também possui interfaces de VLAN associadas, essas interfaces de VLAN deixarão de ver qualquer tráfego que não seja destinado ao endereço MAC da interface física. Esse comportamento é devido à ordem em que a ponte e a marcação de VLAN são processadas e podem ser alteradas usando ebtables conforme descrito em . No entanto, no que diz respeito à Spanning Tree, anexar pontes a uma interface física e interfaces de VLAN associadas funcionará corretamente se você estiver usando o PVST + de qualquer maneira (porque o bloqueio de portas STP é gerenciado independentemente para cada ponte), portanto não é realmente relevante aqui.
Mas você também pode criar interfaces VLAN na parte superior de uma ponte que está passando pacotes marcados com VLAN e, em seguida, adicionar essas interfaces VLAN a outras pontes.
Então, para realizar o que você quer, tente:
ip link set dev hdlc0 up
ip link set dev hdlc1 up
brctl addbr br_native
brctl addif br_native hdlc0
brctl addif br_native hdlc1
brctl stp br_native on
ip link set dev br_native up
ip link add link br_native name br_native.42 type vlan id 42
ip link set dev br_native.42 up
ip link set dev eth0 up
brctl addbr br_42
brctl addif br_42 br_native.42
brctl addif br_42 eth0
ip link set dev br_42 up
Observe que o código de ponte do kernel Linux suporta apenas nativamente o 802.1D STP tradicional. Para adicionar suporte a RSTP e PVST +, use o link (Também é possível encontrar alguma documentação relevante para mstpd em: link ). O mstpd também é capaz de falar MSTP, mas devido à maneira como o Linux implementa seus FIBs, atualmente é impossível mapear topologias MSTP em pontes Linux, portanto o MSTP não é realmente funcional.
Para responder sua segunda pergunta, não acredito que seja possível (em qualquer switch, não apenas quando usando Linux) usar STP ou RSTP para direcionar cada uma das duas VLANs diferentes em um único tronco através de outros dois troncos. Isso só pode ser feito usando PVST + ou MSTP, embora, como mencionado acima, o MSTP não seja suportado no Linux.