LINUX.ORG.RU

еще раз о сетевых драйверах


0

0

Я учусь писать сетевые драйверы. Реализовал функцию hard_start_xmit, которая, как я понимаю, вызывается, если модуль принимает пакет. Также реализовали и прием пакета через обработчик прерываний.

это все замечательно.

теперь мы пытаемся написать прогу, работающую с этим драйвером. пишем: socket() - возвращается не 0 bind() - тоже проходит успешно но когда делам listen(), чтобы слушать сокет, возвращается -1 и пишется operation not supported как я понимаю, я не написал какую-нибудь функцию в драйвере. это так? и, если так, не подскажите, что я упустил?

Проверь, что тип сокета - SOCK_STREAM. Ты не можешь слушать на UDP сокете.

anonymous
()

для справки 1) hard_start_xmit вызывается когда модуль передает пакет в сеть (принимает от верхнего уровня) (если вы конечно имеете в виду dev->hard_start_xmit())

2) сетевые драйверы (aka net_device) и socket interface не имеют между собой такой близкой и непосредственной связи :) (по крайней мере под Linux)

anonymous
()
Ответ на: комментарий от anonymous

1) ага, знаю) 2) а между чем и сетевыми драйверами (aka net_device) есть близкая и непосредственная связь?

dima3351
() автор топика

продолжение вопроса:

делаю форк.

в ветке 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 одинаковы...

dima3351
() автор топика
Ответ на: комментарий от dima3351

модулями сетевых протоколов ИМХО.

anonymous
()
Ответ на: комментарий от dima3351

Рано вам драйверами заниматься, начните с сетевых приложений в юзерленде.

Dr_ZLO
()
Ответ на: комментарий от dima3351

>my_addr.sin_family = AF_UNIX; >dest_addr.sin_family = AF_INET;

должны быть одинаковые

и для AF_UNIX надо использовать struct sockaddr_un, а длину получать с помощью SUN_LEN

// max

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.