首页 > 解决方案 > dev_alloc_skb 返回 null

问题描述

我创建了一个网络驱动程序,当我收到一个像 ICMP 包这样的包时,它工作正常。但是当我想通过网络复制数据时,我的缓冲区无法分配并返回 null。这就是我接收包裹的方式:

struct stm32_port *stm32_port = netdev_priv(my_net);
struct sk_buff *skb = stm32_port -> skb;
unsigned char *dma_start;

dma_start = stm32_port->rx_buf + (RX_BUF_L - stm32_port->last_res);
//---------------------------------------------------------------------------------
skb = netdev_alloc_skb_ip_align(my_net, dma_size);
if (unlikely(skb == NULL)) {
    if (printk_ratelimit(  ))
        printk(KERN_NOTICE "eth1 rx: low on mem - packet dropped\n");
    my_net->stats.rx_dropped++;
    goto error;
}

memcpy(skb_put(skb, dma_size), dma_start, dma_size);

/* Write metadata, and then pass to the receive level */
skb->dev = my_net;
skb->protocol = eth_type_trans(skb, my_net);
skb->ip_summed = CHECKSUM_NONE; // let the OS check the checksum

netif_receive_skb(skb);
//---------------------------------------------------------------------------------
my_net->stats.rx_bytes += dma_size;
port->icount.rx += dma_size;

error:
stm32_port->last_res -= dma_size;
if (stm32_port->last_res == 0)
    stm32_port->last_res = dma_size;

可能是 netif_receive_skb 不会释放 socked 缓冲区,这就是我无法分配新缓冲区的原因。如果是,我该如何避免。

标签: linux-kernelnetwork-programmingbuffer

解决方案


推荐阅读