Skip to content

socket_zep: port to radio HAL#16932

Merged
jia200x merged 6 commits intoRIOT-OS:masterfrom
benpicco:socket_zep-hal
Dec 7, 2021
Merged

socket_zep: port to radio HAL#16932
jia200x merged 6 commits intoRIOT-OS:masterfrom
benpicco:socket_zep-hal

Conversation

@benpicco
Copy link
Copy Markdown
Contributor

@benpicco benpicco commented Oct 1, 2021

Contribution description

This ports socket_zep to the radio HAL so it can make use of automatic retransmissions.

  • implement ACK handling
  • send ACKs when requested

Testing procedure

flat topology

This should work the same as in master:

  • start the ZEP dispatcher

    dist/tools/zep_dispatch/bin/zep_dispatch ::1 17754
    
  • start two native instances that communicate with the ZEP interface

     make -C examples/gnrc_networking USE_ZEP=1 all term # repeat this in a second terminal
    

Broadcast ping should still work:

ping ff02::1
12 bytes from fe80::ec17:98b9:8acf:a3b1%7: icmp_seq=0 ttl=64 rssi=0 dBm time=0.591 ms
12 bytes from fe80::ec17:98b9:8acf:a3b1%7: icmp_seq=1 ttl=64 rssi=0 dBm time=0.568 ms
12 bytes from fe80::ec17:98b9:8acf:a3b1%7: icmp_seq=2 ttl=64 rssi=0 dBm time=0.623 ms

--- ff02::1 PING statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.568/0.594/0.623 ms

As well as unicast

ping fe80::ec17:98b9:8acf:a3b1
12 bytes from fe80::ec17:98b9:8acf:a3b1%7: icmp_seq=0 ttl=64 rssi=0 dBm time=1.679 ms
12 bytes from fe80::ec17:98b9:8acf:a3b1%7: icmp_seq=1 ttl=64 rssi=0 dBm time=1.628 ms
12 bytes from fe80::ec17:98b9:8acf:a3b1%7: icmp_seq=2 ttl=64 rssi=0 dBm time=0.609 ms

--- fe80::ec17:98b9:8acf:a3b1 PING statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.609/1.305/1.679 ms

advanced topology

(this requires #16957)

  • start the ZEP dispatcher for two nodes on a symmetric link with 75% probability of successful transmisson

     echo "A B 0.75" | dist/tools/zep_dispatch/bin/zep_dispatch -t - :: 17754
    

Unicast ping should still work reliably

ping -c 100 -i 10 fe80::e8a4:53ae:bda2:e844
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=1 ttl=64 rssi=0 dBm time=2.414 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=2 ttl=64 rssi=0 dBm time=0.532 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=3 ttl=64 rssi=0 dBm time=2.422 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=3 ttl=64 rssi=0 dBm time=3.363 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=6 ttl=64 rssi=0 dBm time=5.279 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=8 ttl=64 rssi=0 dBm time=1.454 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=9 ttl=64 rssi=0 dBm time=1.413 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=10 ttl=64 rssi=0 dBm time=1.444 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=10 ttl=64 rssi=0 dBm time=2.445 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=11 ttl=64 rssi=0 dBm time=2.420 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=12 ttl=64 rssi=0 dBm time=2.433 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=12 ttl=64 rssi=0 dBm time=3.450 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=13 ttl=64 rssi=0 dBm time=0.460 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=15 ttl=64 rssi=0 dBm time=5.284 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=15 ttl=64 rssi=0 dBm time=6.219 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=16 ttl=64 rssi=0 dBm time=2.462 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=17 ttl=64 rssi=0 dBm time=3.419 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=18 ttl=64 rssi=0 dBm time=2.301 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=19 ttl=64 rssi=0 dBm time=1.491 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=20 ttl=64 rssi=0 dBm time=2.465 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=20 ttl=64 rssi=0 dBm time=3.413 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=21 ttl=64 rssi=0 dBm time=2.441 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=23 ttl=64 rssi=0 dBm time=3.425 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=24 ttl=64 rssi=0 dBm time=0.456 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=25 ttl=64 rssi=0 dBm time=3.352 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=26 ttl=64 rssi=0 dBm time=3.365 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=27 ttl=64 rssi=0 dBm time=2.478 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=28 ttl=64 rssi=0 dBm time=2.374 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=29 ttl=64 rssi=0 dBm time=3.434 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=30 ttl=64 rssi=0 dBm time=1.397 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=31 ttl=64 rssi=0 dBm time=6.156 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=32 ttl=64 rssi=0 dBm time=0.334 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=34 ttl=64 rssi=0 dBm time=4.965 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=35 ttl=64 rssi=0 dBm time=1.394 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=35 ttl=64 rssi=0 dBm time=2.211 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=36 ttl=64 rssi=0 dBm time=1.388 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=37 ttl=64 rssi=0 dBm time=0.463 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=39 ttl=64 rssi=0 dBm time=0.471 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=42 ttl=64 rssi=0 dBm time=1.515 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=44 ttl=64 rssi=0 dBm time=0.398 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=45 ttl=64 rssi=0 dBm time=1.344 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=47 ttl=64 rssi=0 dBm time=2.358 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=47 ttl=64 rssi=0 dBm time=3.306 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=48 ttl=64 rssi=0 dBm time=1.468 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=49 ttl=64 rssi=0 dBm time=0.430 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=50 ttl=64 rssi=0 dBm time=5.032 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=51 ttl=64 rssi=0 dBm time=0.548 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=55 ttl=64 rssi=0 dBm time=0.460 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=55 ttl=64 rssi=0 dBm time=1.482 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=56 ttl=64 rssi=0 dBm time=5.143 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=57 ttl=64 rssi=0 dBm time=0.243 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=58 ttl=64 rssi=0 dBm time=5.287 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=59 ttl=64 rssi=0 dBm time=1.494 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=60 ttl=64 rssi=0 dBm time=0.519 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=61 ttl=64 rssi=0 dBm time=1.333 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=62 ttl=64 rssi=0 dBm time=0.423 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=63 ttl=64 rssi=0 dBm time=1.461 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=64 ttl=64 rssi=0 dBm time=0.510 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=65 ttl=64 rssi=0 dBm time=1.438 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=65 ttl=64 rssi=0 dBm time=3.379 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=66 ttl=64 rssi=0 dBm time=1.494 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=67 ttl=64 rssi=0 dBm time=0.490 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=68 ttl=64 rssi=0 dBm time=1.464 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=70 ttl=64 rssi=0 dBm time=2.345 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=71 ttl=64 rssi=0 dBm time=1.480 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=72 ttl=64 rssi=0 dBm time=0.571 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=73 ttl=64 rssi=0 dBm time=1.455 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=74 ttl=64 rssi=0 dBm time=0.555 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=75 ttl=64 rssi=0 dBm time=5.350 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=76 ttl=64 rssi=0 dBm time=2.576 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=77 ttl=64 rssi=0 dBm time=2.527 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=77 ttl=64 rssi=0 dBm time=3.383 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=77 ttl=64 rssi=0 dBm time=4.386 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=79 ttl=64 rssi=0 dBm time=1.539 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=80 ttl=64 rssi=0 dBm time=1.390 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=80 ttl=64 rssi=0 dBm time=3.376 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=83 ttl=64 rssi=0 dBm time=0.542 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=84 ttl=64 rssi=0 dBm time=2.272 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=85 ttl=64 rssi=0 dBm time=5.024 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=86 ttl=64 rssi=0 dBm time=2.188 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=88 ttl=64 rssi=0 dBm time=1.420 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=89 ttl=64 rssi=0 dBm time=0.352 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=90 ttl=64 rssi=0 dBm time=2.129 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=91 ttl=64 rssi=0 dBm time=0.275 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=92 ttl=64 rssi=0 dBm time=1.160 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=93 ttl=64 rssi=0 dBm time=5.066 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=95 ttl=64 rssi=0 dBm time=2.291 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=96 ttl=64 rssi=0 dBm time=0.382 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=96 ttl=64 rssi=0 dBm time=1.346 ms (DUP!)
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=97 ttl=64 rssi=0 dBm time=1.529 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=99 ttl=64 rssi=0 dBm time=1.514 ms
12 bytes from fe80::e8a4:53ae:bda2:e844%7: icmp_seq=99 ttl=64 rssi=0 dBm time=2.408 ms (DUP!)

--- fe80::e8a4:53ae:bda2:e844 PING statistics ---
100 packets transmitted, 78 packets received, 14 duplicates, 22% packet loss
round-trip min/avg/max = 0.243/2.179/6.219 ms

Compared to master (no retransmissions):

ping -c 100 -i 10 fe80::a4a5:51ed:7fdc:2e46
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=0 ttl=64 rssi=-8288 dBm time=0.437 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=1 ttl=64 rssi=-8288 dBm time=0.606 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=2 ttl=64 rssi=-8288 dBm time=0.587 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=3 ttl=64 rssi=-8288 dBm time=0.629 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=5 ttl=64 rssi=-8288 dBm time=0.609 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=7 ttl=64 rssi=-8288 dBm time=0.646 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=8 ttl=64 rssi=-8288 dBm time=0.594 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=9 ttl=64 rssi=-8288 dBm time=0.366 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=11 ttl=64 rssi=-8288 dBm time=0.588 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=12 ttl=64 rssi=-8288 dBm time=0.667 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=13 ttl=64 rssi=-8288 dBm time=0.626 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=17 ttl=64 rssi=-8288 dBm time=0.621 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=18 ttl=64 rssi=-8288 dBm time=0.526 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=20 ttl=64 rssi=-8288 dBm time=0.598 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=21 ttl=64 rssi=-8288 dBm time=0.589 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=23 ttl=64 rssi=-8288 dBm time=0.542 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=24 ttl=64 rssi=-8288 dBm time=0.586 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=25 ttl=64 rssi=-8288 dBm time=0.627 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=29 ttl=64 rssi=-8288 dBm time=0.521 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=31 ttl=64 rssi=-8288 dBm time=0.475 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=32 ttl=64 rssi=-8288 dBm time=0.413 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=34 ttl=64 rssi=-8288 dBm time=0.422 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=35 ttl=64 rssi=-8288 dBm time=0.626 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=36 ttl=64 rssi=-8288 dBm time=0.615 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=40 ttl=64 rssi=-8288 dBm time=0.484 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=41 ttl=64 rssi=-8288 dBm time=0.544 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=46 ttl=64 rssi=-8288 dBm time=0.607 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=47 ttl=64 rssi=-8288 dBm time=0.650 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=49 ttl=64 rssi=-8288 dBm time=0.632 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=50 ttl=64 rssi=-8288 dBm time=0.537 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=52 ttl=64 rssi=-8288 dBm time=0.460 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=55 ttl=64 rssi=-8288 dBm time=0.586 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=56 ttl=64 rssi=-8288 dBm time=0.591 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=57 ttl=64 rssi=-8288 dBm time=0.587 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=58 ttl=64 rssi=-8288 dBm time=0.564 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=63 ttl=64 rssi=-8288 dBm time=0.622 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=64 ttl=64 rssi=-8288 dBm time=0.532 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=65 ttl=64 rssi=-8288 dBm time=0.567 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=68 ttl=64 rssi=-8288 dBm time=0.581 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=69 ttl=64 rssi=-8288 dBm time=0.478 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=71 ttl=64 rssi=-8288 dBm time=0.431 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=73 ttl=64 rssi=-8288 dBm time=0.511 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=77 ttl=64 rssi=-8288 dBm time=0.480 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=79 ttl=64 rssi=-8288 dBm time=0.478 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=80 ttl=64 rssi=-8288 dBm time=0.480 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=81 ttl=64 rssi=-8288 dBm time=0.494 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=82 ttl=64 rssi=-8288 dBm time=0.477 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=83 ttl=64 rssi=-8288 dBm time=0.484 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=84 ttl=64 rssi=-8288 dBm time=0.462 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=85 ttl=64 rssi=-8288 dBm time=0.483 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=86 ttl=64 rssi=-8288 dBm time=0.478 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=87 ttl=64 rssi=-8288 dBm time=0.511 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=89 ttl=64 rssi=-8288 dBm time=0.486 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=93 ttl=64 rssi=-8288 dBm time=0.496 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=94 ttl=64 rssi=-8288 dBm time=0.494 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=95 ttl=64 rssi=-8288 dBm time=0.478 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=96 ttl=64 rssi=-8288 dBm time=0.481 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=98 ttl=64 rssi=-8288 dBm time=0.480 ms
12 bytes from fe80::a4a5:51ed:7fdc:2e46%7: icmp_seq=99 ttl=64 rssi=-8288 dBm time=0.482 ms

--- fe80::a4a5:51ed:7fdc:2e46 PING statistics ---
100 packets transmitted, 59 packets received, 41% packet loss
round-trip min/avg/max = 0.366/0.537/0.667 ms

Issues/PRs references

depends on #16957 for ACKs to be dispatched in non-flat topologies

@benpicco benpicco requested a review from jia200x October 1, 2021 15:14
@github-actions github-actions bot added Area: cpu Area: CPU/MCU ports Area: network Area: Networking Area: sys Area: System Area: tests Area: tests and testing framework Platform: native Platform: This PR/issue effects the native platform labels Oct 1, 2021
@jia200x
Copy link
Copy Markdown
Member

jia200x commented Oct 4, 2021

  • implement ACK handling
  • send ACKs when requested

Is this what's missing? If so, the driver only needs to send ACK when requested, because the SubMAC will handle the ACK.

Copy link
Copy Markdown
Member

@jia200x jia200x left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here are some comments

{
(void) dev;

/* TODO: handle ACK */
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't require to handle ACK here, since the SubMAC will do it automatically.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I only need to send ACKs, I don't need to process them at all?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, you only need to send an ACK frame "TXRXTurnaroundTime" usecs after receiving a valid frame.
You should forward the ACKs to the upper layer, without requiring to process them.

Alternatively if ACKs are not relevant for the scope of ZEP, you can also "omit" them with the ACK timeout CAP. Then, the TX_DONE callback will be interpreted as "the radio is not triggering an ACK timeout so it received an ACK"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TXRXTurnaroundTime is symbol_time * 12. For O-QPSK this is 192 us.

break;
}
case ZEP_V2_TYPE_ACK: {
break;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you should pass this ACK to the upper layer if you want the SubMAC to take care of retransmissions. Alternatively, you can implement this here and use caps to indicate that the ACK's are managed, but probably the former will be easier

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or is this a ZEP internal?

Copy link
Copy Markdown
Contributor Author

@benpicco benpicco Oct 4, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah so I can just pass on the L2 ACK payload and don't have to distinguish between Data frames and ACK frames in the driver at all?

Copy link
Copy Markdown
Member

@miri64 miri64 Oct 4, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think that these are supposed to be used in tandem to L2 ACKs. I believe more (since they were only introduced with V2 of ZEP) that they are a ZEP internal (as always: ZEP is rather sparsely documented). So rather handle them separately, in case we need them later for their actual purpose.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah so I can just pass on the L2 ACK payload and don't have to distinguish between Data frames and ACK frames in the driver at all?

This is correct. The SubMAC will take care of it

I don't think that these are supposed to be used in tandem to L2 ACKs. I believe more (since they were only introduced with V2 of ZEP) that they are a ZEP internal (as always: ZEP is rather sparsely documented). So rather handle them separately, in case we need them later for their actual purpose.

I don't know how ZEP works. In fact, do ZEP retransmissions exists? Can these frame get lost somehow?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ZEP retransmissions exists?

ZEP just wraps a IEEE 802.15.4 frame inside a UDP packet, so it should be able to do everything a real IEEE 802.15.4 network can do.

Can these frame get lost somehow?

If we simulate a network with ZEP dispatcher they can get lost, just like in a real network. 😉

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know how ZEP works. In fact, do ZEP retransmissions exists? Can these frame get lost somehow?

Nobody knows, I think... the only doc that can be found on this is the packet format in the Wireshark code and Wiki. Since ZEP could, in theory, be sent in normal Internet traffic, I think having retransmissions in ZEP can make sense, if you want to keep the ZEP layer somewhat transparent from 802.15.4.

If we simulate a network with ZEP dispatcher they can get lost, just like in a real network. wink

I think in that case, the IEEE 802.15.4 frame should rather be dropped, not the ZEP message. Yes this implies also the ZEP message to be dropped, so semantics, I know, but a crucial difference when it comes to the layer retransmissions are happening on ;-).

typedef struct {
netdev_ieee802154_t netdev; /**< netdev internal member */
const socket_zep_params_t *params;
ieee802154_dev_t *hal; /**< radio HAL */
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in the SPI radios it's possible to pass this pointer as an ISR argument, so you don't need to store it here. Would it be possible here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the ISR this works, but there are other places where I need to access sock_fd

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but why does the private descriptor needs access to the hal? can't this be accessed directly from the private descriptor?

@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Oct 5, 2021

What I'm trying to understand is why I'm getting so many retransmissions:

> udp send fe80::bc8e:d0f2:c11:b97b 1234 Hello
socket_zep::write(37 bytes)
socket_zep::request_transmit
Success: sent 5 byte(s) to [fe80::bc8e:d0f2:c11:b97b]:1234
socket_zep::request_transmit
socket_zep::request_transmit
socket_zep::request_transmit
socket_zep::request_transmit

@jia200x
Copy link
Copy Markdown
Member

jia200x commented Oct 5, 2021

What I'm trying to understand is why I'm getting so many retransmissions:

This means either the SubMAC didn't receive an ACK on time or didn't receive it at all. Did you implement the ACK mechanism?

@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Oct 5, 2021

I added ACK sending in 6b117a4, without a delay so far as I assume it's not needed on native where we can always send / receive.
But I'm afraid I didn't get it right yet, I still get all the retransmissions.

@jia200x
Copy link
Copy Markdown
Member

jia200x commented Oct 5, 2021

I added ACK sending in 6b117a4, without a delay so far as I assume it's not needed on native where we can always send / receive. But I'm afraid I didn't get it right yet, I still get all the retransmissions.

Hmmmm does the send function handle FCS? I think I saw in the other send function that the FCS was calculated manually. This should be the same for the ACK

@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Oct 5, 2021

Ah I wasn't sure if the sub-MAC would check it, added it now. (still no difference though, there might be something else wrong)

@jia200x
Copy link
Copy Markdown
Member

jia200x commented Oct 5, 2021

do you see the ACK frames in wireshark?

@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Oct 5, 2021

Yes the ACKs are there in Wireshark, but instead of them I read 3 bytes (always 45 58 2 - a zep_hdr_t) after each frame sent with ACK_REQ enabled. I'm not sure where those are coming from, but that's likely unrelated to the radio HAL/sub-MAC.

edit ah now I get it! The sub-mac wants to read a 3 byte ACK and doesn't use .len because the size is known.
So I can' read direcly into the sub-MAC supplied buffer but have to use a per-device RX buffer where I can receive the full frame with ZEP header.

With this it appears to be working :D

@jia200x
Copy link
Copy Markdown
Member

jia200x commented Oct 6, 2021

edit ah now I get it! The sub-mac wants to read a 3 byte ACK and doesn't use .len because the size is known.
So I can' read direcly into the sub-MAC supplied buffer but have to use a per-device RX buffer where I can receive the full frame with ZEP header.

Glad to hear it works!

But this I didn't understand. Why do you need to store the full frame?
The SubMAC does exactly this:

...
    uint8_t ack[3];

    switch (ev) {
    case IEEE802154_FSM_EV_RX_DONE:
        assert(!ieee802154_radio_has_irq_ack_timeout(&submac->dev));
        if (ieee802154_radio_read(&submac->dev, ack, 3, NULL) &&
            ack[0] & IEEE802154_FCF_TYPE_ACK) {
            ieee802154_submac_ack_timer_cancel(submac);
            ieee802154_tx_info_t tx_info;
            tx_info.retrans = submac->retrans;
            bool fp = (ack[0] & IEEE802154_FCF_FRAME_PEND);
            ieee802154_radio_set_frame_filter_mode(&submac->dev, IEEE802154_FILTER_ACCEPT);
            return _tx_end(submac, fp ? TX_STATUS_FRAME_PENDING : TX_STATUS_SUCCESS,
                           &tx_info);
        }
        return IEEE802154_FSM_STATE_WAIT_FOR_ACK;
...

It just calls ieee802154_radio_read to read the potential ACK frame. This should be 3 bytes long.

@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Oct 6, 2021

But this I didn't understand. Why do you need to store the full frame?

because before the ACK frame there comes the ZEP header which I also need to read.I have to store that somewhere.
I guess I could do two reads and first read the ZEP header and then read the 802.15.4 frame into the buffer I get from the sub-MAC.

@jia200x
Copy link
Copy Markdown
Member

jia200x commented Oct 6, 2021

because before the ACK frame there comes the ZEP header which I also need to read.I have to store that somewhere.
I guess I could do two reads and first read the ZEP header and then read the 802.15.4 frame into the buffer I get from the sub-MAC.

ah! I see. Yes, that seems reasonable.

@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Oct 6, 2021

I guess I could do two reads and first read the ZEP header and then read the 802.15.4 frame into the buffer I get from the sub-MAC.

Ah that doesn't work, when I do a partial read on a datagram, the remaining bytes will simply be discarded.

Btw.: I still quite often get

IDLE--(ACK_TIMEOUT)->INVALID

Is this due to me not waiting before sending the ACK?

@jia200x
Copy link
Copy Markdown
Member

jia200x commented Oct 6, 2021

Ah that doesn't work, when I do a partial read on a datagram, the remaining bytes will simply be discarded.

Hmmm if there's a header before, I think the RX buffer would be the only option.

Btw.: I still quite often get

Could you try this patch?

diff --git a/sys/include/net/ieee802154/submac.h b/sys/include/net/ieee802154/submac.h
index 044903e4e3..9dff7e047e 100644
--- a/sys/include/net/ieee802154/submac.h
+++ b/sys/include/net/ieee802154/submac.h
@@ -549,7 +549,9 @@ ieee802154_fsm_state_t ieee802154_submac_process_ev(ieee802154_submac_t *submac,
  */
 static inline void ieee802154_submac_ack_timeout_fired(ieee802154_submac_t *submac)
 {
-    ieee802154_submac_process_ev(submac, IEEE802154_FSM_EV_ACK_TIMEOUT);
+    if (submac->fsm_state == IEEE802154_FSM_STATE_WAIT_FOR_ACK) {
+        ieee802154_submac_process_ev(submac, IEEE802154_FSM_EV_ACK_TIMEOUT);
+    }
 }
 
 /**

I think the issue is a race condition between the RX_DONE event ACK_TIMEOUT event of the SubMAC.
That patch would indicate if that's the problem.

The solution would be to either PR that patch or simply ignore the ACK_TIMEOUT state on IDLE. Since I don't see other sources of interrupts there, I think it's safe to assume the only case where an ACK_TIMEOUT is triggered in IDLE is because of this race condition. Therefore probably the latter would be cleaner.

The most elegant solution would be to extend the state machne to support better state transitions (let's say "enter" and "exit" events for each state). We would only need to modify one function (ieee802154_submac_process_ev).

@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Oct 6, 2021

With that patch things are running a lot more smoothly!
No more failed assertions and also no more duplicates.

Does it also make sense for 'real' radios?

@jia200x
Copy link
Copy Markdown
Member

jia200x commented Oct 6, 2021

Great to hear that!

With that patch things are running a lot more smoothly!
No more failed assertions and also no more duplicates.

When the radio receives a late
Does it also make sense for 'real' radios?

The mechanism yes, but I would probably choose to write is as a transition. There are some transitions that are simply ignored, but some others are intentionally asserted because it might be caused by a wrong driver implementation or a bug in the SubMAC.

What those lines are trying to prevent there is a race condition between ztimer and the RX_DONE event of the radio, due to the fact they are posted in a single queue. When reading the ACK frame takes longer, the timer fires before calling ztimer_cancel.
Since this events might be posted from the same thread (e.g SPI radios), disabling/enabling IRQs won't be effective.

We could simply ignore ACK_TIMEOUT events during IDLE. I think it's unlikely this would happen because of a faulty driver or a bug in the SubMAC.

pre-print EDIT: I just noticed there's an event_cancel function that removes an event from the queue. Maybe that's all we need (inside ieee802154_submac_ack_timer_cancel). For netdev_ieee802154_submac, simply clearing the NETDEV_SUBMAC_FLAGS_ACK_TIMEOUT flag should do the trick:

diff --git a/drivers/netdev_ieee802154_submac/netdev_ieee802154_submac.c b/drivers/netdev_ieee802154_submac/netdev_ieee802154_submac.c
index baa1efd509..d5692a5f57 100644
--- a/drivers/netdev_ieee802154_submac/netdev_ieee802154_submac.c
+++ b/drivers/netdev_ieee802154_submac/netdev_ieee802154_submac.c
@@ -151,6 +151,9 @@ void ieee802154_submac_ack_timer_cancel(ieee802154_submac_t *submac)
                                                              submac);
 
     xtimer_remove(&netdev_submac->ack_timer);
+    /* Prevent a race condition between the RX_DONE event and the ACK timeout */
+    netdev_submac->isr_flags &= ~NETDEV_SUBMAC_FLAGS_ACK_TIMEOUT;
+
 }
 
 static int _send(netdev_t *netdev, const iolist_t *pkt)

@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Oct 6, 2021

That patch works too.

I get

ping -c 100 -i 10 fe80::a47f:23a7:7d62:a804%7

12 bytes from fe80::a47f:23a7:7d62:a804%7: icmp_seq=0 ttl=64 rssi=0 dBm time=2.630 ms
…
12 bytes from fe80::a47f:23a7:7d62:a804%7: icmp_seq=97 ttl=64 rssi=0 dBm time=0.944 ms
12 bytes from fe80::a47f:23a7:7d62:a804%7: icmp_seq=98 ttl=64 rssi=0 dBm time=1.281 ms
12 bytes from fe80::a47f:23a7:7d62:a804%7: icmp_seq=99 ttl=64 rssi=0 dBm time=1.915 ms

--- fe80::a47f:23a7:7d62:a804%7 PING statistics ---
100 packets transmitted, 97 packets received, 1 duplicates, 3% packet loss
round-trip min/avg/max = 0.621/1.675/6.129 ms

@github-actions github-actions bot added the Area: pkg Area: External package ports label Oct 6, 2021
@benpicco benpicco marked this pull request as ready for review October 6, 2021 21:29
@leandrolanzieri
Copy link
Copy Markdown
Contributor

socket_zep is not modelled in Kconfig yet, I think the following is enough (does not include the dependency for netdev):

diff --git a/cpu/native/socket_zep/Kconfig b/cpu/native/socket_zep/Kconfig
new file mode 100644
index 0000000000..4b3d70d305
--- /dev/null
+++ b/cpu/native/socket_zep/Kconfig
@@ -0,0 +1,17 @@
+menuconfig MODULE_SOCKET_ZEP
+    bool "Socket-based ZEP"
+    depends on CPU_MODEL_NATIVE
+    depends on TEST_KCONFIG
+    select MODULE_IOLIST
+    select MODULE_CHECKSUM
+    select MODULE_RANDOM
+    select MODULE_IEEE802154
+    help
+      UDP socket-based IEEE 802.15.4 device over ZEP
+
+config MODULE_SOCKET_ZEP_HELLO
+    bool "Send a dummy HELLO packet on startup"
+    depends on MODULE_SOCKET_ZEP
+    help
+      Say y to send a dummy HELLO packet on startup. This is used to make
+      dispatchers aware of the node.
diff --git a/drivers/Kconfig.net b/drivers/Kconfig.net
index 37738a53c5..0634122267 100644
--- a/drivers/Kconfig.net
+++ b/drivers/Kconfig.net
@@ -18,6 +18,7 @@ rsource "ncv7356/Kconfig"
 rsource "pn532/Kconfig"
 rsource "rn2xx3/Kconfig"
 rsource "slipdev/Kconfig"
+rsource "$(RIOTCPU)/native/socket_zep/Kconfig"
 rsource "sx126x/Kconfig"
 rsource "sx127x/Kconfig"
 rsource "tja1042/Kconfig"
diff --git a/tests/ieee802154_hal/Makefile b/tests/ieee802154_hal/Makefile
index e2b7e95b3d..24fa7d1e5e 100644
--- a/tests/ieee802154_hal/Makefile
+++ b/tests/ieee802154_hal/Makefile
@@ -24,6 +24,10 @@ ifeq ($(BOARD), native)
   ZEP_PORT_BASE ?= 17754
   TERMFLAGS += -z [::1]:$(ZEP_PORT_BASE)
   USEMODULE += socket_zep
+  # the same for Kconfig
+  ifeq (1,$(TEST_KCONFIG))
+    KCONFIG_ADD_CONFIG += $(APPDIR)/app.config.test.native
+  endif
 endif
 
 USEMODULE += od
diff --git a/tests/ieee802154_hal/app.config.test.native b/tests/ieee802154_hal/app.config.test.native
new file mode 100644
index 0000000000..3ffd15ce5f
--- /dev/null
+++ b/tests/ieee802154_hal/app.config.test.native
@@ -0,0 +1,7 @@
+CONFIG_MODULE_SOCKET_ZEP=y
+
+# Should be autoselecting the MODULE_PRNG_HWRNG if possible
+# Since the makefile cannot we have to override until end of migration
+# Remove when TEST_KCONFIG is complete
+CONFIG_MODULE_PRNG_TINYMT32=y
+

@fjmolinas
Copy link
Copy Markdown
Contributor

ping @jia200x @leandrolanzieri

@leandrolanzieri
Copy link
Copy Markdown
Contributor

ping @jia200x @leandrolanzieri

The Kconfig changes LGTM

@fjmolinas fjmolinas added this to the Release 2022.01 milestone Nov 18, 2021
@fjmolinas
Copy link
Copy Markdown
Contributor

@jia200x anything missing to squash?

@jia200x
Copy link
Copy Markdown
Member

jia200x commented Nov 18, 2021

please squash!

@benpicco benpicco added the CI: skip compile test If set, CI server will run only non-compile jobs, but no compile jobs or their dependent jobs label Nov 18, 2021
@benpicco benpicco requested a review from jia200x November 29, 2021 13:39
@benpicco benpicco removed the CI: skip compile test If set, CI server will run only non-compile jobs, but no compile jobs or their dependent jobs label Nov 29, 2021
@fjmolinas
Copy link
Copy Markdown
Contributor

all green @jia200x

@jia200x
Copy link
Copy Markdown
Member

jia200x commented Dec 7, 2021

it looks fine to me!

@benpicco could you post the test results again, after all the requested changes were addressed? Otherwise, let's get this one soon!

@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Dec 7, 2021

I ran the test with

echo "A B 0.75" | bin/zep_dispatch -t - ::1 17754

(25% packet loss between A and B)

master
> ping -c 100 -i 10 fe80::dca1:35e9:ebc8:4272
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=2 ttl=64 rssi=24672 dBm time=0.273 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=6 ttl=64 rssi=24672 dBm time=0.485 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=7 ttl=64 rssi=24672 dBm time=0.315 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=8 ttl=64 rssi=24672 dBm time=0.437 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=9 ttl=64 rssi=24672 dBm time=0.231 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=10 ttl=64 rssi=24672 dBm time=0.249 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=13 ttl=64 rssi=24672 dBm time=0.231 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=14 ttl=64 rssi=24672 dBm time=0.376 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=15 ttl=64 rssi=24672 dBm time=0.240 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=17 ttl=64 rssi=24672 dBm time=0.251 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=18 ttl=64 rssi=24672 dBm time=0.273 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=21 ttl=64 rssi=24672 dBm time=0.219 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=22 ttl=64 rssi=24672 dBm time=0.525 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=23 ttl=64 rssi=24672 dBm time=0.284 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=25 ttl=64 rssi=24672 dBm time=0.212 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=28 ttl=64 rssi=24672 dBm time=0.242 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=29 ttl=64 rssi=24672 dBm time=0.372 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=30 ttl=64 rssi=24672 dBm time=0.237 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=31 ttl=64 rssi=24672 dBm time=0.231 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=34 ttl=64 rssi=24672 dBm time=0.338 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=35 ttl=64 rssi=24672 dBm time=0.375 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=37 ttl=64 rssi=24672 dBm time=0.284 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=38 ttl=64 rssi=24672 dBm time=0.596 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=40 ttl=64 rssi=24672 dBm time=0.575 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=42 ttl=64 rssi=24672 dBm time=0.368 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=44 ttl=64 rssi=24672 dBm time=0.506 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=45 ttl=64 rssi=24672 dBm time=0.264 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=47 ttl=64 rssi=24672 dBm time=0.382 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=48 ttl=64 rssi=24672 dBm time=0.411 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=50 ttl=64 rssi=24672 dBm time=0.229 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=51 ttl=64 rssi=24672 dBm time=0.442 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=52 ttl=64 rssi=24672 dBm time=0.353 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=53 ttl=64 rssi=24672 dBm time=0.490 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=58 ttl=64 rssi=24672 dBm time=0.259 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=60 ttl=64 rssi=24672 dBm time=0.235 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=64 ttl=64 rssi=24672 dBm time=0.376 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=65 ttl=64 rssi=24672 dBm time=0.321 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=66 ttl=64 rssi=24672 dBm time=0.495 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=67 ttl=64 rssi=24672 dBm time=0.435 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=68 ttl=64 rssi=24672 dBm time=0.363 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=70 ttl=64 rssi=24672 dBm time=0.242 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=71 ttl=64 rssi=24672 dBm time=0.261 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=74 ttl=64 rssi=24672 dBm time=0.228 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=78 ttl=64 rssi=24672 dBm time=0.272 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=79 ttl=64 rssi=24672 dBm time=0.436 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=80 ttl=64 rssi=24672 dBm time=0.326 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=83 ttl=64 rssi=24672 dBm time=0.349 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=84 ttl=64 rssi=24672 dBm time=0.258 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=86 ttl=64 rssi=24672 dBm time=0.409 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=87 ttl=64 rssi=24672 dBm time=0.264 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=88 ttl=64 rssi=24672 dBm time=0.224 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=89 ttl=64 rssi=24672 dBm time=0.376 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=93 ttl=64 rssi=24672 dBm time=0.337 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=94 ttl=64 rssi=24672 dBm time=0.302 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=96 ttl=64 rssi=24672 dBm time=0.232 ms
12 bytes from fe80::dca1:35e9:ebc8:4272%7: icmp_seq=97 ttl=64 rssi=24672 dBm time=0.272 ms

--- fe80::dca1:35e9:ebc8:4272 PING statistics ---
100 packets transmitted, 56 packets received, 44% packet loss
round-trip min/avg/max = 0.212/0.331/0.596 ms
this PR
> ping -c 100 -i 10 fe80::ecbd:2a7:e4e9:1d3
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=0 ttl=64 rssi=0 dBm time=0.240 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=0 ttl=64 rssi=0 dBm time=1.295 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=1 ttl=64 rssi=0 dBm time=0.291 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=1 ttl=64 rssi=0 dBm time=1.249 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=1 ttl=64 rssi=0 dBm time=2.106 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=1 ttl=64 rssi=0 dBm time=3.106 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=2 ttl=64 rssi=0 dBm time=2.204 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=3 ttl=64 rssi=0 dBm time=0.238 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=5 ttl=64 rssi=0 dBm time=2.051 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=6 ttl=64 rssi=0 dBm time=4.996 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=8 ttl=64 rssi=0 dBm time=0.288 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=8 ttl=64 rssi=0 dBm time=1.189 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=9 ttl=64 rssi=0 dBm time=4.989 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=12 ttl=64 rssi=0 dBm time=0.235 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=13 ttl=64 rssi=0 dBm time=1.458 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=14 ttl=64 rssi=0 dBm time=0.377 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=15 ttl=64 rssi=0 dBm time=0.225 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=17 ttl=64 rssi=0 dBm time=1.267 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=18 ttl=64 rssi=0 dBm time=1.262 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=19 ttl=64 rssi=0 dBm time=2.229 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=20 ttl=64 rssi=0 dBm time=2.405 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=21 ttl=64 rssi=0 dBm time=1.340 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=21 ttl=64 rssi=0 dBm time=2.270 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=22 ttl=64 rssi=0 dBm time=2.260 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=24 ttl=64 rssi=0 dBm time=0.392 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=24 ttl=64 rssi=0 dBm time=1.433 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=24 ttl=64 rssi=0 dBm time=3.337 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=25 ttl=64 rssi=0 dBm time=2.303 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=26 ttl=64 rssi=0 dBm time=0.454 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=27 ttl=64 rssi=0 dBm time=4.282 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=28 ttl=64 rssi=0 dBm time=0.222 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=29 ttl=64 rssi=0 dBm time=1.454 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=30 ttl=64 rssi=0 dBm time=2.289 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=31 ttl=64 rssi=0 dBm time=1.396 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=32 ttl=64 rssi=0 dBm time=0.318 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=33 ttl=64 rssi=0 dBm time=0.328 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=35 ttl=64 rssi=0 dBm time=2.323 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=35 ttl=64 rssi=0 dBm time=3.270 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=36 ttl=64 rssi=0 dBm time=1.350 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=37 ttl=64 rssi=0 dBm time=1.428 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=39 ttl=64 rssi=0 dBm time=2.262 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=39 ttl=64 rssi=0 dBm time=3.210 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=39 ttl=64 rssi=0 dBm time=4.164 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=40 ttl=64 rssi=0 dBm time=2.248 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=40 ttl=64 rssi=0 dBm time=3.240 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=41 ttl=64 rssi=0 dBm time=1.337 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=41 ttl=64 rssi=0 dBm time=2.366 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=41 ttl=64 rssi=0 dBm time=4.206 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=41 ttl=64 rssi=0 dBm time=5.087 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=43 ttl=64 rssi=0 dBm time=0.262 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=44 ttl=64 rssi=0 dBm time=0.289 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=45 ttl=64 rssi=0 dBm time=0.338 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=45 ttl=64 rssi=0 dBm time=1.301 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=45 ttl=64 rssi=0 dBm time=4.140 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=46 ttl=64 rssi=0 dBm time=0.261 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=47 ttl=64 rssi=0 dBm time=1.304 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=48 ttl=64 rssi=0 dBm time=4.984 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=49 ttl=64 rssi=0 dBm time=2.977 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=50 ttl=64 rssi=0 dBm time=0.261 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=51 ttl=64 rssi=0 dBm time=0.386 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=52 ttl=64 rssi=0 dBm time=0.340 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=53 ttl=64 rssi=0 dBm time=1.157 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=53 ttl=64 rssi=0 dBm time=2.067 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=54 ttl=64 rssi=0 dBm time=2.288 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=55 ttl=64 rssi=0 dBm time=2.491 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=56 ttl=64 rssi=0 dBm time=1.190 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=57 ttl=64 rssi=0 dBm time=1.186 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=58 ttl=64 rssi=0 dBm time=0.251 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=59 ttl=64 rssi=0 dBm time=0.259 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=59 ttl=64 rssi=0 dBm time=2.188 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=59 ttl=64 rssi=0 dBm time=4.107 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=60 ttl=64 rssi=0 dBm time=1.197 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=61 ttl=64 rssi=0 dBm time=2.106 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=63 ttl=64 rssi=0 dBm time=3.039 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=64 ttl=64 rssi=0 dBm time=0.332 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=64 ttl=64 rssi=0 dBm time=1.286 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=65 ttl=64 rssi=0 dBm time=0.284 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=66 ttl=64 rssi=0 dBm time=1.355 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=68 ttl=64 rssi=0 dBm time=2.206 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=70 ttl=64 rssi=0 dBm time=0.405 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=71 ttl=64 rssi=0 dBm time=1.113 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=72 ttl=64 rssi=0 dBm time=0.302 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=72 ttl=64 rssi=0 dBm time=1.260 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=73 ttl=64 rssi=0 dBm time=0.233 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=74 ttl=64 rssi=0 dBm time=1.319 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=76 ttl=64 rssi=0 dBm time=0.351 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=77 ttl=64 rssi=0 dBm time=0.217 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=77 ttl=64 rssi=0 dBm time=1.181 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=77 ttl=64 rssi=0 dBm time=2.148 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=77 ttl=64 rssi=0 dBm time=3.079 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=78 ttl=64 rssi=0 dBm time=0.263 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=79 ttl=64 rssi=0 dBm time=2.299 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=80 ttl=64 rssi=0 dBm time=1.486 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=83 ttl=64 rssi=0 dBm time=0.403 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=84 ttl=64 rssi=0 dBm time=0.224 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=84 ttl=64 rssi=0 dBm time=1.150 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=86 ttl=64 rssi=0 dBm time=0.282 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=86 ttl=64 rssi=0 dBm time=1.225 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=87 ttl=64 rssi=0 dBm time=0.356 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=88 ttl=64 rssi=0 dBm time=1.297 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=89 ttl=64 rssi=0 dBm time=0.324 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=90 ttl=64 rssi=0 dBm time=0.199 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=91 ttl=64 rssi=0 dBm time=0.366 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=92 ttl=64 rssi=0 dBm time=0.248 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=92 ttl=64 rssi=0 dBm time=1.325 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=93 ttl=64 rssi=0 dBm time=0.313 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=94 ttl=64 rssi=0 dBm time=0.413 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=95 ttl=64 rssi=0 dBm time=1.097 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=96 ttl=64 rssi=0 dBm time=4.150 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=98 ttl=64 rssi=0 dBm time=0.305 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=99 ttl=64 rssi=0 dBm time=0.310 ms
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=99 ttl=64 rssi=0 dBm time=1.179 ms (DUP!)
12 bytes from fe80::ecbd:2a7:e4e9:1d3%7: icmp_seq=99 ttl=64 rssi=0 dBm time=2.131 ms (DUP!)

--- fe80::ecbd:2a7:e4e9:1d3 PING statistics ---
100 packets transmitted, 83 packets received, 30 duplicates, 17% packet loss
round-trip min/avg/max = 0.199/1.531/5.087 ms

and with a perfect link (flat topology)

this PR
> ping -c 100 -i 10 fe80::ac4b:6aad:8c91:39fb
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=0 ttl=64 rssi=0 dBm time=0.374 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=1 ttl=64 rssi=0 dBm time=1.239 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=2 ttl=64 rssi=0 dBm time=0.255 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=3 ttl=64 rssi=0 dBm time=0.370 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=4 ttl=64 rssi=0 dBm time=0.317 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=5 ttl=64 rssi=0 dBm time=0.189 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=6 ttl=64 rssi=0 dBm time=0.263 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=7 ttl=64 rssi=0 dBm time=0.191 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=8 ttl=64 rssi=0 dBm time=0.250 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=9 ttl=64 rssi=0 dBm time=0.295 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=10 ttl=64 rssi=0 dBm time=1.406 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=11 ttl=64 rssi=0 dBm time=1.239 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=12 ttl=64 rssi=0 dBm time=0.308 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=13 ttl=64 rssi=0 dBm time=1.218 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=14 ttl=64 rssi=0 dBm time=0.277 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=15 ttl=64 rssi=0 dBm time=0.306 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=16 ttl=64 rssi=0 dBm time=0.437 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=17 ttl=64 rssi=0 dBm time=1.237 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=18 ttl=64 rssi=0 dBm time=0.202 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=19 ttl=64 rssi=0 dBm time=1.193 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=20 ttl=64 rssi=0 dBm time=0.298 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=21 ttl=64 rssi=0 dBm time=0.275 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=22 ttl=64 rssi=0 dBm time=0.297 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=23 ttl=64 rssi=0 dBm time=1.375 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=24 ttl=64 rssi=0 dBm time=0.324 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=25 ttl=64 rssi=0 dBm time=1.398 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=26 ttl=64 rssi=0 dBm time=0.291 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=27 ttl=64 rssi=0 dBm time=0.401 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=28 ttl=64 rssi=0 dBm time=0.325 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=29 ttl=64 rssi=0 dBm time=0.549 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=30 ttl=64 rssi=0 dBm time=0.515 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=31 ttl=64 rssi=0 dBm time=1.643 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=32 ttl=64 rssi=0 dBm time=1.603 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=33 ttl=64 rssi=0 dBm time=0.312 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=34 ttl=64 rssi=0 dBm time=0.444 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=35 ttl=64 rssi=0 dBm time=0.487 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=36 ttl=64 rssi=0 dBm time=0.327 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=37 ttl=64 rssi=0 dBm time=0.486 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=38 ttl=64 rssi=0 dBm time=1.385 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=39 ttl=64 rssi=0 dBm time=0.496 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=40 ttl=64 rssi=0 dBm time=0.262 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=41 ttl=64 rssi=0 dBm time=1.407 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=42 ttl=64 rssi=0 dBm time=0.263 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=43 ttl=64 rssi=0 dBm time=0.248 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=44 ttl=64 rssi=0 dBm time=1.388 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=45 ttl=64 rssi=0 dBm time=0.207 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=46 ttl=64 rssi=0 dBm time=1.286 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=47 ttl=64 rssi=0 dBm time=1.374 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=48 ttl=64 rssi=0 dBm time=0.308 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=49 ttl=64 rssi=0 dBm time=1.284 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=50 ttl=64 rssi=0 dBm time=0.330 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=51 ttl=64 rssi=0 dBm time=0.363 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=52 ttl=64 rssi=0 dBm time=0.314 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=53 ttl=64 rssi=0 dBm time=0.258 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=54 ttl=64 rssi=0 dBm time=0.251 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=55 ttl=64 rssi=0 dBm time=0.327 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=56 ttl=64 rssi=0 dBm time=0.271 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=57 ttl=64 rssi=0 dBm time=1.241 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=58 ttl=64 rssi=0 dBm time=0.223 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=59 ttl=64 rssi=0 dBm time=1.343 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=60 ttl=64 rssi=0 dBm time=1.454 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=61 ttl=64 rssi=0 dBm time=1.279 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=62 ttl=64 rssi=0 dBm time=1.440 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=63 ttl=64 rssi=0 dBm time=1.366 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=64 ttl=64 rssi=0 dBm time=1.274 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=65 ttl=64 rssi=0 dBm time=1.135 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=66 ttl=64 rssi=0 dBm time=1.284 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=67 ttl=64 rssi=0 dBm time=1.341 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=68 ttl=64 rssi=0 dBm time=0.211 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=69 ttl=64 rssi=0 dBm time=1.180 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=70 ttl=64 rssi=0 dBm time=1.240 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=71 ttl=64 rssi=0 dBm time=1.188 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=72 ttl=64 rssi=0 dBm time=1.300 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=73 ttl=64 rssi=0 dBm time=1.318 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=74 ttl=64 rssi=0 dBm time=0.239 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=75 ttl=64 rssi=0 dBm time=0.357 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=76 ttl=64 rssi=0 dBm time=0.183 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=77 ttl=64 rssi=0 dBm time=0.432 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=78 ttl=64 rssi=0 dBm time=0.240 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=79 ttl=64 rssi=0 dBm time=0.283 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=80 ttl=64 rssi=0 dBm time=1.318 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=81 ttl=64 rssi=0 dBm time=0.411 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=82 ttl=64 rssi=0 dBm time=0.237 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=83 ttl=64 rssi=0 dBm time=0.375 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=84 ttl=64 rssi=0 dBm time=1.435 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=85 ttl=64 rssi=0 dBm time=0.283 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=86 ttl=64 rssi=0 dBm time=0.235 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=87 ttl=64 rssi=0 dBm time=0.341 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=88 ttl=64 rssi=0 dBm time=0.314 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=89 ttl=64 rssi=0 dBm time=1.395 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=90 ttl=64 rssi=0 dBm time=0.367 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=91 ttl=64 rssi=0 dBm time=0.309 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=92 ttl=64 rssi=0 dBm time=0.434 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=93 ttl=64 rssi=0 dBm time=0.268 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=94 ttl=64 rssi=0 dBm time=1.344 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=95 ttl=64 rssi=0 dBm time=0.263 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=96 ttl=64 rssi=0 dBm time=0.341 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=97 ttl=64 rssi=0 dBm time=0.216 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=98 ttl=64 rssi=0 dBm time=0.207 ms
12 bytes from fe80::ac4b:6aad:8c91:39fb%7: icmp_seq=99 ttl=64 rssi=0 dBm time=0.255 ms

--- fe80::ac4b:6aad:8c91:39fb PING statistics ---
100 packets transmitted, 100 packets received, 0% packet loss
round-trip min/avg/max = 0.183/0.668/1.643 ms

Copy link
Copy Markdown
Member

@jia200x jia200x left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK. Code-wise looks good and I trust the test results.

@jia200x jia200x merged commit ce8cda2 into RIOT-OS:master Dec 7, 2021
@benpicco benpicco deleted the socket_zep-hal branch December 7, 2021 17:29
@benpicco
Copy link
Copy Markdown
Contributor Author

benpicco commented Dec 7, 2021

Thank you for the review!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area: boards Area: Board ports Area: cpu Area: CPU/MCU ports Area: drivers Area: Device drivers Area: Kconfig Area: Kconfig integration Area: network Area: Networking Area: pkg Area: External package ports Area: sys Area: System Area: tests Area: tests and testing framework CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR Platform: native Platform: This PR/issue effects the native platform

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants