ToList()
возвращает новый экземпляр, поэтому вы не можете увидеть результат AddRange в «gc». Если вы действительно хотите использовать AddRange, вы можете сделать следующее.
((List<GenericClass>)gc).AddRange(sampleList);
Существует два макросов, определенные в 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));
Надеюсь, это поможет.
Простой. 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]);
Можно использовать стертол для преобразования каждой части в, он - целочисленная форма.
/* Convinience union to __be32 to ip address */
union ip_address {
u8 a[4];
__be32 saddr;
};
IP-адрес мог быть получен [0].a[1].a[2].a[3]