Ruslan1 17 27 декабря, 2017 Опубликовано 27 декабря, 2017 · Жалоба Здравствуйте! В устройстве есть два вида соединения: 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 26 27 декабря, 2017 Опубликовано 27 декабря, 2017 · Жалоба Вопрос: как красиво (просто, надежно) сделать автоматический переход на приоритетный канал общения? Я бы сделал некую программную прослойку, через которую производилось бы "общение" других частей проекта. А уже эта "прослойка" сама переключала бы канал обмена в зависимости от ситуации. Т.е. прозрачно для кода. Эта прослойка может быть еще одной задачей в рамках ОС со своими правилами и алгоритмами поведения в случае сбоев и обрывов. Главное ограничение такой модели построения проекта: никто не должен пытаться напрямую общаться по конкретным канала связи, минуя эту прослойку! В терминах ООП это называется "инкапсуляция". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 27 декабря, 2017 Опубликовано 27 декабря, 2017 · Жалоба Вопрос: как красиво (просто, надежно) сделать автоматический переход на приоритетный канал общения? Там есть функция netif_set_default(), она как раз для этого. ЕМНИП, код PPP вызывает её, когда устанавливается соединение. Нужно сделать наоборот: закомментировать вызов netif_set_default() из PPP и, видимо, вызывать его для eth0 (не знаю, нужно ли это делать каждый раз или достаточно один раз при запуске). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 29 декабря, 2017 Опубликовано 29 декабря, 2017 · Жалоба Там есть функция 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 1 29 декабря, 2017 Опубликовано 29 декабря, 2017 · Жалоба Согласно описанию того же netif_set_default(), где-то существует возможность задать "specific route", но вот что-то я совсем туплю, не могу понять как это сделать Здрассте. "Specific route" - это когда адресат входит в диапазон адресов какого-то интерфейса (типа 192.168.0.x, как часто бывает). Всё остальное идёт в default interface, потому что куда ещё? У взрослых стеков есть статические маршруты, но в lwip этого нет, насколько я знаю. Кстати, приделать сбоку обработку доп. маршрутов должно быть совсем не сложно. UPD: заглянул в lwip-2, там есть LWIP_HOOK_IP4_ROUTE() как раз для этого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 29 декабря, 2017 Опубликовано 29 декабря, 2017 · Жалоба Здрассте. "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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 29 декабря, 2017 Опубликовано 29 декабря, 2017 · Жалоба #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, адресация, подсети, сетевые маски, шлюзы. Там всё крайне просто, а без этого элементарного знания ничего толкового не сделаете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 30 декабря, 2017 Опубликовано 30 декабря, 2017 (изменено) · Жалоба ... #1: Подключена локалка... Обязательно ли для этого действа переключить интерфейс в дефолтовый езернет? Получается, что обязательно? #2: ...так как это дефолтовый интерфейс? Получается что да, все UDP пакеты польются тоже в ppp ? 5 копеек: если рассматривать стэк без механизации маршрутиризации - то у вас на хосте (stm) есть два канала связи. Ситуация распадается на: - перенаправлять пакеты в рукопашную -- по определённому правилу(тип пакета, наличие коннекта, другие условия) перенаправлять или дропить пакеты. - заюзать, что нить готовое -- (как уже прозвучало выше) lwip-2 то что нужно копать на этот предмет в первую очередь как то так (круглый) Изменено 30 декабря, 2017 пользователем kolobok0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 30 декабря, 2017 Опубликовано 30 декабря, 2017 · Жалоба Но для начала почитайте немного про азы. 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 Ну и да, опять посмотрю "азы". Мало ли что я уже забыл за давностью востребованности информации (это только один из многих вопросов, вот и получается, что углубляюсь только по нужде. Очень мешает, что в сутках так мало часов). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться