diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/af_inet6.c | 1 | ||||
-rw-r--r-- | net/ipv6/ip6_fib.c | 8 | ||||
-rw-r--r-- | net/ipv6/route.c | 32 |
3 files changed, 37 insertions, 4 deletions
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 55138f0d2b9d..cc6f8d0c625a 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -927,6 +927,7 @@ static const struct ipv6_stub ipv6_stub_impl = { | |||
927 | .fib6_nh_init = fib6_nh_init, | 927 | .fib6_nh_init = fib6_nh_init, |
928 | .fib6_nh_release = fib6_nh_release, | 928 | .fib6_nh_release = fib6_nh_release, |
929 | .fib6_update_sernum = fib6_update_sernum_stub, | 929 | .fib6_update_sernum = fib6_update_sernum_stub, |
930 | .fib6_rt_update = fib6_rt_update, | ||
930 | .ip6_del_rt = ip6_del_rt, | 931 | .ip6_del_rt = ip6_del_rt, |
931 | .udpv6_encap_enable = udpv6_encap_enable, | 932 | .udpv6_encap_enable = udpv6_encap_enable, |
932 | .ndisc_send_na = ndisc_send_na, | 933 | .ndisc_send_na = ndisc_send_na, |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index df726fb8f70f..7958cf91895a 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -393,10 +393,10 @@ static int call_fib6_entry_notifier(struct notifier_block *nb, struct net *net, | |||
393 | return call_fib6_notifier(nb, net, event_type, &info.info); | 393 | return call_fib6_notifier(nb, net, event_type, &info.info); |
394 | } | 394 | } |
395 | 395 | ||
396 | static int call_fib6_entry_notifiers(struct net *net, | 396 | int call_fib6_entry_notifiers(struct net *net, |
397 | enum fib_event_type event_type, | 397 | enum fib_event_type event_type, |
398 | struct fib6_info *rt, | 398 | struct fib6_info *rt, |
399 | struct netlink_ext_ack *extack) | 399 | struct netlink_ext_ack *extack) |
400 | { | 400 | { |
401 | struct fib6_entry_notifier_info info = { | 401 | struct fib6_entry_notifier_info info = { |
402 | .info.extack = extack, | 402 | .info.extack = extack, |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 7a014ca877ed..c52a7f49d096 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -5123,6 +5123,38 @@ errout: | |||
5123 | rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err); | 5123 | rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err); |
5124 | } | 5124 | } |
5125 | 5125 | ||
5126 | void fib6_rt_update(struct net *net, struct fib6_info *rt, | ||
5127 | struct nl_info *info) | ||
5128 | { | ||
5129 | u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0; | ||
5130 | struct sk_buff *skb; | ||
5131 | int err = -ENOBUFS; | ||
5132 | |||
5133 | /* call_fib6_entry_notifiers will be removed when in-kernel notifier | ||
5134 | * is implemented and supported for nexthop objects | ||
5135 | */ | ||
5136 | call_fib6_entry_notifiers(net, FIB_EVENT_ENTRY_REPLACE, rt, NULL); | ||
5137 | |||
5138 | skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any()); | ||
5139 | if (!skb) | ||
5140 | goto errout; | ||
5141 | |||
5142 | err = rt6_fill_node(net, skb, rt, NULL, NULL, NULL, 0, | ||
5143 | RTM_NEWROUTE, info->portid, seq, NLM_F_REPLACE); | ||
5144 | if (err < 0) { | ||
5145 | /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */ | ||
5146 | WARN_ON(err == -EMSGSIZE); | ||
5147 | kfree_skb(skb); | ||
5148 | goto errout; | ||
5149 | } | ||
5150 | rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE, | ||
5151 | info->nlh, gfp_any()); | ||
5152 | return; | ||
5153 | errout: | ||
5154 | if (err < 0) | ||
5155 | rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err); | ||
5156 | } | ||
5157 | |||
5126 | static int ip6_route_dev_notify(struct notifier_block *this, | 5158 | static int ip6_route_dev_notify(struct notifier_block *this, |
5127 | unsigned long event, void *ptr) | 5159 | unsigned long event, void *ptr) |
5128 | { | 5160 | { |