上一篇分析报文接收,IP层提交本地处理的流程,本篇分析报文转发场景的处理过程,在ip_rcv_finish函数中,会根据IP地址决定是提交给本机处理,还是报文转发,报文转发的入口函数为ip_forward,本篇将从ip_forward函数入手分析转发过程。
1、ip_forward函数
int ip_forward(struct sk_buff *skb)
{
u32 mtu;
struct iphdr *iph; /* Our header */
struct rtable *rt; /* Route we use */
struct ip_options *opt = &(IPCB(skb)->opt);
/* that should never happen */
if (skb->pkt_type != PACKET_HOST) //不允许处理非本host的报文,即报文目的mac是本机
goto drop;
if (unlikely(skb->sk))
goto drop;
if (skb_warn_if_lro(skb)) //报文为非线性,gso_size不为零,但是gso_type为零,丢弃此类报文
goto drop;
if (!xfrm4_policy_check(NULL, XFRM_POLICY_FWD, skb)) //ipset安全规则检测
goto drop;
if (IPCB(skb)->opt.router_alert && ip_call_ra_chain(skb))
return NET_RX_SUCCESS;
skb_forward_csum(skb);
/*
* According to the RFC, we must first decrease the TTL field. If
* that reaches zero, we