dev_queue_xmit会导致内核崩溃

时间:2014-04-04 05:12:23

标签: linux module kernel

我正在编写内核模块的一部分,它将skbuff从一个接口传输到另一个接口。 Ex上的所有数据包都出现在eth0上,转发到eth1上。甚至我打算传输的第一个数据包的问题导致dev_queue_xmit()中的内核崩溃。任何人都可以帮我理解这里出了什么问题吗?

中出现内核恐慌 net / core / skbuff.c上的

< 2>内核BUG:927!

我用来传输数据包的代码示例函数如下。请告诉我。

enter code here

   int txPktOnOtherIf(struct sk_buff *skb, struct net_device *tdev)
   {
    int reservedSpace=max((int)LL_RESERVED_SPACE(tdev),(int)sizeof(struct ethhdr));
    int buffLen = reservedSpace - sizeof(struct ethhdr) + skb->len + skb->dev->needed_tailroom;
    struct sk_buff* nskb = NULL;
    int err = 0;

    printk("ReservedSpace is %d and buffer len is %d",reservedSpace,buffLen);
    nskb = alloc_skb(buffLen, GFP_KERNEL);
    if (!nskb) {
             printk("Couldn't allocate SKB\n");
            return -1;
    }
    skb_reserve(nskb, reservedSpace);
    skb_reset_network_header(nskb);
    skb_put(nskb, skb->len - sizeof(struct ethhdr));
    skb_push(nskb, sizeof(struct ethhdr));
    skb_reset_mac_header(nskb);
    skb_reset_mac_len(nskb);
    err = skb_store_bits(nskb, 0, skb->data, skb->len);
    if (err) {
            kfree_skb(nskb);
            printk("Error %d storing to SKB\n", err);
            return -1;
    }
    nskb->dev = tdev;
    nskb->protocol = skb->protocol;
    skb_get(nskb);
    err = dev_queue_xmit(nskb);
    err = net_xmit_eval(err);
    if (err) {
            kfree_skb(nskb);
            printk("Error %d sending frame\n", err);
            return -1;
    }
    return 0;
    }

0 个答案:

没有答案