LinuxIP-IP tunnel 实现机理

本文详细介绍了在内核空间中如何正确地使用skb结构来处理数据包。包括如何为数据包预留头部空间、分配和释放缓存空间等关键步骤。通过具体的函数调用说明,帮助读者理解如何有效地管理和操作数据包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当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()之前进行预约。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值