2012-03-30 124 views
1

我正在編寫一個內核模塊,它在ip級別形成自己的數據包,然後發送數據。我只想知道如何找到本地網絡接口的IP地址。從內核模塊獲取本地網卡的IP地址

+0

網絡接口可以(並且將會)接收來自許多不同發件人的數據包。您從收到的數據包中獲得發件人。 – 2012-03-30 10:20:40

+0

@JoachimPileborg我想要我的接口的IP地址。沒有爲我的界面獲取IP地址的功能。我不想捕獲RX包,並從那裏採取,因爲我會產生交通 – karan421 2012-03-30 10:24:50

+0

我編輯的問題和標題,使其更清晰。 – 2012-03-30 10:49:00

回答

1

定義了ioctl SIOCGIFADDR(獲取地址)和SIOCSIFADDR(設置地址)。

IPv4的所有設備配置都在net/ipv4/devinet.c中完成。你可以參考這個源文件來獲取更多信息。

+0

我想在內核空間使用ioctl的IP地址.....我怎麼能做到這一點..please告訴通過編寫代碼 – karan421 2012-03-30 14:50:40

1

想讀取設計問題的接口地址reeks。但是,如果您正在尋找在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; 
} 
+0

這段代碼似乎是ip 6我需要ip 4 – karan421 2012-03-30 16:34:58

+0

這是類似的IPv4(請參閱net/netfilter/xt_TEE.c的骨架)。 prefaddr然後在'struct rtable.rt_src' AFAICS中。 – 2012-03-30 16:42:31

0

我們有if_getconfig功能的linux-XYZ /文檔/網絡/ ifenslave.c文件可這是怎樣一個很好的例子使用ioctls並從內核空間獲取地址