Frage

Ich schreibe ein Kernel-Modul, das ein Netfilter Hook registriert. Ich versuche, die IP-Adresse des Anrufers zu erhalten, indem das sk_buff->saddr Element verwendet. Gibt es eine Möglichkeit ich die IP-in für Menschen lesbaren heißt x.x.x.x Format bekommen?

fand ich die Funktion inet_ntop() aber es scheint nicht in der Kernel-Header zur Verfügung zu stehen. Wie konvertiere ich \ XC0 \ XA8 \ x00 \ x01 bis 192.168.0.1?

War es hilfreich?

Lösung

Es gibt zwei definierte Makros in include / linux / kernel.h

NIPQUAD für IPv4-Adressen und NIP6 für IPv6-Adressen.

#define NIPQUAD(addr) \
    ((unsigned char *)&addr)[0], \
    ((unsigned char *)&addr)[1], \
    ((unsigned char *)&addr)[2], \
    ((unsigned char *)&addr)[3]

#define NIP6(addr) \
    ntohs((addr).s6_addr16[0]), \
    ntohs((addr).s6_addr16[1]), \
    ntohs((addr).s6_addr16[2]), \
    ntohs((addr).s6_addr16[3]), \
    ntohs((addr).s6_addr16[4]), \
    ntohs((addr).s6_addr16[5]), \
    ntohs((addr).s6_addr16[6]), \
    ntohs((addr).s6_addr16[7])

Es gibt genügend Beispiele in den Kernel-Quellen, die Verwendung dieser drucken IP-Adressen in für Menschen lesbaren Format zu machen. Zum Beispiel:

printk(KERN_DEBUG "Received packet from source address: %d.%d.%d.%d!\n",NIPQUAD(iph->saddr));

Hope, das hilft.

Andere Tipps

Sie sollten die% pi4 erweiterten Formatbezeich von printk bereitgestellt () verwenden:

printk(KERN_DEBUG "IP addres = %pI4\n", &local_ip);

printk verarbeiten kann diese direkt an:

IPv4-Adressen:

%pI4    1.2.3.4
%pi4    001.002.003.004
%p[Ii]4[hnbl]

For printing IPv4 dot-separated decimal addresses. The 'I4' and 'i4'
specifiers result in a printed address with ('i4') or without ('I4')
leading zeros.

The additional 'h', 'n', 'b', and 'l' specifiers are used to specify
host, network, big or little endian order addresses respectively. Where
no specifier is provided the default network/big endian order is used.

Passed by reference.

IPv6-Adressen:

%pI6    0001:0002:0003:0004:0005:0006:0007:0008
%pi6    00010002000300040005000600070008
%pI6c   1:2:3:4:5:6:7:8

For printing IPv6 network-order 16-bit hex addresses. The 'I6' and 'i6'
specifiers result in a printed address with ('I6') or without ('i6')
colon-separators. Leading zeros are always used.

The additional 'c' specifier can be used with the 'I' specifier to
print a compressed IPv6 address as described by
http://tools.ietf.org/html/rfc5952

Passed by reference.

Referenz: https://www.kernel.org/doc/Documentation/ printk-formats.txt

Einfach. Die IP-Adresse in „x.x.x.x“ -Format ist gepunkteter Vierer für einen Grund. Jede Zahl steht für ein Byte, für insgesamt 4 Bytes in Ihrer Adresse.

Also, mit der 4-Byte-Adresse, Sie würden einfach den Dezimalwert jeden Bytes drucken.

quick and dirty Beispiel (printf mit Ausgabefunktion der Wahl ersetzen):

unsigned char *addr = (unsigned char*)sk_buff->addr;
printf("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);

Sie können mit strtol jedes Stück konvertieren, um es ganze Zahl ist Form.

/* Convinience union to __be32 to ip address  */
union ip_address {
    u8 a[4];
    __be32 saddr;
};

IP-Adresse erhalten werden kann, a [0] .a [1] .a [2] .a [3]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top