Как привязать raw_socket к определенному интерфейсу в пространстве ядра? - PullRequest
0 голосов
/ 11 января 2011

Моя проблема в том, что когда я слушаю с PF_PACKET, я также получаю пакеты, которые отправляет мой ящик, и это нежелательно.

err_create = sock_create(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL), sock);

Вместо ETH_P_ALL я пробовал ETH_P_IP, но тогда я получаю только пакеты, отправленные на мойхост.Поэтому моя идея заключалась в том, чтобы привязать сокет к интерфейсу.С 'sockaddr_ll' я могу определить ifindex.Но я не нашел никакой функции для получения индекса моего интерфейса. Ioctl не работает в пространстве ядра.

..

memset(&my_addr, 0, sizeof(struct sockaddr_ll));
my_addr.sll_family = PF_PACKET;
my_addr.sll_protocol = htons(ETH_P_ALL);
// my_addr.sll_ifindex = 2; //I tried different numbers.. but then I got no packets 

err_bind = sock->ops->bind(sock, (struct sockaddr_ll *)&my_addr, sizeof(my_addr));

Любая помощь будет оценена

1 Ответ

0 голосов
/ 09 февраля 2011

Я не уверен в том, что вы пытаетесь сделать, но вы можете посмотреть сетевое устройство в ядре через dev_get_by_name () .Но почему вы пытаетесь поймать пакеты в ядре ?Вот для чего нужен libpcap в userspace .

...