IP-адрес от sk_buff

ToList() возвращает новый экземпляр, поэтому вы не можете увидеть результат AddRange в «gc». Если вы действительно хотите использовать AddRange, вы можете сделать следующее.

((List<GenericClass>)gc).AddRange(sampleList);
12
задан red0ct 22 November 2018 в 15:19
поделиться

4 ответа

Существует два макросов, определенные в include/linux/kernel.h

NIPQUAD для адресов ipv4 и NIP6 для адресов ipv6.

#define NIPQUAD(addr) \
    ((unsigned char *)&addr)[0], \
    ((unsigned char *)&addr)[1], \
    ((unsigned char *)&addr)[2], \
    ((unsigned char *)&addr)[3]

#define NIP6(addr) \
    ntohs((addr).s6_addr16[0]), \
    ntohs((addr).s6_addr16[1]), \
    ntohs((addr).s6_addr16[2]), \
    ntohs((addr).s6_addr16[3]), \
    ntohs((addr).s6_addr16[4]), \
    ntohs((addr).s6_addr16[5]), \
    ntohs((addr).s6_addr16[6]), \
    ntohs((addr).s6_addr16[7])

Существуют вполне достаточные примеры в источниках ядра, которые используют их для печати IP-адресов в человекочитаемом формате. Например:

printk(KERN_DEBUG "Received packet from source address: %d.%d.%d.%d!\n",NIPQUAD(iph->saddr));

Надеюсь, это поможет.

13
ответ дан 2 December 2019 в 04:25
поделиться

Простой. IP-адрес в "x.x.x.x" формате называют точечной четверкой по причине. Каждое число представляет байт для в общей сложности 4 байтов в Вашем адресе.

Так, с 4-байтовым адресом Вы просто распечатали бы десятичное значение каждого байта.

Быстрый и грязный пример (заменяют printf Вашей предпочтительной функцией вывода):

unsigned char *addr = (unsigned char*)sk_buff->addr;
printf("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
2
ответ дан 2 December 2019 в 04:25
поделиться

Можно использовать стертол для преобразования каждой части в, он - целочисленная форма.

0
ответ дан 2 December 2019 в 04:25
поделиться
/* Convinience union to __be32 to ip address  */
union ip_address {
    u8 a[4];
    __be32 saddr;
};

IP-адрес мог быть получен [0].a[1].a[2].a[3]

0
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: