Lines Matching refs:cfg
3238 static int ip6_nh_lookup_table(struct net *net, struct fib6_config *cfg, in ip6_nh_lookup_table() argument
3243 .flowi6_oif = cfg->fc_ifindex, in ip6_nh_lookup_table()
3245 .saddr = cfg->fc_prefsrc, in ip6_nh_lookup_table()
3254 if (!ipv6_addr_any(&cfg->fc_prefsrc)) in ip6_nh_lookup_table()
3259 err = fib6_table_lookup(net, table, cfg->fc_ifindex, &fl6, res, flags); in ip6_nh_lookup_table()
3261 fib6_select_path(net, res, &fl6, cfg->fc_ifindex, in ip6_nh_lookup_table()
3262 cfg->fc_ifindex != 0, NULL, flags); in ip6_nh_lookup_table()
3268 struct fib6_config *cfg, in ip6_route_check_nh_onlink() argument
3273 const struct in6_addr *gw_addr = &cfg->fc_gateway; in ip6_route_check_nh_onlink()
3277 err = ip6_nh_lookup_table(net, cfg, gw_addr, tbid, 0, &res); in ip6_route_check_nh_onlink()
3291 struct fib6_config *cfg, in ip6_route_check_nh() argument
3295 const struct in6_addr *gw_addr = &cfg->fc_gateway; in ip6_route_check_nh()
3301 if (cfg->fc_table) { in ip6_route_check_nh()
3302 err = ip6_nh_lookup_table(net, cfg, gw_addr, in ip6_route_check_nh()
3303 cfg->fc_table, flags, &res); in ip6_route_check_nh()
3315 .flowi6_oif = cfg->fc_ifindex, in ip6_route_check_nh()
3319 err = fib6_lookup(net, cfg->fc_ifindex, &fl6, &res, flags); in ip6_route_check_nh()
3327 fib6_select_path(net, &res, &fl6, cfg->fc_ifindex, in ip6_route_check_nh()
3328 cfg->fc_ifindex != 0, NULL, flags); in ip6_route_check_nh()
3344 static int ip6_validate_gw(struct net *net, struct fib6_config *cfg, in ip6_validate_gw() argument
3348 const struct in6_addr *gw_addr = &cfg->fc_gateway; in ip6_validate_gw()
3383 if (cfg->fc_flags & RTNH_F_ONLINK) in ip6_validate_gw()
3384 err = ip6_route_check_nh_onlink(net, cfg, dev, extack); in ip6_validate_gw()
3386 err = ip6_route_check_nh(net, cfg, _dev, idev); in ip6_validate_gw()
3433 struct fib6_config *cfg, gfp_t gfp_flags, in fib6_nh_init() argument
3447 if (cfg->fc_ifindex) { in fib6_nh_init()
3448 dev = dev_get_by_index(net, cfg->fc_ifindex); in fib6_nh_init()
3456 if (cfg->fc_flags & RTNH_F_ONLINK) { in fib6_nh_init()
3477 addr_type = ipv6_addr_type(&cfg->fc_dst); in fib6_nh_init()
3478 if (fib6_is_reject(cfg->fc_flags, dev, addr_type)) { in fib6_nh_init()
3496 if (cfg->fc_flags & RTF_GATEWAY) { in fib6_nh_init()
3497 err = ip6_validate_gw(net, cfg, &dev, &idev, extack); in fib6_nh_init()
3501 fib6_nh->fib_nh_gw6 = cfg->fc_gateway; in fib6_nh_init()
3515 if (!(dev->flags & IFF_UP) && !cfg->fc_ignore_dev_down) { in fib6_nh_init()
3521 if (!(cfg->fc_flags & (RTF_LOCAL | RTF_ANYCAST)) && in fib6_nh_init()
3525 err = fib_nh_common_init(&fib6_nh->nh_common, cfg->fc_encap, in fib6_nh_init()
3526 cfg->fc_encap_type, cfg, gfp_flags, extack); in fib6_nh_init()
3591 static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, in ip6_route_info_create() argument
3595 struct net *net = cfg->fc_nlinfo.nl_net; in ip6_route_info_create()
3604 if (cfg->fc_flags & RTF_PCPU) { in ip6_route_info_create()
3610 if (cfg->fc_flags & RTF_CACHE) { in ip6_route_info_create()
3615 if (cfg->fc_type > RTN_MAX) { in ip6_route_info_create()
3620 if (cfg->fc_dst_len > 128) { in ip6_route_info_create()
3624 if (cfg->fc_src_len > 128) { in ip6_route_info_create()
3629 if (cfg->fc_src_len) { in ip6_route_info_create()
3635 if (cfg->fc_nh_id) { in ip6_route_info_create()
3636 nh = nexthop_find_by_id(net, cfg->fc_nh_id); in ip6_route_info_create()
3641 err = fib6_check_nexthop(nh, cfg, extack); in ip6_route_info_create()
3647 if (cfg->fc_nlinfo.nlh && in ip6_route_info_create()
3648 !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) { in ip6_route_info_create()
3649 table = fib6_get_table(net, cfg->fc_table); in ip6_route_info_create()
3652 table = fib6_new_table(net, cfg->fc_table); in ip6_route_info_create()
3655 table = fib6_new_table(net, cfg->fc_table); in ip6_route_info_create()
3666 rt->fib6_metrics = ip_fib_metrics_init(net, cfg->fc_mx, cfg->fc_mx_len, in ip6_route_info_create()
3675 if (cfg->fc_flags & RTF_ADDRCONF) in ip6_route_info_create()
3678 if (cfg->fc_flags & RTF_EXPIRES) in ip6_route_info_create()
3680 clock_t_to_jiffies(cfg->fc_expires)); in ip6_route_info_create()
3684 if (cfg->fc_protocol == RTPROT_UNSPEC) in ip6_route_info_create()
3685 cfg->fc_protocol = RTPROT_BOOT; in ip6_route_info_create()
3686 rt->fib6_protocol = cfg->fc_protocol; in ip6_route_info_create()
3689 rt->fib6_metric = cfg->fc_metric; in ip6_route_info_create()
3690 rt->fib6_type = cfg->fc_type ? : RTN_UNICAST; in ip6_route_info_create()
3691 rt->fib6_flags = cfg->fc_flags & ~RTF_GATEWAY; in ip6_route_info_create()
3693 ipv6_addr_prefix(&rt->fib6_dst.addr, &cfg->fc_dst, cfg->fc_dst_len); in ip6_route_info_create()
3694 rt->fib6_dst.plen = cfg->fc_dst_len; in ip6_route_info_create()
3699 ipv6_addr_prefix(&rt->fib6_src.addr, &cfg->fc_src, cfg->fc_src_len); in ip6_route_info_create()
3700 rt->fib6_src.plen = cfg->fc_src_len; in ip6_route_info_create()
3714 err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack); in ip6_route_info_create()
3723 addr_type = ipv6_addr_type(&cfg->fc_dst); in ip6_route_info_create()
3724 if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh->fib_nh_dev, in ip6_route_info_create()
3729 if (!ipv6_addr_any(&cfg->fc_prefsrc)) { in ip6_route_info_create()
3732 if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) { in ip6_route_info_create()
3737 rt->fib6_prefsrc.addr = cfg->fc_prefsrc; in ip6_route_info_create()
3752 int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags, in ip6_route_add() argument
3758 rt = ip6_route_info_create(cfg, gfp_flags, extack); in ip6_route_add()
3762 err = __ip6_ins_rt(rt, &cfg->fc_nlinfo, extack); in ip6_route_add()
3796 static int __ip6_del_rt_siblings(struct fib6_info *rt, struct fib6_config *cfg) in __ip6_del_rt_siblings() argument
3798 struct nl_info *info = &cfg->fc_nlinfo; in __ip6_del_rt_siblings()
3809 if (rt->fib6_nsiblings && cfg->fc_delete_all_nh) { in __ip6_del_rt_siblings()
3854 static int __ip6_del_cached_rt(struct rt6_info *rt, struct fib6_config *cfg) in __ip6_del_cached_rt() argument
3858 if (cfg->fc_ifindex && rt->dst.dev->ifindex != cfg->fc_ifindex) in __ip6_del_cached_rt()
3861 if (cfg->fc_flags & RTF_GATEWAY && in __ip6_del_cached_rt()
3862 !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway)) in __ip6_del_cached_rt()
3870 static int ip6_del_cached_rt(struct fib6_config *cfg, struct fib6_info *rt, in ip6_del_cached_rt() argument
3879 rt_cache = rt6_find_cached_rt(&res, &cfg->fc_dst, &cfg->fc_src); in ip6_del_cached_rt()
3881 return __ip6_del_cached_rt(rt_cache, cfg); in ip6_del_cached_rt()
3887 struct fib6_config *cfg; member
3896 rc = ip6_del_cached_rt(arg->cfg, arg->f6i, nh); in fib6_nh_del_cached_rt()
3900 static int ip6_del_cached_rt_nh(struct fib6_config *cfg, struct fib6_info *f6i) in ip6_del_cached_rt_nh() argument
3903 .cfg = cfg, in ip6_del_cached_rt_nh()
3910 static int ip6_route_del(struct fib6_config *cfg, in ip6_route_del() argument
3918 table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table); in ip6_route_del()
3927 &cfg->fc_dst, cfg->fc_dst_len, in ip6_route_del()
3928 &cfg->fc_src, cfg->fc_src_len, in ip6_route_del()
3929 !(cfg->fc_flags & RTF_CACHE)); in ip6_route_del()
3935 if (rt->nh && cfg->fc_nh_id && in ip6_route_del()
3936 rt->nh->id != cfg->fc_nh_id) in ip6_route_del()
3939 if (cfg->fc_flags & RTF_CACHE) { in ip6_route_del()
3943 rc = ip6_del_cached_rt_nh(cfg, rt); in ip6_route_del()
3944 } else if (cfg->fc_nh_id) { in ip6_route_del()
3948 rc = ip6_del_cached_rt(cfg, rt, nh); in ip6_route_del()
3957 if (cfg->fc_metric && cfg->fc_metric != rt->fib6_metric) in ip6_route_del()
3959 if (cfg->fc_protocol && in ip6_route_del()
3960 cfg->fc_protocol != rt->fib6_protocol) in ip6_route_del()
3968 return __ip6_del_rt(rt, &cfg->fc_nlinfo); in ip6_route_del()
3970 if (cfg->fc_nh_id) in ip6_route_del()
3974 if (cfg->fc_ifindex && in ip6_route_del()
3976 nh->fib_nh_dev->ifindex != cfg->fc_ifindex)) in ip6_route_del()
3978 if (cfg->fc_flags & RTF_GATEWAY && in ip6_route_del()
3979 !ipv6_addr_equal(&cfg->fc_gateway, &nh->fib_nh_gw6)) in ip6_route_del()
3986 if (cfg->fc_flags & RTF_GATEWAY) in ip6_route_del()
3987 return __ip6_del_rt(rt, &cfg->fc_nlinfo); in ip6_route_del()
3989 return __ip6_del_rt_siblings(rt, cfg); in ip6_route_del()
4186 struct fib6_config cfg = { in rt6_add_route_info() local
4199 cfg.fc_table = l3mdev_fib_table(dev) ? : addrconf_rt_table(dev, RT6_TABLE_INFO), in rt6_add_route_info()
4200 cfg.fc_dst = *prefix; in rt6_add_route_info()
4201 cfg.fc_gateway = *gwaddr; in rt6_add_route_info()
4205 cfg.fc_flags |= RTF_DEFAULT; in rt6_add_route_info()
4207 ip6_route_add(&cfg, GFP_ATOMIC, NULL); in rt6_add_route_info()
4250 struct fib6_config cfg = { in rt6_add_dflt_router() local
4263 cfg.fc_gateway = *gwaddr; in rt6_add_dflt_router()
4265 if (!ip6_route_add(&cfg, GFP_ATOMIC, NULL)) { in rt6_add_dflt_router()
4268 table = fib6_get_table(dev_net(dev), cfg.fc_table); in rt6_add_dflt_router()
4298 struct fib6_config *cfg) in rtmsg_to_fib6_config() argument
4300 *cfg = (struct fib6_config){ in rtmsg_to_fib6_config()
4321 struct fib6_config cfg; in ipv6_route_ioctl() local
4335 rtmsg_to_fib6_config(net, &rtmsg, &cfg); in ipv6_route_ioctl()
4340 err = ip6_route_add(&cfg, GFP_KERNEL, NULL); in ipv6_route_ioctl()
4343 err = ip6_route_del(&cfg, NULL); in ipv6_route_ioctl()
4426 struct fib6_config cfg = { in addrconf_f6i_alloc() local
4439 cfg.fc_type = RTN_ANYCAST; in addrconf_f6i_alloc()
4440 cfg.fc_flags |= RTF_ANYCAST; in addrconf_f6i_alloc()
4442 cfg.fc_type = RTN_LOCAL; in addrconf_f6i_alloc()
4443 cfg.fc_flags |= RTF_LOCAL; in addrconf_f6i_alloc()
4446 f6i = ip6_route_info_create(&cfg, gfp_flags, NULL); in addrconf_f6i_alloc()
4872 struct fib6_config *cfg, in rtm_to_fib6_config() argument
4888 *cfg = (struct fib6_config){ in rtm_to_fib6_config()
4905 cfg->fc_flags |= RTF_REJECT; in rtm_to_fib6_config()
4908 cfg->fc_flags |= RTF_LOCAL; in rtm_to_fib6_config()
4911 cfg->fc_flags |= RTF_CACHE; in rtm_to_fib6_config()
4913 cfg->fc_flags |= (rtm->rtm_flags & RTNH_F_ONLINK); in rtm_to_fib6_config()
4922 cfg->fc_nh_id = nla_get_u32(tb[RTA_NH_ID]); in rtm_to_fib6_config()
4926 cfg->fc_gateway = nla_get_in6_addr(tb[RTA_GATEWAY]); in rtm_to_fib6_config()
4927 cfg->fc_flags |= RTF_GATEWAY; in rtm_to_fib6_config()
4940 nla_memcpy(&cfg->fc_dst, tb[RTA_DST], plen); in rtm_to_fib6_config()
4949 nla_memcpy(&cfg->fc_src, tb[RTA_SRC], plen); in rtm_to_fib6_config()
4953 cfg->fc_prefsrc = nla_get_in6_addr(tb[RTA_PREFSRC]); in rtm_to_fib6_config()
4956 cfg->fc_ifindex = nla_get_u32(tb[RTA_OIF]); in rtm_to_fib6_config()
4959 cfg->fc_metric = nla_get_u32(tb[RTA_PRIORITY]); in rtm_to_fib6_config()
4962 cfg->fc_mx = nla_data(tb[RTA_METRICS]); in rtm_to_fib6_config()
4963 cfg->fc_mx_len = nla_len(tb[RTA_METRICS]); in rtm_to_fib6_config()
4967 cfg->fc_table = nla_get_u32(tb[RTA_TABLE]); in rtm_to_fib6_config()
4970 cfg->fc_mp = nla_data(tb[RTA_MULTIPATH]); in rtm_to_fib6_config()
4971 cfg->fc_mp_len = nla_len(tb[RTA_MULTIPATH]); in rtm_to_fib6_config()
4973 err = lwtunnel_valid_encap_type_attr(cfg->fc_mp, in rtm_to_fib6_config()
4974 cfg->fc_mp_len, extack); in rtm_to_fib6_config()
4984 cfg->fc_flags |= RTF_PREF(pref); in rtm_to_fib6_config()
4988 cfg->fc_encap = tb[RTA_ENCAP]; in rtm_to_fib6_config()
4991 cfg->fc_encap_type = nla_get_u16(tb[RTA_ENCAP_TYPE]); in rtm_to_fib6_config()
4993 err = lwtunnel_valid_encap_type(cfg->fc_encap_type, extack); in rtm_to_fib6_config()
5002 cfg->fc_expires = jiffies_to_clock_t(timeout * HZ); in rtm_to_fib6_config()
5003 cfg->fc_flags |= RTF_EXPIRES; in rtm_to_fib6_config()
5076 static int ip6_route_multipath_add(struct fib6_config *cfg, in ip6_route_multipath_add() argument
5080 struct nl_info *info = &cfg->fc_nlinfo; in ip6_route_multipath_add()
5092 int replace = (cfg->fc_nlinfo.nlh && in ip6_route_multipath_add()
5093 (cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_REPLACE)); in ip6_route_multipath_add()
5100 remaining = cfg->fc_mp_len; in ip6_route_multipath_add()
5101 rtnh = (struct rtnexthop *)cfg->fc_mp; in ip6_route_multipath_add()
5107 memcpy(&r_cfg, cfg, sizeof(*cfg)); in ip6_route_multipath_add()
5203 if (cfg->fc_nlinfo.nlh) { in ip6_route_multipath_add()
5204 cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL | in ip6_route_multipath_add()
5206 cfg->fc_nlinfo.nlh->nlmsg_flags |= NLM_F_CREATE; in ip6_route_multipath_add()
5249 static int ip6_route_multipath_del(struct fib6_config *cfg, in ip6_route_multipath_del() argument
5258 remaining = cfg->fc_mp_len; in ip6_route_multipath_del()
5259 rtnh = (struct rtnexthop *)cfg->fc_mp; in ip6_route_multipath_del()
5263 memcpy(&r_cfg, cfg, sizeof(*cfg)); in ip6_route_multipath_del()
5297 struct fib6_config cfg; in inet6_rtm_delroute() local
5300 err = rtm_to_fib6_config(skb, nlh, &cfg, extack); in inet6_rtm_delroute()
5304 if (cfg.fc_nh_id && in inet6_rtm_delroute()
5305 !nexthop_find_by_id(sock_net(skb->sk), cfg.fc_nh_id)) { in inet6_rtm_delroute()
5310 if (cfg.fc_mp) in inet6_rtm_delroute()
5311 return ip6_route_multipath_del(&cfg, extack); in inet6_rtm_delroute()
5313 cfg.fc_delete_all_nh = 1; in inet6_rtm_delroute()
5314 return ip6_route_del(&cfg, extack); in inet6_rtm_delroute()
5321 struct fib6_config cfg; in inet6_rtm_newroute() local
5324 err = rtm_to_fib6_config(skb, nlh, &cfg, extack); in inet6_rtm_newroute()
5328 if (cfg.fc_metric == 0) in inet6_rtm_newroute()
5329 cfg.fc_metric = IP6_RT_PRIO_USER; in inet6_rtm_newroute()
5331 if (cfg.fc_mp) in inet6_rtm_newroute()
5332 return ip6_route_multipath_add(&cfg, extack); in inet6_rtm_newroute()
5334 return ip6_route_add(&cfg, GFP_KERNEL, extack); in inet6_rtm_newroute()