Отговори на тема  [ 53 мнения ]  Отиди на страница 1, 2, 3, 4  Следваща
Вмъкване на паралелен TCP/IP интерфейс/стек в линукс 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Има линукс система с нейния си TCP/IP стек, етернет интерфейс и т.н. Към тази система по някакъв интерфейс, да кажем SPI, имам закачено ембедед процесорче със собствен етернет и собствен (затворен като код) TCP/IP стек. Кодът е това процесорче е доста нестандартен - не е lwip, има си специфично API през което са достъпни IP протоколите, да кажем TCP и UDP сокети. Т.е. няма достъп по L2 нивото през това АПИ.
Същото API прозрачно се вижда в линукса и мога да го ползват. В него има неща като отваряне на сокет, accept, connect, send, receive и т.н.
Търся начин да интегрирам този интерфейс в линукса, понеже там вървят разни приложения, които са TCP сървъри. Тези приложения си ползват BSD сокет апи-тата на линукса и си слухтят за връзка - това си работи през етернет дупката на линукс кутията. Същите услуги трябва сега да станат достъпни през етернет дупката на процесорчето. Това изисква когато линукския сървър отвори да слухти на ТЦП сокет 2000 (примерно) някакъв мой код да получи информация и да изиска през SPI-а другия TCP/IP стек също да отвори за слухтене порт 2000, както и след това останалите операции (приемане и предаване).
Търся дали в линукса има дефиниран начин това да се прави - т.е. да мога да регистрирам мой адаптер но на ниво IP. Очаквам да изискват от мен да имплементирам този дефиниран интерфейс с функции от типа отваряне на сокет, конект, пращане, приемане.
Има нещо като dummy интерфейс - https://ixnfo.com/en/creating-dummy-interfaces-on-linux.html
Това му е сорса: https://elixir.bootlin.com/linux/latest/source/drivers/net/dummy.c
Предполагам че този dummy модул се закача някъде там като ниво в стека - но понеже се modprobe-ва явно е кърнел модул, а мен някак ми се искаше да е userspace. Ясно че това е логично предвид че в линукс мрежовия стек се подвизава в кърнела, ама дали някой не е избарал нещо за ползване в user mode?


Сря Авг 28, 2019 7:58 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 10:53 pm
Мнения: 4174
Местоположение: Brussels / Пловдив
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
На първо четене говоря наизуст без претенции за коректност:
- би трябвало да може да се направи нещо само в юзер мод - но не виждам кой знае какви проблеми да си направиш един нормален драйвер и да си върви в кернела
- мисля, че разните мобилни модеми са доста близки като функционалност за това което ти трябва - няма да се учудя ако има и някакъв драйвер който минава всичко през AT команди т.е. сравнително лесно да го ползваш за основа и да си разпишеш всичко - разбира се не забравяй за GPL лиценза ...

_________________
Мразя да мразя ...


Нед Сеп 01, 2019 9:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Мда, тази посока е интересна - ще трябва да огледам как се закачат разни ppp/slip може би? Гледах че някъде там (около тип сокет) ще да е подходящо да се мушна - както например е вкаран CAN-а в SocketCAN.
Ако се наложи ще се прави и у кърнелОТ, но се надявам да ми се размине. За момента излезе друг приоритет, но след някой ден ще се върна на темата и ще ровя.
Благодаря!


Вто Сеп 03, 2019 7:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4671
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
а имаш ли ppp на дивайса ... то почти всичко "мобилно" е така

Azure Sphere ползват VPN през който минава ppp-то от уарта и влиза в линукса
https://3rdpartysource.microsoft.com/do ... 04/TAP.zip

_________________
main[-1u]={1};


Вто Сеп 03, 2019 7:17 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Не, нямам нищо стандартно - имам функции (по-точно съобщения) с които си говоря с ембедед процесора, в който върви затворен като код и много специфичен tcp/ip стек.
Функциите за достъп са достатъчно добри, но са само на ниво tcp и udp.
Нещо подобно ще да са на wiznet хардуерните tcp/ip - само че не намерих някой да ги е закачил на такова ниво. Което открих е драйвери с които прескачат стека и ползват чиповете като етернет контролери, но при мен не е възможно защото не са ми дали достъп до това ниво.


Вто Сеп 03, 2019 8:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 10:53 pm
Мнения: 4174
Местоположение: Brussels / Пловдив
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
gicho написа:
Мда, тази посока е интересна - ще трябва да огледам как се закачат разни ppp/slip може би? Гледах че някъде там (около тип сокет) ще да е подходящо да се мушна - както например е вкаран CAN-а в SocketCAN.
Ако се наложи ще се прави и у кърнелОТ, но се надявам да ми се размине. За момента излезе друг приоритет, но след някой ден ще се върна на темата и ще ровя.
Благодаря!

Времето ми е кът та не съм ровил да видя как би било най удачно да се подкара - интересен проблем е. Та като се върнеш пак на проблема, пиши ако имаш нужда от помощ и ще отделя час-два да поровя. За момента няма да се хабя, че и при мен приоритетите постоянно се сменят ...

_________________
Мразя да мразя ...


Сря Сеп 04, 2019 3:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Благодаря, като се поизмъча ще питам - и аз засега не съм отделил повече от няколко часа.


Сря Сеп 04, 2019 7:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Върнах се на темата и се боря с нови сили. Попаднах на описание на потока на данните в кърнела, което е доста смислено:
https://wiki.linuxfoundation.org/networking/kernel_flow
Някакъв студент е работил по темата и има подобна информация: http://home.ifi.uio.no/paalh/students/AndersMoe.pdf
Там има картинка на фунциите на отделните слоеве:
[img]Screenshot%20from%202019-09-21%2015-02-52.png[/img]
От там стигнах до сорсове, които изглеждат много близко до интерфейса, който търся:
https://elixir.bootlin.com/linux/latest/source/net/ipv4/tcp_ipv4.c#L2548
Тая структура "struct proto tcp_prot" има методите, които търся, поне като ниво. Ще ровя дали имам шанс да закача паралелно моя имплементация на тоя интерфейс, без да махна оригиналната - но си мисля че няма да стане. Тоя код там е който обслужва всички сокети за IPv4 - ако слагам паралелно мой модул на това ниво сигурно ще иска да обява друг протокол.
Остава да нахълтам в тоя код и да модифицирам за да добавя обслужването и на моите неща, но това не ми харесва като идея.
Из кода се споменава за "fallback device", ама май е на по-ниско ниво, трябва да ровя пак.

Като алтернатива трябва да разбера дали "tunneling" механизмите ще ми позволят да обявя виртуален ip адаптер и да имплементирам своя обработка когато има рутиране към него.
Другото е дали през netfilter функционалностите не мога да постигна същия ефект.

Като минимум задачата изисква да бъда известен когато произволно приложение в системата отвори слухтящ сокет (поне), и кога затваря, разбира се. От там мога в мой (user mode) код да се конкектна към този порт на localhost, и да си изпратя заявките към микроконтролера и неговия стек да отворят да слушат на същия порт. Когато получа от микроконтролера информация че има конект, данни, дисконект и т.н. да правя същите действия върху localhost връзките, които съм отворил в началото. Това ще ми е план Б, ако не намеря вече измислен подход за закачане на това ниво.

libnetfilter_conntrack имат нужните средства за да получа информацията и събития кога се отварят и затварят сокетите. Има и някакво libnetfilter_queue - може би за данните, сега ще чета там.

Edit: за libnetfilter_queue има и питонски байндинг и примерите звучат интересно - не че ще го ползвам от питона, но за първи проби и като информация какво е постижимо:
https://pypi.org/project/NetfilterQueue/


Съб Сеп 21, 2019 11:25 am
Профил
Online
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1954
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Имай едно на ум, че connection tracking може да го няма. Използва се при nat и ако не му трябва на ползвателя, може въобще да го няма компилиран в ядрото.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Съб Сеп 21, 2019 1:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4671
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
не каза ли в началото, че нямаш мрежов интерфейс, а само "виртуален" сокет

_________________
main[-1u]={1};


Съб Сеп 21, 2019 2:00 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Линукс устройството си има мрежови адаптери - един или два според модела. Освен тях в определени ситуации/конфигурации има закачен този микроконтролер, в който тича специфичен ОС и специфичен tcp/ip стек и специфичен мрежов адаптер, излизащ на специфична (трета) RJ45 букса. Най-близко като аналогия можем да си представим примерно RPi, което си има мрежа и примерно ssh към него при закачен rj45 кабел. Ако решим по spi или uart примерно да закачим едно esp8266 с фирмуер за AT команди, или wiznet с вграден хардуерен tcpip стек, то задачата е ssh сървъра в малинката да може да се достъпи през новата дупка - дали вифи за esp или мрежа за wiznet.
Целта е всички сървиси, които са достъпни през другите (нормални) етернет интерфейси да станат достъпни и през rj45 дупката на микроконтролера.
Ако conntrack го няма ще се ребилдва кърнела - това не е проблем, макар че се надявам да сме го пуснали навремето.
В момента има "някакво" решение, но създава проблеми - понеже не са знаели как да разберат създаването на сокет в линукса (т.е. кога е тръгнал ssh демона и ftp сървъра) са дефинирали един списък с портове, които автоматично при стартиране се "бриджват". Само че още ftp-то е осрало пейзажа - понеже през първата командна връзка по порт 21 се връща информация на кой друг порт да се закачат (за passive) се е наложило да следят данните по порт 21 и да си прихващат кой порт е избрал ftp сървъра. После са добавили още портове (като define с числа) и накрая списъка е станал сериозен, макар че в даден момент/конфигурация/приложение/клиент се ползват само няколко едновременно.
Надявам се да хвана събитията по отваряне и затваряне и това да замести твърдите списъци и сниффването на данните по порт 21. Но не искам да откривам топлата вода, ако вече има измислен механизъм за това в линукса.


Съб Сеп 21, 2019 9:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 10:53 pm
Мнения: 4174
Местоположение: Brussels / Пловдив
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Така като гледам няма да е много лесно да се направи това което ти трябва - това е при положение, че съм разбрал какво всъщност ти трябва а то е да ползваш този микроконтролер за tcp/ip комуникация през линукс. Първоначалната ми идея беше, че все някой ще е направил поддръжка за GPRS modem който има вграден TCP/IP стек с AT commands (например като на Telit "AT#GPRS=1") само, че не успях да намеря такъв. При това положение щом не можеш да пращаш/приемаш етернет пакети но пък можеш да отваряш сокети то няма смисъл да се опитваш да емулираш мрежови драйвер а по добре да се качиш едно ниво нагоре както и сам си се досетил като си погледнал в tcp_ipv4.c. Порових малко и в тази посока но не виждам някакво лесно решение. Според мен начинът е да се дефинира:
Код:
struct net_proto_family gicho_sock_family_ops = {
        ...
        .family = PF_INET,
        ...
}

Обаче не виждам някаква лесна имплементация която да преизползваш, то да не кажа, че е само една в net/ipv4/af_inet.c където в net_proto_family да се инициализира с PF_INET

Те това ми е грепа в сорса ако решиш да ровиш и ти (VIM+fugitive):
Код:
:Gg "\(\.family.*\<[AP]F_INET\>\|net_proto_family.*=\)"

... ако не ползваш VIM предполагам, че може и без промяна да го пуснеш и с git grep ...

Това от мен, ще поровя още малко но 6-тото чувство ми говори, че едва ли ще открия нещо повече ...

_________________
Мразя да мразя ...


Нед Сеп 22, 2019 12:44 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Да, явно ще се огранича да хващам създаването и унищожаването на сокети от conntrack и ще отварям нови сокети към локалхост за да правя софтуерно бриджването.
Пробвах netfilter_queue и успешно закачих питонския пример да бъде информиран за всеки tcp пакет е линукса (това на десктопа ми) - ама това върши работа да се закача във веригата за обработка и ако искам да го играя firewall или друг вид инспектиране на трафика. Ама при мен проблема е да подкарам трафика, а не да слухтя вече наличния. Като цяло само дето успях да си убия мрежата като спрях питонския инспектираш скрипт - той трябва да даде "accept" на всеки пакет, за който е известен, ама като не работи няма как да го потвърди.
В nuttx имат такъв механизъм - викат му USRSOCKET. В този документ споменават пример за ползването му:
https://nuttx2019.org/wp-content/uploads/2019/07/TKoizumi_nx2019.pdf
Но по него не намерих референции за подобно нещо у ЛинОксОТ...

Засега се насочвам програмно да получа събитията за сокетите (това което излиза като събития от "conntrack -E") и оттам да си connect-вам към локалхост и отделно да отварям сокета в микроконтролера през неговите API-та. Това е изходът от conntrack -E при отваряне на интерфейса на рутера ми като филтрирам по порт (само началото, има доста отдлени конекции от броузъра):
Код:
   [NEW] tcp      6 120 SYN_SENT src=192.168.1.142 dst=192.168.1.1 sport=40304 dport=80 [UNREPLIED] src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40304
[UPDATE] tcp      6 60 SYN_RECV src=192.168.1.142 dst=192.168.1.1 sport=40304 dport=80 src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40304
[UPDATE] tcp      6 432000 ESTABLISHED src=192.168.1.142 dst=192.168.1.1 sport=40304 dport=80 src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40304 [ASSURED]
    [NEW] tcp      6 120 SYN_SENT src=192.168.1.142 dst=192.168.1.1 sport=40306 dport=80 [UNREPLIED] src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40306
[UPDATE] tcp      6 120 FIN_WAIT src=192.168.1.142 dst=192.168.1.1 sport=40304 dport=80 src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40304 [ASSURED]
[UPDATE] tcp      6 60 CLOSE_WAIT src=192.168.1.142 dst=192.168.1.1 sport=40304 dport=80 src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40304 [ASSURED]
[UPDATE] tcp      6 59 SYN_RECV src=192.168.1.142 dst=192.168.1.1 sport=40306 dport=80 src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40306
[UPDATE] tcp      6 432000 ESTABLISHED src=192.168.1.142 dst=192.168.1.1 sport=40306 dport=80 src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40306 [ASSURED]
[UPDATE] tcp      6 30 LAST_ACK src=192.168.1.142 dst=192.168.1.1 sport=40304 dport=80 src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40304 [ASSURED]
[UPDATE] tcp      6 120 TIME_WAIT src=192.168.1.142 dst=192.168.1.1 sport=40304 dport=80 src=192.168.1.1 dst=192.168.1.142 sport=80 dport=40304 [ASSURED]


Нед Сеп 22, 2019 9:19 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
Въх, дърво...
conntrack работи с конекции (дали пък не беше ясно от името му...). Ама при мен конекции йок - първо трябва да хвана създаването на сокет, а не конекцията към него. Затова и conntrack -E мълчи като риба при отваряне на listening socket ( nc -l -p 1234). Обажда се чак като се закача от другаде към порт 1234, т.е. като пусна клиент и има връзка. Но при мен това няма да стане ако не съм прихванал създаването на сокета по-рано и не съм пуснал бриджването през специфичното tcp api.
Значи се връщам в първи клас и търся начин да прихвана създаването на сокета. Имаше тема в stackoverflow но там говорят да се закачам към кърнелските апи-та за отваряне - това е твърде нестандартно и не мисля да го правя. Имало и някакъв auditd ама него ще го гледам по-нататък.
Като начало ще направя някакъв поллинг с викане на netstat -l и може би grep, но дали има шел инструмент да ми връща промените? Нещо като diff ми трябва- целта е в края на реда да сложа мой тул, който да се вика само ако има промяна в таблицата върната от netstat -l - примерно "изчезна реда "tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN" "?
Има ли някакъв начин в шел скрипт който върви в бекграунд с закъснение примерно, да се спести овърхеда от създаването на процеси за netstat, grep, diff и т.н.? В смисъл да не е на всяка итерация на полинга да ми създава и унищожава няколко процеса? Със сигурност може да стане ако си го кодирам в едно приложение на C, ама целта ми е да съм мързелив :)
Реално ми трябва event механизъм, който да замени ламерския подход в периодично викане на netstat -l

Тц, за малко да стане ... ама не. Намерих че имало по-нов алтернатива на netstat - викала се ss: https://www.networkworld.com/article/3327557/using-the-linux-ss-command-to-examine-network-and-socket-connections.html
Има повече неща, дори успях да извадя от нея събитие за моя сокет без да го конектвам - но за съжаление сибитието е само когат спра сокета (затворя nc -l -p 1234). Ако излизаше и когато пускам nc-то щеше да е достатъчно - ама не, на пускане мълчи...
Пускам го така:
Цитат:
s -ltune -E

Ще видя дали не съм пропуснал някоя опция, с която би се навил да ме осведоми.


Нед Сеп 22, 2019 9:51 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4671
Мнение Re: Вмъкване на паралелен TCP/IP интерфейс/стек в линукс
имплементирай нов "празен" интерфейс в линукса който ще хуква сокет операции ... вътре "сложния" бридж който ще отваря сокети към платката и да препредава payload в двете посоки

EDIT: ако имаш L3 IP ... https://backreference.org/2010/03/26/tu ... -tutorial/

_________________
main[-1u]={1};


Нед Сеп 22, 2019 10:09 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 53 мнения ]  Отиди на страница 1, 2, 3, 4  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни