software checksuming on IPv6 multicasting is not working
[email protected] Sun, 2 Aug 2026 11:17:44 +0200 (CEST)
| Newsgroups | gmane.os.openbsd.bugs |
|---|---|
| Message-ID | <[email protected]> |
>Synopsis: software checksumming on IPv6 multicasting is not working >Category: kernel >Environment: System : OpenBSD 7.9 Details : OpenBSD 7.9 (GENERIC.MP) #0: Sat May 2 08:16:16 CEST 2026 [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP Architecture: OpenBSD.amd64 Machine : amd64 >Description: In writing IPv6 multicasting code, I have determined after a full day of debugging, that software checksumming from udp6_output/ip6_output does not work. After examining all my devices there is two that do hardware offloading of IPv6 UDP packets and this turned out to work. Conclusion is obvious, software checksumming doesn't work in this multicast. >How-To-Repeat: [A stripped down version of both of these programs exist at the end of report (b64)] I have two programs, one is called dsd, the other dsc. dsc multicasts on the ethernet and dsd replies per unicast to register/serialize a cpu as this is a work network for high cpu intensive tasks. In an output of dsc 8 cpu's get serialized running on three hosts that have 2, 2 and 4 cpu's respectively. The total makes eight cpu's on console. Here is a snippet how it looks properly: riscv$ dsc/dsc -i axen0 sending cpu serial 0 sending cpu serial 1 sending cpu serial 2 sending cpu serial 3 sending cpu serial 4 sending cpu serial 5 sending cpu serial 6 sending cpu serial 7 ^C on this host there is an axen as said here is it's hwfeatures: riscv$ ifconfig axen0 hwfeatures axen0: flags=248843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,AUTOCONF6TEMP,AUTOCONF6> mtu 1500 hwfeatures=197<CSUM_IPv4,CSUM_TCPv4,CSUM_UDPv4,VLAN_MTU,CSUM_TCPv6,CSUM_UDPv6> hardmtu 1500 notice CSUm_UDPv6. On another host (a raspberry pi, I have collected a tcpdump, it looks like so: arm64# tcpdump -v -n -r /tmp/cksum.pcap port 1519 and udp tcpdump: WARNING: snaplen raised from 116 to 1500 08:27:59.058781 fe80::f68c:ebff:fe4b:5d70.1519 > ff12::1519.1519: [udp sum ok] udp 592 [hlim 1] (len 600) 08:28:00.088396 fe80::f68c:ebff:fe4b:5d70.1519 > ff12::1519.1519: [udp sum ok] udp 592 [hlim 1] (len 600) The above shows the udp sum being OK. This is important. I will also show the responding tcp unicast followup on the SYN: 08:27:59.077887 fe80::f68c:ebff:fe4b:5d70.1519 > fe80::dea6:32ff:fecc:dba7.28375: S [tcp sum ok] 1392315276:1392315276(0) ack 1412054441 win 16384 <mss 1440,nop,nop,sackOK,nop,wscale 6,nop,nop,timestamp 4218548494 3259293879> (len 44, hlim 64) This above means that the remote dsd's socket descriptor is receiving data. The following shows a ktrace receiving data through the select loop indicating that it too has registered/serialized: 54669 dsd 1785392981.924654 STRU struct fd_set { 3 } 54669 dsd 1785392981.924669 RET select 1 54669 dsd 1785392981.924696 CALL kbind(0x77560975da40,24,0xcb6b35796ecfa140) 54669 dsd 1785392981.924780 RET kbind 0 54669 dsd 1785392981.924818 CALL recvfrom(3,0x77560975e368,0x250,0,0x77560975e5cc,0x77560975df30) 54669 dsd 1785392981.924831 GIO fd 3 read 592 bytes "CENSOR\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0X\M-=C,\M-T\M^B\M-)A\M^K\ T\M-VG\M--)\M-=\^\\^B\M-Z >\M-N\M-z\M-bX\M-#\M-J"\M-~\M-`\^Q,\M-[\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 54669 dsd 1785392981.924836 STRU struct sockaddr { AF_INET6, [fe80::f68c:ebff:fe4b:5d70%2]:1519 } 54669 dsd 1785392981.924841 RET recvfrom 592/0x250 54669 dsd 1785392981.924848 CALL socket(AF_INET6,0x1<SOCK_STREAM>,0x6) 54669 dsd 1785392981.924870 RET socket 4 54669 dsd 1785392981.924879 CALL kbind(0x77560975d7e0,24,0xcb6b35796ecfa140) 54669 dsd 1785392981.924934 RET kbind 0 54669 dsd 1785392981.924962 CALL connect(4,0x77560975e5cc,28) 54669 dsd 1785392981.924968 STRU struct sockaddr { AF_INET6, [fe80::f68c:ebff:fe4b:5d70%2]:1519 } 54669 dsd 1785392981.929047 RET connect 0 54669 dsd 1785392981.929077 CALL kbind(0x77560975d7e0,24,0xcb6b35796ecfa140) 54669 dsd 1785392981.929155 RET kbind 0 54669 dsd 1785392981.929164 CALL recvfrom(4,0x77560975d8c0,0x200,0,0,0) 54669 dsd 1785392981.938349 GIO fd 4 read 2 bytes "2 " 54669 dsd 1785392981.938363 RET recvfrom 2 54669 dsd 1785392981.938384 CALL kbind(0x77560975d7e0,24,0xcb6b35796ecfa140) 54669 dsd 1785392981.938463 RET kbind 0 54669 dsd 1785392981.938473 CALL close(4) 54669 dsd 1785392981.938548 RET close 0 54669 dsd 1785392981.938561 CALL kbind(0x77560975d7e0,24,0xcb6b35796ecfa140) 54669 dsd 1785392981.938619 RET kbind 0 54669 dsd 1785392981.938628 CALL socket(AF_INET6,0x1<SOCK_STREAM>,0x6) 54669 dsd 1785392981.938647 RET socket 4 54669 dsd 1785392981.938654 CALL connect(4,0x77560975e5cc,28) 54669 dsd 1785392981.938660 STRU struct sockaddr { AF_INET6, [fe80::f68c:ebff:fe4b:5d70%2]:1519 } 54669 dsd 1785392981.940424 RET connect 0 54669 dsd 1785392981.940449 CALL recvfrom(4,0x77560975d8c0,0x200,0,0,0) 54669 dsd 1785392981.944928 GIO fd 4 read 2 bytes "5 " 54669 dsd 1785392981.944945 RET recvfrom 2 54669 dsd 1785392981.945038 CALL close(4) 54669 dsd 1785392981.945091 RET close 0 54669 dsd 1785392981.945104 CALL select(4,0x77560975db20,0,0,0) 54669 dsd 1785392981.945109 STRU struct fd_set { 3 } 54669 dsd 1785392982.954064 STRU struct fd_set { 3 } 54669 dsd 1785392982.954100 RET select 1 54669 dsd 1785392982.954122 CALL recvfrom(3,0x77560975e368,0x250,0,0x77560975e5cc,0x77560975df30) 54669 dsd 1785392982.954141 GIO fd 3 read 592 bytes "CENSOR\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0X\M-=C,\M-T\M^B\M-)A\M^K\ T\M-VG\M--)\M-=\^\\^B\M-Z >\M-N\M-z\M-bX\M-#\M-J"\M-~\M-`\^Q,\M-[\0\0\ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 54669 dsd 1785392982.954146 STRU struct sockaddr { AF_INET6, [fe80::f68c:ebff:fe4b:5d70%2]:1519 } 54669 dsd 1785392982.954150 RET recvfrom 592/0x250 The above is all working correctly, here is one that doesn't work. The ifconfig hwfeatures look like so: orca$ ifconfig bge0 hwfeatures bge0: flags=248843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,AUTOCONF6TEMP,AUTOCONF6> mtu 1500 hwfeatures=33<CSUM_IPv4,CSUM_TCPv4,VLAN_MTU,VLAN_HWTAGGING> hardmtu 9000 Then executing the program the output of dsc is like so: orca$ dsc/dsc -i bge0 sending cpu serial 0 sending cpu serial 1 ^C In the above you can see only two cpu's serialized. Those two are on the loopback / same box. Also a tcpdump on another host (arm64) was made and it shows the wrong checksums, and this is important, it doesn't work because of these: cpdump -v -n -r /tmp/cksum-bad.pcap port 1519 and udp < tcpdump: WARNING: snaplen raised from 116 to 1500 08:53:18.736086 fe80::ae87:a3ff:fe23:e099.1519 > ff12::1519.1519: [invalid udp cksum 0] udp 592 [hlim 1] (len 600) 08:53:19.745907 fe80::ae87:a3ff:fe23:e099.1519 > ff12::1519.1519: [invalid udp cksum 0] udp 592 [hlim 1] (len 600) Notice on the above the "invalid udp cksum 0". Only ever happens when the outgoing (dsc) interface is NOT hardware offloading. >Fix: I didn't invest time into it, hoping to get feedback next week from you before I lift a finger. I'll be back on the Internet for a month starting the 10th of august or so. dmesg: OpenBSD 7.9 (GENERIC.MP) #0: Sat May 2 08:16:16 CEST 2026 [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP real mem = 3965952000 (3782MB) avail mem = 3818246144 (3641MB) random: good seed from bootblocks mpath0 at root scsibus0 at mpath0: 256 targets mainbus0 at root bios0 at mainbus0: SMBIOS rev. 2.7 @ 0xe3e70 (51 entries) bios0: vendor Acer version "V1.08" date 12/06/2011 bios0: Acer AO722 acpi0 at bios0: ACPI 4.0 acpi0: sleep states S0 S3 S4 S5 acpi0: tables DSDT FACP HPET APIC MCFG BOOT SLIC SSDT SSDT acpi0: wakeup devices SPB2(S4) GEC_(S4) USB0(S3) USB4(S3) P2P_(S5) acpitimer0 at acpi0: 3579545 Hz, 32 bits acpihpet0 at acpi0: 14318180 Hz acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat cpu0 at mainbus0: apid 0 (boot processor) cpu0: AMD C-60 APU with Radeon(tm) HD Graphics, 998.05 MHz, 14-02-00, patch 05000119 cpu0: cpuid 1 edx=178bfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT> ecx=802209<SSE3,MWAIT,SSSE3,CX16,POPCNT> cpu0: cpuid 6 eax=4<ARAT> ecx=1<EFFFREQ> cpu0: cpuid 80000001 edx=2fd3fbff<NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG> ecx=35ff<LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,IBS,SKINIT> cpu0: cpuid 80000007 edx=3f9<HWPSTATE,ITSC> cpu0: 32KB 64b/line 8-way D-cache, 32KB 64b/line 2-way I-cache cpu0: 512KB 64b/line 16-way L2 cache cpu0: smt 0, core 0, package 0, type P mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges cpu0: apic clock running at 199MHz cpu0: mwait min=64, max=64, IBE cpu1 at mainbus0: apid 1 (application processor) cpu1: AMD C-60 APU with Radeon(tm) HD Graphics, 997.55 MHz, 14-02-00, patch 05000119 cpu1: smt 0, core 1, package 0, type P ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 21, 24 pins, remapped acpimcfg0 at acpi0 acpimcfg0: addr 0xf8000000, bus 0-63 acpiprt0 at acpi0: bus 0 (PCI0) acpiprt1 at acpi0: bus -1 (PB2_) acpiprt2 at acpi0: bus -1 (PB3_) acpiprt3 at acpi0: bus -1 (PB4_) acpiprt4 at acpi0: bus -1 (PB5_) acpiprt5 at acpi0: bus -1 (PB6_) acpiprt6 at acpi0: bus -1 (PB7_) acpiprt7 at acpi0: bus 2 (SPB0) acpiprt8 at acpi0: bus -1 (SPB1) acpiprt9 at acpi0: bus 6 (SPB2) acpiprt10 at acpi0: bus 7 (SPB3) acpiprt11 at acpi0: bus 1 (P2P_) acpiec0 at acpi0 acpibtn0 at acpi0: PWRB acpibtn1 at acpi0: SLPB acpipci0 at acpi0 PCI0 acpicmos0 at acpi0 "PNP0303" at acpi0 not configured "ETD0500" at acpi0 not configured "PNP0C14" at acpi0 not configured "PNP0C14" at acpi0 not configured acpibat0 at acpi0: BAT1 model "31334230314c41" serial 417d type Lion oem "Sanyo " acpiac0 at acpi0: AC unit offline acpibtn2 at acpi0: LID_ acpicpu0 at acpi0: C2(0@100 io@0xf800), C1(@1 halt!), PSS acpicpu1 at acpi0: C2(0@100 io@0xf800), C1(@1 halt!), PSS acpivideo0 at acpi0: VGA_ acpivout0 at acpivideo0: LCD_ acpivideo1 at acpi0: VGA_ acpivideo2 at acpi0: VGA_ cpu0: 998 MHz: speeds: 1000 800 MHz pci0 at mainbus0 bus 0 pchb0 at pci0 dev 0 function 0 "AMD 14h Host" rev 0x00 radeondrm0 at pci0 dev 1 function 0 "ATI Radeon HD 6290" rev 0x00 drm0 at radeondrm0 radeondrm0: msi azalia0 at pci0 dev 1 function 1 "ATI Radeon HD 6310 HD Audio" rev 0x00: msi azalia0: no supported codecs ahci0 at pci0 dev 17 function 0 "ATI SBx00 SATA" rev 0x00: apic 4 int 19, AHCI 1.2 ahci0: port 0: 3.0Gb/s scsibus1 at ahci0: 32 targets sd0 at scsibus1 targ 0 lun 0: <ATA, WDC WD3200BPVT-2, 01.0> naa.50014ee25be3a7df sd0: 305245MB, 512 bytes/sector, 625142448 sectors ohci0 at pci0 dev 18 function 0 "ATI SB700 USB" rev 0x00: apic 4 int 18, version 1.0, legacy support ehci0 at pci0 dev 18 function 2 "ATI SB700 USB2" rev 0x00: apic 4 int 17 usb0 at ehci0: USB revision 2.0 uhub0 at usb0 configuration 1 interface 0 "ATI EHCI root hub" rev 2.00/1.00 addr 1 ohci1 at pci0 dev 19 function 0 "ATI SB700 USB" rev 0x00: apic 4 int 18, version 1.0, legacy support ehci1 at pci0 dev 19 function 2 "ATI SB700 USB2" rev 0x00: apic 4 int 17 usb1 at ehci1: USB revision 2.0 uhub1 at usb1 configuration 1 interface 0 "ATI EHCI root hub" rev 2.00/1.00 addr 1 piixpm0 at pci0 dev 20 function 0 "ATI SBx00 SMBus" rev 0x42: SMI iic0 at piixpm0 spdmem0 at iic0 addr 0x50: 4GB DDR3 SDRAM PC3-10600 SO-DIMM azalia1 at pci0 dev 20 function 2 "ATI SBx00 HD Audio" rev 0x40: apic 4 int 16 azalia1: codecs: Conexant/0x506c audio0 at azalia1 pcib0 at pci0 dev 20 function 3 "ATI SB700 ISA" rev 0x40 ppb0 at pci0 dev 20 function 4 "ATI SB600 PCI" rev 0x40 pci1 at ppb0 bus 1 ppb1 at pci0 dev 21 function 0 "ATI SB800 PCIE" rev 0x00: msi pci2 at ppb1 bus 2 ppb2 at pci0 dev 21 function 2 "ATI SB800 PCIE" rev 0x00 pci3 at ppb2 bus 6 alc0 at pci3 dev 0 function 0 "Attansic Technology L2C" rev 0xc1: msi, address dc:0e:a1:54:ba:16 atphy0 at alc0 phy 0: F2, rev. 5 ppb3 at pci0 dev 21 function 3 "ATI SB800 PCIE" rev 0x00 pci4 at ppb3 bus 7 "Atheros AR9485" rev 0x01 at pci4 dev 0 function 0 not configured pchb1 at pci0 dev 24 function 0 "AMD 14h Link Cfg" rev 0x43 pchb2 at pci0 dev 24 function 1 "AMD 14h Address Map" rev 0x00 pchb3 at pci0 dev 24 function 2 "AMD 14h DRAM Cfg" rev 0x00 km0 at pci0 dev 24 function 3 "AMD 14h Misc Cfg" rev 0x00 pchb4 at pci0 dev 24 function 4 "AMD 14h CPU Power" rev 0x00 pchb5 at pci0 dev 24 function 5 "AMD 14h Reserved" rev 0x00 pchb6 at pci0 dev 24 function 6 "AMD 14h NB Power" rev 0x00 pchb7 at pci0 dev 24 function 7 "AMD 14h Reserved" rev 0x00 usb2 at ohci0: USB revision 1.0 uhub2 at usb2 configuration 1 interface 0 "ATI OHCI root hub" rev 1.00/1.00 addr 1 usb3 at ohci1: USB revision 1.0 uhub3 at usb3 configuration 1 interface 0 "ATI OHCI root hub" rev 1.00/1.00 addr 1 isa0 at pcib0 isadma0 at isa0 pckbc0 at isa0 port 0x60/5 irq 1 irq 12 pckbd0 at pckbc0 (kbd slot) wskbd0 at pckbd0: console keyboard pms0 at pckbc0 (aux slot) wsmouse0 at pms0 mux 0 pms0: Elantech Touchpad, version 2, firmware 0x40213 pcppi0 at isa0 port 0x61 spkr0 at pcppi0 vmm0 at mainbus0: SVM/RVI uvideo0 at uhub1 port 1 configuration 1 interface 0 "Chicony Electronics Co., Ltd. WebCam" rev 2.00/82.57 addr 2 video0 at uvideo0 umass0 at uhub1 port 2 configuration 1 interface 0 "Generic USB2.0-CRW" rev 2.00/38.82 addr 3 umass0: using SCSI over Bulk-Only scsibus2 at umass0: 2 targets, initiator 0 sd1 at scsibus2 targ 1 lun 0: <Generic-, Multi-Card, 1.00> removable serial.0bda0138516388200000 uhidev0 at uhub2 port 2 configuration 1 interface 0 "Logitech USB-PS/2 Optical Mouse" rev 2.00/27.20 addr 2 uhidev0: iclass 3/1 ums0 at uhidev0: 8 buttons, Z and W dir wsmouse1 at ums0 mux 0 vscsi0 at root scsibus3 at vscsi0: 256 targets softraid0 at root scsibus4 at softraid0: 256 targets root on sd0a (45e31731e0fe958d.a) swap on sd0b dump on sd0b radeondrm0: PALM radeondrm0: 1366x768, 32bpp wsdisplay0 at radeondrm0 mux 1: console (std, vt100 emulation), using wskbd0 wsdisplay0: screen 1-5 added (std, vt100 emulation) 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