diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-07-18 15:26:44 +1000 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-07-19 18:33:33 +0200 |
commit | c000f2aba6a4612a202ee4e8e66fec2d19deedf7 (patch) | |
tree | 20269df0fe4081bb7e9b9c40d6f6ff5effb1144a /icmp.c | |
parent | 060f24e310b71f8813dbbc561a2e5a59d21feae0 (diff) | |
download | passt-c000f2aba6a4612a202ee4e8e66fec2d19deedf7.tar passt-c000f2aba6a4612a202ee4e8e66fec2d19deedf7.tar.gz passt-c000f2aba6a4612a202ee4e8e66fec2d19deedf7.tar.bz2 passt-c000f2aba6a4612a202ee4e8e66fec2d19deedf7.tar.lz passt-c000f2aba6a4612a202ee4e8e66fec2d19deedf7.tar.xz passt-c000f2aba6a4612a202ee4e8e66fec2d19deedf7.tar.zst passt-c000f2aba6a4612a202ee4e8e66fec2d19deedf7.zip |
flow, icmp: Use general flow forwarding rules for ICMP
Current ICMP hard codes its forwarding rules, and never applies any
translations. Change it to use the flow_target() function, so that
it's translated the same as TCP (excluding TCP specific port
redirection).
This means that gw mapping now applies to ICMP so "ping <gw address>" will
now ping the host's loopback instead of the actual gw machine. This
removes the surprising behaviour that the target you ping might not be the
same as you connect to with TCP.
This removes the last user of flow_target_af(), so that's removed as well.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'icmp.c')
-rw-r--r-- | icmp.c | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -169,24 +169,28 @@ static struct icmp_ping_flow *icmp_ping_new(const struct ctx *c, sa_family_t af, uint16_t id, const void *saddr, const void *daddr) { + uint8_t proto = af == AF_INET ? IPPROTO_ICMP : IPPROTO_ICMPV6; uint8_t flowtype = af == AF_INET ? FLOW_PING4 : FLOW_PING6; union epoll_ref ref = { .type = EPOLL_TYPE_PING }; union flow *flow = flow_alloc(); struct icmp_ping_flow *pingf; const struct flowside *tgt; - const void *bind_addr; if (!flow) return NULL; flow_initiate_af(flow, PIF_TAP, af, saddr, id, daddr, id); + if (!(tgt = flow_target(c, flow, proto))) + goto cancel; - if (af == AF_INET) - bind_addr = &c->ip4.addr_out; - else if (af == AF_INET6) - bind_addr = &c->ip6.addr_out; + if (flow->f.pif[TGTSIDE] != PIF_HOST) { + flow_err(flow, "No support for forwarding %s from %s to %s", + proto == IPPROTO_ICMP ? "ICMP" : "ICMPv6", + pif_name(flow->f.pif[INISIDE]), + pif_name(flow->f.pif[TGTSIDE])); + goto cancel; + } - tgt = flow_target_af(flow, PIF_HOST, af, bind_addr, 0, daddr, 0); pingf = FLOW_SET_TYPE(flow, flowtype, ping); pingf->seq = -1; |