aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2022-07-22 15:31:14 +1000
committerStefano Brivio <sbrivio@redhat.com>2022-07-30 21:57:50 +0200
commit3f190726407109fdb74ed7b5f8ddd7e68a56d7aa (patch)
tree9cad3e6ffe6171db0799f3920f277477f491d15b
parent06abfcf6d95762976d37aa5721c16802c649efd4 (diff)
downloadpasst-3f190726407109fdb74ed7b5f8ddd7e68a56d7aa.tar
passt-3f190726407109fdb74ed7b5f8ddd7e68a56d7aa.tar.gz
passt-3f190726407109fdb74ed7b5f8ddd7e68a56d7aa.tar.bz2
passt-3f190726407109fdb74ed7b5f8ddd7e68a56d7aa.tar.lz
passt-3f190726407109fdb74ed7b5f8ddd7e68a56d7aa.tar.xz
passt-3f190726407109fdb74ed7b5f8ddd7e68a56d7aa.tar.zst
passt-3f190726407109fdb74ed7b5f8ddd7e68a56d7aa.zip
Initialize host side MAC when in IPv6 only mode
When sending packets to the guest we need a source MAC address, which we currently take from the host side interface we're using (though it's basically arbitrary). However if not given on the command line this MAC is initialized in an IPv4 specific path, and will end up as 00:00:00:00:00:00 when running "passt 6". The MAC address is also used for IPv6 packets, though. Interestingly, we largely seem to get away with using an all-zero MAC, but it's probably not a good idea. Make the IPv6 path pick the MAC address from its interface if the IPv4 path hasn't already done so. While we're there, use the existing MAC_IS_ZERO macro to make the code a little clearer. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r--conf.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/conf.c b/conf.c
index cc08de3..bc8851f 100644
--- a/conf.c
+++ b/conf.c
@@ -672,7 +672,7 @@ static void conf_ip(struct ctx *c)
memcpy(&c->addr4_seen, &c->addr4, sizeof(c->addr4_seen));
- if (!memcmp(c->mac, MAC_ZERO, ETH_ALEN))
+ if (MAC_IS_ZERO(c->mac))
nl_link(0, c->ifi4, c->mac, 0, 0);
}
@@ -691,17 +691,20 @@ static void conf_ip(struct ctx *c)
memcpy(&c->addr6_seen, &c->addr6, sizeof(c->addr6));
memcpy(&c->addr6_ll_seen, &c->addr6_ll, sizeof(c->addr6_ll));
+
+ if (MAC_IS_ZERO(c->mac))
+ nl_link(0, c->ifi6, c->mac, 0, 0);
}
- if (!c->gw4 || !c->addr4 ||
- !memcmp(c->mac, ((uint8_t [ETH_ALEN]){ 0 }), ETH_ALEN))
+ if (!c->gw4 || !c->addr4 || MAC_IS_ZERO(c->mac))
v4 = IP_VERSION_DISABLED;
else
v4 = IP_VERSION_ENABLED;
if (IN6_IS_ADDR_UNSPECIFIED(&c->gw6) ||
IN6_IS_ADDR_UNSPECIFIED(&c->addr6) ||
- IN6_IS_ADDR_UNSPECIFIED(&c->addr6_ll))
+ IN6_IS_ADDR_UNSPECIFIED(&c->addr6_ll) ||
+ MAC_IS_ZERO(c->mac))
v6 = IP_VERSION_DISABLED;
else
v6 = IP_VERSION_ENABLED;
@@ -905,12 +908,12 @@ static void conf_print(const struct ctx *c)
if (c->mode == MODE_PASTA)
info("Namespace interface: %s", c->pasta_ifn);
- if (c->v4) {
- info("ARP:");
- info(" address: %02x:%02x:%02x:%02x:%02x:%02x",
- c->mac[0], c->mac[1], c->mac[2],
- c->mac[3], c->mac[4], c->mac[5]);
+ info("MAC:");
+ info(" host: %02x:%02x:%02x:%02x:%02x:%02x",
+ c->mac[0], c->mac[1], c->mac[2],
+ c->mac[3], c->mac[4], c->mac[5]);
+ if (c->v4) {
if (!c->no_dhcp) {
info("DHCP:");
info(" assign: %s",