From 5b51ae2f1eca61c6f68e40a05333da5a362ff327 Mon Sep 17 00:00:00 2001 From: Murat Sezgin Date: Mon, 13 Apr 2020 09:01:48 -0700 Subject: [qca-nss-ecm] IPv6 solicitation fix with zero gateway address The ECM function can find a zero gateway address for a host IP address. In this case, we need to use the host IP address while sending the solicitation request. Signed-off-by: Murat Sezgin Change-Id: I1979834088ddfe1843566f51f64348f79e2df0fc --- frontends/nss/ecm_nss_ipv6.c | 11 ++++++++++- frontends/sfe/ecm_sfe_ipv6.c | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/frontends/nss/ecm_nss_ipv6.c b/frontends/nss/ecm_nss_ipv6.c index a05781b..9eb591c 100644 --- a/frontends/nss/ecm_nss_ipv6.c +++ b/frontends/nss/ecm_nss_ipv6.c @@ -516,7 +516,16 @@ struct ecm_db_node_instance *ecm_nss_ipv6_node_establish_and_ref(struct ecm_fron return NULL; } - DEBUG_TRACE("Have a gw address " ECM_IP_ADDR_OCTAL_FMT "\n", ECM_IP_ADDR_TO_OCTAL(gw_addr)); + /* + * The found gateway address can be all zeros, + * so in this case use the host address. + */ + if (ECM_IP_ADDR_IS_NULL(gw_addr)) { + DEBUG_TRACE("GW address is found as zeros, so use host IP\n"); + ECM_IP_ADDR_COPY(gw_addr, addr); + } else { + DEBUG_TRACE("Have a gw address " ECM_IP_ADDR_OCTAL_FMT "\n", ECM_IP_ADDR_TO_OCTAL(gw_addr)); + } if (ecm_interface_mac_addr_get_no_route(dev, gw_addr, node_addr)) { DEBUG_TRACE("Found the mac address for gateway\n"); diff --git a/frontends/sfe/ecm_sfe_ipv6.c b/frontends/sfe/ecm_sfe_ipv6.c index 51a9ccb..e609df7 100644 --- a/frontends/sfe/ecm_sfe_ipv6.c +++ b/frontends/sfe/ecm_sfe_ipv6.c @@ -245,7 +245,16 @@ struct ecm_db_node_instance *ecm_sfe_ipv6_node_establish_and_ref(struct ecm_fron return NULL; } - DEBUG_TRACE("Have a gw address " ECM_IP_ADDR_OCTAL_FMT "\n", ECM_IP_ADDR_TO_OCTAL(gw_addr)); + /* + * The found gateway address can be all zeros, + * so in this case use the host address. + */ + if (ECM_IP_ADDR_IS_NULL(gw_addr)) { + DEBUG_TRACE("GW address is found as zeros, so use host IP\n"); + ECM_IP_ADDR_COPY(gw_addr, addr); + } else { + DEBUG_TRACE("Have a gw address " ECM_IP_ADDR_OCTAL_FMT "\n", ECM_IP_ADDR_TO_OCTAL(gw_addr)); + } if (ecm_interface_mac_addr_get_no_route(dev, gw_addr, node_addr)) { DEBUG_TRACE("Found the mac address for gateway\n"); -- cgit v1.1