Взятие поразрядно & типа __be 32 в модуле ядра Linux - PullRequest
1 голос
/ 17 февраля 2012

Папка linux / содержит файл заголовка ip.h, в котором часть структуры заголовка IP определяется следующим образом:

struct iphdr
{
     // ...
     __be32 saddr;
     __be32 daddr;
};

У меня есть ситуация, когда у меня есть исходная маска типа char *. Я хочу проверить, относится ли IP-адрес типа __be32 к сети с адресом типа char *. Я могу преобразовать маску сети и сетевой адрес в __be32, используя in_aton (), предоставленный в linux / inet.h.

 char * network_addr = "192.166.0.0";
 char * netmask = "255.255.0.0";

Может кто-нибудь сказать, как я могу получить логическое значение && для адресов типа __be32 или просто применение оператора && даст правильный результат.

Спасибо.

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Вы ищете побитовый оператор И &, а не логический оператор И &&:

__be32 addr;
__be32 addr_mask;
...
__be32 addr_masked = addr & addr_mask;

Помните, что IPv4-адреса имеют 32-битное число: 4 x 8-битных байтов

0 голосов
/ 17 февраля 2012

Имейте в виду, что __be32 - это 32-разрядное значение в порядке байтов с прямым порядком байтов, которое может не соответствовать порядку байтов хоста. Ищите процедуры замены байтов, такие как be32toh, для преобразования в порядок байтов хоста для ваших сравнений.

same_network = (my_addr & addr_mask) == (be32toh( his_addr_be) & addr_mask);
...