diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2022-07-13 05:22:25 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2022-07-14 01:36:05 +0200 |
commit | 4de37151c9e5f4d65d8563336159084d393d1bd4 (patch) | |
tree | 054ddd1e9d398981bb35313e173cba046ba6a401 | |
parent | f3198c4a06494846597df66ca73d053c977fefc8 (diff) | |
download | passt-4de37151c9e5f4d65d8563336159084d393d1bd4.tar passt-4de37151c9e5f4d65d8563336159084d393d1bd4.tar.gz passt-4de37151c9e5f4d65d8563336159084d393d1bd4.tar.bz2 passt-4de37151c9e5f4d65d8563336159084d393d1bd4.tar.lz passt-4de37151c9e5f4d65d8563336159084d393d1bd4.tar.xz passt-4de37151c9e5f4d65d8563336159084d393d1bd4.tar.zst passt-4de37151c9e5f4d65d8563336159084d393d1bd4.zip |
conf: Fix initialisation of IPv6 unicast and link-local addresses
In commit 675174d4ba25 ("conf, tap: Split netlink and pasta
functions, allow interface configuration"), I broke the initial
setting of the observed IPv6 addresses in two ways:
- the size copied from the configured addresses corresponds to an
IPv4 address, not to an IPv6 address
- the observed link-local address is initialised to the configured
unicast address, not the link-local one
If we haven't seen the guest using some type of addresses yet, we
should default to the configured values, hence these initial
settings: fix both.
This resulted in UDP flows to the guest from a unique local address
on the network not working before the guest shows passt a valid
address itself, as reported by Alona.
Reported-by: Alona Paz <alkaplan@redhat.com>
Link: https://bugs.passt.top/show_bug.cgi?id=16
Fixes: 675174d4ba25 ("conf, tap: Split netlink and pasta functions, allow interface configuration")
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r-- | conf.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -589,8 +589,8 @@ static void conf_ip(struct ctx *c) IN6_IS_ADDR_UNSPECIFIED(&c->addr6) ? &c->addr6 : NULL, &prefix_len, &c->addr6_ll); - memcpy(&c->addr6_seen, &c->addr6, sizeof(c->addr4_seen)); - memcpy(&c->addr6_ll_seen, &c->addr6, sizeof(c->addr4_seen)); + memcpy(&c->addr6_seen, &c->addr6, sizeof(c->addr6)); + memcpy(&c->addr6_ll_seen, &c->addr6_ll, sizeof(c->addr6_ll)); } if (!c->gw4 || !c->addr4 || |