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