2015-01-13 2 views
3

Когда я беру исходящий пакет в ядре с помощью модуля ядра, я использую kfree_skb(), чтобы удалить этот пакет, но он не работает, и пакет достигает своей точки назначения. Я проверяю & skb-> user is 1.Снимите skb или разверните исходящий skb

change_skb (struct sk_buff * skb) получает исходный skb и создает новую отдельную копию (просто скопируйте ее полезную нагрузку) и отправьте новый skb. Это работает, я вижу свой новый пакет со стороны приемника, но я не могу отбросить оригинал, чтобы по-прежнему видеть оригинал на стороне приемника.

Вот мой код:

int my_pkt_handling(struct sk_buff *skb, struct net_device *dev, struct packet_type *pkt, struct net_device *org_dev) { 

struct ethhdr *eth = eth_hdr(skb); 
struct iphdr *iph = ip_hdr(skb); 
unsigned char dst_addr[] = {0x00, 0x16, 0x41, 0xaa, 0xf8, 0xf0}; 
unsigned char src_addr[] = {0x00, 0x1f, 0xe2, 0x12, 0xb0, 0x34}; 

switch (skb->pkt_type) { 
    case PACKET_OUTGOING: 
     if (memcmp(eth->h_dest, dst_addr, ETH_ALEN) == 0 && eth->h_proto == htons(ETH_P_IP)) {     
      printk(KERN_ALERT"Outgoing| Interface: %4s Type: 0x%4x Src: %pI4 Dest: %pI4 Len: %d SizeOf: %lu User#: %d\n", 
         skb->dev->name, ntohs(eth->h_proto), &iph->saddr, &iph->daddr, skb->len, sizeof(skb), atomic_read(&skb->users)); 
      change_skb(skb); 
      kfree_skb(skb); 
      return 0; 
     } 
     break; 
    default: 
     break; 
} 

return 0; 
+1

вы должны не использовать 'skb_unlink()' перед вызовом 'kfree_skb()'? – askb

+0

Я не использовал skb_unlink() где угодно. – auc

ответ

0

С вашей подписи функции, его, кажется, вы используете dev_add_pack() API.

dev_add_pack() - неправильный API для удаления пакета.

Если вы хотите сбросить пакет, вы должны использовать nf_register_hook() и вернуть NF_DROP.

подробнее о Netfilter в этой ссылке: http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-3.html

+0

Но nf_register_hook() если для IP-пакетов правильно? Я хочу захватить все пакеты ethernet. – auc

+0

Если вы используете мост, nf_register_hook() поймать все пакеты ethernet. Если вы не используете мост, nf_register_hook() может использоваться для захвата IP/ARP. Если вы не используете мост и хотите поймать какой-либо пакет, единственный вариант (насколько мне известно) - это поймать его на dev_queue_xmit() до его передачи в dev_hard_start_xmit() – Nil

+0

Итак, могу ли я разработать модуль ядра для этого или мне нужно изменить исходный исходный код ядра? – auc

Смежные вопросы