Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: lwIP при наличии двух каналов связи, установка приоритета
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ruslan1
Здравствуйте!
В устройстве есть два вида соединения:
1) LAN (Ethernet)
2) Modem (ppp).
все это работает через lwIP & FreeRTOS на STM32F4

Вопрос: как красиво (просто, надежно) сделать автоматический переход на приоритетный канал общения?

Реальная ситуация: Прибор общается через модем, но ему подключили LAN. Прибор должен начать передавать данные в LAN и не использовать ppp соединение через модем. Если LAN отключили- то опять перейти на модем/ppp.

Можно ли в lwIP установить приоритет канала передачи?
Или это нужно делать более дубово, например, просто рвать ppp соединение и lwIP будет использовать единственный оставшийся канал для передачи (LAN)? ну и обратно, восстанавливать ppp если LAN отключили .
Хорошо, если просто можно указать lwIP какой из каналов связи использовать для конкретного устанавливаемого TCP соединения.
Например: как выполнить ping через указанное соединение (LAN или модем), если они оба подключены?
Подозреваю что RTFM, но вот какую именно часть M мне нужно R....
Заранее спасибо.
Forger
Цитата(Ruslan1 @ Dec 27 2017, 14:26) *
Вопрос: как красиво (просто, надежно) сделать автоматический переход на приоритетный канал общения?


Я бы сделал некую программную прослойку, через которую производилось бы "общение" других частей проекта.
А уже эта "прослойка" сама переключала бы канал обмена в зависимости от ситуации.
Т.е. прозрачно для кода.
Эта прослойка может быть еще одной задачей в рамках ОС со своими правилами и алгоритмами поведения в случае сбоев и обрывов.
Главное ограничение такой модели построения проекта: никто не должен пытаться напрямую общаться по конкретным канала связи, минуя эту прослойку!
В терминах ООП это называется "инкапсуляция".
scifi
Цитата(Ruslan1 @ Dec 27 2017, 14:26) *
Вопрос: как красиво (просто, надежно) сделать автоматический переход на приоритетный канал общения?

Там есть функция netif_set_default(), она как раз для этого. ЕМНИП, код PPP вызывает её, когда устанавливается соединение. Нужно сделать наоборот: закомментировать вызов netif_set_default() из PPP и, видимо, вызывать его для eth0 (не знаю, нужно ли это делать каждый раз или достаточно один раз при запуске).
Ruslan1
Цитата(scifi @ Dec 27 2017, 16:23) *
Там есть функция netif_set_default(), она как раз для этого.

Спасибо, значит только через нее.
Собственно, она сейчас и используется для полного переключения всего трафика модем/езернет.
То есть всегда использую текущий дефолтный интерфейс.
Но вот как использовать недефолтный?
Как сказать lwip, что я хочу чтобы это конкретное соединение установилось именно через ethernet, а не через дефолтовый канал?
Согласно описанию того же netif_set_default(), где-то существует возможность задать "specific route", но вот что-то я совсем туплю, не могу понять как это сделать:
Цитата
Set a network interface as the default network interface (used to output all packets for which no specific route is found
scifi
Цитата(Ruslan1 @ Dec 29 2017, 19:24) *
Согласно описанию того же netif_set_default(), где-то существует возможность задать "specific route", но вот что-то я совсем туплю, не могу понять как это сделать

Здрассте. "Specific route" - это когда адресат входит в диапазон адресов какого-то интерфейса (типа 192.168.0.x, как часто бывает). Всё остальное идёт в default interface, потому что куда ещё? У взрослых стеков есть статические маршруты, но в lwip этого нет, насколько я знаю.
Кстати, приделать сбоку обработку доп. маршрутов должно быть совсем не сложно. UPD: заглянул в lwip-2, там есть LWIP_HOOK_IP4_ROUTE() как раз для этого.
Ruslan1
Цитата(scifi @ Dec 29 2017, 19:17) *
Здрассте. "Specific route" - это когда адресат входит в диапазон адресов какого-то интерфейса (типа 192.168.0.x, как часто бывает). Всё остальное идёт в default interface, потому что куда ещё? У взрослых стеков есть статические маршруты, но в lwip этого нет, насколько я знаю.
Кстати, приделать сбоку обработку доп. маршрутов должно быть совсем не сложно. UPD: заглянул в lwip-2, там есть LWIP_HOOK_IP4_ROUTE() как раз для этого.

Извините за примитивные вопросы и спасибо за ответы sm.gif

реальные ситуации:
#1:
Подключена локалка, прибору присвоен (через DHCP) IP 192.***. В это же время, работает модем (ppp) и прибор имеет IP 10.***
Мне нужно понять, доступен ли интернет через локалку, для чего пробую пинговать что-нибудь (ну, например, 8.8.8.8).
Обязательно ли для этого действа переключить интерфейс в дефолтовый езернет?
Получается, что обязательно?

#2:
Прибору дана команда валить по UDP данные. Кабель воткнут, данные бегут. Но соединение с интернетом нет, и достигнуть нужного для отсылки данных ftp через локалку невозможно. Подключается модем, устанавливается соединение, дефолтовым становится ppp, и соединение с ftp работает. Но, как я понимаю, в это время в ppp также пойдут и все UDP пакеты, так как это дефолтовый интерфейс?
Получается что да, все UDP пакеты польются тоже в ppp ?
scifi
Цитата(Ruslan1 @ Dec 29 2017, 22:45) *
#1:
Подключена локалка, прибору присвоен (через DHCP) IP 192.***. В это же время, работает модем (ppp) и прибор имеет IP 10.***
Мне нужно понять, доступен ли интернет через локалку, для чего пробую пинговать что-нибудь (ну, например, 8.8.8.8).
Обязательно ли для этого действа переключить интерфейс в дефолтовый езернет?
Получается, что обязательно?

Не обязательно, если прикрутите LWIP_HOOK_IP4_ROUTE(). Он есть в lwip-2, не знаю за предыдущие версии, но приделать тривиально, всего пара строчек. Этот крючок может направлять 8.8.8.8 (его и только его, если нужно) на нужный интерфейс.
Цитата(Ruslan1 @ Dec 29 2017, 22:45) *
#2:
Прибору дана команда валить по UDP данные. Кабель воткнут, данные бегут. Но соединение с интернетом нет, и достигнуть нужного для отсылки данных ftp через локалку невозможно. Подключается модем, устанавливается соединение, дефолтовым становится ppp, и соединение с ftp работает. Но, как я понимаю, в это время в ppp также пойдут и все UDP пакеты, так как это дефолтовый интерфейс?
Получается что да, все UDP пакеты польются тоже в ppp ?

Именно так. Опять же, своя обработка маршрутизации поможет это решить.
Но для начала почитайте немного про азы. IP, адресация, подсети, сетевые маски, шлюзы. Там всё крайне просто, а без этого элементарного знания ничего толкового не сделаете.
kolobok0
Цитата(Ruslan1 @ Dec 29 2017, 22:45) *
...
#1:
Подключена локалка...
Обязательно ли для этого действа переключить интерфейс в дефолтовый езернет?
Получается, что обязательно?

#2:
...так как это дефолтовый интерфейс?
Получается что да, все UDP пакеты польются тоже в ppp ?


5 копеек:
если рассматривать стэк без механизации маршрутиризации - то у вас на хосте (stm) есть два канала связи. Ситуация распадается на:
- перенаправлять пакеты в рукопашную
-- по определённому правилу(тип пакета, наличие коннекта, другие условия) перенаправлять или дропить пакеты.
- заюзать, что нить готовое
-- (как уже прозвучало выше) lwip-2 то что нужно копать на этот предмет в первую очередь


как то так
(круглый)
Ruslan1
Цитата(scifi @ Dec 29 2017, 23:04) *
Но для начала почитайте немного про азы. IP, адресация, подсети, сетевые маски, шлюзы. Там всё крайне просто, а без этого элементарного знания ничего толкового не сделаете.

спасибо за обстоятельный и понятный ответ.
К сожалению моего понимания того как работают "IP, адресация, подсети, сетевые маски, шлюзы" оказалось недостаточно для того, чтобы понять:
1) что именно в lwIP называется "specific route".
2) что "У взрослых стеков есть статические маршруты, но в lwip этого нет"
3) нужно смотреть LWIP_HOOK_IP4_ROUTE и lwip-2

Еще раз спасибо, теперь стало значительно понятнее куда именно копать.

вроде бы текущий релиз "lwIP 2.0.2" ? Или пока что преждевременно переползать на 2.0.x ? (Сейчас в проекте используется 1.4.1)

Цитата(kolobok0 @ Dec 30 2017, 15:33) *
Ситуация распадается на:
- перенаправлять пакеты в рукопашную
-- по определённому правилу(тип пакета, наличие коннекта, другие условия) перенаправлять или дропить пакеты.
- заюзать, что нить готовое
-- (как уже прозвучало выше) lwip-2 то что нужно копать на этот предмет в первую очередь

Да, именно так и я вижу проблему и пути решения. спасибо за детализацию.

Upd:
Хм, у себя в lwIP 1.4.1 тоже нашел LWIP_HOOK_IP4_ROUTE. Буду смотреть.
Цитата
* LWIP_HOOK_IP4_ROUTE(dest):
* - called from ip_route() (IPv4)
* - dest: destination IPv4 address
* Returns the destination netif or NULL if no destination netif is found. In
* that case, ip_route() continues as normal

Ну и да, опять посмотрю "азы". Мало ли что я уже забыл за давностью востребованности информации (это только один из многих вопросов, вот и получается, что углубляюсь только по нужде. Очень мешает, что в сутках так мало часов).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.