anycast.c (93c2fb253d177a0b8f4f93592441f88c9b7d6245) anycast.c (360a9887c8c01a715b2b4b131f7c7462f7cce576)
1/*
2 * Anycast support for IPv6
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * David L Stevens (dlstevens@us.ibm.com)
7 *
8 * based heavily on net/ipv6/mcast.c

--- 233 unchanged lines hidden (view full) ---

242}
243
244/*
245 * device anycast group inc (add if not found)
246 */
247int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr)
248{
249 struct ifacaddr6 *aca;
1/*
2 * Anycast support for IPv6
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * David L Stevens (dlstevens@us.ibm.com)
7 *
8 * based heavily on net/ipv6/mcast.c

--- 233 unchanged lines hidden (view full) ---

242}
243
244/*
245 * device anycast group inc (add if not found)
246 */
247int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr)
248{
249 struct ifacaddr6 *aca;
250 struct fib6_info *rt;
250 struct fib6_info *f6i;
251 struct net *net;
252 int err;
253
254 ASSERT_RTNL();
255
256 write_lock_bh(&idev->lock);
257 if (idev->dead) {
258 err = -ENODEV;

--- 4 unchanged lines hidden (view full) ---

263 if (ipv6_addr_equal(&aca->aca_addr, addr)) {
264 aca->aca_users++;
265 err = 0;
266 goto out;
267 }
268 }
269
270 net = dev_net(idev->dev);
251 struct net *net;
252 int err;
253
254 ASSERT_RTNL();
255
256 write_lock_bh(&idev->lock);
257 if (idev->dead) {
258 err = -ENODEV;

--- 4 unchanged lines hidden (view full) ---

263 if (ipv6_addr_equal(&aca->aca_addr, addr)) {
264 aca->aca_users++;
265 err = 0;
266 goto out;
267 }
268 }
269
270 net = dev_net(idev->dev);
271 rt = addrconf_dst_alloc(net, idev, addr, true, GFP_ATOMIC);
272 if (IS_ERR(rt)) {
273 err = PTR_ERR(rt);
271 f6i = addrconf_f6i_alloc(net, idev, addr, true, GFP_ATOMIC);
272 if (IS_ERR(f6i)) {
273 err = PTR_ERR(f6i);
274 goto out;
275 }
274 goto out;
275 }
276 aca = aca_alloc(rt, addr);
276 aca = aca_alloc(f6i, addr);
277 if (!aca) {
277 if (!aca) {
278 fib6_info_release(rt);
278 fib6_info_release(f6i);
279 err = -ENOMEM;
280 goto out;
281 }
282
283 aca->aca_next = idev->ac_list;
284 idev->ac_list = aca;
285
286 /* Hold this for addrconf_join_solict() below before we unlock,
287 * it is already exposed via idev->ac_list.
288 */
289 aca_get(aca);
290 write_unlock_bh(&idev->lock);
291
279 err = -ENOMEM;
280 goto out;
281 }
282
283 aca->aca_next = idev->ac_list;
284 idev->ac_list = aca;
285
286 /* Hold this for addrconf_join_solict() below before we unlock,
287 * it is already exposed via idev->ac_list.
288 */
289 aca_get(aca);
290 write_unlock_bh(&idev->lock);
291
292 ip6_ins_rt(net, rt);
292 ip6_ins_rt(net, f6i);
293
294 addrconf_join_solict(idev->dev, &aca->aca_addr);
295
296 aca_put(aca);
297 return 0;
298out:
299 write_unlock_bh(&idev->lock);
300 return err;

--- 258 unchanged lines hidden ---
293
294 addrconf_join_solict(idev->dev, &aca->aca_addr);
295
296 aca_put(aca);
297 return 0;
298out:
299 write_unlock_bh(&idev->lock);
300 return err;

--- 258 unchanged lines hidden ---