sk_buffer问题
在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 还是空的,并没赋值流程在这之前,这是为啥?