Соответствие адреса назначения записи таблицы пересылки в C ++ - PullRequest
0 голосов
/ 28 октября 2011

По сути, у меня есть два 4-байтовых IP-адреса:

u_int32_t daddr; // in the packet
u_int32_t entry; // in the forwarding table

У меня также есть префикс, который идет вместе с записью в таблице пересылки:

unsigned short prefix; // in forwarding table corresponding to entry

Мне нужно соответствоватьdaddr для записи на основе префикса.Я вполне уверен, что это означает: если, например, префикс равен 23, то я должен сопоставить первые 23 бита записи с daddr.Честно говоря, я даже не знаю, с чего начать, потому что не знаю, как сопоставить отдельные биты.

У меня есть таблица пересылки с множеством записей, каждый из которых имеет свой префикс.Я не уверен, как сопоставить да с правильной записью. Любая помощь будет высоко ценится.Мой daddr хранится в стандартном заголовке ip, который я получил из файла netinet ip.h.

РЕДАКТИРОВАТЬ: Я нашел "самое длинное" соответствие.Поэтому я не сравниваю записи, чтобы только проверить, равны ли они, я сравниваю их, чтобы определить, сколько битов совпадают.Наилучшее совпадение очевидно, когда все биты одинаковы.

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Для сравнения только старшие n биты a и b некоторого типа без знака UInt:

const unsigned int NBITS = sizeof(UInt) * CHAR_BIT;

UInt a, b;

if ((a >> (NBITS - n)) == (b >> (NBITS - n))) { /*...*/ }

Для сравнения младших m бит:

if ((a << (NBITS - m)) == (b << (NBITS - m))) { /*...*/ }

Некоторое объяснение: тип UInt имеет sizeof(UInt) байтов и, следовательно, NBITS битов.Чтобы сравнить старшие n биты, мы просто сдвигаем оба числа вправо так, чтобы остались только n биты (новые старшие биты заполнены нулями, потому что тип является беззнаковым).Чтобы сравнить младшие m биты, мы сдвигаем оба числа влево до тех пор, пока все, кроме m битов не упадут влево (и справа не заполнятся нули):

NBITS = 12, n = 4, m = 7:

     a:  1 2 3 4 x A B C D E F G
     b:  1 3 2 5 x A B C D E F G

a >> 8:  0 0 0 0 0 0 0 0 1 2 3 4
b >> 8:  0 0 0 0 0 0 0 0 1 3 2 5

a << 5:  A B C D E F G 0 0 0 0 0
b << 5:  A B C D E F G 0 0 0 0 0
0 голосов
/ 28 октября 2011

Что-то вроде daddr&(0xffffffff<<(32-prefix)) == entry, возможно.

...