aboutgitcodebugslistschat
diff options
context:
space:
mode:
-rw-r--r--flow.c32
-rw-r--r--icmp.c16
2 files changed, 10 insertions, 38 deletions
diff --git a/flow.c b/flow.c
index c1af136..27340df 100644
--- a/flow.c
+++ b/flow.c
@@ -370,38 +370,6 @@ const struct flowside *flow_initiate_sa(union flow *flow, uint8_t pif,
}
/**
- * flow_target_af() - Move flow to TGT, setting TGTSIDE details
- * @flow: Flow to change state
- * @pif: pif of the target side
- * @af: Address family for @eaddr and @faddr
- * @saddr: Source address (pointer to in_addr or in6_addr)
- * @sport: Endpoint port
- * @daddr: Destination address (pointer to in_addr or in6_addr)
- * @dport: Destination port
- *
- * Return: pointer to the target flowside information
- */
-const struct flowside *flow_target_af(union flow *flow, uint8_t pif,
- sa_family_t af,
- const void *saddr, in_port_t sport,
- const void *daddr, in_port_t dport)
-{
- struct flow_common *f = &flow->f;
- struct flowside *tgt = &f->side[TGTSIDE];
-
- ASSERT(pif != PIF_NONE);
- ASSERT(flow_new_entry == flow && f->state == FLOW_STATE_INI);
- ASSERT(f->type == FLOW_TYPE_NONE);
- ASSERT(f->pif[INISIDE] != PIF_NONE && f->pif[TGTSIDE] == PIF_NONE);
-
- flowside_from_af(tgt, af, daddr, dport, saddr, sport);
- f->pif[TGTSIDE] = pif;
- flow_set_state(f, FLOW_STATE_TGT);
- return tgt;
-}
-
-
-/**
* flow_target() - Determine where flow should forward to, and move to TGT
* @c: Execution context
* @flow: Flow to forward
diff --git a/icmp.c b/icmp.c
index 2217747..cb81c76 100644
--- a/icmp.c
+++ b/icmp.c
@@ -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;