ip_output函数是Linux内核(特别是网络子系统)中用于发送IPv4数据包的核心函数。以下是一个示例实现,并附上详细的中文讲解:
int ip_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{
struct iphdr *iph;
/* 构建IP头部 */
iph = ip_hdr(skb);
/* 设置服务类型(TOS)和ID号 */
iph->tos = inet_sk(sk)->tos;
iph->id = htons(inet_sk(sk)->id++);
/* 设置TTL(生存时间) */
iph->ttl = ip_select_ttl(inet_sk(sk), &inet_sk(sk)->mc_ttl);
/* 计算校验和 */
ip_send_check(iph);
/* 记录统计信息 */
IP_INC_STATS(net, IPSTATS_MIB_OUTDATAGRAMS);
/* 调用Netfilter钩子函数 */
return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING,
net, sk, skb, NULL, skb->dev,
ip_finish_output,