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

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....

Заранее спасибо.

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


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

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

 

Я бы сделал некую программную прослойку, через которую производилось бы "общение" других частей проекта.

А уже эта "прослойка" сама переключала бы канал обмена в зависимости от ситуации.

Т.е. прозрачно для кода.

Эта прослойка может быть еще одной задачей в рамках ОС со своими правилами и алгоритмами поведения в случае сбоев и обрывов.

Главное ограничение такой модели построения проекта: никто не должен пытаться напрямую общаться по конкретным канала связи, минуя эту прослойку!

В терминах ООП это называется "инкапсуляция".

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


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

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

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

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


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

Там есть функция 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

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


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

Согласно описанию того же netif_set_default(), где-то существует возможность задать "specific route", но вот что-то я совсем туплю, не могу понять как это сделать

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

Кстати, приделать сбоку обработку доп. маршрутов должно быть совсем не сложно. UPD: заглянул в lwip-2, там есть LWIP_HOOK_IP4_ROUTE() как раз для этого.

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


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

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

Кстати, приделать сбоку обработку доп. маршрутов должно быть совсем не сложно. UPD: заглянул в lwip-2, там есть LWIP_HOOK_IP4_ROUTE() как раз для этого.

Извините за примитивные вопросы и спасибо за ответы :)

 

реальные ситуации:

#1:

Подключена локалка, прибору присвоен (через DHCP) IP 192.***. В это же время, работает модем (ppp) и прибор имеет IP 10.***

Мне нужно понять, доступен ли интернет через локалку, для чего пробую пинговать что-нибудь (ну, например, 8.8.8.8).

Обязательно ли для этого действа переключить интерфейс в дефолтовый езернет?

Получается, что обязательно?

 

#2:

Прибору дана команда валить по UDP данные. Кабель воткнут, данные бегут. Но соединение с интернетом нет, и достигнуть нужного для отсылки данных ftp через локалку невозможно. Подключается модем, устанавливается соединение, дефолтовым становится ppp, и соединение с ftp работает. Но, как я понимаю, в это время в ppp также пойдут и все UDP пакеты, так как это дефолтовый интерфейс?

Получается что да, все UDP пакеты польются тоже в ppp ?

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


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

#1:

Подключена локалка, прибору присвоен (через DHCP) IP 192.***. В это же время, работает модем (ppp) и прибор имеет IP 10.***

Мне нужно понять, доступен ли интернет через локалку, для чего пробую пинговать что-нибудь (ну, например, 8.8.8.8).

Обязательно ли для этого действа переключить интерфейс в дефолтовый езернет?

Получается, что обязательно?

Не обязательно, если прикрутите LWIP_HOOK_IP4_ROUTE(). Он есть в lwip-2, не знаю за предыдущие версии, но приделать тривиально, всего пара строчек. Этот крючок может направлять 8.8.8.8 (его и только его, если нужно) на нужный интерфейс.

#2:

Прибору дана команда валить по UDP данные. Кабель воткнут, данные бегут. Но соединение с интернетом нет, и достигнуть нужного для отсылки данных ftp через локалку невозможно. Подключается модем, устанавливается соединение, дефолтовым становится ppp, и соединение с ftp работает. Но, как я понимаю, в это время в ppp также пойдут и все UDP пакеты, так как это дефолтовый интерфейс?

Получается что да, все UDP пакеты польются тоже в ppp ?

Именно так. Опять же, своя обработка маршрутизации поможет это решить.

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

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


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

...

#1:

Подключена локалка...

Обязательно ли для этого действа переключить интерфейс в дефолтовый езернет?

Получается, что обязательно?

 

#2:

...так как это дефолтовый интерфейс?

Получается что да, все UDP пакеты польются тоже в ppp ?

 

5 копеек:

если рассматривать стэк без механизации маршрутиризации - то у вас на хосте (stm) есть два канала связи. Ситуация распадается на:

- перенаправлять пакеты в рукопашную

-- по определённому правилу(тип пакета, наличие коннекта, другие условия) перенаправлять или дропить пакеты.

- заюзать, что нить готовое

-- (как уже прозвучало выше) lwip-2 то что нужно копать на этот предмет в первую очередь

 

 

как то так

(круглый)

Изменено пользователем kolobok0

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


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

Но для начала почитайте немного про азы. 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)

 

Ситуация распадается на:

- перенаправлять пакеты в рукопашную

-- по определённому правилу(тип пакета, наличие коннекта, другие условия) перенаправлять или дропить пакеты.

- заюзать, что нить готовое

-- (как уже прозвучало выше) 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

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

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...