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 --- |