Esta é uma pergunta para iniciantes em redes. Tentei encontrar uma solução na web, mas sem sucesso.
Objetivo: Estabelecer uma conexão TCP/IP via Ethernet diretamente entre meu PC host Linux e uma placa STM32MP157, para que eu pudesse enviar e receber pacotes usando soquetes C e programas cliente/servidor simples ( como estes ).
- Nesta questão estou me referindo ao BeagleBone Black como um caso de teste extra. Presumo que tudo o que está faltando é relevante para ambos, mas lembre-se de que meu objetivo é comunicar-me com a placa STM32MP1.
PC host: Kernel versão 5.15.0-117-genérico
Detalhes: Realizei alguns testes, conectando o cabo Ethernet em diversas situações, e é isso que surge:
Quando eu conecto meu host Linux diretamente ao meu roteador doméstico, a conexão é estabelecida, IPv4:
10.100.102.47/24
Quando conecto o STM32MP1 diretamente ao meu roteador doméstico, a conexão é estabelecida:
root@stm32mp1:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 10:e7:7a:e1:8b:a4 brd ff:ff:ff:ff:ff:ff
altname ethernet0
altname ethernet0.ethernet
inet 10.100.102.46/24 metric 10 brd 10.100.102.255 scope global dynamic end0
valid_lft 3568sec preferred_lft 3568sec
inet6 fe80::12e7:7aff:fee1:8ba4/64 scope link
valid_lft forever preferred_lft forever
3: usb0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 7e:8f:a7:2e:04:e5 brd ff:ff:ff:ff:ff:ff
root@stm32mp1:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=7.27 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=6.17 ms
- Quando conecto o BBB direto ao meu roteador doméstico, a conexão é estabelecida:
root@bela:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether e0:ff:f1:d8:ee:5d brd ff:ff:ff:ff:ff:ff
inet 10.100.102.44/24 brd 10.100.102.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::e2ff:f1ff:fed8:ee5d/64 scope link
valid_lft forever preferred_lft forever
3: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether be:1a:f1:d8:ee:5f brd ff:ff:ff:ff:ff:ff
inet 192.168.6.2/24 brd 192.168.6.255 scope global usb0
valid_lft forever preferred_lft forever
inet6 fe80::bc1a:f1ff:fed8:ee5f/64 scope link
valid_lft forever preferred_lft forever
4: usb1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether be:1a:f1:d8:ee:62 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.2/24 brd 192.168.7.255 scope global usb1
valid_lft forever preferred_lft forever
inet6 fe80::bc1a:f1ff:fed8:ee62/64 scope link
valid_lft forever preferred_lft forever
root@bela:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=6.36 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=5.79 ms
192.168.6.2/24 e 192.168.7.2/24 são atribuídos antes da conexão ao roteador.
- Quando conecto o STM32MP1 (assim como o BBB) diretamente ao meu PC host Linux, a conexão não é estabelecida:
root@stm32mp1:~#
[ 65.854953] stm32-dwmac 5800a000.ethernet end0: Link is Up - 1Gbps/Full - flow control rx/tx
[ 65.862162] IPv6: ADDRCONF(NETDEV_CHANGE): end0: link becomes ready
root@stm32mp1:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 10:e7:7a:e1:8b:a4 brd ff:ff:ff:ff:ff:ff
altname ethernet0
altname ethernet0.ethernet
inet6 fe80::12e7:7aff:fee1:8ba4/64 scope link
valid_lft forever preferred_lft forever
3: usb0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether e2:40:83:22:5d:7a brd ff:ff:ff:ff:ff:ff
root@stm32mp1:~#
Emitir:
A verificação nº 1 mostra que a porta Ethernet do meu host pode funcionar.
As verificações nº 2,3 mostram que as portas Ethernet das placas alvo são capazes de funcionar.
A verificação nº 4 mostra que a conexão não foi estabelecida entre o host e um quadro de destino.
Em vez disso, ao conectar o host e o STM32MP1: Enquanto o cabo estiver conectado, uma mensagem de erro dizendo “Falha na conexão: falha na ativação da conexão de rede” apareceria na tela do host periodicamente.
Como isso pode ser resolvido? Obrigado
Informações adicionais: Se eu conectar o destino (cabo eth) e o host (sem fio) ao roteador, consigo me comunicar pela rede. Mas preciso de uma conexão direta entre a máquina, sem o roteador no meio.
O guia do STM sobre como configurar a interface Ethernet do STM32MP1 sugere:
If a DHCP server is not available, one can set the Ethernet IP address with :
Board $> ifconfig end0 uuu.xxx.yyy.zzz
Eu fiz isso, mas não importa porque a conexão nunca é estabelecida com o host.
Seu roteador doméstico atua como um servidor DHCP; ele atribui automaticamente endereços IP para qualquer sistema conectado ao seu segmento de rede . Ter mais de um servidor DHCP em um único segmento de rede causará caos, a menos que os servidores DHCP sejam configurados especificamente para cooperar entre si, e o recurso do servidor DHCP de um roteador doméstico normal de consumo pode não ser flexível o suficiente para tal configuração.
Seu PC host Linux não possui atualmente um servidor DHCP configurado. Na verdade, o host Linux provavelmente está atualmente agindo como um cliente DHCP , obtendo seu endereço IP automaticamente do roteador, pois é a configuração padrão moderna para a maioria dos dispositivos compatíveis com IPv4.
Se você desconectar o host Linux do roteador e conectá-lo diretamente ao STM32MP1, o host detectará a perda de conexão com o roteador e reiniciará o processo de solicitação de endereço DHCP. Mas como o STM32MP1 também não possui um servidor DHCP, essa solicitação expirará sem resposta; esta é a causa provável da
Connection failed: activation of network connection failed
mensagem de erro que você mencionou.Resumindo, tanto o host Linux quanto o STM32MP1 esperam que outra coisa (como o roteador) lhes atribua endereços IP. Ao conectá-los diretamente entre si, nenhum deles obterá um endereço IP.
O
ifconfig
comando não é persistente no Linux: seu efeito será cancelado quando o sistema for reinicializado. É por isso que o guia do STM que você mencionou diz que oifconfig
método é rápido e temporário . O segundo método (usandosystemd
) é descrito como durável porque essa configuração persistirá durante uma reinicialização.Para você, a maneira mais simples de resolver seu problema seria configurar o STM32MP1 para atuar como um servidor DHCP: ele teria um endereço IP estático próprio configurado manualmente e forneceria um endereço IP compatível para qualquer outro sistema conectado para ele automaticamente. O capítulo 3.5 do guia STM que você vinculou descreve exatamente essa configuração.
Passo #1: Você teria que primeiro desabilitar a configuração automática de DHCP da
end0
interface de rede no STM32MP1:Passo #2: Em seguida, adicione a configuração descrita no capítulo 3.5 para a
end0
interface para habilitar a função do servidor DHCP nela:Digite a configuração descrita no capítulo 3.5 e salve-a:
Etapa #3: Agora desconecte o STM32MP1 do roteador, reinicie o STM32MP1 e conecte o host Linux diretamente ao STM32MP1.
O host Linux agora deve obter automaticamente um endereço IP no formato 192.168.72.* do STM32MP1, e o STM32MP1 deve estar acessível no endereço IP 192.168.72.1.
O
systemd-networkd
irá ler qualquer arquivo com um sufixo*.network
ou*.link
no/lib/systemd/network/
diretório e irá ignorar quaisquer arquivos com quaisquer outros sufixos como*.static
ou*.sample
ou*.dhcp
.Em uma distribuição normal do Linux, eu recomendaria escrever arquivos de configuração de substituição no
/etc/systemd/network/
diretório; mas como a própria documentação do STM exige a modificação da configuração em/lib/systemd/
, presumo que esta possa ser uma instalação de sistema embarcado "básica" e os diretórios correspondentes em/etc/
podem não existir.Para um iniciante, pode ser aconselhável seguir a documentação do STM por enquanto, até saber melhor; mas esteja ciente de que a configuração documentada pelo STM fará com que suas configurações sejam revertidas para os padrões de fábrica sempre que o sistema operacional do STM32MP1 ou seus
systemd
componentes forem atualizados.Sua pergunta já foi respondida aqui .
Resumindo, você precisa de um servidor DNS e DHCP em sua rede para usar o protocolo TCP/IP. Você pode usar
dnsmasq
na maioria das distribuições Linux para permitir que seu PC host atue como um servidor DNS e DHCP. (Além disso, o Windows 10 tem o protocolo APIPA , mas requer que ambos os dispositivos executem sistemas operacionais Windows)Se não for viável executar um programa de servidor em seu PC host, sugiro considerar a comunicação serial como uma alternativa à Ethernet.