ipv6ready(Section 4: RFC 8201 - Path MTU Discovery for IPv6)

本文讨论了如何在Linux内核4.19.155的icmpv6_err函数中调整对IPv6 PMTU过大报文的响应策略,确保小于1280字节的MTU被正确处理,并关注了RFC8200和8201的规定。着重于IPv6链路MTU最小值和报文分片现象的修复案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试仪发送MTU值小于最新IPv6 PMTU 56字节的Packet Too Big报文,依据RFC8200和8201中规定,此类packet too big需丢弃,测试中被测设备将其pmtu更新为1280,后续响应的报文分片。

具体case号是IPv6 Specification 的9、10。

 修改net\ipv6\icmp.c中的icmpv6_err函数

static void icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
		       u8 type, u8 code, int offset, __be32 info)
{
	/* icmpv6_notify checks 8 bytes can be pulled, icmp6hdr is 8 bytes */
	struct icmp6hdr *icmp6 = (struct icmp6hdr *) (skb->data + offset);
	struct net *net = dev_net(skb->dev);

	if (type == ICMPV6_PKT_TOOBIG)
        {
                if( ntohl(info) >= 1280 )
                {
			ip6_update_pmtu(skb, net, info, skb->dev->ifindex, 0, sock_net_uid(net, NULL));
                }
		printk("toobig2, mtu=%u\n", ntohl(info));
        }
	else if (type == NDISC_REDIRECT)
		ip6_redirect(skb, net, skb->dev->ifindex, 0,
			     sock_net_uid(net, NULL));

	if (!(type & ICMPV6_INFOMSG_MASK))
		if (icmp6->icmp6_type == ICMPV6_ECHO_REQUEST)
			ping_err(skb, offset, ntohl(info));
}

修改后的函数与源函数对比:

 当mtu小于ipv6最小链路mtu时丢弃packet too big。ipv6规定链路最小mtu是1280,上面的逻辑是当收到packet too big消息,并且所带mtu大于等于1280时才会对mtu进行更新。

注:我测试用的内核版本是 linux-4.19.155,其它内核版本可能需要做相应的调整。

相关内容定期更新,本号默认不接受白嫖,打不打赏不要紧,点赞、收藏都不来就太不够意思了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高晓伟_Steven

相逢即是有缘,动力源于金钱。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值