【Linux4.1.12源码分析】IP层报文发送之ip_local_out
2017-07-06 20:25
543 查看
http://blog.csdn.net/one_clouder/article/details/52665276
IP层本地报文发送有两个函数ip_local_out和ip_local_out_sk,实际实现两者是等同的,因为本地发送的报文,skb必然关联着一个sock对象。
1、ip_local_out函数
[cpp]
view plain
copy
static inline int ip_local_out(struct sk_buff *skb)
{
return ip_local_out_sk(skb->sk, skb); //本地报文发送,本地发送的报文都关联着一个sock对象
}
2、ip_local_out_sk函数
[cpp]
view plain
copy
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;
}
3、__ip_local_out函数
[cpp]
view plain
copy
int __ip_local_out(struct sk_buff *skb)
{
return __ip_local_out_sk(skb->sk, skb);
}
4、__ip_local_out_sk函数
[cpp]
view plain
copy
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);
}
5、dst_output_sk函数
[cpp]
view plain
copy
/* 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函数
}
ip_local_out函数,主要实现了如下功能:设置IP头中报文长度信息和csum值; netfilter NF_INET_LOCAL_OUT点的处理。 最后调用ip_outputt函数,进入报文发送的下一个阶段。
IP层本地报文发送有两个函数ip_local_out和ip_local_out_sk,实际实现两者是等同的,因为本地发送的报文,skb必然关联着一个sock对象。
1、ip_local_out函数
[cpp]
view plain
copy
static inline int ip_local_out(struct sk_buff *skb)
{
return ip_local_out_sk(skb->sk, skb); //本地报文发送,本地发送的报文都关联着一个sock对象
}
2、ip_local_out_sk函数
[cpp]
view plain
copy
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;
}
3、__ip_local_out函数
[cpp]
view plain
copy
int __ip_local_out(struct sk_buff *skb)
{
return __ip_local_out_sk(skb->sk, skb);
}
4、__ip_local_out_sk函数
[cpp]
view plain
copy
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);
}
5、dst_output_sk函数
[cpp]
view plain
copy
/* 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函数
}
ip_local_out函数,主要实现了如下功能:设置IP头中报文长度信息和csum值; netfilter NF_INET_LOCAL_OUT点的处理。 最后调用ip_outputt函数,进入报文发送的下一个阶段。
相关文章推荐
- 【Linux4.1.12源码分析】IP层报文发送之ip_local_out
- 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(IP层)
- 【Linux4.1.12源码分析】协议栈报文接收之IP层处理分析(ip_local_deliver)
- 【Linux4.1.12源码分析】IP层报文发送之ip_output
- 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(TCP)
- 【Linux4.1.12源码分析】二层报文发送之dev_queue_xmit
- 【Linux4.1.12源码分析】vxlan报文发送之iptunnel_xmit
- 【Linux4.1.12源码分析】二层报文发送之qdisc实现分析
- 【Linux4.1.12源码分析】二层报文发送之GSO条件判断
- 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(skb_segment)
- 【Linux4.1.12源码分析】协议栈报文接收之IP层处理分析(ip_forward)
- 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(UDP)
- 【Linux4.1.12源码分析】vxlan报文发送之udp_tunnel_xmit_skb
- 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(MAC层)
- 【Linux4.1.12源码分析】邻居子系统实现分析 - ARP - ip_finish_output2()
- Linux TCP/IP 协议栈源码分析 - 数据 发送/接收 流程图
- 【Linux4.1.12源码分析】协议栈gro收包之IP层处理
- 转载--Linux TCP/IP 协议栈源码分析
- Linux TCP/IP 协议栈源码分析
- linux源码分析之IP(1) -- ip.h