Lines Matching defs:cfg
3217 static int ip6_nh_lookup_table(struct net *net, struct fib6_config *cfg,
3222 .flowi6_oif = cfg->fc_ifindex,
3224 .saddr = cfg->fc_prefsrc,
3233 if (!ipv6_addr_any(&cfg->fc_prefsrc))
3238 err = fib6_table_lookup(net, table, cfg->fc_ifindex, &fl6, res, flags);
3240 fib6_select_path(net, res, &fl6, cfg->fc_ifindex,
3241 cfg->fc_ifindex != 0, NULL, flags);
3247 struct fib6_config *cfg,
3252 const struct in6_addr *gw_addr = &cfg->fc_gateway;
3256 err = ip6_nh_lookup_table(net, cfg, gw_addr, tbid, 0, &res);
3270 struct fib6_config *cfg,
3274 const struct in6_addr *gw_addr = &cfg->fc_gateway;
3280 if (cfg->fc_table) {
3281 err = ip6_nh_lookup_table(net, cfg, gw_addr,
3282 cfg->fc_table, flags, &res);
3294 .flowi6_oif = cfg->fc_ifindex,
3298 err = fib6_lookup(net, cfg->fc_ifindex, &fl6, &res, flags);
3306 fib6_select_path(net, &res, &fl6, cfg->fc_ifindex,
3307 cfg->fc_ifindex != 0, NULL, flags);
3323 static int ip6_validate_gw(struct net *net, struct fib6_config *cfg,
3327 const struct in6_addr *gw_addr = &cfg->fc_gateway;
3362 if (cfg->fc_flags & RTNH_F_ONLINK)
3363 err = ip6_route_check_nh_onlink(net, cfg, dev, extack);
3365 err = ip6_route_check_nh(net, cfg, _dev, idev);
3412 struct fib6_config *cfg, gfp_t gfp_flags,
3424 if (cfg->fc_is_fdb) {
3425 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3431 if (cfg->fc_ifindex) {
3432 dev = dev_get_by_index(net, cfg->fc_ifindex);
3440 if (cfg->fc_flags & RTNH_F_ONLINK) {
3461 addr_type = ipv6_addr_type(&cfg->fc_dst);
3462 if (fib6_is_reject(cfg->fc_flags, dev, addr_type)) {
3480 if (cfg->fc_flags & RTF_GATEWAY) {
3481 err = ip6_validate_gw(net, cfg, &dev, &idev, extack);
3485 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3499 if (!(dev->flags & IFF_UP) && !cfg->fc_ignore_dev_down) {
3505 if (!(cfg->fc_flags & (RTF_LOCAL | RTF_ANYCAST)) &&
3509 err = fib_nh_common_init(net, &fib6_nh->nh_common, cfg->fc_encap,
3510 cfg->fc_encap_type, cfg, gfp_flags, extack);
3594 static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
3598 struct net *net = cfg->fc_nlinfo.nl_net;
3607 if (cfg->fc_flags & RTF_PCPU) {
3613 if (cfg->fc_flags & RTF_CACHE) {
3618 if (cfg->fc_type > RTN_MAX) {
3623 if (cfg->fc_dst_len > 128) {
3627 if (cfg->fc_src_len > 128) {
3632 if (cfg->fc_src_len) {
3638 if (cfg->fc_nh_id) {
3639 nh = nexthop_find_by_id(net, cfg->fc_nh_id);
3644 err = fib6_check_nexthop(nh, cfg, extack);
3650 if (cfg->fc_nlinfo.nlh &&
3651 !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) {
3652 table = fib6_get_table(net, cfg->fc_table);
3655 table = fib6_new_table(net, cfg->fc_table);
3658 table = fib6_new_table(net, cfg->fc_table);
3669 rt->fib6_metrics = ip_fib_metrics_init(net, cfg->fc_mx, cfg->fc_mx_len,
3678 if (cfg->fc_flags & RTF_ADDRCONF)
3681 if (cfg->fc_flags & RTF_EXPIRES)
3683 clock_t_to_jiffies(cfg->fc_expires));
3687 if (cfg->fc_protocol == RTPROT_UNSPEC)
3688 cfg->fc_protocol = RTPROT_BOOT;
3689 rt->fib6_protocol = cfg->fc_protocol;
3692 rt->fib6_metric = cfg->fc_metric;
3693 rt->fib6_type = cfg->fc_type ? : RTN_UNICAST;
3694 rt->fib6_flags = cfg->fc_flags & ~RTF_GATEWAY;
3696 ipv6_addr_prefix(&rt->fib6_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
3697 rt->fib6_dst.plen = cfg->fc_dst_len;
3700 ipv6_addr_prefix(&rt->fib6_src.addr, &cfg->fc_src, cfg->fc_src_len);
3701 rt->fib6_src.plen = cfg->fc_src_len;
3715 err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack);
3724 addr_type = ipv6_addr_type(&cfg->fc_dst);
3725 if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh->fib_nh_dev,
3730 if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
3733 if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) {
3738 rt->fib6_prefsrc.addr = cfg->fc_prefsrc;
3753 int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags,
3759 rt = ip6_route_info_create(cfg, gfp_flags, extack);
3763 err = __ip6_ins_rt(rt, &cfg->fc_nlinfo, extack);
3800 static int __ip6_del_rt_siblings(struct fib6_info *rt, struct fib6_config *cfg)
3802 struct nl_info *info = &cfg->fc_nlinfo;
3813 if (rt->fib6_nsiblings && cfg->fc_delete_all_nh) {
3879 static int __ip6_del_cached_rt(struct rt6_info *rt, struct fib6_config *cfg)
3883 if (cfg->fc_ifindex && rt->dst.dev->ifindex != cfg->fc_ifindex)
3886 if (cfg->fc_flags & RTF_GATEWAY &&
3887 !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway))
3895 static int ip6_del_cached_rt(struct fib6_config *cfg, struct fib6_info *rt,
3904 rt_cache = rt6_find_cached_rt(&res, &cfg->fc_dst, &cfg->fc_src);
3906 return __ip6_del_cached_rt(rt_cache, cfg);
3912 struct fib6_config *cfg;
3921 rc = ip6_del_cached_rt(arg->cfg, arg->f6i, nh);
3925 static int ip6_del_cached_rt_nh(struct fib6_config *cfg, struct fib6_info *f6i)
3928 .cfg = cfg,
3935 static int ip6_route_del(struct fib6_config *cfg,
3943 table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table);
3952 &cfg->fc_dst, cfg->fc_dst_len,
3953 &cfg->fc_src, cfg->fc_src_len,
3954 !(cfg->fc_flags & RTF_CACHE));
3960 if (rt->nh && cfg->fc_nh_id &&
3961 rt->nh->id != cfg->fc_nh_id)
3964 if (cfg->fc_flags & RTF_CACHE) {
3968 rc = ip6_del_cached_rt_nh(cfg, rt);
3969 } else if (cfg->fc_nh_id) {
3973 rc = ip6_del_cached_rt(cfg, rt, nh);
3982 if (cfg->fc_metric && cfg->fc_metric != rt->fib6_metric)
3984 if (cfg->fc_protocol &&
3985 cfg->fc_protocol != rt->fib6_protocol)
3993 return __ip6_del_rt(rt, &cfg->fc_nlinfo);
3995 if (cfg->fc_nh_id)
3999 if (cfg->fc_ifindex &&
4001 nh->fib_nh_dev->ifindex != cfg->fc_ifindex))
4003 if (cfg->fc_flags & RTF_GATEWAY &&
4004 !ipv6_addr_equal(&cfg->fc_gateway, &nh->fib_nh_gw6))
4011 if (cfg->fc_flags & RTF_GATEWAY)
4012 return __ip6_del_rt(rt, &cfg->fc_nlinfo);
4014 return __ip6_del_rt_siblings(rt, cfg);
4211 struct fib6_config cfg = {
4224 cfg.fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO;
4225 cfg.fc_dst = *prefix;
4226 cfg.fc_gateway = *gwaddr;
4230 cfg.fc_flags |= RTF_DEFAULT;
4232 ip6_route_add(&cfg, GFP_ATOMIC, NULL);
4275 struct fib6_config cfg = {
4288 cfg.fc_gateway = *gwaddr;
4290 if (!ip6_route_add(&cfg, GFP_ATOMIC, NULL)) {
4293 table = fib6_get_table(dev_net(dev), cfg.fc_table);
4346 struct fib6_config *cfg)
4348 *cfg = (struct fib6_config){
4369 struct fib6_config cfg;
4377 rtmsg_to_fib6_config(net, rtmsg, &cfg);
4382 err = ip6_route_add(&cfg, GFP_KERNEL, NULL);
4385 err = ip6_route_del(&cfg, NULL);
4462 struct fib6_config cfg = {
4475 cfg.fc_type = RTN_ANYCAST;
4476 cfg.fc_flags |= RTF_ANYCAST;
4478 cfg.fc_type = RTN_LOCAL;
4479 cfg.fc_flags |= RTF_LOCAL;
4482 f6i = ip6_route_info_create(&cfg, gfp_flags, NULL);
4908 struct fib6_config *cfg,
4924 *cfg = (struct fib6_config){
4941 cfg->fc_flags |= RTF_REJECT;
4944 cfg->fc_flags |= RTF_LOCAL;
4947 cfg->fc_flags |= RTF_CACHE;
4949 cfg->fc_flags |= (rtm->rtm_flags & RTNH_F_ONLINK);
4958 cfg->fc_nh_id = nla_get_u32(tb[RTA_NH_ID]);
4962 cfg->fc_gateway = nla_get_in6_addr(tb[RTA_GATEWAY]);
4963 cfg->fc_flags |= RTF_GATEWAY;
4976 nla_memcpy(&cfg->fc_dst, tb[RTA_DST], plen);
4985 nla_memcpy(&cfg->fc_src, tb[RTA_SRC], plen);
4989 cfg->fc_prefsrc = nla_get_in6_addr(tb[RTA_PREFSRC]);
4992 cfg->fc_ifindex = nla_get_u32(tb[RTA_OIF]);
4995 cfg->fc_metric = nla_get_u32(tb[RTA_PRIORITY]);
4998 cfg->fc_mx = nla_data(tb[RTA_METRICS]);
4999 cfg->fc_mx_len = nla_len(tb[RTA_METRICS]);
5003 cfg->fc_table = nla_get_u32(tb[RTA_TABLE]);
5006 cfg->fc_mp = nla_data(tb[RTA_MULTIPATH]);
5007 cfg->fc_mp_len = nla_len(tb[RTA_MULTIPATH]);
5009 err = lwtunnel_valid_encap_type_attr(cfg->fc_mp,
5010 cfg->fc_mp_len, extack);
5020 cfg->fc_flags |= RTF_PREF(pref);
5024 cfg->fc_encap = tb[RTA_ENCAP];
5027 cfg->fc_encap_type = nla_get_u16(tb[RTA_ENCAP_TYPE]);
5029 err = lwtunnel_valid_encap_type(cfg->fc_encap_type, extack);
5038 cfg->fc_expires = jiffies_to_clock_t(timeout * HZ);
5039 cfg->fc_flags |= RTF_EXPIRES;
5138 static int ip6_route_multipath_add(struct fib6_config *cfg,
5142 struct nl_info *info = &cfg->fc_nlinfo;
5153 int replace = (cfg->fc_nlinfo.nlh &&
5154 (cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_REPLACE));
5161 remaining = cfg->fc_mp_len;
5162 rtnh = (struct rtnexthop *)cfg->fc_mp;
5168 memcpy(&r_cfg, cfg, sizeof(*cfg));
5264 if (cfg->fc_nlinfo.nlh) {
5265 cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL |
5267 cfg->fc_nlinfo.nlh->nlmsg_flags |= NLM_F_CREATE;
5324 static int ip6_route_multipath_del(struct fib6_config *cfg,
5334 remaining = cfg->fc_mp_len;
5335 rtnh = (struct rtnexthop *)cfg->fc_mp;
5339 memcpy(&r_cfg, cfg, sizeof(*cfg));
5373 struct fib6_config cfg;
5376 err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
5380 if (cfg.fc_nh_id &&
5381 !nexthop_find_by_id(sock_net(skb->sk), cfg.fc_nh_id)) {
5386 if (cfg.fc_mp)
5387 return ip6_route_multipath_del(&cfg, extack);
5389 cfg.fc_delete_all_nh = 1;
5390 return ip6_route_del(&cfg, extack);
5397 struct fib6_config cfg;
5400 err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
5404 if (cfg.fc_metric == 0)
5405 cfg.fc_metric = IP6_RT_PRIO_USER;
5407 if (cfg.fc_mp)
5408 return ip6_route_multipath_add(&cfg, extack);
5410 return ip6_route_add(&cfg, GFP_KERNEL, extack);