diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2022-07-20 18:19:57 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2022-07-20 18:19:57 +0200 |
commit | 9af2e5d5fc331e754abf257c2846c49bce1d2112 (patch) | |
tree | 7fdac1fdac5d59a8eabfb7dc8ef73fd59af684b0 /qrap.c | |
parent | b86cd006d33503d6407e14369610a65dcdcd261b (diff) | |
download | passt-9af2e5d5fc331e754abf257c2846c49bce1d2112.tar passt-9af2e5d5fc331e754abf257c2846c49bce1d2112.tar.gz passt-9af2e5d5fc331e754abf257c2846c49bce1d2112.tar.bz2 passt-9af2e5d5fc331e754abf257c2846c49bce1d2112.tar.lz passt-9af2e5d5fc331e754abf257c2846c49bce1d2112.tar.xz passt-9af2e5d5fc331e754abf257c2846c49bce1d2112.tar.zst passt-9af2e5d5fc331e754abf257c2846c49bce1d2112.zip |
qrap: Add a neighbour solicitation to probe frames, instead of just ARP2022_07_20.9af2e5d
For a while now, passt disables ARP functionality completely if IPv4
is disabled. If qrap sends an ARP request as a probe in that case, it
will receive no answer and move on, trying to find another instance.
Add a second probe frame, a hardcoded neighbour solicitation, so that
we get a neighbour advertisement if IPv6 is enabled.
Without this change, IPv6-only operation is completely broken.
Reported-by: Wenli Quan <wquan@redhat.com>
Reported-by: Alona Paz <alkaplan@redhat.com>
Link: https://bugzilla.redhat.com/show_bug.cgi?id=2106257
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'qrap.c')
-rw-r--r-- | qrap.c | 36 |
1 files changed, 32 insertions, 4 deletions
@@ -24,9 +24,12 @@ #include <fcntl.h> #include <net/if_arp.h> #include <netinet/in.h> +#include <netinet/ip6.h> #include <netinet/if_ether.h> #include <time.h> +#include <linux/icmpv6.h> + #include "util.h" #include "passt.h" #include "arp.h" @@ -121,12 +124,18 @@ int main(int argc, char **argv) const struct pci_dev *dev = NULL; long fd; struct { - uint32_t vnet_len; - struct ethhdr eh; + uint32_t vnet_len4; + struct ethhdr eh4; struct arphdr ah; struct arpmsg am; - } probe = { - .vnet_len = htonl(42), + + uint32_t vnet_len6; + struct ethhdr eh6; + struct ipv6hdr ip6hr; + struct icmp6hdr ihr; + struct in6_addr target; + } __attribute__((__packed__)) probe = { + .vnet_len4 = htonl(42), { .h_dest = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, .h_source = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, @@ -141,6 +150,25 @@ int main(int argc, char **argv) { .sha = { 0 }, .sip = { 0 }, .tha = { 0 }, .tip = { 0 }, }, + .vnet_len6 = htonl(78), + { + .h_dest = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, + .h_source = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, + .h_proto = htons(ETH_P_IPV6), + }, + { + .version = 6, + .payload_len = htons(24), + .nexthdr = IPPROTO_ICMPV6, + .hop_limit = 255, + .saddr = IN6ADDR_LOOPBACK_INIT, + .daddr = IN6ADDR_ANY_INIT, + }, + { + .icmp6_type = 135, + .icmp6_code = 0, + }, + IN6ADDR_ANY_INIT, }; char probe_r; |