From 754d5581fa9d5de97f7c2acf8c2900e105f588c9 Mon Sep 17 00:00:00 2001 Message-Id: <754d5581fa9d5de97f7c2acf8c2900e105f588c9.1590585469.git.lorenzo.bianconi@redhat.com> In-Reply-To: References: From: Lorenzo Bianconi Date: Wed, 20 May 2020 22:01:16 +0200 Subject: [PATCH ovn 2/3] controller: fix ip buffering with static routes When the arp request is sent to a gw router and not to the final destination of the packet buffered_packets_map needs to be updated using next-hop ip address and not the destionation one. Fixes: 2e5cdb4b1392 ("OVN: add buffering support for ip packets") Signed-off-by: Lorenzo Bianconi --- controller/pinctrl.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) --- a/controller/pinctrl.c +++ b/controller/pinctrl.c @@ -1378,8 +1378,7 @@ pinctrl_find_buffered_packets(const stru /* Called with in the pinctrl_handler thread context. */ static int -pinctrl_handle_buffered_packets(const struct flow *ip_flow, - struct dp_packet *pkt_in, +pinctrl_handle_buffered_packets(struct dp_packet *pkt_in, const struct match *md, bool is_arp) OVS_REQUIRES(pinctrl_mutex) { @@ -1388,9 +1387,10 @@ pinctrl_handle_buffered_packets(const st struct in6_addr addr; if (is_arp) { - addr = in6_addr_mapped_ipv4(ip_flow->nw_dst); + addr = in6_addr_mapped_ipv4(htonl(md->flow.regs[0])); } else { - addr = ip_flow->ipv6_dst; + ovs_be128 ip6 = hton128(flow_get_xxreg(&md->flow, 0)); + memcpy(&addr, &ip6, sizeof addr); } uint32_t hash = hash_bytes(&addr, sizeof addr, 0); @@ -1431,7 +1431,7 @@ pinctrl_handle_arp(struct rconn *swconn, } ovs_mutex_lock(&pinctrl_mutex); - pinctrl_handle_buffered_packets(ip_flow, pkt_in, md, true); + pinctrl_handle_buffered_packets(pkt_in, md, true); ovs_mutex_unlock(&pinctrl_mutex); /* Compose an ARP packet. */ @@ -5278,7 +5278,7 @@ pinctrl_handle_nd_ns(struct rconn *swcon } ovs_mutex_lock(&pinctrl_mutex); - pinctrl_handle_buffered_packets(ip_flow, pkt_in, md, false); + pinctrl_handle_buffered_packets(pkt_in, md, false); ovs_mutex_unlock(&pinctrl_mutex); uint64_t packet_stub[128 / 8];