linux-kernel - 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 缓冲区,这就是我无法分配新缓冲区的原因。如果是,我该如何避免。
解决方案
推荐阅读
- java - 使用 PDFBOX jar 加载后 PDF 正在发生变化
- python - 如何在python pandas的for循环中将分类数据转换为数值数据
- python - 获取 json.decoder.JSONDecodeError:期望值:第 1 行第 1 列
- c++ - 错误:C2065:'QTcpSocket':未声明的标识符
- node.js - Electron 无法正确安装,请删除 node_modules/electron 并重新尝试安装。会不会是版本冲突?
- javascript - 使用 fetch 时在浏览器控制台中处理错误消息
- android - 为 build.gradle 使用 Kotlin 和 buildSrc 不会显示可用的库版本更新?
- php - 我如何制作一个将数据添加到数据库的 php 页面,如果数据已经存在,则将其删除?
- excel - 以独特的字母顺序自定义排序
- laravel - ErrorException 视图中未定义的变量数据