How to understand the function of pskb_may_pull()?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



hi all:
      The job of pskb_may_pull is to make sure that the area pointed to by skb->data contains a block of
data at least as big as the IP header, since each IP packet (fragments included) must include a complete IP
header.When we receive a packet , the kernel will call the pkb_may_pull(), it looks like the following in line 395:

373 /*
374  *  Main IP Receive routine.
375  */
376 int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
377 {
378     const struct iphdr *iph;
379     u32 len;
380 
381     /* When the interface is in promisc. mode, drop all the crap
382      * that it receives, do not try to analyse it.
383      */
384     if (skb->pkt_type == PACKET_OTHERHOST)
385         goto drop;
386 
387 
388     IP_UPD_PO_STATS_BH(dev_net(dev), IPSTATS_MIB_IN, skb->len);
389 
390     if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) {
391         IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INDISCARDS);
392         goto out;
393     }
394 
395     if (!pskb_may_pull(skb, sizeof(struct iphdr)))
396         goto inhdr_error;
397 
398     iph = ip_hdr(skb);
399 

And the definition of pkb_may_pull() looks like the following:

1708 static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len)
1709 {  
1710     if (likely(len <= skb_headlen(skb)))
1711         return 1;
1712     if (unlikely(len > skb->len))
1713         return 0;
1714     return __pskb_pull_tail(skb, len - skb_headlen(skb)) != NULL;
1715 }

I just want to know which situation make the skb->data contains a block of data less than the IP header?
I think this packet can't send by kernel at all.
Thank you.
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux