c - 删除 skb 或扩展传出 skb

标签 c linux-kernel network-programming kernel-module

当我使用内核模块捕获内核中的传出数据包时,我正在使用 kfree_skb() 丢弃该数据包,但它不起作用并且数据包到达其目的地点。我检查 &skb->user 是 1。

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;

最佳答案

从您的函数签名来看,您似乎正在使用 dev_add_pack() API。
dev_add_pack()不是丢弃数据包的正确 API。

如果你想丢弃一个数据包,你应该使用 nf_register_hook()return NF_DROP .

在此链接中阅读有关 netfilter 的更多信息:
http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-3.html

关于c - 删除 skb 或扩展传出 skb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27926042/

相关文章:

tcp - 如何在局域网中找到我的服务器?

python - 你怎么知道广播消息来自哪个接口(interface)?

c - 从 C 函数返回结构体会出现编译错误

c++ - OMNeT++ 和 INET : Error while using 3rd Party-Tool

vb.net - 关闭 socket ?

python - Linux 内核调试 : "Python Exception <class ' gdb. 错误'> 没有名为 module_core 的成员。"在 gdb 中尝试使用帮助脚本时

linux - NFS用户权限问题

c - fgets() 不响应 PuTTY 命令

c - 访问结构和空指针

linux - BPF:程序上下文的翻译