All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Gospodarek <andy@greyhouse.net>
To: Jiri Pirko <jiri@resnulli.us>
Cc: netdev@vger.kernel.org, davem@davemloft.net, idosch@mellanox.com,
	eladr@mellanox.com, mlxsw@mellanox.com,
	Roopa Prabhu <roopa@cumulusnetworks.com>,
	David Ahern <dsa@cumulusnetworks.com>
Subject: Re: [patch net-next 12/15] ipv4: fib: Notify about nexthop status changes
Date: Wed, 8 Feb 2017 09:56:00 -0500	[thread overview]
Message-ID: <20170208145600.GA48568@C02RW35GFVH8.dhcp.broadcom.net> (raw)
In-Reply-To: <1486549002-2056-13-git-send-email-jiri@resnulli.us>

On Wed, Feb 08, 2017 at 11:16:39AM +0100, Jiri Pirko wrote:
> From: Ido Schimmel <idosch@mellanox.com>
> 
> When a multipath route is hit the kernel doesn't consider nexthops that
> are DEAD or LINKDOWN when IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN is set.
> Devices that offload multipath routes need to be made aware of nexthop
> status changes. Otherwise, the device will keep forwarding packets to
> non-functional nexthops.
> 
> Add the FIB_EVENT_NH_{ADD,DEL} events to the fib notification chain,
> which notify capable devices when they should add or delete a nexthop
> from their tables.

This looks good -- thanks for doing this.

IIUC the hardware forwarding use case for your hardware covered by David
Ahern's patch[1] to the ipv4 software path selection is already covered,
so this is probably the last known link/neighbor forwarding issue for
ipv4 that needs coverage.

1. a6db449 net: ipv4: Consider failed nexthops in multipath routes

> Cc: Roopa Prabhu <roopa@cumulusnetworks.com>
> Cc: David Ahern <dsa@cumulusnetworks.com>
> Cc: Andy Gospodarek <andy@greyhouse.net>

Reviewed-by: Andy Gospodarek <gospo@broadcom.com>

> Signed-off-by: Ido Schimmel <idosch@mellanox.com>
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
> ---
>  include/net/ip_fib.h     |  7 +++++++
>  net/ipv4/fib_semantics.c | 33 +++++++++++++++++++++++++++++++++
>  2 files changed, 40 insertions(+)
> 
> diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
> index 57c2a86..45a184e 100644
> --- a/include/net/ip_fib.h
> +++ b/include/net/ip_fib.h
> @@ -214,11 +214,18 @@ struct fib_entry_notifier_info {
>  	u32 nlflags;
>  };
>  
> +struct fib_nh_notifier_info {
> +	struct fib_notifier_info info; /* must be first */
> +	struct fib_nh *fib_nh;
> +};
> +
>  enum fib_event_type {
>  	FIB_EVENT_ENTRY_ADD,
>  	FIB_EVENT_ENTRY_DEL,
>  	FIB_EVENT_RULE_ADD,
>  	FIB_EVENT_RULE_DEL,
> +	FIB_EVENT_NH_ADD,
> +	FIB_EVENT_NH_DEL,
>  };
>  
>  int register_fib_notifier(struct notifier_block *nb,
> diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
> index 6306a67..317026a 100644
> --- a/net/ipv4/fib_semantics.c
> +++ b/net/ipv4/fib_semantics.c
> @@ -1355,6 +1355,36 @@ int fib_sync_down_addr(struct net_device *dev, __be32 local)
>  	return ret;
>  }
>  
> +static int call_fib_nh_notifiers(struct fib_nh *fib_nh,
> +				 enum fib_event_type event_type)
> +{
> +	struct in_device *in_dev = __in_dev_get_rtnl(fib_nh->nh_dev);
> +	struct fib_nh_notifier_info info = {
> +		.fib_nh = fib_nh,
> +	};
> +
> +	switch (event_type) {
> +	case FIB_EVENT_NH_ADD:
> +		if (fib_nh->nh_flags & RTNH_F_DEAD)
> +			break;
> +		if (IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN(in_dev) &&
> +		    fib_nh->nh_flags & RTNH_F_LINKDOWN)
> +			break;
> +		return call_fib_notifiers(dev_net(fib_nh->nh_dev), event_type,
> +					  &info.info);
> +	case FIB_EVENT_NH_DEL:
> +		if ((IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN(in_dev) &&
> +		     fib_nh->nh_flags & RTNH_F_LINKDOWN) ||
> +		    (fib_nh->nh_flags & RTNH_F_DEAD))
> +			return call_fib_notifiers(dev_net(fib_nh->nh_dev),
> +						  event_type, &info.info);
> +	default:
> +		break;
> +	}
> +
> +	return NOTIFY_DONE;
> +}
> +
>  /* Event              force Flags           Description
>   * NETDEV_CHANGE      0     LINKDOWN        Carrier OFF, not for scope host
>   * NETDEV_DOWN        0     LINKDOWN|DEAD   Link down, not for scope host
> @@ -1396,6 +1426,8 @@ int fib_sync_down_dev(struct net_device *dev, unsigned long event, bool force)
>  					nexthop_nh->nh_flags |= RTNH_F_LINKDOWN;
>  					break;
>  				}
> +				call_fib_nh_notifiers(nexthop_nh,
> +						      FIB_EVENT_NH_DEL);
>  				dead++;
>  			}
>  #ifdef CONFIG_IP_ROUTE_MULTIPATH
> @@ -1550,6 +1582,7 @@ int fib_sync_up(struct net_device *dev, unsigned int nh_flags)
>  				continue;
>  			alive++;
>  			nexthop_nh->nh_flags &= ~nh_flags;
> +			call_fib_nh_notifiers(nexthop_nh, FIB_EVENT_NH_ADD);
>  		} endfor_nexthops(fi)
>  
>  		if (alive > 0) {
> -- 
> 2.7.4
> 

  reply	other threads:[~2017-02-08 15:25 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-08 10:16 [patch net-next 00/15] mlxsw: Reflect nexthop status changes Jiri Pirko
2017-02-08 10:16 ` [patch net-next 01/15] mlxsw: spectrum_router: Nullify nexthop's neigh pointer Jiri Pirko
2017-02-08 10:16 ` [patch net-next 02/15] mlxsw: spectrum_router: Store nexthop groups in a hash table Jiri Pirko
2017-02-08 10:16 ` [patch net-next 03/15] mlxsw: spectrum_router: Store nexthops " Jiri Pirko
2017-02-08 10:16 ` [patch net-next 04/15] mlxsw: spectrum_router: Use nexthop's scope to set action type Jiri Pirko
2017-02-08 10:16 ` [patch net-next 05/15] mlxsw: spectrum_router: Add gateway indication to nexthop group Jiri Pirko
2017-02-08 10:16 ` [patch net-next 06/15] mlxsw: spectrum_router: Store routes in a more generic way Jiri Pirko
2017-02-08 10:16 ` [patch net-next 07/15] mlxsw: spectrum_router: Remove FIB info from FIB entry struct Jiri Pirko
2017-02-08 10:16 ` [patch net-next 08/15] mlxsw: spectrum_router: Refactor nexthop init routine Jiri Pirko
2017-02-08 10:16 ` [patch net-next 09/15] mlxsw: spectrum_router: More accurately set offload flag Jiri Pirko
2017-02-08 10:16 ` [patch net-next 10/15] mlxsw: spectrum_router: Determine offload status using generic function Jiri Pirko
2017-02-08 10:16 ` [patch net-next 11/15] mlxsw: spectrum_router: Use trap action only for some route types Jiri Pirko
2017-02-08 10:16 ` [patch net-next 12/15] ipv4: fib: Notify about nexthop status changes Jiri Pirko
2017-02-08 14:56   ` Andy Gospodarek [this message]
2017-02-08 15:32     ` Ido Schimmel
2017-02-08 18:05       ` David Ahern
2017-02-08 18:20         ` Ido Schimmel
2017-02-08 15:27   ` Andy Gospodarek
2017-02-08 10:16 ` [patch net-next 13/15] mlxsw: spectrum_router: Reflect " Jiri Pirko
2017-02-08 10:16 ` [patch net-next 14/15] mlxsw: spectrum_router: Don't reflect LINKDOWN nexthops Jiri Pirko
2017-02-08 10:16 ` [patch net-next 15/15] mlxsw: spectrum_router: Flush resources when RIF is deleted Jiri Pirko
2017-02-08 13:36 ` [patch net-next 14/15] mlxsw: spectrum_router: Don't reflect LINKDOWN nexthops Jiri Pirko
2017-02-08 20:28 ` [patch net-next 00/15] mlxsw: Reflect nexthop status changes David Miller
2017-02-08 20:43   ` David Miller
2017-02-08 20:58     ` Jiri Pirko
2017-02-08 21:00       ` David Miller
2017-02-08 20:59     ` Ido Schimmel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170208145600.GA48568@C02RW35GFVH8.dhcp.broadcom.net \
    --to=andy@greyhouse.net \
    --cc=davem@davemloft.net \
    --cc=dsa@cumulusnetworks.com \
    --cc=eladr@mellanox.com \
    --cc=idosch@mellanox.com \
    --cc=jiri@resnulli.us \
    --cc=mlxsw@mellanox.com \
    --cc=netdev@vger.kernel.org \
    --cc=roopa@cumulusnetworks.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.