Lines Matching defs:nh_grp
3108 struct mlxsw_sp_nexthop_group *nh_grp;
3201 struct mlxsw_sp_nexthop_group *nh_grp = nh->nhgi->nh_grp;
3205 nhct = xa_load(&nh_grp->nhgi->nexthop_counters, nh->id);
3215 err = xa_err(xa_store(&nh_grp->nhgi->nexthop_counters, nh->id, nhct,
3230 struct mlxsw_sp_nexthop_group *nh_grp = nh->nhgi->nh_grp;
3233 nhct = xa_load(&nh_grp->nhgi->nexthop_counters, nh->id);
3240 xa_erase(&nh_grp->nhgi->nexthop_counters, nh->id);
3386 mlxsw_sp_nexthop_group_vr_entry_lookup(struct mlxsw_sp_nexthop_group *nh_grp,
3394 return rhashtable_lookup_fast(&nh_grp->vr_ht, &key,
3399 mlxsw_sp_nexthop_group_vr_entry_create(struct mlxsw_sp_nexthop_group *nh_grp,
3413 err = rhashtable_insert_fast(&nh_grp->vr_ht, &vr_entry->ht_node,
3418 list_add(&vr_entry->list, &nh_grp->vr_list);
3428 mlxsw_sp_nexthop_group_vr_entry_destroy(struct mlxsw_sp_nexthop_group *nh_grp,
3432 rhashtable_remove_fast(&nh_grp->vr_ht, &vr_entry->ht_node,
3438 mlxsw_sp_nexthop_group_vr_link(struct mlxsw_sp_nexthop_group *nh_grp,
3443 vr_entry = mlxsw_sp_nexthop_group_vr_entry_lookup(nh_grp, fib);
3449 return mlxsw_sp_nexthop_group_vr_entry_create(nh_grp, fib);
3453 mlxsw_sp_nexthop_group_vr_unlink(struct mlxsw_sp_nexthop_group *nh_grp,
3458 vr_entry = mlxsw_sp_nexthop_group_vr_entry_lookup(nh_grp, fib);
3465 mlxsw_sp_nexthop_group_vr_entry_destroy(nh_grp, vr_entry);
3478 mlxsw_sp_nexthop6_group_has_nexthop(const struct mlxsw_sp_nexthop_group *nh_grp,
3484 for (i = 0; i < nh_grp->nhgi->count; i++) {
3487 nh = &nh_grp->nhgi->nexthops[i];
3497 mlxsw_sp_nexthop6_group_cmp(const struct mlxsw_sp_nexthop_group *nh_grp,
3502 if (nh_grp->nhgi->count != fib6_entry->nrt6)
3513 if (!mlxsw_sp_nexthop6_group_has_nexthop(nh_grp, gw, ifindex,
3525 const struct mlxsw_sp_nexthop_group *nh_grp = ptr;
3527 if (nh_grp->type != cmp_arg->type)
3532 return cmp_arg->fi != nh_grp->ipv4.fi;
3534 return !mlxsw_sp_nexthop6_group_cmp(nh_grp,
3537 return cmp_arg->id != nh_grp->obj.id;
3546 const struct mlxsw_sp_nexthop_group *nh_grp = data;
3552 switch (nh_grp->type) {
3554 fi = nh_grp->ipv4.fi;
3557 val = nh_grp->nhgi->count;
3558 for (i = 0; i < nh_grp->nhgi->count; i++) {
3559 nh = &nh_grp->nhgi->nexthops[i];
3565 return jhash(&nh_grp->obj.id, sizeof(nh_grp->obj.id), seed);
3616 struct mlxsw_sp_nexthop_group *nh_grp)
3618 if (nh_grp->type == MLXSW_SP_NEXTHOP_GROUP_TYPE_IPV6 &&
3619 !nh_grp->nhgi->gateway)
3623 &nh_grp->ht_node,
3628 struct mlxsw_sp_nexthop_group *nh_grp)
3630 if (nh_grp->type == MLXSW_SP_NEXTHOP_GROUP_TYPE_IPV6 &&
3631 !nh_grp->nhgi->gateway)
3635 &nh_grp->ht_node,
3710 struct mlxsw_sp_nexthop_group *nh_grp,
3713 struct mlxsw_sp_nexthop_group_info *nhgi = nh_grp->nhgi;
3717 list_for_each_entry(vr_entry, &nh_grp->vr_list, list) {
3731 list_for_each_entry_continue_reverse(vr_entry, &nh_grp->vr_list, list)
3888 struct mlxsw_sp_nexthop_group *nh_grp)
3893 list_for_each_entry(fib_entry, &nh_grp->fib_list, nexthop_group_node) {
4040 mlxsw_sp_rt6_nexthop(struct mlxsw_sp_nexthop_group *nh_grp,
4045 struct mlxsw_sp_nexthop_group *nh_grp)
4049 for (i = 0; i < nh_grp->nhgi->count; i++) {
4050 struct mlxsw_sp_nexthop *nh = &nh_grp->nhgi->nexthops[i];
4060 __mlxsw_sp_nexthop6_group_offload_refresh(struct mlxsw_sp_nexthop_group *nh_grp,
4069 nh = mlxsw_sp_rt6_nexthop(nh_grp, mlxsw_sp_rt6);
4079 struct mlxsw_sp_nexthop_group *nh_grp)
4087 list_for_each_entry(fib6_entry, &nh_grp->fib_list,
4089 __mlxsw_sp_nexthop6_group_offload_refresh(nh_grp, fib6_entry);
4097 struct mlxsw_sp_nexthop_group *nh_grp = nh->nhgi->nh_grp;
4106 nexthop_bucket_set_hw_flags(mlxsw_sp_net(mlxsw_sp), nh_grp->obj.id,
4112 struct mlxsw_sp_nexthop_group *nh_grp)
4124 if (nh_grp->can_destroy)
4127 nexthop_set_hw_flags(mlxsw_sp_net(mlxsw_sp), nh_grp->obj.id,
4128 nh_grp->nhgi->adj_index_valid, false);
4133 if (!nh_grp->nhgi->is_resilient)
4136 for (i = 0; i < nh_grp->nhgi->count; i++) {
4137 struct mlxsw_sp_nexthop *nh = &nh_grp->nhgi->nexthops[i];
4145 struct mlxsw_sp_nexthop_group *nh_grp)
4147 switch (nh_grp->type) {
4149 mlxsw_sp_nexthop4_group_offload_refresh(mlxsw_sp, nh_grp);
4152 mlxsw_sp_nexthop6_group_offload_refresh(mlxsw_sp, nh_grp);
4155 mlxsw_sp_nexthop_obj_group_offload_refresh(mlxsw_sp, nh_grp);
4162 struct mlxsw_sp_nexthop_group *nh_grp)
4164 struct mlxsw_sp_nexthop_group_info *nhgi = nh_grp->nhgi;
4174 return mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, nh_grp);
4197 mlxsw_sp_nexthop_group_offload_refresh(mlxsw_sp, nh_grp);
4237 mlxsw_sp_nexthop_group_offload_refresh(mlxsw_sp, nh_grp);
4243 err = mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, nh_grp);
4251 err = mlxsw_sp_adj_index_mass_update(mlxsw_sp, nh_grp,
4269 err2 = mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, nh_grp);
4272 mlxsw_sp_nexthop_group_offload_refresh(mlxsw_sp, nh_grp);
4334 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp);
4371 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp);
4609 struct mlxsw_sp_nexthop_group *nh_grp,
4617 nh->nhgi = nh_grp->nhgi;
4692 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp);
4716 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp);
4732 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp);
4744 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp);
4757 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp);
4823 const struct mlxsw_sp_nexthop_group *nh_grp,
4833 mlxsw_reg_ratrad_pack(ratrad_pl, nh_grp->nhgi->adj_index,
4834 nh_grp->nhgi->count);
4839 for (i = 0; i < nh_grp->nhgi->count; i++) {
4853 const struct mlxsw_sp_nexthop_group *nh_grp)
4857 activity = bitmap_zalloc(nh_grp->nhgi->count, GFP_KERNEL);
4861 mlxsw_sp_nh_grp_activity_get(mlxsw_sp, nh_grp, activity);
4862 nexthop_res_grp_activity_update(mlxsw_sp_net(mlxsw_sp), nh_grp->obj.id,
4863 nh_grp->nhgi->count, activity);
4889 mlxsw_sp_nh_grp_activity_update(router->mlxsw_sp, nhgi->nh_grp);
4942 const struct nh_notifier_grp_info *nh_grp,
4947 if (nh_grp->is_fdb) {
4952 for (i = 0; i < nh_grp->num_nh; i++) {
4956 nh = &nh_grp->nh_entries[i].nh;
5054 info->nh_grp,
5110 struct mlxsw_sp_nexthop_group *nh_grp,
5117 nh->nhgi = nh_grp->nhgi;
5148 if (nh_grp->nhgi->is_resilient && !nh->should_offload) {
5173 struct mlxsw_sp_nexthop_group *nh_grp,
5188 nhs = info->nh_grp->num_nh;
5189 hw_stats = info->nh_grp->hw_stats;
5203 nh_grp->nhgi = nhgi;
5204 nhgi->nh_grp = nh_grp;
5223 nh_obj = &info->nh_grp->nh_entries[i].nh;
5224 weight = info->nh_grp->nh_entries[i].weight;
5234 err = mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj,
5242 err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
5274 struct mlxsw_sp_nexthop_group *nh_grp)
5276 struct mlxsw_sp_nexthop_group_info *nhgi = nh_grp->nhgi;
5292 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
5303 struct mlxsw_sp_nexthop_group *nh_grp;
5306 nh_grp = kzalloc(sizeof(*nh_grp), GFP_KERNEL);
5307 if (!nh_grp)
5309 INIT_LIST_HEAD(&nh_grp->vr_list);
5310 err = rhashtable_init(&nh_grp->vr_ht,
5314 INIT_LIST_HEAD(&nh_grp->fib_list);
5315 nh_grp->type = MLXSW_SP_NEXTHOP_GROUP_TYPE_OBJ;
5316 nh_grp->obj.id = info->id;
5318 err = mlxsw_sp_nexthop_obj_group_info_init(mlxsw_sp, nh_grp, info);
5322 nh_grp->can_destroy = false;
5324 return nh_grp;
5327 rhashtable_destroy(&nh_grp->vr_ht);
5329 kfree(nh_grp);
5335 struct mlxsw_sp_nexthop_group *nh_grp)
5337 if (!nh_grp->can_destroy)
5339 mlxsw_sp_nexthop_obj_group_info_fini(mlxsw_sp, nh_grp);
5340 WARN_ON_ONCE(!list_empty(&nh_grp->fib_list));
5341 WARN_ON_ONCE(!list_empty(&nh_grp->vr_list));
5342 rhashtable_destroy(&nh_grp->vr_ht);
5343 kfree(nh_grp);
5359 struct mlxsw_sp_nexthop_group *nh_grp)
5361 return mlxsw_sp_nexthop_group_insert(mlxsw_sp, nh_grp);
5366 struct mlxsw_sp_nexthop_group *nh_grp,
5371 struct mlxsw_sp_nexthop_group_info *new_nhgi = nh_grp->nhgi;
5375 new_nhgi->nh_grp = old_nh_grp;
5376 nh_grp->nhgi = old_nhgi;
5377 old_nhgi->nh_grp = nh_grp;
5418 /* At this point 'nh_grp' is just a shell that is not used by anyone
5422 nh_grp->can_destroy = true;
5423 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp);
5428 old_nhgi->nh_grp = old_nh_grp;
5429 nh_grp->nhgi = new_nhgi;
5430 new_nhgi->nh_grp = nh_grp;
5438 struct nh_notifier_grp_info *grp_info = info->nh_grp;
5440 struct mlxsw_sp_nexthop_group *nh_grp;
5444 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, info->id);
5445 if (!nh_grp)
5447 nhgi = nh_grp->nhgi;
5461 err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
5475 struct mlxsw_sp_nexthop_group *nh_grp, *old_nh_grp;
5479 nh_grp = mlxsw_sp_nexthop_obj_group_create(mlxsw_sp, info);
5480 if (IS_ERR(nh_grp))
5481 return PTR_ERR(nh_grp);
5485 err = mlxsw_sp_nexthop_obj_group_add(mlxsw_sp, nh_grp);
5487 err = mlxsw_sp_nexthop_obj_group_replace(mlxsw_sp, nh_grp,
5491 nh_grp->can_destroy = true;
5492 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp);
5501 struct mlxsw_sp_nexthop_group *nh_grp;
5503 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, info->id);
5504 if (!nh_grp)
5507 nh_grp->can_destroy = true;
5508 mlxsw_sp_nexthop_group_remove(mlxsw_sp, nh_grp);
5513 if (!list_empty(&nh_grp->fib_list))
5515 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp);
5604 struct mlxsw_sp_nexthop_group *nh_grp;
5608 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, info->id);
5609 if (!nh_grp) {
5614 nhgi = nh_grp->nhgi;
5625 err = mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, 1);
5641 mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, 1);
5703 struct mlxsw_sp_nexthop_group *nh_grp;
5708 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, info->id);
5709 if (!nh_grp)
5711 nhgi = nh_grp->nhgi;
5774 struct mlxsw_sp_nexthop_group *nh_grp)
5776 unsigned int nhs = fib_info_num_path(nh_grp->ipv4.fi);
5784 nh_grp->nhgi = nhgi;
5785 nhgi->nh_grp = nh_grp;
5786 nhgi->gateway = mlxsw_sp_fi_is_gateway(mlxsw_sp, nh_grp->ipv4.fi);
5792 fib_nh = fib_info_nh(nh_grp->ipv4.fi, i);
5793 err = mlxsw_sp_nexthop4_init(mlxsw_sp, nh_grp, nh, fib_nh);
5800 err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
5821 struct mlxsw_sp_nexthop_group *nh_grp)
5823 struct mlxsw_sp_nexthop_group_info *nhgi = nh_grp->nhgi;
5832 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
5840 struct mlxsw_sp_nexthop_group *nh_grp;
5843 nh_grp = kzalloc(sizeof(*nh_grp), GFP_KERNEL);
5844 if (!nh_grp)
5846 INIT_LIST_HEAD(&nh_grp->vr_list);
5847 err = rhashtable_init(&nh_grp->vr_ht,
5851 INIT_LIST_HEAD(&nh_grp->fib_list);
5852 nh_grp->type = MLXSW_SP_NEXTHOP_GROUP_TYPE_IPV4;
5853 nh_grp->ipv4.fi = fi;
5856 err = mlxsw_sp_nexthop4_group_info_init(mlxsw_sp, nh_grp);
5860 err = mlxsw_sp_nexthop_group_insert(mlxsw_sp, nh_grp);
5864 nh_grp->can_destroy = true;
5866 return nh_grp;
5869 mlxsw_sp_nexthop4_group_info_fini(mlxsw_sp, nh_grp);
5872 rhashtable_destroy(&nh_grp->vr_ht);
5874 kfree(nh_grp);
5880 struct mlxsw_sp_nexthop_group *nh_grp)
5882 if (!nh_grp->can_destroy)
5884 mlxsw_sp_nexthop_group_remove(mlxsw_sp, nh_grp);
5885 mlxsw_sp_nexthop4_group_info_fini(mlxsw_sp, nh_grp);
5886 fib_info_put(nh_grp->ipv4.fi);
5887 WARN_ON_ONCE(!list_empty(&nh_grp->vr_list));
5888 rhashtable_destroy(&nh_grp->vr_ht);
5889 kfree(nh_grp);
5896 struct mlxsw_sp_nexthop_group *nh_grp;
5899 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp,
5901 if (WARN_ON_ONCE(!nh_grp))
5906 nh_grp = mlxsw_sp_nexthop4_group_lookup(mlxsw_sp, fi);
5907 if (!nh_grp) {
5908 nh_grp = mlxsw_sp_nexthop4_group_create(mlxsw_sp, fi);
5909 if (IS_ERR(nh_grp))
5910 return PTR_ERR(nh_grp);
5913 list_add_tail(&fib_entry->nexthop_group_node, &nh_grp->fib_list);
5914 fib_entry->nh_group = nh_grp;
5921 struct mlxsw_sp_nexthop_group *nh_grp = fib_entry->nh_group;
5924 if (!list_empty(&nh_grp->fib_list))
5927 if (nh_grp->type == MLXSW_SP_NEXTHOP_GROUP_TYPE_OBJ) {
5928 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp);
5932 mlxsw_sp_nexthop4_group_destroy(mlxsw_sp, nh_grp);
5974 mlxsw_sp_rt6_nexthop(struct mlxsw_sp_nexthop_group *nh_grp,
5979 for (i = 0; i < nh_grp->nhgi->count; i++) {
5980 struct mlxsw_sp_nexthop *nh = &nh_grp->nhgi->nexthops[i];
6973 struct mlxsw_sp_nexthop_group *nh_grp,
6980 nh->nhgi = nh_grp->nhgi;
7026 struct mlxsw_sp_nexthop_group *nh_grp,
7038 nh_grp->nhgi = nhgi;
7039 nhgi->nh_grp = nh_grp;
7048 err = mlxsw_sp_nexthop6_init(mlxsw_sp, nh_grp, nh, rt);
7053 nh_grp->nhgi = nhgi;
7057 err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
7078 struct mlxsw_sp_nexthop_group *nh_grp)
7080 struct mlxsw_sp_nexthop_group_info *nhgi = nh_grp->nhgi;
7089 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
7098 struct mlxsw_sp_nexthop_group *nh_grp;
7101 nh_grp = kzalloc(sizeof(*nh_grp), GFP_KERNEL);
7102 if (!nh_grp)
7104 INIT_LIST_HEAD(&nh_grp->vr_list);
7105 err = rhashtable_init(&nh_grp->vr_ht,
7109 INIT_LIST_HEAD(&nh_grp->fib_list);
7110 nh_grp->type = MLXSW_SP_NEXTHOP_GROUP_TYPE_IPV6;
7112 err = mlxsw_sp_nexthop6_group_info_init(mlxsw_sp, nh_grp, fib6_entry);
7116 err = mlxsw_sp_nexthop_group_insert(mlxsw_sp, nh_grp);
7120 nh_grp->can_destroy = true;
7122 return nh_grp;
7125 mlxsw_sp_nexthop6_group_info_fini(mlxsw_sp, nh_grp);
7127 rhashtable_destroy(&nh_grp->vr_ht);
7129 kfree(nh_grp);
7135 struct mlxsw_sp_nexthop_group *nh_grp)
7137 if (!nh_grp->can_destroy)
7139 mlxsw_sp_nexthop_group_remove(mlxsw_sp, nh_grp);
7140 mlxsw_sp_nexthop6_group_info_fini(mlxsw_sp, nh_grp);
7141 WARN_ON_ONCE(!list_empty(&nh_grp->vr_list));
7142 rhashtable_destroy(&nh_grp->vr_ht);
7143 kfree(nh_grp);
7150 struct mlxsw_sp_nexthop_group *nh_grp;
7153 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp,
7155 if (WARN_ON_ONCE(!nh_grp))
7160 nh_grp = mlxsw_sp_nexthop6_group_lookup(mlxsw_sp, fib6_entry);
7161 if (!nh_grp) {
7162 nh_grp = mlxsw_sp_nexthop6_group_create(mlxsw_sp, fib6_entry);
7163 if (IS_ERR(nh_grp))
7164 return PTR_ERR(nh_grp);
7170 __mlxsw_sp_nexthop6_group_offload_refresh(nh_grp, fib6_entry);
7174 &nh_grp->fib_list);
7175 fib6_entry->common.nh_group = nh_grp;
7183 struct mlxsw_sp_nexthop_group *nh_grp = fib_entry->nh_group;
7186 if (!list_empty(&nh_grp->fib_list))
7189 if (nh_grp->type == MLXSW_SP_NEXTHOP_GROUP_TYPE_OBJ) {
7190 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp);
7194 mlxsw_sp_nexthop6_group_destroy(mlxsw_sp, nh_grp);