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

时间:2012-03-30 10:13:23

标签: c linux linux-kernel

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

3 个答案:

答案 0 :(得分:1)

定义了ioctls SIOCGIFADDR(获取if地址)和SIOCSIFADDR(设置if地址)。

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

答案 1 :(得分:1)

想要读取设计问题的接口地址。但是,如果您正在寻找确定在联系远程对等方时使用的首选源地址,则在使用struct rt6_info.rt6i_prefsrc获取远程对等方后,在ip6_route_output中提供该地址。有些事情(没有暗示保证):

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;
}

答案 2 :(得分:0)

我们在 linux-xyz / Documentation / networking / ifenslave.c 文件中提供了 if_getconfig 功能,这是如何使用ioctls和获取地址的一个非常好的示例内核空间