2012-03-30 2 views
1

私は、ipレベルで独自のパケットを形成し、データを送信するカーネルモジュールを作成しています。私はちょうどローカルネットワークインターフェイスのIPアドレスを見つける方法を知りたいです。カーネルモジュールからローカルNICのip-addressを取得

+0

ネットワークインターフェイスは、多くの異なる送信者からのパケットを受信できます。受信したパケットから送信者を取得します。 –

+0

@JoachimPileborg私のインターフェイスのIPアドレスが必要です。私のインターフェースのIPアドレスを取得する機能はありませんか?私はトラフィックを生成しているので、rxパケットをキャプチャしてそこから取得したくない – karan421

+0

質問とタイトルを編集してより明確にしました。 –

答えて

1

ioctls SIOCGIFADDR(アドレスの場合)とSIOCSIFADDR(アドレスの場合)を定義しています。

IPv4のすべてのデバイス設定は、net/ipv4/devinet.cで行われます。詳細は、このソースファイルを参照してください。

+0

私はカーネルスペースのIPアドレスにioctlを使用したいと思います.....どうすればいいですか?コードを書くことで伝えてください – karan421

1

インターフェイスのアドレスを読みたい場合は、設計上問題があります。ただし、リモートピアに接続するときに使用する優先送信元アドレスを決定する場合は、ip6_route_outputで取得した後にstruct rt6_info.rt6i_prefsrcで指定します。 (なし暗黙の保証付)の線に沿って何か:

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

+0

IPv4スケルトンについてはnet/netfilter/xt_TEE.cを参照してください)。 prefaddrは 'struct rtable.rt_src' AFAICSにあります。 –

0

我々はのlinux-XYZ /ドキュメント/ネットワーキング/ ifenslave.cにどのようにの非常に良い例ですファイルを利用できる if_getconfig機能を持っていますioctlsを使用し、カーネルスペースからアドレスを取得する

関連する問題