ipv6: fix handling of throw routes
It's the same problem that previous fix about blackhole and prohibit routes. When adding a throw route, it was handled like a classic route. Moreover, it was only possible to add this kind of routes by specifying an interface. Before the patch: $ ip route add throw 2001::2/128 RTNETLINK answers: No such device $ ip route add throw 2001::2/128 dev eth0 $ ip -6 route | grep 2001::2 2001::2 dev eth0 metric 1024 After: $ ip route add throw 2001::2/128 $ ip -6 route | grep 2001::2 throw 2001::2 dev lo metric 1024 error -11 Reported-by: Markus Stenberg <markus.stenberg@iki.fi> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
7ab4551f3b
Коммит
b4949ab269
|
@ -1471,6 +1471,9 @@ int ip6_route_add(struct fib6_config *cfg)
|
|||
case RTN_PROHIBIT:
|
||||
rt->dst.error = -EACCES;
|
||||
break;
|
||||
case RTN_THROW:
|
||||
rt->dst.error = -EAGAIN;
|
||||
break;
|
||||
default:
|
||||
rt->dst.error = -ENETUNREACH;
|
||||
break;
|
||||
|
@ -2275,7 +2278,8 @@ static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
|
||||
if (rtm->rtm_type == RTN_UNREACHABLE ||
|
||||
rtm->rtm_type == RTN_BLACKHOLE ||
|
||||
rtm->rtm_type == RTN_PROHIBIT)
|
||||
rtm->rtm_type == RTN_PROHIBIT ||
|
||||
rtm->rtm_type == RTN_THROW)
|
||||
cfg->fc_flags |= RTF_REJECT;
|
||||
|
||||
if (rtm->rtm_type == RTN_LOCAL)
|
||||
|
@ -2412,6 +2416,9 @@ static int rt6_fill_node(struct net *net,
|
|||
case -EACCES:
|
||||
rtm->rtm_type = RTN_PROHIBIT;
|
||||
break;
|
||||
case -EAGAIN:
|
||||
rtm->rtm_type = RTN_THROW;
|
||||
break;
|
||||
default:
|
||||
rtm->rtm_type = RTN_UNREACHABLE;
|
||||
break;
|
||||
|
|
Загрузка…
Ссылка в новой задаче