【Linux4.1.12源码分析】IP层报文发送之ip_local_out
http://blog.csdn.net/one_clouder/article/details/52665276
IP层本地报文发送有两个函数ip_local_out和ip_local_out_sk,实际实现两者是等同的,因为本地发送的报文,skb必然关联着一个sock对象。
1、ip_local_out函数
- static inline int ip_local_out(struct sk_buff *skb)
- {
- return ip_local_out_sk(skb->sk, skb); //本地报文发送,本地发送的报文都关联着一个sock对象
- }
- int ip_local_out_sk(struct sock *sk, struct sk_buff *skb) //本地报文发送,本地发送的报文都关联着一个sock对象
- {
- int err;
- err = __ip_local_out(skb); //报文安全检测(netfilter)
- if (likely(err == 1)) //返回值为1,说明netfilter允许报文通过
- err = dst_output_sk(sk, skb); //最终会调用ip_output函数
- return err;
- }
- int __ip_local_out(struct sk_buff *skb)
- {
- return __ip_local_out_sk(skb->sk, skb);
- }
- int __ip_local_out_sk(struct sock *sk, struct sk_buff *skb)
- {
- struct iphdr *iph = ip_hdr(skb);
- iph->tot_len = htons(skb->len);
- ip_send_check(iph); //计算IP层csum值
- return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, sk, skb, NULL, //调用netfilter,返回值为1说明允许报文通过,由调用者负责下一步的处理
- skb_dst(skb)->dev, dst_output_sk);
- }
- /* Output packet to network from transport. */
- static inline int dst_output_sk(struct sock *sk, struct sk_buff *skb)
- {
- return skb_dst(skb)->output(sk, skb); //实际调用ip_output函数
- }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通