| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > сетевой драйвер |
| Автор: dima3351 10.11.2006, 17:32 |
| Я учусь писать сетевые драйверы. Реализовал функцию hard_start_xmit, которая, как я понимаю, вызывается, если модуль передает пакет. Также реализовали и прием пакета через обработчик прерываний. это все замечательно. теперь мы пытаемся написать прогу, работающую с этим драйвером. делаю в ней форк. в ветке N1 socket(AF_UNIX, SOCK_STREAM, 0) my_addr.sin_family = AF_UNIX; my_addr.sin_port = htons(50); my_addr.sin_addr.s_addr = "100.100.100.100"; memset( &(my_addr.sin_zero), '\0', 8); bind(sfd, (struct sockaddr*) &my_addr, sizeof(struct sockaddr); listen(sfd, 10); в ветке N2 socket(AF_UNIX, SOCK_STREAM, 0); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(50); dest_addr.sin_addr.s_addr = "100.100.100.100"; memset( &(dest_addr.sin_zero), '\0', 8); connect(sfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)) connect не срабатывает, пишет Invalid parametr в чем дело? параметры у bind в ветке 1 и connect в ветке 2 одинаковы... |
| Автор: MAKCim 10.11.2006, 18:23 | ||
| dima3351, в ветке 2 что-то непонятно т. е создается локальный сокет
но в sin_family указывается почему то AF_INET что за тип у dest_addr? (должен быть struct sockaddr_un из <sys/un.h>) |
| Автор: dima3351 10.11.2006, 19:43 | ||||
да, глюк, пробовал и так и так - не помогает.
читал http://www.beej.us/guide/bgnet/output/htmlsingle/bgnet.html#connect, тип соответственно struct sockaddr_in. А реально, что именно это приводит к ошибке? Опробую. |
| Автор: MAKCim 10.11.2006, 20:23 | ||
| dima3351 для локальных сокетов порт и адрес указывать не надо надо: - семейство протоколов (в данном случае AF_UNIX) - path т. е
|
| Автор: bsa 11.11.2006, 01:00 |
| dima3351, прежде чем грешить на свой драйвер, попробуй ту же программу запустить на одном из стандартных. Если заработает, то виноват драйвер, если нет - прога. |
| Автор: dima3351 13.11.2006, 12:28 | ||||||
спасибо за ответы)
мне нужно, чтобы к моему устройству можно было бы обращаться чезер IP. для этого я поднимаю его, указывая IP ifconfig mcb address 100.100.100.100 up (при этом драйвер реагирует нормально, запускается функция open) а потом пытаюсь работать в программе так
но уже эти строчки не работают: bind(): -1 Cannot assign requested address
хм, а не подскажите какой-нибудь несложный ethernet драйвер? Мне в нем покопаться оччень полезно будет. |
| Автор: MAKCim 13.11.2006, 15:46 | ||
за несложность ручаться не могу drivers/net/8139cp.c |
| Автор: GrayCardinal 17.11.2006, 12:27 |
| MAKCim, Это сложный ;p drivers/net/8139too.c - наш выбор dima3351, Извиняюсь что припозднился... Кода, так понимаю - не будет ? Значит так, на пальцах : Упс, сорри, прозевал две строчки ифконфа... Но вообще, там AF_INET должно быть везде, это точно Добавлено @ 12:37 Вот эту шнягу замените : my_addr.sin_addr.s_addr = "100.100.100.100"; на inet_aton ("100.100.100.100", &my_addr.sin_addr). формат-то сетевой........ Добавлено @ 12:39 Объясните мне кто-нибудь каким боком тут AF_UNIX ? |
| Автор: dima3351 17.11.2006, 13:25 | ||
| большое спасибо за ответы! потихоньку ситуация проясняется. AF_UNIX здесь действительно абсолютно левый. на чем остановился сечас: (весь код не привожу, дабы не загромождать тему. если нужно - могу весть сюда скопипастить)
Ошибка возникает при connect(): Address family not supported by protocol При этом netstat -a пишет Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:9000 *:* LISTEN то есть все вроде нормально. теперь, как я понимаю, надо прикрутить в драйвере поддержку AF_INET? |
| Автор: GrayCardinal 17.11.2006, 15:02 | ||
| dima3351, Поддержка AF_INET там по дефолту Вообще пока пакеты не начнут уходить _через_ девайс, девайс ничего и не делает. Т.е. регистрация, все у тебя на компе локальный девайс с таким-то IP. И все это все равно через loopback А дальше /sbin/route GW, как я понимаю................................. ЗЫ
А вот этого быть не должно... Скорее всего просто надо в sizeof давать не sockaddr а sockaddr_in |
| Автор: dima3351 18.12.2006, 15:32 | ||
| привет! Я опять вернулся к своему драйверу. Сеичас точно определил, что ошибка в нем, тестовые программы бегают под loopback, но не бегуют под мои драйвер. Первая ошибка, которую я нашел было то, что не были проинициализированы поля структуры struct net_device. Помогите найти глюк... Ошибку прога выдает ту же: Address family not supported by protocol
|
| Автор: GrayCardinal 19.12.2006, 04:40 |
| dima3351, И где в приведенном куске, даже чисто теоретически, может быть ошибка ? В куче операторов "=" ? |
| Автор: BlackStar 19.12.2006, 13:03 | ||
И с чего бы им бегать если mcb2_hsx возращает ноль. Советую посмотреть реализацию сетевых драйверов здесь: * виртуальные /usr/src/linux/drivers/net/dummy.c /usr/src/linux/drivers/net/loopback.c *аппаратные /usr/src/linux/drivers/net/pci-skeleton.c /usr/src/linux/drivers/net/isa-skeleton.c |
| Автор: dima3351 19.12.2006, 13:49 |
| BlackStar огромное спасибо, особенно за ссылку на /usr/src/linux/drivers/net/dummy.c! Как раз то, что мне нужно, чтоб разобраться. GrayCardinal а вот есть тут ошибки! не хватает тут многого... |
| Автор: GrayCardinal 19.12.2006, 15:01 |
| dima3351, И ? Предлагаете дописать ? |
| Автор: dima3351 19.12.2006, 19:34 |
| да нет конечно же) вообще надо было мне еще давно сказать /usr/src/linux/drivers/net/dummy.c и я был бы щастлив) |
| Автор: BlackStar 19.12.2006, 19:43 |
| Обращайся, рад был помочь. |
| Автор: GrayCardinal 20.12.2006, 09:59 |
| dima3351, Ну я тебя не так понял значит Но вслудующий раз стоит просто спросить "Где копнуть". Пошлют куда надо, гарантия Галку поставьте на тему. |
| Автор: dima3351 29.1.2007, 12:29 |
| Продолжаю непонимать... Вот есть у нас 2 сетевых "устройства": [root@ws11 cs]# ifconfig dummy0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 inet addr:127.0.0.2 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:376 errors:0 dropped:0 overruns:0 frame:0 TX packets:376 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:32168 (31.4 Kb) TX bytes:32168 (31.4 Kb) Предположим, я запустил некоторое простейшую серверную программку... [root@ws11 cs]# ./server 80000 & ...и клиент к нему [root@ws11 cs]# ./client 127.0.0.2 qwer 80000 Сервер нормально пишет, что к нему кто-то подключился... Client connected: 127.0.0.2 Received: qwer Но, посмотрев еще раз вывод ifconfig, видим, что пакеты шли через loopback... lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:831 errors:0 dropped:0 overruns:0 frame:0 TX packets:831 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:73464 (71.7 Kb) TX bytes:73464 (71.7 Kb) Читаем заголовок dummy.c: The purpose of this driver is to provide a device to point a route through, but not to actually transmit packets. Ага, значит так и должно быть (?) Получается, что dummy.c не позволяет даже передавать пакеты, только устанавливать соединение (?) Поправьте меня, если не прав. Тут я подумал - ну тогда надо посмотреть этот самый loopback.c, через который мои пакеты таки доходят. В нем регистрация проходит не через стандартные module_init и module_exit, а через статическую компиляцию с другими сишниками (net_init.o), но это не самое главное. Плохо то, что я не вижу в нем сильных отличий от dummy. Похожее заполнение struct net_device, похожее hard_start_xmit... В чем фишка-то? Объясните плз... |
| Автор: BlackStar 1.2.2007, 15:09 |
| Честно говоря сам до конца не понимаю как работает dummy, но различие с loopback.c в hard_start_xmit: dummy осбождает пакет (dev_kfree_skb), loopback отправляет его на верхний уровень (netif_rx). |