ok...
We have two devices, and a router....
root@cpe:~# ip route get 192.0.2.17
192.0.2.17 via inet6 fe80::6cec:83db:265b:a6f2 dev br-vlan64 src 192.168.64.1 uid 0
cache
root@cpe:~# ip route get 192.0.2.23
192.0.2.23 via inet6 fe80::ae1f:6bff:fed1:225c dev br-vlan24 src 192.168.24.1 uid 0
cache
As you see, two interfaces on the router. Routes got added with:
root@cpe:~# ip -4 route add 192.0.2.23/32 via inet6 fe80::ae1f:6bff:fed1:225c dev br-vlan24
root@cpe:~# ip -4 route add 192.0.2.17/32 via inet6 fe80::6cec:83db:265b:a6f2 dev br-vlan64
Link local on the router:
root@cpe:~# ip -6 -br addr show scope link | grep -Ee 'vlan(24|64)'
br-vlan24 UP fe80::1ff:fe01:18/64
br-vlan64 UP fe80::1ff:fe01:40/64
Both test-devices:
root@margot:~# ip link add test type dummy
root@margot:~# ip link set test up
root@margot:~# ip addr add 192.0.2.23/32 dev test
root@margot:~# ip -br a
...
eno1 UP ... fe80::ae1f:6bff:fed1:225c/64
test UNKNOWN 192.0.2.23/32 fe80::2cfc:17ff:fe2f:7f94/64
root@margot:~# ip route add 192.0.2.17/32 via inet6 fe80::1ff:fe01:18 dev eno1
root@hiten ~ # ip link add test type dummy
root@hiten ~ # ip addr 192.0.2.17/32 dev test
root@hiten ~ # ip link set test up
root@hiten ~ # ip -4 route add 192.0.2.23 via inet6 fe80::1ff:fe01:40
root@hiten ~ # ip -br a
...
eno1 UP ... fe80::6cec:83db:265b:a6f2/64
...
test UNKNOWN 192.0.2.17/32 fe80::1475:fbff:fe5f:9a42/64
root@hiten ~ # ping -I 192.0.2.17 -c 3 192.0.2.23
PING 192.0.2.23 (192.0.2.23) from 192.0.2.17 : 56(84) bytes of data.
64 bytes from 192.0.2.23: icmp_seq=1 ttl=63 time=0.478 ms
64 bytes from 192.0.2.23: icmp_seq=2 ttl=63 time=0.472 ms
64 bytes from 192.0.2.23: icmp_seq=3 ttl=63 time=0.438 ms
--- 192.0.2.23 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2015ms
rtt min/avg/max/mdev = 0.438/0.462/0.478/0.017 ms
root@margot:~# tcpdump -i any -enN icmp or icmp6
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
20:57:33.904096 eno1 In ifindex 2 02:00:01:01:00:18 ethertype IPv4 (0x0800), length 104: 192.0.2.17 > 192.0.2.23: ICMP echo request, id 5, seq 1, length 64
20:57:33.904118 eno1 Out ifindex 2 ac:1f:6b:d1:22:5c ethertype IPv4 (0x0800), length 104: 192.0.2.23 > 192.0.2.17: ICMP echo reply, id 5, seq 1, length 64
20:57:34.906189 eno1 In ifindex 2 02:00:01:01:00:18 ethertype IPv4 (0x0800), length 104: 192.0.2.17 > 192.0.2.23: ICMP echo request, id 5, seq 2, length 64
20:57:34.906211 eno1 Out ifindex 2 ac:1f:6b:d1:22:5c ethertype IPv4 (0x0800), length 104: 192.0.2.23 > 192.0.2.17: ICMP echo reply, id 5, seq 2, length 64
20:57:35.919519 eno1 In ifindex 2 02:00:01:01:00:18 ethertype IPv4 (0x0800), length 104: 192.0.2.17 > 192.0.2.23: ICMP echo request, id 5, seq 3, length 64
20:57:35.919541 eno1 Out ifindex 2 ac:1f:6b:d1:22:5c ethertype IPv4 (0x0800), length 104: 192.0.2.23 > 192.0.2.17: ICMP echo reply, id 5, seq 3, length 64
^C
6 packets captured
8 packets received by filter
0 packets dropped by kernel
And again, just read RFC 8950 and the earlier version RFC 5549.
It's already in the title!
Advertising IPv4 Network Layer Reachability Information with an IPv6 Next Hop