Мастер Linux DSA не может общаться по мосту.

Вопрос или проблема

в настоящее время мы разрабатываем плату на базе embedded linux с интегрированным коммутатором KSZ8775. Ядро Linux: v5.15

Настройка коммутатора следующая:

Порт 1: Пользователь 1
Порт 2: Пользователь 2
Порт 3: Пользователь 3
Порт 4: Внешний PHY - Пользователь 4
Порт 5: Интерфейс CPU-Хост (Linux-система)

Интерфейс процессора настроен как RMII, а для управления используется SPI. Я включил драйверы ядра и добавил устройство в свое дерево устройств. Я также настроил драйвер ksz8795 для принятия ksz8775.

Все хорошо, при загрузке я получаю все пользовательские интерфейсы коммутатора (lan1, lan2, lan3, lan4, как указано в дереве устройства). Затем я создаю интерфейс моста и добавляю к нему lan1, lan2 и т.д. Как описано здесь: https://www.kernel.org/doc/html/v5.15/networking/dsa/configuration.html

С этой конфигурацией пользовательские порты могут пинговать друг друга, например, пользователь 2 может пинговать пользователя 1 и наоборот. К сожалению, главный интерфейс (хост-процессор) не может пинговать ни одного пользователя, и ни один пользователь не может пинговать главный интерфейс.

Когда я пытаюсь пинговать главный интерфейс с пользовательского порта, я вижу входящие пакеты ARP и также вижу, что они отвечают. Например, здесь я использую tcpdump, чтобы увидеть весь трафик на eth0 (подключенном к порту 5 коммутатора):

root@picocoremx6ull100-de-dp-eval:~/tools# ./tcpdump -i eth0
tcpdump: подробный вывод подавлен, используйте -v[v]... для полного декодирования протокола
прослушивание на eth0, тип связи NULL (BSD loopback), длина снимка 262144 байт
23:21:38.691465 AF Неизвестный (4294967295), длина 61:
        0x0000:  ffff 0005 5107 5584 0806 0001 0800 0604  ....Q.U.........
        0x0010:  0001 0005 5107 5584 c0a8 0214 0000 0000  ....Q.U.........
        0x0020:  0000 c0a8 0201 0000 0000 0000 0000 0000  ................
        0x0030:  0000 0000 0000 0000 02                   .........
23:21:38.691786 AF Неизвестный (348423), длина 61:
        0x0000:  5584 46e2 4a3e 7493 0806 0001 0800 0604  U.F.J>t.........
        0x0010:  0002 46e2 4a3e 7493 c0a8 0201 0005 5107  ..F.J>t.......Q.
        0x0020:  5584 c0a8 0214 0000 0000 0000 0000 0000  U...............
        0x0030:  0000 0000 0000 0000 04                   .........
23:21:39.709613 AF Неизвестный (4294967295), длина 61:
        0x0000:  ffff 0005 5107 5584 0806 0001 0800 0604  ....Q.U.........
        0x0010:  0001 0005 5107 5584 c0a8 0214 0000 0000  ....Q.U.........
        0x0020:  0000 c0a8 0201 0000 0000 0000 0000 0000  ................
        0x0030:  0000 0000 0000 0000 02                   .........
23:21:39.709862 AF Неизвестный (348423), длина 61:
        0x0000:  5584 46e2 4a3e 7493 0806 0001 0800 0604  U.F.J>t.........
        0x0010:  0002 46e2 4a3e 7493 c0a8 0201 0005 5107  ..F.J>t.......Q.
        0x0020:  5584 c0a8 0214 0000 0000 0000 0000 0000  U...............
        0x0030:  0000 0000 0000 0000 04                   .........

Я вижу ARP-запрос “кто имеет 192.168.2.1”, поступающий от 192.168.2.20, подключенного к пользовательскому порту 3. Сразу после запроса приходит ARP-ответ “192.168.2.1 имеет адрес 46:e2:4a:3e:74:93”.

Также метки в пакетах кажутся корректными. “02” для пакетов от коммутатора к процессору и “04” для пакетов от процессора к коммутатору. Это точно так, как описано в драйвере ядра в tag_ksz.c.

Вот дополнительная информация:

root@picocoremx6ull100-de-dp-eval:~/tools# bridge vlan show
порт              vlan-id
lan1              1 PVID Egress Untagged
lan2              1 PVID Egress Untagged
lan3              1 PVID Egress Untagged
br0               1 PVID Egress Untagged

root@picocoremx6ull100-de-dp-eval:~/tools# 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 1501 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 46:e2:4a:3e:74:93 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::44e2:4aff:fe3e:7493/64 scope link
       valid_lft forever preferred_lft forever
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
4: lan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000
    link/ether 46:e2:4a:3e:74:93 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::44e2:4aff:fe3e:7493/64 scope link
       valid_lft forever preferred_lft forever
5: lan2@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue master br0 state LOWERLAYERDOWN group default qlen 1000
    link/ether 46:e2:4a:3e:74:93 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::44e2:4aff:fe3e:7493/64 scope link
       valid_lft forever preferred_lft forever
6: lan3@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue master br0 state LOWERLAYERDOWN group default qlen 1000
    link/ether 46:e2:4a:3e:74:93 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::44e2:4aff:fe3e:7493/64 scope link
       valid_lft forever preferred_lft forever
7: spe@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 46:e2:4a:3e:74:93 brd ff:ff:ff:ff:ff:ff
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 46:e2:4a:3e:74:93 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::44e2:4aff:fe3e:7493/64 scope link
       valid_lft forever preferred_lft forever
root@picocoremx6ull100-de-dp-eval:~/tools#

то же самое tcpdump входящего пинга, но на интерфейсе моста br0:

root@picocoremx6ull100-de-dp-eval:~/tools# ./tcpdump -i br0
устройство br0 перешло в промискуитетный режим
tcpdump: подробный вывод подавлен, используйте -v[v]... для полного декодирования протокола
прослушивание на br0, тип связи EN10MB (Ethernet), длина снимка 262144 байт
23:58:05.658830 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Запрос от 00:05:51:07:55:84 (oui Неизвестный), длина 300
23:58:08.482775 ARP, Запрос who-has 192.168.2.1 tell 192.168.2.20, длина 46
23:58:08.482877 ARP, Ответ 192.168.2.1 is-at 46:e2:4a:3e:74:93 (oui Неизвестный), длина 28
23:58:09.558810 ARP, Запрос who-has 192.168.2.1 tell 192.168.2.20, длина 46
23:58:09.558910 ARP, Ответ 192.168.2.1 is-at 46:e2:4a:3e:74:93 (oui Неизвестный), длина 28
23:58:10.598784 ARP, Запрос who-has 192.168.2.1 tell 192.168.2.20, длина 46
23:58:10.598886 ARP, Ответ 192.168.2.1 is-at 46:e2:4a:3e:74:93 (oui Неизвестный), длина 28

Но кажется, что коммутатор не передает ответ обратно к пользовательскому порту, который отправил запрос. Есть ли что-то, что я упускаю в настройке моста? В принципе, я хочу, чтобы каждый порт (пользовательский и процессорный) мог общаться друг с другом. Мне нужно добавить отдельный интерфейс в мост для связи с пользовательскими портами, или эта настройка должна работать?

К сожалению, я не очень хорошо разбираюсь в сетях… Дайте знать, если вам нужна дополнительная информация.

Надеюсь, это подходящее место, чтобы попросить помощь по этому вопросу.

Спасибо!

Ответ или решение

Когда речь идет о встраиваемых системах Linux с использованием коммутатора, возникает множество сложностей с конфигурацией сети. В описанном вами сценарии, главная задача состоит в том, чтобы наладить корректное взаимодействие между портами коммутатора и главным интерфейсом CPU через мостовую конфигурацию. Давайте разберем, что может пойти не так и какие шаги можно предпринять для решения проблемы.

Теория

Как вы описали, вы используете коммутатор KSZ8775 с драйвером KSZ8795 в Linux kernel версии 5.15. Коммутатор интегрируется в систему, и каждый его порт является отдельной сетевой интерфейсной точкой. Конфигурация предполагает, что все порты (включая главный интерфейс для CPU) должны быть добавлены в сетевой мост, чтобы обеспечить их взаимодействие. Когда моста строится, каждый пакет, включая ARP-запросы, должен корректно маршрутизироваться между интерфейсами, чтобы обеспечить связь. В случае ARP-запросов, пакеты должны дойти до целевого устройства, и ответы должны вернуться обратно.

Пример

Ваша проблема заключается в том, что, несмотря на видимые ARP-запросы и ответы на них, главный интерфейс CPU не может обмениваться данными с «пользовательскими» портами или быть доступным для них. Вы упоминаете видимые ARP-пакеты через tcpdump, включая запросы и ответы, но сообщения не доходят обратно до интерфейсов через коммутатор.

Применение

  1. Проверьте тэгирование и обработку тэйл-тэгов: В драйвере KSZ8795 предусмотрена система тэгирования трафика с использованием последних байтов пакета для определения направления (пакет от коммутатора к CPU или в обратном направлении). Убедитесь, что тэги правильно интерпретируются драйвером, и соответствующие пакеты не отбрасываются из-за некорректной обработки.

  2. Диагностика сетевой конфигурации:

    • Изучите таблицу MAC-адресов (например, с помощью bridge fdb show), чтобы убедиться, что адреса корректно изучены мостом и ядром системы. Если MAC-адреса главного интерфейса или пользовательских интерфейсов отсутствуют, это может означать проблемы в их обучении коммутатором.
    • Проверьте маршрутизацию и флагирование пакетов, чтобы убедиться, что они направлены в нужные интерфейсы.
  3. Конфигурация моста:

    • Убедитесь, что каждый интерфейс моста, включающий CPU и пользовательские порты, корректно настроен и активен в составе моста (проверьте это с помощью brctl show или bridge link).
    • Проверьте, есть ли на CPU интерфейсе правильная IP-конфигурация, и удалите IP с физических интерфейсов (lanX), кроме самого моста (br0), если они установлены.
  4. Исследование логов karusela: В дополнение к видимости пакетов через tcpdump, попробуйте исследовать системные логи (dmesg или /var/log/syslog) для диагностирования аномалий или ошибок, связанных с драйвером коммутатора.

  5. Настройка драйвера: Иногда специфические исправления драйверов или обновления могут содержать исправления для специфичной ситуации или аппаратной конфигурации. Проверьте последний статус драйвера и убедитесь, что у вас установлена самая новая версия или патч, адаптированный для KSZ8775.

  6. Конфигурация VLAN (если применимо): Поскольку ваш мост не настроен на использование VLAN, убедитесь, что ни один из интерфейсов не ждет тегированных кадров, если это не было явно запланировано.

Если все эти меры не привели к желаемому результату, и проблема остается, возможно потребуется провести глубокий аудит драйвера на предмет несовместимости или ошибок в коде обработки. Важность обращения к сообществу разработчиков, поддержке дистрибутива или, если есть доступ, к сотрудникам производителя аппаратного обеспечения остается важным шагом в поиске решения. В некоторых случаях может потребоваться разработка кастомного решения или патча, чтобы проблемы были решены.

Оцените материал
Добавить комментарий

Капча загружается...