sk_buffer问题

txm119161336 2018-01-13 06:39:41
在Linux 源码中, 当网卡驱动读取数据时候, 有对sk_buffer进行赋值, 具体如下

static void
el_receive(struct device *dev)
{
int sksize, pkt_len;
struct sk_buff *skb;

pkt_len = inw(RX_LOW);

if (el_debug > 4)
printk(" el_receive %d.\n", pkt_len);

if ((pkt_len < 60) || (pkt_len > 1536)) {
if (el_debug)
printk("%s: bogus packet, length=%d\n", dev->name, pkt_len);
el_status.stats.rx_over_errors++;
return;
}
outb(AX_SYS, AX_CMD);

sksize = sizeof(struct sk_buff) + pkt_len;
skb = alloc_skb(sksize, GFP_ATOMIC);
outw(0x00, GP_LOW);
if (skb == NULL) {
printk("%s: Memory squeeze, dropping packet.\n", dev->name);
el_status.stats.rx_dropped++;
return;
} else {
skb->mem_len = sksize;
skb->mem_addr = skb;
skb->len = pkt_len;
skb->dev = dev;

insb(DATAPORT, skb->data, pkt_len);

#ifdef HAVE_NETIF_RX
netif_rx(skb);
#else
skb->lock = 0;
if (dev_rint((unsigned char*)skb, pkt_len, IN_SKBUFF, dev) != 0) {
kfree_skbmem(skb, sksize);
lp->stats.rx_dropped++;
break;
}
#endif
el_status.stats.rx_packets++;
}
return;
}

当传输到dev.c时候,有对 skb.h.raw 赋值 具体赋值为 skb->h.raw = skb->data + skb->dev->hard_header_len;
但是并没有对skb结构中的头进行处理,到ip.c时候 ,为什么可以直接 struct iphdr *iph = skb->h.iph;

按道理讲,这时候 skb->h.iph 还是空的,并没赋值流程在这之前,这是为啥?







...全文
468 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧