测试仪发送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,其它内核版本可能需要做相应的调整。
相关内容定期更新,本号默认不接受白嫖,打不打赏不要紧,点赞、收藏都不来就太不够意思了。