Eu encontrei uma solução. Envolve 4 instâncias de socat, organizadas no diagrama de rede abaixo:
/-<-[A - udp receiver] <=udp= [D - udp sender]-<-\
ttyS0 <--> [B - serial adapter] [C - tcp adapter] <=tcp=> Process A
\->-------------------------------------------->-/
- Socat "B" fala com a porta serial, recebe entrada em stdin e saídas para stdout.
- O Socat "A" ouve os pacotes UDP de qualquer lugar e os envia para o stdout, onde são canalizados para o socat "B".
- O Socat "C" escuta uma conexão TCP do Processo A. Os dados vindos da socat "A" aparecem em stdin e são roteados para o Processo A. Os dados do Processo A são enviados para a saída "soc" "D".
- O Socat "D" pega dados de stdin e os envia por UDP para a sociedade "A".
O processo B envia pacotes UDP para socat "B" quando ele quer injetar tráfego.
O comando bash para criar essa monstruosidade é o seguinte:
socat -d -d -d -lpA_udp_rxr -u -T5 udp-recv:1111 - 2>>log.txt |
socat -d -d -d -lpB_serial_adapter -t5 - /dev/ttyS0,raw 2>>log.txt |
socat -d -d -d -lpC_tcp_adapter -T5 - tcp4-listen:3333 2>>log.txt |
socat -d -d -d -lpD_udp_sender -u -T5 - udp:localhost:1111,sourceport=2222 2>>log.txt
Isso também define um tempo limite de 5 segundos e registra muitos detalhes em "log.txt". Números de porta substituídos por segurança.