Я пишу модуль ядра, который получает пакеты Ethernet для Linux 2.6.31, и я хотел бы извлечь содержимое пакетов Ethernet из указателя на struct sk_buff
, который передается функции func
struct packet_type
, зарегистрированной dev_add_pack
. К какому члену структуры я должен обратиться? Когда я отправил пакет Ethernet с 46-байтовым телом, skb->data - skb->head
было 48, а skb->len
было 46, где skb
— указатель на struct sk_buff
.
Получение пакета Ethernet в sk_buff
Ответы (2)
вы можете извлечь данные из структуры sk_buff как...
char buff[1024];
int i=0;
//printk("******start of the data*******\n");
while(i<((skb->tail)-(skb->data)))
buff[i]=(char *)((skb->data)[i]);
размер буфера может отличаться или вы можете определить его по своему желанию.
& в этом буфере фактически вы скопировали данные с заголовком или без заголовка, а также фактическую полезную нагрузку пакета. Это зависит от того, где вы снимаете sk_buff (я имею в виду на каком слое). потому что, когда пакет идет от сокета к сетевому адаптеру или от сетевого адаптера к сокету, соответствующие поля sk_buff обновляются.
person
akp
schedule
06.11.2012
Вы можете использовать функции подключения netfilter. Это мой пример кода.
static unsigned int hook_func(unsigned int hooknum,
struct sk_buff *pskb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff*)) {
int ret = 110;
int x = 0;
struct net_device * dev;
struct ethhdr *neth_hdr = NULL;
if(strcmp(in->name,"lo0") == 0){
return NF_ACCEPT;
}
if(!pskb){
return NF_ACCEPT;
}
struct iphdr* iph = ip_hdr(pskb);
if(!(iph)){
return NF_ACCEPT;
}
if(iph->ttl == 0xFF){
return NF_ACCEPT;
}
if(iph->protocol == 6){
struct tcphdr *tcp = tcp_hdr(pskb);
if(tcp == NULL){
return NF_ACCEPT;
}
if(ntohs(tcp->dest) == 80){
if(tcp->syn == 1){
printk(KERN_DEBUG "Packet TCP SYN\n");
return NF_ACCEPT;
}
}
}
return NF_ACCEPT;
}
int init_module(void) {
nfho.hook = hook_func;
nfho.pf = PF_INET;
nfho.hooknum = NF_INET_PRE_ROUTING;
nfho.priority = NF_IP_PRI_FIRST;
thrqueue = create_workqueue(WQ_NAME1);
INIT_WORK(&thread, thread_function);
return nf_register_hook(&nfho);
}
void cleanup_module() {
nf_unregister_hook(&nfho);
}
person
StxApp
schedule
17.01.2017