LINUX.ORG.RU

Re: несколько сетевых интерфейсов и модемов

наверное, это в admin? вам нужно настроить route.

вообще-то, вы (кажется) можете использовать source routing,
передав ip_options в msghdr (IP_RETOPTS), но вряд ли вы это
имели в виду. и не спрашивайте, как конкретно это сделать,
я не разбирался.

ну или raw socket.

idle ★★★★★ ()

Re: несколько сетевых интерфейсов и модемов

> SO_BINDTODEVICE

а вы это пробовали? я - нет, но глядя на
net/ipv4/route.c:ip_route_output_slow()
мне кажется, что это не будет работать.

точнее будет, но только в том случае, если
у нас _нет_ маршрута для этого пакета:

net/ipv4/route.c:ip_route_output_slow()
2480          if (fib_lookup(&fl, &res)) {  // нет маршрута
2481                  res.fi = NULL;
2482                  if (oldflp->oif) {    // смотрим на SO_BINDTODEVICE

если ошибаюсь - поправьте.

idle ★★★★★ ()

Re: несколько сетевых интерфейсов и модемов

Честно сказать, нет. Я пробовал через пакетный сокет.

int open_packet_socket(const char* dev)

{

if(!dev)

dev="eth0";

int ps=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));

if(ps>0)

{

struct sockaddr_ll paddr;

struct ifreq ifr;

strcpy(ifr.ifr_name,dev);

ioctl(ps,SIOCGIFINDEX,&ifr);

paddr.sll_family =AF_PACKET;

paddr.sll_protocol=htons(ETH_P_ALL);// Physical layer protocol

paddr.sll_ifindex =ifr.ifr_ifindex; // Interface number

paddr.sll_hatype =0; // Header type

paddr.sll_pkttype =PACKET_BROADCAST; // Packet type

memset(paddr.sll_addr,0xff,sizeof(paddr.sll_addr));// address

paddr.sll_halen =6; // Length of address

ioctl(ps,SIOCGIFFLAGS,&ifr);

ifr.ifr_flags|=(IFF_PROMISC|IFF_ALLMULTI);

ioctl(ps,SIOCSIFFLAGS,&ifr);

if(bind(ps,(struct sockaddr*)&paddr,sizeof(paddr))!=0)

{

close(ps);

return -1;

}

}

return ps;

}

anonymous ()

Re: несколько сетевых интерфейсов и модемов

Спасибо всем кто ответил.

Проблему решил. Дело в том, что если даже и сделать bind сокета к интерфейсу, они все равно роутятся через какой-нибудь интерфес (что в принципе для меня странно), если пакет попадает под правило роутинга этого интерфейса (т.е. заголовки пакета IP содержать исходный адрес ip ppp0, а шлются через eth0:). Все что нужно было, это подкорректировать таблицы маршрутизации.

anonymous ()

Re: несколько сетевых интерфейсов и модемов

Другой вопрос: кто знает как программно изменить таблицу маршрутизации? Т.е. как добавить или удалить из таблицы маршрутизации запись из программы, не обращаясь к утилите route?

Спасибо.

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