Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

setsockopt SO_BINDTODEVICE

5 réponses
Avatar
Zouplaz
Bonjour, j'ai posté dans les ng adéquats plusieurs questions sur
l'utilisation de SO_BINDTODEVICE, sans réponses (c'est une petite
application en C)...

Est-ce que quelqu'un ici pourrait m'aider (plusieurs appels ioctl suivis
d'un appel setsockopt) ??

Ca m'aiderait grandement, je m'en sors pas !

Comme c'est HS, vous pouvez m'écrire à jls-fjs@yahoo.fr (et enlever le
tiret avant).

Merci

5 réponses

Avatar
no_spam
On Sat, 06 Mar 2004 10:29:32 +0000, Zouplaz wrote:

Bonjour, j'ai posté dans les ng adéquats plusieurs questions sur
l'utilisation de SO_BINDTODEVICE, sans réponses (c'est une petite
application en C)...

Est-ce que quelqu'un ici pourrait m'aider (plusieurs appels ioctl suivis
d'un appel setsockopt) ??


Etrange, d'habitude, setsocktopt est plutôt fait au moment de la création
de la socket:
on crée la socket, on la paramêtre (setsockopt) et ensuite on s'en
sert (ioctl)...
Il me parait étrange de faire les ioctls avant le setsockopt....
Envoie moi ton bout de code, j'y jetterai un coup d'oeil...

Avatar
Zouplaz
no_spam - :

On Sat, 06 Mar 2004 10:29:32 +0000, Zouplaz wrote:

Bonjour, j'ai posté dans les ng adéquats plusieurs questions sur
l'utilisation de SO_BINDTODEVICE, sans réponses (c'est une petite
application en C)...

Est-ce que quelqu'un ici pourrait m'aider (plusieurs appels ioctl
suivis d'un appel setsockopt) ??


Etrange, d'habitude, setsocktopt est plutôt fait au moment de la
création de la socket:
on crée la socket, on la paramêtre (setsockopt) et ensuite on s'en
sert (ioctl)...
Il me parait étrange de faire les ioctls avant le setsockopt....
Envoie moi ton bout de code, j'y jetterai un coup d'oeil...




Voici le code (expurgé des commentaires et tests d'erreurs, pour faire
plus court) :

1) Obtenir un socket
ssock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

2) Obtenir les paramètres de l'interface choisie
strcpy(interface_req.ifr_name,eth_name);
ioctl(ssock,SIOCGIFFLAGS,&interface_req);

3) Bind sur l'interface seulement
setsockopt(ssock, SOL_SOCKET,SO_BINDTODEVICE,eth_name,strlen(eth_name)+
1);

4) Mode promisc
interface_req.ifr_flags |= IFF_PROMISC;
ioctl(ssock,SIOCSIFFLAGS,&interface_req);


Avec 1,2 et 4 : J'intercepte le traffic de toutes les interfaces, ce que
je ne désire pas forcément.

Avec 1,2,3 et 4 : Ca change rien. Si je déplace 3 après 1, même résultat.

Si je rajoute l'appel suivant après 2) :
ioctl(sniff_socket,SIOCGIFINDEX,&interface_req);

L'appli est "bindée" sur eth1 (systématiquement) et eth0 et ppp0
disparaissent de ifconfig (je suis bon pour un service network reload).


J'ai du mal à trouver de la doc sur ces appels, à part des infos très
généralistes et assez floues (rien sur l'ordre d'enchainement des
appels)...

Si tu as une idée...


Merci


Avatar
no_spam
On Sun, 07 Mar 2004 12:29:34 +0000, Zouplaz wrote:

no_spam - :

On Sat, 06 Mar 2004 10:29:32 +0000, Zouplaz wrote:

Bonjour, j'ai posté dans les ng adéquats plusieurs questions sur
l'utilisation de SO_BINDTODEVICE, sans réponses (c'est une petite
application en C)...

Est-ce que quelqu'un ici pourrait m'aider (plusieurs appels ioctl
suivis d'un appel setsockopt) ??


Etrange, d'habitude, setsocktopt est plutôt fait au moment de la
création de la socket:
on crée la socket, on la paramêtre (setsockopt) et ensuite on s'en
sert (ioctl)...
Il me parait étrange de faire les ioctls avant le setsockopt....
Envoie moi ton bout de code, j'y jetterai un coup d'oeil...




Voici le code (expurgé des commentaires et tests d'erreurs, pour faire
plus court) :

1) Obtenir un socket
ssock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

2) Obtenir les paramètres de l'interface choisie
strcpy(interface_req.ifr_name,eth_name);
ioctl(ssock,SIOCGIFFLAGS,&interface_req);

3) Bind sur l'interface seulement
setsockopt(ssock, SOL_SOCKET,SO_BINDTODEVICE,eth_name,strlen(eth_name)+
1);

4) Mode promisc
interface_req.ifr_flags |= IFF_PROMISC;
ioctl(ssock,SIOCSIFFLAGS,&interface_req);



Je ne vois pas pourquoi ça ne marcherait pas...

J'ai du mal à trouver de la doc sur ces appels, à part des infos très
généralistes et assez floues (rien sur l'ordre d'enchainement des
appels)...


Dans le code du kernel :-)


Si tu as une idée...


J'ai regardé la libpcap, leur code est complètement différent.
Comme c'est du code qui marche, tu devrais sans doute t'en inspirer !



Avatar
Zouplaz
no_spam - :


J'ai du mal à trouver de la doc sur ces appels, à part des infos très
généralistes et assez floues (rien sur l'ordre d'enchainement des
appels)...


Dans le code du kernel :-)



De tête, tu sais pas dans quel coin de l'arborescence chercher ? (au moins
le rép)

Pour libcap, j'ai commencé à fouiner (ça peut aider), y aussi le code
d'iptraf qui est assez court (relativement)...


Avatar
no_spam
On Sun, 07 Mar 2004 13:46:19 +0000, Zouplaz wrote:

no_spam - :


J'ai du mal à trouver de la doc sur ces appels, à part des infos très
généralistes et assez floues (rien sur l'ordre d'enchainement des
appels)...


Dans le code du kernel :-)



De tête, tu sais pas dans quel coin de l'arborescence chercher ? (au moins
le rép)


dans net/core/sock.c pour les options génériques sur les sockets
(dont SO_BINDTODEVICE).
Ensuite, net/ipv4/ip_sockglue.c:ip_setsockopt
net/ipv4/raw.c:raw_setsockopt
et net/ipv4/tcp.c:tcp_setsockopt
pourront te donner des infos sur des options plus spécifiques.
D'une façon générale:
grep -r setsockopt *
dans net/ te donnera tous les endroits ou il y a des options pour
les sockets.

Et net/ipv4/af_inet.c:inet_bind et net/ipv4/raw:raw_bind
peuvent être interressants...

Pour libcap, j'ai commencé à fouiner (ça peut aider), y aussi le code
d'iptraf qui est assez court (relativement)...


C'est vrai.