LinuxIP-IP tunnel 实现机理

当tunnel_xmit()函数被调用的时候, skb中包含了将要被发出的包,同时,dev中包含了隧道装置。
当我们传输一个包的时候,我们期望在源地址前加上我们现在地址的包头。(注:skb即socket buffer套接字缓存。)
如何正确的分配,复制和释放一个缓存?当你分配了一个缓存后,出现的是一个“0长度”的内存块,这个内存块开始于零。如果你想稍后新增一个头在这个缓存上,你必须调用函数“skb_reserve(skb,amount)",从而预约你想要预约的amount个内存。接着,你调用”skb_put(skb,amount)",amount就是你想分配的空间。skb_put()返回一个指针,指向这个buffer空间的高点(#0).skb->len设置为你在skb_put()中分配的空间长度。你可以更新这个buffer的skb->len。如果你需要更多空间,你可以再次调用skb_put()增加额外的空间。你可以调用"skb_tailroom(skb)",从而发现你最多可分配的空间数量。
现在,为了增加头空间,就调用"skb_push(skb,header_len)".这个函数在buffer的开头创造了空间,并且返回一个指向新空间的指针,如果将来你打算从这个buffer中剥去这个头,就可以调用skb_pull(skb,header_len)".skb_headroom()返回一个值,这个值显示了buffer的头部还有多少空间剩余。记住。这个头空间必须在调用skb_put()之前进行预约。 

你可能感兴趣的:(buffer,header,socket)