Lines Matching refs:nh

3087 mlxsw_sp_nexthop_dev(const struct mlxsw_sp_nexthop *nh)  in mlxsw_sp_nexthop_dev()  argument
3089 if (!nh->crif) in mlxsw_sp_nexthop_dev()
3091 return nh->crif->key.dev; in mlxsw_sp_nexthop_dev()
3154 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_counter_alloc() argument
3163 if (mlxsw_sp_flow_counter_alloc(mlxsw_sp, &nh->counter_index)) in mlxsw_sp_nexthop_counter_alloc()
3166 nh->counter_valid = true; in mlxsw_sp_nexthop_counter_alloc()
3170 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_counter_free() argument
3172 if (!nh->counter_valid) in mlxsw_sp_nexthop_counter_free()
3174 mlxsw_sp_flow_counter_free(mlxsw_sp, nh->counter_index); in mlxsw_sp_nexthop_counter_free()
3175 nh->counter_valid = false; in mlxsw_sp_nexthop_counter_free()
3179 struct mlxsw_sp_nexthop *nh, u64 *p_counter) in mlxsw_sp_nexthop_counter_get() argument
3181 if (!nh->counter_valid) in mlxsw_sp_nexthop_counter_get()
3184 return mlxsw_sp_flow_counter_get(mlxsw_sp, nh->counter_index, in mlxsw_sp_nexthop_counter_get()
3189 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_next() argument
3191 if (!nh) { in mlxsw_sp_nexthop_next()
3196 typeof(*nh), router_list_node); in mlxsw_sp_nexthop_next()
3198 if (list_is_last(&nh->router_list_node, &router->nexthop_list)) in mlxsw_sp_nexthop_next()
3200 return list_next_entry(nh, router_list_node); in mlxsw_sp_nexthop_next()
3203 bool mlxsw_sp_nexthop_is_forward(const struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_is_forward() argument
3205 return nh->offloaded && nh->action == MLXSW_SP_NEXTHOP_ACTION_FORWARD; in mlxsw_sp_nexthop_is_forward()
3208 unsigned char *mlxsw_sp_nexthop_ha(struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_ha() argument
3210 if (nh->type != MLXSW_SP_NEXTHOP_TYPE_ETH || in mlxsw_sp_nexthop_ha()
3211 !mlxsw_sp_nexthop_is_forward(nh)) in mlxsw_sp_nexthop_ha()
3213 return nh->neigh_entry->ha; in mlxsw_sp_nexthop_ha()
3216 int mlxsw_sp_nexthop_indexes(struct mlxsw_sp_nexthop *nh, u32 *p_adj_index, in mlxsw_sp_nexthop_indexes() argument
3219 struct mlxsw_sp_nexthop_group_info *nhgi = nh->nhgi; in mlxsw_sp_nexthop_indexes()
3223 if (!nh->offloaded || !nhgi->adj_index_valid) in mlxsw_sp_nexthop_indexes()
3232 if (nh_iter == nh) in mlxsw_sp_nexthop_indexes()
3242 struct mlxsw_sp_rif *mlxsw_sp_nexthop_rif(struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_rif() argument
3244 if (WARN_ON(!nh->crif)) in mlxsw_sp_nexthop_rif()
3246 return nh->crif->rif; in mlxsw_sp_nexthop_rif()
3249 bool mlxsw_sp_nexthop_group_has_ipip(struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_group_has_ipip() argument
3251 struct mlxsw_sp_nexthop_group_info *nhgi = nh->nhgi; in mlxsw_sp_nexthop_group_has_ipip()
3370 const struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop6_group_has_nexthop() local
3372 nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_nexthop6_group_has_nexthop()
3373 if (nh->ifindex == ifindex && nh->nh_weight == weight && in mlxsw_sp_nexthop6_group_has_nexthop()
3374 ipv6_addr_equal(gw, (struct in6_addr *) nh->gw_addr)) in mlxsw_sp_nexthop6_group_has_nexthop()
3432 const struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_group_hash_obj() local
3444 nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_hash_obj()
3445 val ^= jhash(&nh->ifindex, sizeof(nh->ifindex), seed); in mlxsw_sp_nexthop_group_hash_obj()
3446 val ^= jhash(&nh->gw_addr, sizeof(nh->gw_addr), seed); in mlxsw_sp_nexthop_group_hash_obj()
3557 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_insert() argument
3560 &nh->ht_node, mlxsw_sp_nexthop_ht_params); in mlxsw_sp_nexthop_insert()
3564 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_remove() argument
3566 rhashtable_remove_fast(&mlxsw_sp->router->nexthop_ht, &nh->ht_node, in mlxsw_sp_nexthop_remove()
3627 struct mlxsw_sp_nexthop *nh, in __mlxsw_sp_nexthop_eth_update() argument
3630 struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry; in __mlxsw_sp_nexthop_eth_update()
3631 struct mlxsw_sp_rif *rif = mlxsw_sp_nexthop_rif(nh); in __mlxsw_sp_nexthop_eth_update()
3641 switch (nh->action) { in __mlxsw_sp_nexthop_eth_update()
3658 if (nh->counter_valid) in __mlxsw_sp_nexthop_eth_update()
3659 mlxsw_reg_ratr_counter_pack(ratr_pl, nh->counter_index, true); in __mlxsw_sp_nexthop_eth_update()
3667 struct mlxsw_sp_nexthop *nh, bool force, in mlxsw_sp_nexthop_eth_update() argument
3672 for (i = 0; i < nh->num_adj_entries; i++) { in mlxsw_sp_nexthop_eth_update()
3676 nh, force, ratr_pl); in mlxsw_sp_nexthop_eth_update()
3686 struct mlxsw_sp_nexthop *nh, in __mlxsw_sp_nexthop_ipip_update() argument
3691 ipip_ops = mlxsw_sp->router->ipip_ops_arr[nh->ipip_entry->ipipt]; in __mlxsw_sp_nexthop_ipip_update()
3692 return ipip_ops->nexthop_update(mlxsw_sp, adj_index, nh->ipip_entry, in __mlxsw_sp_nexthop_ipip_update()
3698 struct mlxsw_sp_nexthop *nh, bool force, in mlxsw_sp_nexthop_ipip_update() argument
3703 for (i = 0; i < nh->num_adj_entries; i++) { in mlxsw_sp_nexthop_ipip_update()
3707 nh, force, ratr_pl); in mlxsw_sp_nexthop_ipip_update()
3716 struct mlxsw_sp_nexthop *nh, bool force, in mlxsw_sp_nexthop_update() argument
3722 if (nh->type == MLXSW_SP_NEXTHOP_TYPE_ETH || in mlxsw_sp_nexthop_update()
3723 nh->action == MLXSW_SP_NEXTHOP_ACTION_DISCARD || in mlxsw_sp_nexthop_update()
3724 nh->action == MLXSW_SP_NEXTHOP_ACTION_TRAP) in mlxsw_sp_nexthop_update()
3725 return mlxsw_sp_nexthop_eth_update(mlxsw_sp, adj_index, nh, in mlxsw_sp_nexthop_update()
3728 return mlxsw_sp_nexthop_ipip_update(mlxsw_sp, adj_index, nh, in mlxsw_sp_nexthop_update()
3739 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_group_update() local
3743 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_update()
3745 if (!nh->should_offload) { in mlxsw_sp_nexthop_group_update()
3746 nh->offloaded = 0; in mlxsw_sp_nexthop_group_update()
3750 if (nh->update || reallocate) { in mlxsw_sp_nexthop_group_update()
3753 err = mlxsw_sp_nexthop_update(mlxsw_sp, adj_index, nh, in mlxsw_sp_nexthop_group_update()
3757 nh->update = 0; in mlxsw_sp_nexthop_group_update()
3758 nh->offloaded = 1; in mlxsw_sp_nexthop_group_update()
3760 adj_index += nh->num_adj_entries; in mlxsw_sp_nexthop_group_update()
3873 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_group_normalize() local
3876 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_normalize()
3878 if (!nh->should_offload) in mlxsw_sp_nexthop_group_normalize()
3881 g = gcd(nh->nh_weight, g); in mlxsw_sp_nexthop_group_normalize()
3883 g = nh->nh_weight; in mlxsw_sp_nexthop_group_normalize()
3887 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_normalize()
3889 if (!nh->should_offload) in mlxsw_sp_nexthop_group_normalize()
3891 nh->norm_nh_weight = nh->nh_weight / g; in mlxsw_sp_nexthop_group_normalize()
3892 sum_norm_weight += nh->norm_nh_weight; in mlxsw_sp_nexthop_group_normalize()
3906 struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_rebalance() local
3909 if (!nh->should_offload) in mlxsw_sp_nexthop_group_rebalance()
3911 weight += nh->norm_nh_weight; in mlxsw_sp_nexthop_group_rebalance()
3913 nh->num_adj_entries = upper_bound - lower_bound; in mlxsw_sp_nexthop_group_rebalance()
3929 struct mlxsw_sp_nexthop *nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_nexthop4_group_offload_refresh() local
3931 if (nh->offloaded) in mlxsw_sp_nexthop4_group_offload_refresh()
3932 nh->key.fib_nh->fib_nh_flags |= RTNH_F_OFFLOAD; in mlxsw_sp_nexthop4_group_offload_refresh()
3934 nh->key.fib_nh->fib_nh_flags &= ~RTNH_F_OFFLOAD; in mlxsw_sp_nexthop4_group_offload_refresh()
3946 struct mlxsw_sp_nexthop *nh; in __mlxsw_sp_nexthop6_group_offload_refresh() local
3948 nh = mlxsw_sp_rt6_nexthop(nh_grp, mlxsw_sp_rt6); in __mlxsw_sp_nexthop6_group_offload_refresh()
3949 if (nh && nh->offloaded) in __mlxsw_sp_nexthop6_group_offload_refresh()
3973 const struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_bucket_offload_refresh() argument
3976 struct mlxsw_sp_nexthop_group *nh_grp = nh->nhgi->nh_grp; in mlxsw_sp_nexthop_bucket_offload_refresh()
3979 if (nh->offloaded) { in mlxsw_sp_nexthop_bucket_offload_refresh()
3980 if (nh->action == MLXSW_SP_NEXTHOP_ACTION_TRAP) in mlxsw_sp_nexthop_bucket_offload_refresh()
4016 struct mlxsw_sp_nexthop *nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_nexthop_obj_group_offload_refresh() local
4018 mlxsw_sp_nexthop_bucket_offload_refresh(mlxsw_sp, nh, i); in mlxsw_sp_nexthop_obj_group_offload_refresh()
4045 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_group_refresh() local
4056 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_refresh()
4058 if (nh->should_offload != nh->offloaded) { in mlxsw_sp_nexthop_group_refresh()
4060 if (nh->should_offload) in mlxsw_sp_nexthop_group_refresh()
4061 nh->update = 1; in mlxsw_sp_nexthop_group_refresh()
4145 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_refresh()
4146 nh->offloaded = 0; in mlxsw_sp_nexthop_group_refresh()
4158 static void __mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp_nexthop *nh, in __mlxsw_sp_nexthop_neigh_update() argument
4162 nh->action = MLXSW_SP_NEXTHOP_ACTION_FORWARD; in __mlxsw_sp_nexthop_neigh_update()
4163 nh->should_offload = 1; in __mlxsw_sp_nexthop_neigh_update()
4164 } else if (nh->nhgi->is_resilient) { in __mlxsw_sp_nexthop_neigh_update()
4165 nh->action = MLXSW_SP_NEXTHOP_ACTION_TRAP; in __mlxsw_sp_nexthop_neigh_update()
4166 nh->should_offload = 1; in __mlxsw_sp_nexthop_neigh_update()
4168 nh->should_offload = 0; in __mlxsw_sp_nexthop_neigh_update()
4170 nh->update = 1; in __mlxsw_sp_nexthop_neigh_update()
4178 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_dead_neigh_replace() local
4184 nh = list_first_entry(&neigh_entry->nexthop_list, in mlxsw_sp_nexthop_dead_neigh_replace()
4186 dev = mlxsw_sp_nexthop_dev(nh); in mlxsw_sp_nexthop_dead_neigh_replace()
4188 n = neigh_lookup(nh->neigh_tbl, &nh->gw_addr, dev); in mlxsw_sp_nexthop_dead_neigh_replace()
4190 n = neigh_create(nh->neigh_tbl, &nh->gw_addr, dev); in mlxsw_sp_nexthop_dead_neigh_replace()
4208 list_for_each_entry(nh, &neigh_entry->nexthop_list, in mlxsw_sp_nexthop_dead_neigh_replace()
4212 __mlxsw_sp_nexthop_neigh_update(nh, !entry_connected); in mlxsw_sp_nexthop_dead_neigh_replace()
4213 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_dead_neigh_replace()
4232 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_neigh_update() local
4247 list_for_each_entry(nh, &neigh_entry->nexthop_list, in mlxsw_sp_nexthop_neigh_update()
4249 __mlxsw_sp_nexthop_neigh_update(nh, removing); in mlxsw_sp_nexthop_neigh_update()
4250 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_neigh_update()
4254 static void mlxsw_sp_nexthop_crif_init(struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_crif_init() argument
4257 if (nh->crif) in mlxsw_sp_nexthop_crif_init()
4260 nh->crif = crif; in mlxsw_sp_nexthop_crif_init()
4261 list_add(&nh->crif_list_node, &crif->nexthop_list); in mlxsw_sp_nexthop_crif_init()
4264 static void mlxsw_sp_nexthop_crif_fini(struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_crif_fini() argument
4266 if (!nh->crif) in mlxsw_sp_nexthop_crif_fini()
4269 list_del(&nh->crif_list_node); in mlxsw_sp_nexthop_crif_fini()
4270 nh->crif = NULL; in mlxsw_sp_nexthop_crif_fini()
4274 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_neigh_init() argument
4282 if (WARN_ON(!nh->crif->rif)) in mlxsw_sp_nexthop_neigh_init()
4285 if (!nh->nhgi->gateway || nh->neigh_entry) in mlxsw_sp_nexthop_neigh_init()
4287 dev = mlxsw_sp_nexthop_dev(nh); in mlxsw_sp_nexthop_neigh_init()
4294 n = neigh_lookup(nh->neigh_tbl, &nh->gw_addr, dev); in mlxsw_sp_nexthop_neigh_init()
4296 n = neigh_create(nh->neigh_tbl, &nh->gw_addr, dev); in mlxsw_sp_nexthop_neigh_init()
4317 nh->neigh_entry = neigh_entry; in mlxsw_sp_nexthop_neigh_init()
4318 list_add_tail(&nh->neigh_list_node, &neigh_entry->nexthop_list); in mlxsw_sp_nexthop_neigh_init()
4323 __mlxsw_sp_nexthop_neigh_update(nh, !(nud_state & NUD_VALID && !dead)); in mlxsw_sp_nexthop_neigh_init()
4333 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_neigh_fini() argument
4335 struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry; in mlxsw_sp_nexthop_neigh_fini()
4342 __mlxsw_sp_nexthop_neigh_update(nh, true); in mlxsw_sp_nexthop_neigh_fini()
4343 list_del(&nh->neigh_list_node); in mlxsw_sp_nexthop_neigh_fini()
4344 nh->neigh_entry = NULL; in mlxsw_sp_nexthop_neigh_fini()
4372 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_ipip_init() argument
4378 if (!nh->nhgi->gateway || nh->ipip_entry) in mlxsw_sp_nexthop_ipip_init()
4385 nh->ipip_entry = ipip_entry; in mlxsw_sp_nexthop_ipip_init()
4387 __mlxsw_sp_nexthop_neigh_update(nh, removing); in mlxsw_sp_nexthop_ipip_init()
4388 mlxsw_sp_nexthop_crif_init(nh, crif); in mlxsw_sp_nexthop_ipip_init()
4392 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_ipip_fini() argument
4394 struct mlxsw_sp_ipip_entry *ipip_entry = nh->ipip_entry; in mlxsw_sp_nexthop_ipip_fini()
4399 __mlxsw_sp_nexthop_neigh_update(nh, true); in mlxsw_sp_nexthop_ipip_fini()
4400 nh->ipip_entry = NULL; in mlxsw_sp_nexthop_ipip_fini()
4415 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_type_init() argument
4427 nh->type = MLXSW_SP_NEXTHOP_TYPE_IPIP; in mlxsw_sp_nexthop_type_init()
4428 mlxsw_sp_nexthop_ipip_init(mlxsw_sp, nh, ipip_entry); in mlxsw_sp_nexthop_type_init()
4433 nh->type = MLXSW_SP_NEXTHOP_TYPE_ETH; in mlxsw_sp_nexthop_type_init()
4438 mlxsw_sp_nexthop_crif_init(nh, crif); in mlxsw_sp_nexthop_type_init()
4443 err = mlxsw_sp_nexthop_neigh_init(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_init()
4450 mlxsw_sp_nexthop_crif_fini(nh); in mlxsw_sp_nexthop_type_init()
4455 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_type_rif_made() argument
4457 switch (nh->type) { in mlxsw_sp_nexthop_type_rif_made()
4459 return mlxsw_sp_nexthop_neigh_init(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_rif_made()
4468 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_type_rif_gone() argument
4470 switch (nh->type) { in mlxsw_sp_nexthop_type_rif_gone()
4472 mlxsw_sp_nexthop_neigh_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_rif_gone()
4475 mlxsw_sp_nexthop_ipip_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_rif_gone()
4481 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_type_fini() argument
4483 mlxsw_sp_nexthop_type_rif_gone(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_fini()
4484 mlxsw_sp_nexthop_crif_fini(nh); in mlxsw_sp_nexthop_type_fini()
4489 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop4_init() argument
4496 nh->nhgi = nh_grp->nhgi; in mlxsw_sp_nexthop4_init()
4497 nh->key.fib_nh = fib_nh; in mlxsw_sp_nexthop4_init()
4499 nh->nh_weight = fib_nh->fib_nh_weight; in mlxsw_sp_nexthop4_init()
4501 nh->nh_weight = 1; in mlxsw_sp_nexthop4_init()
4503 memcpy(&nh->gw_addr, &fib_nh->fib_nh_gw4, sizeof(fib_nh->fib_nh_gw4)); in mlxsw_sp_nexthop4_init()
4504 nh->neigh_tbl = &arp_tbl; in mlxsw_sp_nexthop4_init()
4505 err = mlxsw_sp_nexthop_insert(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4509 mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4510 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop4_init()
4514 nh->ifindex = dev->ifindex; in mlxsw_sp_nexthop4_init()
4525 err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); in mlxsw_sp_nexthop4_init()
4532 list_del(&nh->router_list_node); in mlxsw_sp_nexthop4_init()
4533 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4534 mlxsw_sp_nexthop_remove(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4539 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop4_fini() argument
4541 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_fini()
4542 list_del(&nh->router_list_node); in mlxsw_sp_nexthop4_fini()
4543 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop4_fini()
4544 mlxsw_sp_nexthop_remove(mlxsw_sp, nh); in mlxsw_sp_nexthop4_fini()
4551 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop4_event() local
4554 nh = mlxsw_sp_nexthop_lookup(mlxsw_sp, key); in mlxsw_sp_nexthop4_event()
4555 if (!nh) in mlxsw_sp_nexthop4_event()
4560 mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, fib_nh->fib_nh_dev); in mlxsw_sp_nexthop4_event()
4563 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_event()
4567 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop4_event()
4574 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_rif_update() local
4577 list_for_each_entry(nh, &rif->crif->nexthop_list, crif_list_node) { in mlxsw_sp_nexthop_rif_update()
4578 switch (nh->type) { in mlxsw_sp_nexthop_rif_update()
4590 __mlxsw_sp_nexthop_neigh_update(nh, removing); in mlxsw_sp_nexthop_rif_update()
4591 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_rif_update()
4598 struct mlxsw_sp_nexthop *nh, *tmp; in mlxsw_sp_nexthop_rif_made_sync() local
4602 list_for_each_entry_safe(nh, tmp, &rif->crif->nexthop_list, in mlxsw_sp_nexthop_rif_made_sync()
4604 err = mlxsw_sp_nexthop_type_rif_made(mlxsw_sp, nh); in mlxsw_sp_nexthop_rif_made_sync()
4607 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_rif_made_sync()
4614 list_for_each_entry_safe(nh, tmp, &rif->crif->nexthop_list, in mlxsw_sp_nexthop_rif_made_sync()
4618 mlxsw_sp_nexthop_type_rif_gone(mlxsw_sp, nh); in mlxsw_sp_nexthop_rif_made_sync()
4619 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_rif_made_sync()
4627 struct mlxsw_sp_nexthop *nh, *tmp; in mlxsw_sp_nexthop_rif_gone_sync() local
4629 list_for_each_entry_safe(nh, tmp, &rif->crif->nexthop_list, in mlxsw_sp_nexthop_rif_gone_sync()
4631 mlxsw_sp_nexthop_type_rif_gone(mlxsw_sp, nh); in mlxsw_sp_nexthop_rif_gone_sync()
4632 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_rif_gone_sync()
4777 const struct nh_notifier_single_info *nh, in mlxsw_sp_nexthop_obj_single_validate() argument
4782 if (nh->is_fdb) in mlxsw_sp_nexthop_obj_single_validate()
4784 else if (nh->has_encap) in mlxsw_sp_nexthop_obj_single_validate()
4794 const struct nh_notifier_single_info *nh, in mlxsw_sp_nexthop_obj_group_entry_validate() argument
4799 err = mlxsw_sp_nexthop_obj_single_validate(mlxsw_sp, nh, extack); in mlxsw_sp_nexthop_obj_group_entry_validate()
4806 if (!nh->gw_family && !nh->is_reject && in mlxsw_sp_nexthop_obj_group_entry_validate()
4807 !mlxsw_sp_netdev_ipip_type(mlxsw_sp, nh->dev, NULL)) { in mlxsw_sp_nexthop_obj_group_entry_validate()
4828 const struct nh_notifier_single_info *nh; in mlxsw_sp_nexthop_obj_group_validate() local
4831 nh = &nh_grp->nh_entries[i].nh; in mlxsw_sp_nexthop_obj_group_validate()
4832 err = mlxsw_sp_nexthop_obj_group_entry_validate(mlxsw_sp, nh, in mlxsw_sp_nexthop_obj_group_validate()
4899 const struct nh_notifier_single_info *nh; in mlxsw_sp_nexthop_obj_res_group_validate() local
4902 nh = &nh_res_table->nhs[i]; in mlxsw_sp_nexthop_obj_res_group_validate()
4903 err = mlxsw_sp_nexthop_obj_group_entry_validate(mlxsw_sp, nh, in mlxsw_sp_nexthop_obj_res_group_validate()
4916 struct nh_notifier_single_info *nh; in mlxsw_sp_nexthop_obj_validate() local
4925 return mlxsw_sp_nexthop_obj_single_validate(mlxsw_sp, info->nh, in mlxsw_sp_nexthop_obj_validate()
4936 nh = &info->nh_res_bucket->new_nh; in mlxsw_sp_nexthop_obj_validate()
4937 return mlxsw_sp_nexthop_obj_group_entry_validate(mlxsw_sp, nh, in mlxsw_sp_nexthop_obj_validate()
4952 dev = info->nh->dev; in mlxsw_sp_nexthop_obj_is_gateway()
4953 return info->nh->gw_family || info->nh->is_reject || in mlxsw_sp_nexthop_obj_is_gateway()
4965 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_obj_blackhole_init() argument
4967 nh->action = MLXSW_SP_NEXTHOP_ACTION_DISCARD; in mlxsw_sp_nexthop_obj_blackhole_init()
4968 nh->should_offload = 1; in mlxsw_sp_nexthop_obj_blackhole_init()
4973 nh->crif = mlxsw_sp->router->lb_crif; in mlxsw_sp_nexthop_obj_blackhole_init()
4977 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_obj_blackhole_fini() argument
4979 nh->crif = NULL; in mlxsw_sp_nexthop_obj_blackhole_fini()
4980 nh->should_offload = 0; in mlxsw_sp_nexthop_obj_blackhole_fini()
4986 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_obj_init() argument
4992 nh->nhgi = nh_grp->nhgi; in mlxsw_sp_nexthop_obj_init()
4993 nh->nh_weight = weight; in mlxsw_sp_nexthop_obj_init()
4997 memcpy(&nh->gw_addr, &nh_obj->ipv4, sizeof(nh_obj->ipv4)); in mlxsw_sp_nexthop_obj_init()
4998 nh->neigh_tbl = &arp_tbl; in mlxsw_sp_nexthop_obj_init()
5001 memcpy(&nh->gw_addr, &nh_obj->ipv6, sizeof(nh_obj->ipv6)); in mlxsw_sp_nexthop_obj_init()
5003 nh->neigh_tbl = &nd_tbl; in mlxsw_sp_nexthop_obj_init()
5008 mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_init()
5009 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop_obj_init()
5010 nh->ifindex = dev->ifindex; in mlxsw_sp_nexthop_obj_init()
5012 err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); in mlxsw_sp_nexthop_obj_init()
5017 mlxsw_sp_nexthop_obj_blackhole_init(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_init()
5023 if (nh_grp->nhgi->is_resilient && !nh->should_offload) { in mlxsw_sp_nexthop_obj_init()
5024 nh->action = MLXSW_SP_NEXTHOP_ACTION_TRAP; in mlxsw_sp_nexthop_obj_init()
5025 nh->should_offload = 1; in mlxsw_sp_nexthop_obj_init()
5031 list_del(&nh->router_list_node); in mlxsw_sp_nexthop_obj_init()
5032 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_init()
5037 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_obj_fini() argument
5039 if (nh->action == MLXSW_SP_NEXTHOP_ACTION_DISCARD) in mlxsw_sp_nexthop_obj_fini()
5040 mlxsw_sp_nexthop_obj_blackhole_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_fini()
5041 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_fini()
5042 list_del(&nh->router_list_node); in mlxsw_sp_nexthop_obj_fini()
5043 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_fini()
5044 nh->should_offload = 0; in mlxsw_sp_nexthop_obj_fini()
5053 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_obj_group_info_init() local
5085 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_obj_group_info_init()
5088 nh_obj = info->nh; in mlxsw_sp_nexthop_obj_group_info_init()
5092 nh_obj = &info->nh_grp->nh_entries[i].nh; in mlxsw_sp_nexthop_obj_group_info_init()
5103 err = mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, in mlxsw_sp_nexthop_obj_group_info_init()
5134 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_obj_group_info_init()
5135 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_group_info_init()
5157 struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_obj_group_info_fini() local
5159 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_group_info_fini()
5380 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_obj_bucket_adj_update() argument
5398 adj_index = nh->nhgi->adj_index + bucket_index; in mlxsw_sp_nexthop_obj_bucket_adj_update()
5399 err = mlxsw_sp_nexthop_update(mlxsw_sp, adj_index, nh, force, ratr_pl); in mlxsw_sp_nexthop_obj_bucket_adj_update()
5420 nh->update = 0; in mlxsw_sp_nexthop_obj_bucket_adj_update()
5421 nh->offloaded = 1; in mlxsw_sp_nexthop_obj_bucket_adj_update()
5422 mlxsw_sp_nexthop_bucket_offload_refresh(mlxsw_sp, nh, bucket_index); in mlxsw_sp_nexthop_obj_bucket_adj_update()
5435 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_obj_bucket_replace() local
5451 nh = &nhgi->nexthops[bucket_index]; in mlxsw_sp_nexthop_obj_bucket_replace()
5452 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_bucket_replace()
5455 err = mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, 1); in mlxsw_sp_nexthop_obj_bucket_replace()
5461 err = mlxsw_sp_nexthop_obj_bucket_adj_update(mlxsw_sp, nh, info); in mlxsw_sp_nexthop_obj_bucket_replace()
5468 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_bucket_replace()
5471 mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, 1); in mlxsw_sp_nexthop_obj_bucket_replace()
5473 nh->update = 0; in mlxsw_sp_nexthop_obj_bucket_replace()
5474 nh->offloaded = 1; in mlxsw_sp_nexthop_obj_bucket_replace()
5516 const struct fib_nh *nh = fib_info_nh(fi, 0); in mlxsw_sp_fi_is_gateway() local
5518 return nh->fib_nh_gw_family || in mlxsw_sp_fi_is_gateway()
5519 mlxsw_sp_nexthop4_ipip_type(mlxsw_sp, nh, NULL); in mlxsw_sp_fi_is_gateway()
5528 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop4_group_info_init() local
5541 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop4_group_info_init()
5543 err = mlxsw_sp_nexthop4_init(mlxsw_sp, nh_grp, nh, fib_nh); in mlxsw_sp_nexthop4_group_info_init()
5562 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop4_group_info_init()
5563 mlxsw_sp_nexthop4_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_group_info_init()
5578 struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop4_group_info_fini() local
5580 mlxsw_sp_nexthop4_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_group_info_fini()
5648 if (fi->nh) { in mlxsw_sp_nexthop4_group_get()
5650 fi->nh->id); in mlxsw_sp_nexthop4_group_get()
5730 struct mlxsw_sp_nexthop *nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_rt6_nexthop() local
5731 struct net_device *dev = mlxsw_sp_nexthop_dev(nh); in mlxsw_sp_rt6_nexthop()
5735 ipv6_addr_equal((const struct in6_addr *) &nh->gw_addr, in mlxsw_sp_rt6_nexthop()
5737 return nh; in mlxsw_sp_rt6_nexthop()
6571 if (fen_info->fi->nh && in mlxsw_sp_router_fib4_replace()
6572 !mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, fen_info->fi->nh->id)) in mlxsw_sp_router_fib4_replace()
6687 if (!mlxsw_sp_rt6->rt->nh) in mlxsw_sp_rt6_destroy()
6724 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop6_init() argument
6730 nh->nhgi = nh_grp->nhgi; in mlxsw_sp_nexthop6_init()
6731 nh->nh_weight = rt->fib6_nh->fib_nh_weight; in mlxsw_sp_nexthop6_init()
6732 memcpy(&nh->gw_addr, &rt->fib6_nh->fib_nh_gw6, sizeof(nh->gw_addr)); in mlxsw_sp_nexthop6_init()
6734 nh->neigh_tbl = &nd_tbl; in mlxsw_sp_nexthop6_init()
6736 mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); in mlxsw_sp_nexthop6_init()
6738 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop6_init()
6742 nh->ifindex = dev->ifindex; in mlxsw_sp_nexthop6_init()
6744 err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); in mlxsw_sp_nexthop6_init()
6751 list_del(&nh->router_list_node); in mlxsw_sp_nexthop6_init()
6752 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop6_init()
6757 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop6_fini() argument
6759 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop6_fini()
6760 list_del(&nh->router_list_node); in mlxsw_sp_nexthop6_fini()
6761 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop6_fini()
6778 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop6_group_info_init() local
6794 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop6_group_info_init()
6795 err = mlxsw_sp_nexthop6_init(mlxsw_sp, nh_grp, nh, rt); in mlxsw_sp_nexthop6_group_info_init()
6816 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop6_group_info_init()
6817 mlxsw_sp_nexthop6_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop6_group_info_init()
6832 struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop6_group_info_fini() local
6834 mlxsw_sp_nexthop6_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop6_group_info_fini()
6899 if (rt->nh) { in mlxsw_sp_nexthop6_group_get()
6901 rt->nh->id); in mlxsw_sp_nexthop6_group_get()
7267 if (rt->nh && !mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, rt->nh->id)) in mlxsw_sp_router_fib6_replace()
9572 struct mlxsw_sp_nexthop *nh, *tmp; in mlxsw_sp_crif_unregister() local
9576 list_for_each_entry_safe(nh, tmp, &crif->nexthop_list, crif_list_node) in mlxsw_sp_crif_unregister()
9577 mlxsw_sp_nexthop_type_fini(router->mlxsw_sp, nh); in mlxsw_sp_crif_unregister()