aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorJon Maloy <jmaloy@redhat.com>2025-10-23 21:29:29 -0400
committerStefano Brivio <sbrivio@redhat.com>2025-10-30 12:01:01 +0100
commit5d35ac333d8f9cfdfa559468a3351077e87125b8 (patch)
tree473147d06e8396caf760157775dd4aceb1d531e4
parent7917155ba259185bf6a7a83f5d09cad267a6951f (diff)
downloadpasst-5d35ac333d8f9cfdfa559468a3351077e87125b8.tar
passt-5d35ac333d8f9cfdfa559468a3351077e87125b8.tar.gz
passt-5d35ac333d8f9cfdfa559468a3351077e87125b8.tar.bz2
passt-5d35ac333d8f9cfdfa559468a3351077e87125b8.tar.lz
passt-5d35ac333d8f9cfdfa559468a3351077e87125b8.tar.xz
passt-5d35ac333d8f9cfdfa559468a3351077e87125b8.tar.zst
passt-5d35ac333d8f9cfdfa559468a3351077e87125b8.zip
flow: add MAC address of LAN local remote hosts to flow
When communicating with remote hosts on the local network, some guest applications want to see the real MAC address of that host instead of PASST/PASTA's own tap address. The flow_common structure is a convenient location for storing that address, so we do that in this commit. Note that we don“t add actual usage of this address here, that will be done in later commits. Signed-off-by: Jon Maloy <jmaloy@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--flow.c2
-rw-r--r--flow.h2
-rw-r--r--util.h2
3 files changed, 6 insertions, 0 deletions
diff --git a/flow.c b/flow.c
index feefda3..a57d7b9 100644
--- a/flow.c
+++ b/flow.c
@@ -449,6 +449,7 @@ struct flowside *flow_target(const struct ctx *c, union flow *flow,
switch (f->pif[INISIDE]) {
case PIF_TAP:
+ memcpy(f->tap_omac, MAC_UNDEF, ETH_ALEN);
tgtpif = fwd_nat_from_tap(c, proto, ini, tgt);
break;
@@ -458,6 +459,7 @@ struct flowside *flow_target(const struct ctx *c, union flow *flow,
case PIF_HOST:
tgtpif = fwd_nat_from_host(c, proto, ini, tgt);
+ fwd_neigh_mac_get(c, &tgt->oaddr, f->tap_omac);
break;
default:
diff --git a/flow.h b/flow.h
index cac618a..f342895 100644
--- a/flow.h
+++ b/flow.h
@@ -177,6 +177,7 @@ int flowside_connect(const struct ctx *c, int s,
* @type: Type of packet flow
* @pif[]: Interface for each side of the flow
* @side[]: Information for each side of the flow
+ * @tap_omac: MAC address of remote endpoint as seen from the guest
*/
struct flow_common {
#ifdef __GNUC__
@@ -192,6 +193,7 @@ struct flow_common {
#endif
uint8_t pif[SIDES];
struct flowside side[SIDES];
+ uint8_t tap_omac[6];
};
#define FLOW_INDEX_BITS 17 /* 128k - 1 */
diff --git a/util.h b/util.h
index 22eaac5..6fc8f5d 100644
--- a/util.h
+++ b/util.h
@@ -101,6 +101,8 @@ void abort_with_msg(const char *fmt, ...)
((uint8_t [ETH_ALEN]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff })
#define MAC_ZERO ((uint8_t [ETH_ALEN]){ 0 })
#define MAC_IS_ZERO(addr) (!memcmp((addr), MAC_ZERO, ETH_ALEN))
+#define MAC_UNDEF MAC_BROADCAST
+#define MAC_IS_UNDEF(addr) (!memcmp((addr), MAC_UNDEF, ETH_ALEN))
#ifndef __bswap_constant_16
#define __bswap_constant_16(x) \