Перейти к содержанию

lwIP при наличии двух каналов связи, установка приоритета

Здравствуйте!
В устройстве есть два вида соединения:
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....
Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Ruslan1 @ Dec 27 2017, 14:26) <{POST_SNAPBACK}>
Вопрос: как красиво (просто, надежно) сделать автоматический переход на приоритетный канал общения?


Я бы сделал некую программную прослойку, через которую производилось бы "общение" других частей проекта.
А уже эта "прослойка" сама переключала бы канал обмена в зависимости от ситуации.
Т.е. прозрачно для кода.
Эта прослойка может быть еще одной задачей в рамках ОС со своими правилами и алгоритмами поведения в случае сбоев и обрывов.
Главное ограничение такой модели построения проекта: никто не должен пытаться напрямую общаться по конкретным канала связи, минуя эту прослойку!
В терминах ООП это называется "инкапсуляция".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Ruslan1 @ Dec 27 2017, 14:26) <{POST_SNAPBACK}>
Вопрос: как красиво (просто, надежно) сделать автоматический переход на приоритетный канал общения?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(scifi @ Dec 27 2017, 16:23) <{POST_SNAPBACK}>
Там есть функция 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Ruslan1 @ Dec 29 2017, 19:24) <{POST_SNAPBACK}>
Согласно описанию того же netif_set_default(), где-то существует возможность задать "specific route", но вот что-то я совсем туплю, не могу понять как это сделать

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(scifi @ Dec 29 2017, 19:17) <{POST_SNAPBACK}>
Здрассте. "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 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Ruslan1 @ Dec 29 2017, 22:45) <{POST_SNAPBACK}>
#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) <{POST_SNAPBACK}>
#2:
Прибору дана команда валить по UDP данные. Кабель воткнут, данные бегут. Но соединение с интернетом нет, и достигнуть нужного для отсылки данных ftp через локалку невозможно. Подключается модем, устанавливается соединение, дефолтовым становится ppp, и соединение с ftp работает. Но, как я понимаю, в это время в ppp также пойдут и все UDP пакеты, так как это дефолтовый интерфейс?
Получается что да, все UDP пакеты польются тоже в ppp ?

Именно так. Опять же, своя обработка маршрутизации поможет это решить.
Но для начала почитайте немного про азы. IP, адресация, подсети, сетевые маски, шлюзы. Там всё крайне просто, а без этого элементарного знания ничего толкового не сделаете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Ruslan1 @ Dec 29 2017, 22:45) <{POST_SNAPBACK}>
...
#1:
Подключена локалка...
Обязательно ли для этого действа переключить интерфейс в дефолтовый езернет?
Получается, что обязательно?

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


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


как то так
(круглый)
Изменено пользователем kolobok0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(scifi @ Dec 29 2017, 23:04) <{POST_SNAPBACK}>
Но для начала почитайте немного про азы. 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) <{POST_SNAPBACK}>
Ситуация распадается на:
- перенаправлять пакеты в рукопашную
-- по определённому правилу(тип пакета, наличие коннекта, другие условия) перенаправлять или дропить пакеты.
- заюзать, что нить готовое
-- (как уже прозвучало выше) 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

Ну и да, опять посмотрю "азы". Мало ли что я уже забыл за давностью востребованности информации (это только один из многих вопросов, вот и получается, что углубляюсь только по нужде. Очень мешает, что в сутках так мало часов).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация