Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4724676d authored by David Ahern's avatar David Ahern Committed by David S. Miller
Browse files

net: Add struct for fib dump filter



Add struct fib_dump_filter for options on limiting which routes are
returned in a dump request. The current list is table id, protocol,
route type, rtm_flags and nexthop device index. struct net is needed
to lookup the net_device from the index.

Declare the filter for each route dump handler and plumb the new
arguments from dump handlers to ip_valid_fib_dump_req.

Signed-off-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 22e6c58b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -174,6 +174,7 @@ struct rt6_rtnl_dump_arg {
	struct sk_buff *skb;
	struct netlink_callback *cb;
	struct net *net;
	struct fib_dump_filter filter;
};

int rt6_dump_route(struct fib6_info *f6i, void *p_arg);
+12 −1
Original line number Diff line number Diff line
@@ -222,6 +222,16 @@ struct fib_table {
	unsigned long		__data[0];
};

struct fib_dump_filter {
	u32			table_id;
	/* filter_set is an optimization that an entry is set */
	bool			filter_set;
	unsigned char		protocol;
	unsigned char		rt_type;
	unsigned int		flags;
	struct net_device	*dev;
};

int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
		     struct fib_result *res, int fib_flags);
int fib_table_insert(struct net *, struct fib_table *, struct fib_config *,
@@ -453,6 +463,7 @@ static inline void fib_proc_exit(struct net *net)

u32 ip_mtu_from_fib_result(struct fib_result *res, __be32 daddr);

int ip_valid_fib_dump_req(const struct nlmsghdr *nlh,
int ip_valid_fib_dump_req(struct net *net, const struct nlmsghdr *nlh,
			  struct fib_dump_filter *filter,
			  struct netlink_ext_ack *extack);
#endif  /* _NET_FIB_H */
+4 −2
Original line number Diff line number Diff line
@@ -802,7 +802,8 @@ static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
	return err;
}

int ip_valid_fib_dump_req(const struct nlmsghdr *nlh,
int ip_valid_fib_dump_req(struct net *net, const struct nlmsghdr *nlh,
			  struct fib_dump_filter *filter,
			  struct netlink_ext_ack *extack)
{
	struct rtmsg *rtm;
@@ -837,6 +838,7 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
{
	const struct nlmsghdr *nlh = cb->nlh;
	struct net *net = sock_net(skb->sk);
	struct fib_dump_filter filter = {};
	unsigned int h, s_h;
	unsigned int e = 0, s_e;
	struct fib_table *tb;
@@ -844,7 +846,7 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
	int dumped = 0, err;

	if (cb->strict_check) {
		err = ip_valid_fib_dump_req(nlh, cb->extack);
		err = ip_valid_fib_dump_req(net, nlh, &filter, cb->extack);
		if (err < 0)
			return err;
	}
+5 −1
Original line number Diff line number Diff line
@@ -2527,9 +2527,13 @@ static int ipmr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,

static int ipmr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
{
	struct fib_dump_filter filter = {};

	if (cb->strict_check) {
		int err = ip_valid_fib_dump_req(cb->nlh, cb->extack);
		int err;

		err = ip_valid_fib_dump_req(sock_net(skb->sk), cb->nlh,
					    &filter, cb->extack);
		if (err < 0)
			return err;
	}
+3 −2
Original line number Diff line number Diff line
@@ -569,17 +569,18 @@ static int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
{
	const struct nlmsghdr *nlh = cb->nlh;
	struct net *net = sock_net(skb->sk);
	struct rt6_rtnl_dump_arg arg = {};
	unsigned int h, s_h;
	unsigned int e = 0, s_e;
	struct rt6_rtnl_dump_arg arg;
	struct fib6_walker *w;
	struct fib6_table *tb;
	struct hlist_head *head;
	int res = 0;

	if (cb->strict_check) {
		int err = ip_valid_fib_dump_req(nlh, cb->extack);
		int err;

		err = ip_valid_fib_dump_req(net, nlh, &arg.filter, cb->extack);
		if (err < 0)
			return err;
	}
Loading