route.c (93c2fb253d177a0b8f4f93592441f88c9b7d6245) | route.c (360a9887c8c01a715b2b4b131f7c7462f7cce576) |
---|---|
1/* 2 * Linux INET6 implementation 3 * FIB front-end. 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * This program is free software; you can redistribute it and/or --- 3577 unchanged lines hidden (view full) --- 3586 skb->dev = skb_dst(skb)->dev; 3587 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES); 3588} 3589 3590/* 3591 * Allocate a dst for local (unicast / anycast) address. 3592 */ 3593 | 1/* 2 * Linux INET6 implementation 3 * FIB front-end. 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * This program is free software; you can redistribute it and/or --- 3577 unchanged lines hidden (view full) --- 3586 skb->dev = skb_dst(skb)->dev; 3587 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES); 3588} 3589 3590/* 3591 * Allocate a dst for local (unicast / anycast) address. 3592 */ 3593 |
3594struct fib6_info *addrconf_dst_alloc(struct net *net, 3595 struct inet6_dev *idev, 3596 const struct in6_addr *addr, 3597 bool anycast, gfp_t gfp_flags) | 3594struct fib6_info *addrconf_f6i_alloc(struct net *net, 3595 struct inet6_dev *idev, 3596 const struct in6_addr *addr, 3597 bool anycast, gfp_t gfp_flags) |
3598{ 3599 u32 tb_id; 3600 struct net_device *dev = idev->dev; | 3598{ 3599 u32 tb_id; 3600 struct net_device *dev = idev->dev; |
3601 struct fib6_info *rt; | 3601 struct fib6_info *f6i; |
3602 | 3602 |
3603 rt = fib6_info_alloc(gfp_flags); 3604 if (!rt) | 3603 f6i = fib6_info_alloc(gfp_flags); 3604 if (!f6i) |
3605 return ERR_PTR(-ENOMEM); 3606 | 3605 return ERR_PTR(-ENOMEM); 3606 |
3607 rt->dst_nocount = true; | 3607 f6i->dst_nocount = true; |
3608 3609 in6_dev_hold(idev); | 3608 3609 in6_dev_hold(idev); |
3610 rt->fib6_idev = idev; | 3610 f6i->fib6_idev = idev; |
3611 | 3611 |
3612 rt->dst_host = true; 3613 rt->fib6_protocol = RTPROT_KERNEL; 3614 rt->fib6_flags = RTF_UP | RTF_NONEXTHOP; | 3612 f6i->dst_host = true; 3613 f6i->fib6_protocol = RTPROT_KERNEL; 3614 f6i->fib6_flags = RTF_UP | RTF_NONEXTHOP; |
3615 if (anycast) { | 3615 if (anycast) { |
3616 rt->fib6_type = RTN_ANYCAST; 3617 rt->fib6_flags |= RTF_ANYCAST; | 3616 f6i->fib6_type = RTN_ANYCAST; 3617 f6i->fib6_flags |= RTF_ANYCAST; |
3618 } else { | 3618 } else { |
3619 rt->fib6_type = RTN_LOCAL; 3620 rt->fib6_flags |= RTF_LOCAL; | 3619 f6i->fib6_type = RTN_LOCAL; 3620 f6i->fib6_flags |= RTF_LOCAL; |
3621 } 3622 | 3621 } 3622 |
3623 rt->fib6_nh.nh_gw = *addr; | 3623 f6i->fib6_nh.nh_gw = *addr; |
3624 dev_hold(dev); | 3624 dev_hold(dev); |
3625 rt->fib6_nh.nh_dev = dev; 3626 rt->fib6_dst.addr = *addr; 3627 rt->fib6_dst.plen = 128; | 3625 f6i->fib6_nh.nh_dev = dev; 3626 f6i->fib6_dst.addr = *addr; 3627 f6i->fib6_dst.plen = 128; |
3628 tb_id = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL; | 3628 tb_id = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL; |
3629 rt->fib6_table = fib6_get_table(net, tb_id); | 3629 f6i->fib6_table = fib6_get_table(net, tb_id); |
3630 | 3630 |
3631 return rt; | 3631 return f6i; |
3632} 3633 3634/* remove deleted ip from prefsrc entries */ 3635struct arg_dev_net_ip { 3636 struct net_device *dev; 3637 struct net *net; 3638 struct in6_addr *addr; 3639}; --- 1635 unchanged lines hidden --- | 3632} 3633 3634/* remove deleted ip from prefsrc entries */ 3635struct arg_dev_net_ip { 3636 struct net_device *dev; 3637 struct net *net; 3638 struct in6_addr *addr; 3639}; --- 1635 unchanged lines hidden --- |