For ICMP (ping) flows we currently don't populate the common flowside fields. Fill out those parts of the common information that we can easily obtain, using the ICMP id as the "port" on both ends. Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au> --- icmp.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/icmp.c b/icmp.c index 1c5cf84..c000175 100644 --- a/icmp.c +++ b/icmp.c @@ -150,16 +150,23 @@ static void icmp_ping_close(const struct ctx *c, * @id_sock: Pointer to ping flow entry slot in icmp_id_map[] to update * @af: Address family, AF_INET or AF_INET6 * @id: ICMP id for the new socket + * @pif: pif originating the ping request + * @saddr: Source address + * @daddr: Destination address * * Return: Newly opened ping flow, or NULL on failure */ static struct icmp_ping_flow *icmp_ping_new(const struct ctx *c, struct icmp_ping_flow **id_sock, - sa_family_t af, uint16_t id) + sa_family_t af, uint16_t id, + uint8_t pif, const void *saddr, + const void *daddr) { uint8_t flowtype = af == AF_INET ? FLOW_PING4 : FLOW_PING6; union epoll_ref ref = { .type = EPOLL_TYPE_PING }; union flow *flow = flow_alloc(); + struct flowside *sockside = &flow->f.side[SOCKSIDE]; + struct flowside *tapside = &flow->f.side[TAPSIDE]; struct icmp_ping_flow *pingf; const void *bind_addr; const char *bind_if; @@ -167,6 +174,9 @@ static struct icmp_ping_flow *icmp_ping_new(const struct ctx *c, if (!flow) return NULL; + flowside_from_af(tapside, pif, af, daddr, id, saddr, id); + flowside_from_af(sockside, PIF_HOST, af, NULL, 0, daddr, 0); + pingf = FLOW_START(flow, flowtype, ping, TAPSIDE); pingf->seq = -1; @@ -228,7 +238,6 @@ int icmp_tap_handler(const struct ctx *c, uint8_t pif, sa_family_t af, uint16_t id, seq; void *pkt; - (void)saddr; ASSERT(pif == PIF_TAP); if (af == AF_INET) { @@ -269,7 +278,8 @@ int icmp_tap_handler(const struct ctx *c, uint8_t pif, sa_family_t af, } if (!(pingf = *id_sock)) - if (!(pingf = icmp_ping_new(c, id_sock, af, id))) + if (!(pingf = icmp_ping_new(c, id_sock, af, id, + pif, saddr, daddr))) return 1; pingf->ts = now->tv_sec; -- 2.44.0