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()之前进行预约。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值