<div dir="ltr">hi Alberto:<div>        I&#39;m confused with &quot;<span style="font-size:14px"> </span><span style="font-size:14px">paging skbs is a technique meant to ease the work</span></div><span style="font-size:14px">of drivers.</span><span style="font-size:14px">A driver might choose to page &quot;too much&quot; data.</span>&quot;, please give more explain.<div><br></div><div>Thank you.</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-01-07 23:35 GMT+08:00 Alberto Leiva <span dir="ltr">&lt;<a href="mailto:ydahhrk@gmail.com" target="_blank">ydahhrk@gmail.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I think in theory whatever random driver for whatever random hardware<br>
might create this situation. It&#39;s not illegal. Anyone can create a<br>
driver outside of the kernel tree, after all. In practice, of course,<br>
this is not the case, because anyone can tell it creates a significant<br>
amount of overhead when the inevitable pskb_may_pull() come into play,<br>
but you don&#39;t know what constrictive environments a driver out there<br>
might be operating on.<br>
<br>
As I understand it, paging skbs is a technique meant to ease the work<br>
of drivers.<br>
A driver might choose to page &quot;too much&quot; data.<br>
The kernel is prepared for this situation (&#39;Be conservative in what<br>
you do, be liberal in what you accept from others&#39; -<br>
<a href="http://en.wikipedia.org/wiki/Robustness_principle" target="_blank">http://en.wikipedia.org/wiki/Robustness_principle</a>).<br>
That&#39;s all there is to it, I think.<br>
<br>
PS: From your sorta definition, you seem to be assuming<br>
pskb_may_pull() is only used to ensure the IP header is not paged. I<br>
understand this might not be the case, but just to make things clear:<br>
pskb_may_pull() can be used to copy *any* amount of bytes from the<br>
paged part to the head room of the packet (it&#39;s not tied to the IP<br>
header&#39;s length). For example, you could use it to also guarantee a<br>
TCP header by doing this:<br>
if (!pskb_may_pull(skb, sizeof(struct iphdr) + sizeof(struct tcphdr)))<br>
        goto inhdr_error;<br>
<div><div class="h5"><br>
<br>
On Wed, Jan 7, 2015 at 2:28 AM, lx &lt;<a href="mailto:lxlenovostar@gmail.com">lxlenovostar@gmail.com</a>&gt; wrote:<br>
&gt; hi all:<br>
&gt;       The job of pskb_may_pull is to make sure that the area pointed to by<br>
&gt; skb-&gt;data contains a block of<br>
&gt; data at least as big as the IP header, since each IP packet (fragments<br>
&gt; included) must include a complete IP<br>
&gt; header.When we receive a packet , the kernel will call the pkb_may_pull(),<br>
&gt; it looks like the following in line 395:<br>
&gt;<br>
&gt; 373 /*<br>
&gt; 374  *  Main IP Receive routine.<br>
&gt; 375  */<br>
&gt; 376 int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct<br>
&gt; packet_type *pt, struct net_device *orig_dev)<br>
&gt; 377 {<br>
&gt; 378     const struct iphdr *iph;<br>
&gt; 379     u32 len;<br>
&gt; 380<br>
&gt; 381     /* When the interface is in promisc. mode, drop all the crap<br>
&gt; 382      * that it receives, do not try to analyse it.<br>
&gt; 383      */<br>
&gt; 384     if (skb-&gt;pkt_type == PACKET_OTHERHOST)<br>
&gt; 385         goto drop;<br>
&gt; 386<br>
&gt; 387<br>
&gt; 388     IP_UPD_PO_STATS_BH(dev_net(dev), IPSTATS_MIB_IN, skb-&gt;len);<br>
&gt; 389<br>
&gt; 390     if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) {<br>
&gt; 391         IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INDISCARDS);<br>
&gt; 392         goto out;<br>
&gt; 393     }<br>
&gt; 394<br>
&gt; 395     if (!pskb_may_pull(skb, sizeof(struct iphdr)))<br>
&gt; 396         goto inhdr_error;<br>
&gt; 397<br>
&gt; 398     iph = ip_hdr(skb);<br>
&gt; 399<br>
&gt;<br>
&gt; And the definition of pkb_may_pull() looks like the following:<br>
&gt;<br>
&gt; 1708 static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len)<br>
&gt; 1709 {<br>
&gt; 1710     if (likely(len &lt;= skb_headlen(skb)))<br>
&gt; 1711         return 1;<br>
&gt; 1712     if (unlikely(len &gt; skb-&gt;len))<br>
&gt; 1713         return 0;<br>
&gt; 1714     return __pskb_pull_tail(skb, len - skb_headlen(skb)) != NULL;<br>
&gt; 1715 }<br>
&gt;<br>
&gt; I just want to know which situation make the skb-&gt;data contains a block of<br>
&gt; data less than the IP header?<br>
&gt; I think this packet can&#39;t send by kernel at all.<br>
&gt; Thank you.<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Kernelnewbies mailing list<br>
&gt; <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
&gt;<br>
</blockquote></div><br></div>