Re: ICMPv6 over lo0

From: <tuexen_at_freebsd.org>
Date: Wed, 16 Nov 2022 08:37:32 UTC
> On 16. Nov 2022, at 08:54, Andrey V. Elsukov <bu7cher@yandex.ru> wrote:
> 
> 16.11.2022 00:14, tuexen@freebsd.org пишет:
>> when using the master branch of today (or 13.1) I get when running
>> tuexen@ampere128:~ % ping6 -c 1 -b 30000 -s 20000 ::1
>> PING6(20048=40+8+20000 bytes) ::1 --> ::1
>> 20008 bytes from ::1, icmp_seq=0 hlim=64 time=0.709 ms
>> --- ::1 ping6 statistics ---
>> 1 packets transmitted, 1 packets received, 0.0% packet loss
>> round-trip min/avg/max/std-dev = 0.709/0.709/0.709/0.000 ms
>> which is expected. What I don't expect is:
>> tuexen@ampere128:~ % tcpdump -i lo0 -n
>> tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
>> listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
>> 22:06:38.835630 IP6 ::1 > ::1: frag (0|1232) ICMP6, echo request, seq 0, length 1232
>> 22:06:38.835639 IP6 ::1 > ::1: frag (1232|1232)
>> 22:06:38.835641 IP6 ::1 > ::1: frag (2464|1232)
>> Why is for the Echo Request an MTU of 1280 used, whereas for the response an MTU of 16384
>> is used.
>> Is this intended? At least for me, it is not expected...
> 
> Hi Michael,
> 
> I believe it is default behavior for ping6:
> ```
> -u  By default, ping asks the kernel to fragment packets to fit into
>    the minimum IPv6 MTU.  The -u option will suppress the behavior
>    in the following two levels: when the option is specified once,
>    the behavior will be disabled for unicast packets.  When the
>    option is more than once, it will be disabled for both unicast
>    and multicast packets.
> ```
> 
> ```
> % ktrace ping6 -c 1 -b 30000 -s 20000 ::1
> % kdump | grep -A1 MIN_MTU
> 14793 ping6    CALL setsockopt(0x3,IPPROTO_IPV6,IPV6_USE_MIN_MTU,0x7fffffffe614,0x4)
> 14793 ping6    RET   setsockopt 0
> ```
> 
> ```
>        if (mflag != 1) {
>                optval = mflag > 1 ? 0 : 1;
> 
>                if (setsockopt(ssend, IPPROTO_IPV6, IPV6_USE_MIN_MTU,
>                    &optval, sizeof(optval)) == -1)
>                        err(1, "setsockopt(IPV6_USE_MIN_MTU)");
>        }
> ```
Hi Andrey,

thank you very much for the explanation! I wasn't aware of this.

Best regards
Michael
> -- 
> WBR, Andrey V. Elsukov