0

我正在编写一个内核模块,我必须与目标地址进行比较。我有一个地址数组,我想动态添加这些地址。如果地址已经在数组中,我将其删除,但如果不是,则将其放在下一个可用索引处。

我的代码片段如下:

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 这样的地址返回 true(此处为 0),在某些情况下返回 false(此处为 1)。我哪里出错了,或者有没有更好的比较地址的方法?

4

1 回答 1

1

如果块也是可疑的,你最终会增加i两次,我猜你需要的是i++addr1[i] == addr2[i]else

for(i=0; i<4; i++) {
   if(addr1[i]!=addr2[i]) {;
     return 1;
   }
}
return 0;
于 2012-04-17T01:27:53.933 回答