2012-04-17 16 views
0

私はカーネルモジュールを作成していますが、宛先アドレスと比較する必要があります。 私はこれらのアドレスを動的に追加するアドレスの配列を持っています。アドレスが配列内に既にある場合は削除しますが、そうでない場合は次の使用可能なインデックスに置きます。次のようにlinux(カーネル3.2.6)の宛先アドレスの比較

私のコードのスニップです:

daddr = &udp_hdr(sock_buff)->dest; /* an example address just for comparison purposes */ 
saddr = &udp_hdr(sock_buff)->source; /* an example address just for comparison purposes */ 

int compare(__be32 addr1, __be32 addr2) { 

    addr1[0] = 0xff & add1 >> 24; 
    addr1[1] = 0xff & add1 >> 16; 
    addr1[2] = 0xff & add1 >> 8; 
    addr1[3] = 0xff & add1; 

    addr2[0] = 0xff & add2 >> 24; 
    addr2[1] = 0xff & add2 >> 16; 
    addr2[2] = 0xff & add2 >> 8; 
    addr2[3] = 0xff & add2; 

    for(i=0; i<4; i++) { 
    if(addr1[i]==addr2[i]) {; 
     i++; 
     if(i==4) { 
     return 0; 
     break; 
     } else return 1; 
    } 
    } 
} 

それから私はと機能を呼び出して、しかし機能に

int compare(__be32 addr1, __be32 addr2) { 

    addr1[0] = 0xff & add1 >> 24; 
    addr1[1] = 0xff & add1 >> 16; 
    addr1[2] = 0xff & add1 >> 8; 
    addr1[3] = 0xff & add1; 

    addr2[0] = 0xff & add2 >> 24; 
    addr2[1] = 0xff & add2 >> 16; 
    addr2[2] = 0xff & add2 >> 8; 
    addr2[3] = 0xff & add2; 

    for(i=0; i<4; i++) { 
    if(addr1[i]==addr2[i]) {; 
     i++; 
     if(i==4) { 
     return 0; 
     break; 
     } else return 1; 
    } 
    } 
} 

を使用して比較しています比較

compare((__be32)daddr, (__be32)saddr) 

言います192.168.1.2と192.132.1.2のようなアドレスは真(ここでは0)を返し、場合によっては偽を返します(ここでは1)。どこが間違っているのでしょうか、住所を比較する良い方法がありますか?

+0

ノートコードのフォーマットが壊れてます。.. – sarnold

+0

私はかかわらず、私は、書式設定を固定なぜ同じ機能が2回含まれているのかは不明です。 – Wyzard

+0

両方のアドレスが同じサイズの整数で、同じバイト順で格納されているので、それらを直接比較するだけではどうですか? –

答えて

1

あなたはaddr1[i] == addr2[i]場合は二回i++すなわちiをインクリメント終わるもelseブロックは、私は何が必要推測容疑者である

for(i=0; i<4; i++) { 
    if(addr1[i]!=addr2[i]) {; 
    return 1; 
    } 
} 
return 0; 
+0

@kettyがありがとう、これが解決しました。 – Milli

関連する問題