OVH Cloud OVH Cloud

Tester l'appartenance d'une IP a un reseau

3 réponses
Avatar
Vincent Bernat
Bonjour,

J'ai comme donnée une IP sous la forme d'un struct in_addr et un
réseau défini pour le moment par une chaîne contenant sa notation CIDR
(network/mask). Existe-t-il une fonction toute faite pour tester
l'appartenance de l'IP au réseau ? Ou dois-je additionner le découpage
de network/mask, la conversion de la partie IP en un entier avec
inet_aton, la conversion du masque en un entier, etc ?

inet_network() semble assez proche, mais il ne prend pas la notation
CIDR.
--
prom_printf("Detected PenguinPages, getting out of here.\n");
2.0.38 /usr/src/linux/arch/sparc/mm/srmmu.c

3 réponses

Avatar
octane
Bonjour,

J'ai comme donnée une IP sous la forme d'un struct in_addr et un
réseau défini pour le moment par une chaîne contenant sa notation C IDR
(network/mask). Existe-t-il une fonction toute faite pour tester
l'appartenance de l'IP au réseau ? Ou dois-je additionner le découpage
de network/mask, la conversion de la partie IP en un entier avec
inet_aton, la conversion du masque en un entier, etc ?

inet_network() semble assez proche, mais il ne prend pas la notation
CIDR.

Je dirais qu'il suffit de faire un & logique puis de comparer

avec le reseau, mais je ne suis pas persuade d'avoir compris
la question.

Avatar
Vincent Bernat
OoO En ce début d'après-midi nuageux du mardi 27 septembre 2005, vers
14:22, disait:

J'ai comme donnée une IP sous la forme d'un struct in_addr et un
réseau défini pour le moment par une chaîne contenant sa notation CIDR
(network/mask). Existe-t-il une fonction toute faite pour tester
l'appartenance de l'IP au réseau ? Ou dois-je additionner le découpage
de network/mask, la conversion de la partie IP en un entier avec
inet_aton, la conversion du masque en un entier, etc ?

inet_network() semble assez proche, mais il ne prend pas la notation
CIDR.

Je dirais qu'il suffit de faire un & logique puis de comparer

avec le reseau, mais je ne suis pas persuade d'avoir compris
la question.


Je cherchais une fonction qui fasse tout ça quelque part dans la
libc. J'ai fait à la main, ça marche, mais c'est plus long. :)
--
panic ("No CPUs found. System halted.n");
2.4.3 linux/arch/parisc/kernel/setup.c


Avatar
Vincent Bernat
OoO En cette fin de matinée radieuse du lundi 26 septembre 2005, vers
11:32, je disais:

J'ai comme donnée une IP sous la forme d'un struct in_addr et un
réseau défini pour le moment par une chaîne contenant sa notation CIDR
(network/mask). Existe-t-il une fonction toute faite pour tester
l'appartenance de l'IP au réseau ? Ou dois-je additionner le découpage
de network/mask, la conversion de la partie IP en un entier avec
inet_aton, la conversion du masque en un entier, etc ?

inet_network() semble assez proche, mais il ne prend pas la notation
CIDR.


Pour les archives, j'ai fait comme ça :

Fonction qui teste l'appartenance d'une IP à un réseau :

int in_network(struct in_addr *ip, struct in_addr *net, unsigned int cidr) {
return ((ip->s_addr & htonl(0xFFFFFFFF << (32 - cidr))) == net->s_addr);
}

Et pour parser une chaÎne du type ip/cidr

int parse_network(char *network, struct in_addr *net, int *cidr) {
char *cidr_s;
/* We seek for '/' */
if ((cidr_s = index(network, '/')) == NULL) {
/* No network part, this is an error */
syslog(LOG_ERR, "Unable to extract mask from %s", network);
return 0;
}
cidr_s++;
*cidr = atoi(cidr_s);
if (*cidr < 0 || *cidr > 32) {
syslog(LOG_ERR, "CIDR is not in 0..32 range in %s", network);
return 0;
}

/* We convert the IP */
*(--cidr_s) = '';
if (inet_aton(network, net) == 0) {
*cidr_s = '/';
syslog(LOG_ERR, "Not a valid IP : %s", network);
return 0;
}
*cidr_s = '/';
return 1;
}

Cette fonction a l'horrible désavantage de ne pas fonctionner avec le prototype
int parse_network(const char *network, struct in_addr *net, int *cidr)...
--
printk("Cool stuff's happening!n")
2.4.3 linux/fs/jffs/intrep.c