您的位置:首页 > 运维架构 > Linux

【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函数,进入报文发送的下一个阶段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: