Преобразование сетевого порядка байтов IP в порядок байтов хоста в формате ip4 в модуле ядра - PullRequest
0 голосов
/ 20 декабря 2018

Я пишу модуль ядра в Arch Linux с языком .Я хочу преобразовать сетевой IP-адрес в IP-адрес хоста в формате ip4: 127.0.0.1

Я знаю, что в пользовательской программе можно использовать следующие функции:

inetntoa()
ntohs()
ntohl()

Я попытался включитьsocket.h, in.h и т. Д. И используйте приведенные ниже функции, но ни одна из них не работает для меня.

Так что в модуле ядра у меня нетдоступ к этой функции.Есть ли в модуле ядра замена для этих функций?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

У вас есть доступ к ntohl() и друзьям.Просто #include <linux/byteorder/generic.h>.Используйте его как обычно:

__le32 le_ipaddr = ntohl(be_ipaddr); /* to flip big-endian IP to little-endian */

Также вы можете без проблем печатать IPv4-адрес через специальный спецификатор формата %pI4 в printk(), например, таким образом:

__be32 ipaddr /*= gain from somewhere IP in network byte order (__be32 means big endian)*/;
printk(KERN_INFO "Got IP: %pI4\n", &ipaddr); /* in network byte order */
printk(KERN_INFO "Got IP: %pI4h\n", &ipaddr); /* in host byte order */

Читайте также:

IP-адрес от sk_buff

Как правильно получить спецификаторы формата printk (от Kernel.org):

Передано по ссылке.

IPv4-адреса

=============

::

% pI4 1.2.3.4

% pi4 001.002.003.004

...

Дополнительные h, n, bl спецификаторы используются для указания адресов хоста, сети, большого или младшего порядка соответственно.Там, где не указан спецификатор, используется стандартный / порядковый порядковый номер по умолчанию.

...

Передано по ссылке.

IPv6-адреса

==============

::

% pI6 0001: 0002: 0003: 0004: 0005: 0006: 0007: 0008

% pi6 00010002000300040005000600070008

% pI6c 1: 2: 3: 4: 5: 6: 7: 8


PS вы можете искать функции, которые выНужны исходные коды ядра Linux, например, на этом сайте: https://elixir.bootlin.com/linux/latest/ident/

0 голосов
/ 20 декабря 2018

Если под «сетевым IP» вы подразумеваете 32-разрядное целое число с прямым порядком байтов, представляющее IPv4, которое вы хотите преобразовать в представление с точечно-десятичной строкой, то это можно сделать с помощью sprintf().

* 1003.*

ipstr будет содержать строку с IP-адресом.

...