我正在编写一个内核模块,它在ip级别形成自己的数据包,然后发送数据。我只是想知道如何找到本地网络接口的IP地址。
答案 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和获取地址的一个非常好的示例内核空间