Lines Matching refs:cfg

3322 static int ip6_nh_lookup_table(struct net *net, struct fib6_config *cfg,
3327 .flowi6_oif = cfg->fc_ifindex,
3329 .saddr = cfg->fc_prefsrc,
3338 if (!ipv6_addr_any(&cfg->fc_prefsrc))
3343 err = fib6_table_lookup(net, table, cfg->fc_ifindex, &fl6, res, flags);
3345 fib6_select_path(net, res, &fl6, cfg->fc_ifindex,
3346 cfg->fc_ifindex != 0, NULL, flags);
3352 struct fib6_config *cfg,
3357 const struct in6_addr *gw_addr = &cfg->fc_gateway;
3361 err = ip6_nh_lookup_table(net, cfg, gw_addr, tbid, 0, &res);
3375 struct fib6_config *cfg,
3380 const struct in6_addr *gw_addr = &cfg->fc_gateway;
3386 if (cfg->fc_table) {
3387 err = ip6_nh_lookup_table(net, cfg, gw_addr,
3388 cfg->fc_table, flags, &res);
3400 .flowi6_oif = cfg->fc_ifindex,
3404 err = fib6_lookup(net, cfg->fc_ifindex, &fl6, &res, flags);
3412 fib6_select_path(net, &res, &fl6, cfg->fc_ifindex,
3413 cfg->fc_ifindex != 0, NULL, flags);
3429 static int ip6_validate_gw(struct net *net, struct fib6_config *cfg,
3435 const struct in6_addr *gw_addr = &cfg->fc_gateway;
3470 if (cfg->fc_flags & RTNH_F_ONLINK)
3471 err = ip6_route_check_nh_onlink(net, cfg, dev, extack);
3473 err = ip6_route_check_nh(net, cfg, _dev, dev_tracker,
3521 struct fib6_config *cfg, gfp_t gfp_flags,
3534 if (cfg->fc_is_fdb) {
3535 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3541 if (cfg->fc_ifindex) {
3542 dev = netdev_get_by_index(net, cfg->fc_ifindex,
3551 if (cfg->fc_flags & RTNH_F_ONLINK) {
3572 addr_type = ipv6_addr_type(&cfg->fc_dst);
3573 if (fib6_is_reject(cfg->fc_flags, dev, addr_type)) {
3591 if (cfg->fc_flags & RTF_GATEWAY) {
3592 err = ip6_validate_gw(net, cfg, &dev, dev_tracker,
3597 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3611 if (!(dev->flags & IFF_UP) && !cfg->fc_ignore_dev_down) {
3617 if (!(cfg->fc_flags & (RTF_LOCAL | RTF_ANYCAST)) &&
3621 err = fib_nh_common_init(net, &fib6_nh->nh_common, cfg->fc_encap,
3622 cfg->fc_encap_type, cfg, gfp_flags, extack);
3689 static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
3693 struct net *net = cfg->fc_nlinfo.nl_net;
3702 if (cfg->fc_flags & RTF_PCPU) {
3708 if (cfg->fc_flags & RTF_CACHE) {
3713 if (cfg->fc_type > RTN_MAX) {
3718 if (cfg->fc_dst_len > 128) {
3722 if (cfg->fc_src_len > 128) {
3727 if (cfg->fc_src_len) {
3733 if (cfg->fc_nh_id) {
3734 nh = nexthop_find_by_id(net, cfg->fc_nh_id);
3739 err = fib6_check_nexthop(nh, cfg, extack);
3745 if (cfg->fc_nlinfo.nlh &&
3746 !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) {
3747 table = fib6_get_table(net, cfg->fc_table);
3750 table = fib6_new_table(net, cfg->fc_table);
3753 table = fib6_new_table(net, cfg->fc_table);
3764 rt->fib6_metrics = ip_fib_metrics_init(net, cfg->fc_mx, cfg->fc_mx_len,
3773 if (cfg->fc_flags & RTF_ADDRCONF)
3776 if (cfg->fc_flags & RTF_EXPIRES)
3778 clock_t_to_jiffies(cfg->fc_expires));
3780 if (cfg->fc_protocol == RTPROT_UNSPEC)
3781 cfg->fc_protocol = RTPROT_BOOT;
3782 rt->fib6_protocol = cfg->fc_protocol;
3785 rt->fib6_metric = cfg->fc_metric;
3786 rt->fib6_type = cfg->fc_type ? : RTN_UNICAST;
3787 rt->fib6_flags = cfg->fc_flags & ~RTF_GATEWAY;
3789 ipv6_addr_prefix(&rt->fib6_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
3790 rt->fib6_dst.plen = cfg->fc_dst_len;
3793 ipv6_addr_prefix(&rt->fib6_src.addr, &cfg->fc_src, cfg->fc_src_len);
3794 rt->fib6_src.plen = cfg->fc_src_len;
3808 err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack);
3817 addr_type = ipv6_addr_type(&cfg->fc_dst);
3818 if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh->fib_nh_dev,
3823 if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
3826 if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) {
3831 rt->fib6_prefsrc.addr = cfg->fc_prefsrc;
3846 int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags,
3852 rt = ip6_route_info_create(cfg, gfp_flags, extack);
3856 err = __ip6_ins_rt(rt, &cfg->fc_nlinfo, extack);
3893 static int __ip6_del_rt_siblings(struct fib6_info *rt, struct fib6_config *cfg)
3895 struct nl_info *info = &cfg->fc_nlinfo;
3906 if (rt->fib6_nsiblings && cfg->fc_delete_all_nh) {
3972 static int __ip6_del_cached_rt(struct rt6_info *rt, struct fib6_config *cfg)
3976 if (cfg->fc_ifindex && rt->dst.dev->ifindex != cfg->fc_ifindex)
3979 if (cfg->fc_flags & RTF_GATEWAY &&
3980 !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway))
3988 static int ip6_del_cached_rt(struct fib6_config *cfg, struct fib6_info *rt,
3997 rt_cache = rt6_find_cached_rt(&res, &cfg->fc_dst, &cfg->fc_src);
3999 return __ip6_del_cached_rt(rt_cache, cfg);
4005 struct fib6_config *cfg;
4014 rc = ip6_del_cached_rt(arg->cfg, arg->f6i, nh);
4018 static int ip6_del_cached_rt_nh(struct fib6_config *cfg, struct fib6_info *f6i)
4021 .cfg = cfg,
4028 static int ip6_route_del(struct fib6_config *cfg,
4036 table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table);
4045 &cfg->fc_dst, cfg->fc_dst_len,
4046 &cfg->fc_src, cfg->fc_src_len,
4047 !(cfg->fc_flags & RTF_CACHE));
4053 if (rt->nh && cfg->fc_nh_id &&
4054 rt->nh->id != cfg->fc_nh_id)
4057 if (cfg->fc_flags & RTF_CACHE) {
4061 rc = ip6_del_cached_rt_nh(cfg, rt);
4062 } else if (cfg->fc_nh_id) {
4066 rc = ip6_del_cached_rt(cfg, rt, nh);
4075 if (cfg->fc_metric && cfg->fc_metric != rt->fib6_metric)
4077 if (cfg->fc_protocol &&
4078 cfg->fc_protocol != rt->fib6_protocol)
4086 return __ip6_del_rt(rt, &cfg->fc_nlinfo);
4088 if (cfg->fc_nh_id)
4092 if (cfg->fc_ifindex &&
4094 nh->fib_nh_dev->ifindex != cfg->fc_ifindex))
4096 if (cfg->fc_flags & RTF_GATEWAY &&
4097 !ipv6_addr_equal(&cfg->fc_gateway, &nh->fib_nh_gw6))
4104 if (cfg->fc_flags & RTF_GATEWAY)
4105 return __ip6_del_rt(rt, &cfg->fc_nlinfo);
4107 return __ip6_del_rt_siblings(rt, cfg);
4305 struct fib6_config cfg = {
4318 cfg.fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO;
4319 cfg.fc_dst = *prefix;
4320 cfg.fc_gateway = *gwaddr;
4324 cfg.fc_flags |= RTF_DEFAULT;
4326 ip6_route_add(&cfg, GFP_ATOMIC, NULL);
4371 struct fib6_config cfg = {
4385 cfg.fc_gateway = *gwaddr;
4387 if (!ip6_route_add(&cfg, GFP_ATOMIC, NULL)) {
4390 table = fib6_get_table(dev_net(dev), cfg.fc_table);
4443 struct fib6_config *cfg)
4445 *cfg = (struct fib6_config){
4466 struct fib6_config cfg;
4474 rtmsg_to_fib6_config(net, rtmsg, &cfg);
4480 if (cfg.fc_metric == 0)
4481 cfg.fc_metric = IP6_RT_PRIO_USER;
4482 err = ip6_route_add(&cfg, GFP_KERNEL, NULL);
4485 err = ip6_route_del(&cfg, NULL);
4567 struct fib6_config cfg = {
4580 cfg.fc_type = RTN_ANYCAST;
4581 cfg.fc_flags |= RTF_ANYCAST;
4583 cfg.fc_type = RTN_LOCAL;
4584 cfg.fc_flags |= RTF_LOCAL;
4587 f6i = ip6_route_info_create(&cfg, gfp_flags, extack);
5010 struct fib6_config *cfg,
5032 *cfg = (struct fib6_config){
5049 cfg->fc_flags |= RTF_REJECT;
5052 cfg->fc_flags |= RTF_LOCAL;
5055 cfg->fc_flags |= RTF_CACHE;
5057 cfg->fc_flags |= (rtm->rtm_flags & RTNH_F_ONLINK);
5066 cfg->fc_nh_id = nla_get_u32(tb[RTA_NH_ID]);
5070 cfg->fc_gateway = nla_get_in6_addr(tb[RTA_GATEWAY]);
5071 cfg->fc_flags |= RTF_GATEWAY;
5084 nla_memcpy(&cfg->fc_dst, tb[RTA_DST], plen);
5093 nla_memcpy(&cfg->fc_src, tb[RTA_SRC], plen);
5097 cfg->fc_prefsrc = nla_get_in6_addr(tb[RTA_PREFSRC]);
5100 cfg->fc_ifindex = nla_get_u32(tb[RTA_OIF]);
5103 cfg->fc_metric = nla_get_u32(tb[RTA_PRIORITY]);
5106 cfg->fc_mx = nla_data(tb[RTA_METRICS]);
5107 cfg->fc_mx_len = nla_len(tb[RTA_METRICS]);
5111 cfg->fc_table = nla_get_u32(tb[RTA_TABLE]);
5114 cfg->fc_mp = nla_data(tb[RTA_MULTIPATH]);
5115 cfg->fc_mp_len = nla_len(tb[RTA_MULTIPATH]);
5117 err = lwtunnel_valid_encap_type_attr(cfg->fc_mp,
5118 cfg->fc_mp_len, extack);
5128 cfg->fc_flags |= RTF_PREF(pref);
5132 cfg->fc_encap = tb[RTA_ENCAP];
5135 cfg->fc_encap_type = nla_get_u16(tb[RTA_ENCAP_TYPE]);
5137 err = lwtunnel_valid_encap_type(cfg->fc_encap_type, extack);
5146 cfg->fc_expires = jiffies_to_clock_t(timeout * HZ);
5147 cfg->fc_flags |= RTF_EXPIRES;
5246 static int ip6_route_multipath_add(struct fib6_config *cfg,
5250 struct nl_info *info = &cfg->fc_nlinfo;
5261 int replace = (cfg->fc_nlinfo.nlh &&
5262 (cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_REPLACE));
5269 remaining = cfg->fc_mp_len;
5270 rtnh = (struct rtnexthop *)cfg->fc_mp;
5276 memcpy(&r_cfg, cfg, sizeof(*cfg));
5372 if (cfg->fc_nlinfo.nlh) {
5373 cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL |
5375 cfg->fc_nlinfo.nlh->nlmsg_flags |= NLM_F_CREATE;
5432 static int ip6_route_multipath_del(struct fib6_config *cfg,
5442 remaining = cfg->fc_mp_len;
5443 rtnh = (struct rtnexthop *)cfg->fc_mp;
5447 memcpy(&r_cfg, cfg, sizeof(*cfg));
5481 struct fib6_config cfg;
5484 err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
5488 if (cfg.fc_nh_id &&
5489 !nexthop_find_by_id(sock_net(skb->sk), cfg.fc_nh_id)) {
5494 if (cfg.fc_mp)
5495 return ip6_route_multipath_del(&cfg, extack);
5497 cfg.fc_delete_all_nh = 1;
5498 return ip6_route_del(&cfg, extack);
5505 struct fib6_config cfg;
5508 err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
5512 if (cfg.fc_metric == 0)
5513 cfg.fc_metric = IP6_RT_PRIO_USER;
5515 if (cfg.fc_mp)
5516 return ip6_route_multipath_add(&cfg, extack);
5518 return ip6_route_add(&cfg, GFP_KERNEL, extack);