从内核模块获取本地NIC的ip地址

从内核模块获取本地NIC的ip地址,c,linux,linux-kernel,C,Linux,Linux Kernel,我正在编写一个内核模块,它在ip级别形成自己的数据包,然后发送数据。我只想知道如何找到本地网络接口的ip地址。有定义的IOCTLSIOCGIFADDR(获取if地址)和SIOCSIFADDR(设置if地址) IPv4的所有设备配置都在net/IPv4/devinet.c中完成。您可以参考此源文件以获取更多信息 想要读取接口说明设计问题。但是,如果您想确定在联系远程对等方时使用的首选源地址,请在使用ip6\u route\u输出获取后,在struct rt6\u info.rt6i\u prefs

我正在编写一个内核模块,它在ip级别形成自己的数据包,然后发送数据。我只想知道如何找到本地网络接口的ip地址。

有定义的IOCTL
SIOCGIFADDR
(获取if地址)和
SIOCSIFADDR
(设置if地址)


IPv4的所有设备配置都在
net/IPv4/devinet.c
中完成。您可以参考此源文件以获取更多信息

想要读取接口说明设计问题。但是,如果您想确定在联系远程对等方时使用的首选源地址,请在使用
ip6\u route\u输出获取后,在
struct rt6\u info.rt6i\u prefsrc
中给出。大致如下(无隐含保证):


我们在linux-x.y.z/Documentation/networking/ifenslave.c文件中提供了if_getconfig函数,这是如何使用ioctls和从内核空间获取地址的一个很好的示例

网络接口可以(也将)从许多不同的发送方接收数据包。您从收到的数据包中获取发件人。@JoachimPileborg我想要接口的ip地址。没有为我的接口获取ip地址的功能。我不想捕获rx数据包并从中获取信息,因为我将生成流量。我编辑了问题和标题以使其更清楚。我想在内核空间中使用ioctl作为ip地址……我该怎么做……请通过编写代码来说明它与IPv4类似(请参阅net/netfilter/xt_TEE.c了解骨架)。prefaddr然后位于
struct rtable.rt\u src
AFAICS中。
int pick_addr(struct in6_addr *saddr, struct net *net, const struct in6_addr *daddr)
{
    struct rt6_info *rt;
    struct flowi6 fl6;
    int ret;
    memset(&fl6, 0, sizeof(fl6));
    memcpy(&fl6.daddr, daddr, sizeof(*daddr));
    dst = (struct rt6_info *)ip6_route_output(net, NULL /* or sk if you have it */, &fl6);
    ret = rt->dst.error;
    if (ret == 0)
            memcpy(saddr, &rt->rt6i_prefsrc.addr, sizeof(*saddr));

    dst_release(&rt->dst);
    return ret;
}