gpt4 book ai didi

在内核模块中将网络字节序IP转换为ip4格式的主机字节序

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:02 28 4
gpt4 key购买 nike

我正在用 在 Arch Linux 中编写一个内核模块语言。我想将网络IP转换为ip4格式的主机IP:127.0.0.1

我知道在用户程序中可以使用这些函数:

inetntoa()
ntohs()
ntohl()

我尝试包含 socket.hin.h 等并使用以下函数,但它们都不适合我。

所以在内核模块中我无法访问这个函数。内核模块中是否有此功能的替代品?

最佳答案

您可以访问 ntohl()和 friend 。就#include <linux/byteorder/generic.h> .像往常一样使用它:

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

您还可以通过特殊格式说明符 %pI4 轻松打印 IPv4 地址。在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-address from sk_buff

How to get printk format specifiers right (来自 Kernel.org):

Passed by reference.

IPv4 addresses

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

::

%pI4 1.2.3.4

%pi4 001.002.003.004

...

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 addresses

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

::

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

%pi6 00010002000300040005000600070008

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


附言您可以在 Linux 内核源代码中搜索所需的功能,例如在这个网站上:https://elixir.bootlin.com/linux/latest/ident/

关于在内核模块中将网络字节序IP转换为ip4格式的主机字节序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53860258/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com