Lines Matching full:nh
2985 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_counter_alloc() argument
2994 if (mlxsw_sp_flow_counter_alloc(mlxsw_sp, &nh->counter_index)) in mlxsw_sp_nexthop_counter_alloc()
2997 nh->counter_valid = true; in mlxsw_sp_nexthop_counter_alloc()
3001 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_counter_free() argument
3003 if (!nh->counter_valid) in mlxsw_sp_nexthop_counter_free()
3005 mlxsw_sp_flow_counter_free(mlxsw_sp, nh->counter_index); in mlxsw_sp_nexthop_counter_free()
3006 nh->counter_valid = false; in mlxsw_sp_nexthop_counter_free()
3010 struct mlxsw_sp_nexthop *nh, u64 *p_counter) in mlxsw_sp_nexthop_counter_get() argument
3012 if (!nh->counter_valid) in mlxsw_sp_nexthop_counter_get()
3015 return mlxsw_sp_flow_counter_get(mlxsw_sp, nh->counter_index, in mlxsw_sp_nexthop_counter_get()
3020 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_next() argument
3022 if (!nh) { in mlxsw_sp_nexthop_next()
3027 typeof(*nh), router_list_node); in mlxsw_sp_nexthop_next()
3029 if (list_is_last(&nh->router_list_node, &router->nexthop_list)) in mlxsw_sp_nexthop_next()
3031 return list_next_entry(nh, router_list_node); in mlxsw_sp_nexthop_next()
3034 bool mlxsw_sp_nexthop_is_forward(const struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_is_forward() argument
3036 return nh->offloaded && nh->action == MLXSW_SP_NEXTHOP_ACTION_FORWARD; in mlxsw_sp_nexthop_is_forward()
3039 unsigned char *mlxsw_sp_nexthop_ha(struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_ha() argument
3041 if (nh->type != MLXSW_SP_NEXTHOP_TYPE_ETH || in mlxsw_sp_nexthop_ha()
3042 !mlxsw_sp_nexthop_is_forward(nh)) in mlxsw_sp_nexthop_ha()
3044 return nh->neigh_entry->ha; in mlxsw_sp_nexthop_ha()
3047 int mlxsw_sp_nexthop_indexes(struct mlxsw_sp_nexthop *nh, u32 *p_adj_index, in mlxsw_sp_nexthop_indexes() argument
3050 struct mlxsw_sp_nexthop_group_info *nhgi = nh->nhgi; in mlxsw_sp_nexthop_indexes()
3054 if (!nh->offloaded || !nhgi->adj_index_valid) in mlxsw_sp_nexthop_indexes()
3063 if (nh_iter == nh) in mlxsw_sp_nexthop_indexes()
3073 struct mlxsw_sp_rif *mlxsw_sp_nexthop_rif(struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_rif() argument
3075 return nh->rif; in mlxsw_sp_nexthop_rif()
3078 bool mlxsw_sp_nexthop_group_has_ipip(struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_group_has_ipip() argument
3080 struct mlxsw_sp_nexthop_group_info *nhgi = nh->nhgi; in mlxsw_sp_nexthop_group_has_ipip()
3199 const struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop6_group_has_nexthop() local
3201 nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_nexthop6_group_has_nexthop()
3202 if (nh->ifindex == ifindex && nh->nh_weight == weight && in mlxsw_sp_nexthop6_group_has_nexthop()
3203 ipv6_addr_equal(gw, (struct in6_addr *) nh->gw_addr)) in mlxsw_sp_nexthop6_group_has_nexthop()
3261 const struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_group_hash_obj() local
3273 nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_hash_obj()
3274 val ^= jhash(&nh->ifindex, sizeof(nh->ifindex), seed); in mlxsw_sp_nexthop_group_hash_obj()
3275 val ^= jhash(&nh->gw_addr, sizeof(nh->gw_addr), seed); in mlxsw_sp_nexthop_group_hash_obj()
3386 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_insert() argument
3389 &nh->ht_node, mlxsw_sp_nexthop_ht_params); in mlxsw_sp_nexthop_insert()
3393 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_remove() argument
3395 rhashtable_remove_fast(&mlxsw_sp->router->nexthop_ht, &nh->ht_node, in mlxsw_sp_nexthop_remove()
3456 struct mlxsw_sp_nexthop *nh, in __mlxsw_sp_nexthop_eth_update() argument
3459 struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry; in __mlxsw_sp_nexthop_eth_update()
3463 rif_index = nh->rif ? nh->rif->rif_index : in __mlxsw_sp_nexthop_eth_update()
3469 switch (nh->action) { in __mlxsw_sp_nexthop_eth_update()
3486 if (nh->counter_valid) in __mlxsw_sp_nexthop_eth_update()
3487 mlxsw_reg_ratr_counter_pack(ratr_pl, nh->counter_index, true); in __mlxsw_sp_nexthop_eth_update()
3495 struct mlxsw_sp_nexthop *nh, bool force, in mlxsw_sp_nexthop_eth_update() argument
3500 for (i = 0; i < nh->num_adj_entries; i++) { in mlxsw_sp_nexthop_eth_update()
3504 nh, force, ratr_pl); in mlxsw_sp_nexthop_eth_update()
3514 struct mlxsw_sp_nexthop *nh, in __mlxsw_sp_nexthop_ipip_update() argument
3519 ipip_ops = mlxsw_sp->router->ipip_ops_arr[nh->ipip_entry->ipipt]; in __mlxsw_sp_nexthop_ipip_update()
3520 return ipip_ops->nexthop_update(mlxsw_sp, adj_index, nh->ipip_entry, in __mlxsw_sp_nexthop_ipip_update()
3526 struct mlxsw_sp_nexthop *nh, bool force, in mlxsw_sp_nexthop_ipip_update() argument
3531 for (i = 0; i < nh->num_adj_entries; i++) { in mlxsw_sp_nexthop_ipip_update()
3535 nh, force, ratr_pl); in mlxsw_sp_nexthop_ipip_update()
3544 struct mlxsw_sp_nexthop *nh, bool force, in mlxsw_sp_nexthop_update() argument
3550 if (nh->type == MLXSW_SP_NEXTHOP_TYPE_ETH || in mlxsw_sp_nexthop_update()
3551 nh->action == MLXSW_SP_NEXTHOP_ACTION_DISCARD || in mlxsw_sp_nexthop_update()
3552 nh->action == MLXSW_SP_NEXTHOP_ACTION_TRAP) in mlxsw_sp_nexthop_update()
3553 return mlxsw_sp_nexthop_eth_update(mlxsw_sp, adj_index, nh, in mlxsw_sp_nexthop_update()
3556 return mlxsw_sp_nexthop_ipip_update(mlxsw_sp, adj_index, nh, in mlxsw_sp_nexthop_update()
3567 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_group_update() local
3571 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_update()
3573 if (!nh->should_offload) { in mlxsw_sp_nexthop_group_update()
3574 nh->offloaded = 0; in mlxsw_sp_nexthop_group_update()
3578 if (nh->update || reallocate) { in mlxsw_sp_nexthop_group_update()
3581 err = mlxsw_sp_nexthop_update(mlxsw_sp, adj_index, nh, in mlxsw_sp_nexthop_group_update()
3585 nh->update = 0; in mlxsw_sp_nexthop_group_update()
3586 nh->offloaded = 1; in mlxsw_sp_nexthop_group_update()
3588 adj_index += nh->num_adj_entries; in mlxsw_sp_nexthop_group_update()
3701 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_group_normalize() local
3704 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_normalize()
3706 if (!nh->should_offload) in mlxsw_sp_nexthop_group_normalize()
3709 g = gcd(nh->nh_weight, g); in mlxsw_sp_nexthop_group_normalize()
3711 g = nh->nh_weight; in mlxsw_sp_nexthop_group_normalize()
3715 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_normalize()
3717 if (!nh->should_offload) in mlxsw_sp_nexthop_group_normalize()
3719 nh->norm_nh_weight = nh->nh_weight / g; in mlxsw_sp_nexthop_group_normalize()
3720 sum_norm_weight += nh->norm_nh_weight; in mlxsw_sp_nexthop_group_normalize()
3734 struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_rebalance() local
3737 if (!nh->should_offload) in mlxsw_sp_nexthop_group_rebalance()
3739 weight += nh->norm_nh_weight; in mlxsw_sp_nexthop_group_rebalance()
3741 nh->num_adj_entries = upper_bound - lower_bound; in mlxsw_sp_nexthop_group_rebalance()
3757 struct mlxsw_sp_nexthop *nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_nexthop4_group_offload_refresh() local
3759 if (nh->offloaded) in mlxsw_sp_nexthop4_group_offload_refresh()
3760 nh->key.fib_nh->fib_nh_flags |= RTNH_F_OFFLOAD; in mlxsw_sp_nexthop4_group_offload_refresh()
3762 nh->key.fib_nh->fib_nh_flags &= ~RTNH_F_OFFLOAD; in mlxsw_sp_nexthop4_group_offload_refresh()
3774 struct mlxsw_sp_nexthop *nh; in __mlxsw_sp_nexthop6_group_offload_refresh() local
3776 nh = mlxsw_sp_rt6_nexthop(nh_grp, mlxsw_sp_rt6); in __mlxsw_sp_nexthop6_group_offload_refresh()
3777 if (nh && nh->offloaded) in __mlxsw_sp_nexthop6_group_offload_refresh()
3801 const struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_bucket_offload_refresh() argument
3804 struct mlxsw_sp_nexthop_group *nh_grp = nh->nhgi->nh_grp; in mlxsw_sp_nexthop_bucket_offload_refresh()
3807 if (nh->offloaded) { in mlxsw_sp_nexthop_bucket_offload_refresh()
3808 if (nh->action == MLXSW_SP_NEXTHOP_ACTION_TRAP) in mlxsw_sp_nexthop_bucket_offload_refresh()
3844 struct mlxsw_sp_nexthop *nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_nexthop_obj_group_offload_refresh() local
3846 mlxsw_sp_nexthop_bucket_offload_refresh(mlxsw_sp, nh, i); in mlxsw_sp_nexthop_obj_group_offload_refresh()
3873 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_group_refresh() local
3884 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_refresh()
3886 if (nh->should_offload != nh->offloaded) { in mlxsw_sp_nexthop_group_refresh()
3888 if (nh->should_offload) in mlxsw_sp_nexthop_group_refresh()
3889 nh->update = 1; in mlxsw_sp_nexthop_group_refresh()
3973 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_group_refresh()
3974 nh->offloaded = 0; in mlxsw_sp_nexthop_group_refresh()
3986 static void __mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp_nexthop *nh, in __mlxsw_sp_nexthop_neigh_update() argument
3990 nh->action = MLXSW_SP_NEXTHOP_ACTION_FORWARD; in __mlxsw_sp_nexthop_neigh_update()
3991 nh->should_offload = 1; in __mlxsw_sp_nexthop_neigh_update()
3992 } else if (nh->nhgi->is_resilient) { in __mlxsw_sp_nexthop_neigh_update()
3993 nh->action = MLXSW_SP_NEXTHOP_ACTION_TRAP; in __mlxsw_sp_nexthop_neigh_update()
3994 nh->should_offload = 1; in __mlxsw_sp_nexthop_neigh_update()
3996 nh->should_offload = 0; in __mlxsw_sp_nexthop_neigh_update()
3998 nh->update = 1; in __mlxsw_sp_nexthop_neigh_update()
4006 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_dead_neigh_replace() local
4011 nh = list_first_entry(&neigh_entry->nexthop_list, in mlxsw_sp_nexthop_dead_neigh_replace()
4014 n = neigh_lookup(nh->neigh_tbl, &nh->gw_addr, nh->rif->dev); in mlxsw_sp_nexthop_dead_neigh_replace()
4016 n = neigh_create(nh->neigh_tbl, &nh->gw_addr, nh->rif->dev); in mlxsw_sp_nexthop_dead_neigh_replace()
4034 list_for_each_entry(nh, &neigh_entry->nexthop_list, in mlxsw_sp_nexthop_dead_neigh_replace()
4038 __mlxsw_sp_nexthop_neigh_update(nh, !entry_connected); in mlxsw_sp_nexthop_dead_neigh_replace()
4039 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_dead_neigh_replace()
4058 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_neigh_update() local
4073 list_for_each_entry(nh, &neigh_entry->nexthop_list, in mlxsw_sp_nexthop_neigh_update()
4075 __mlxsw_sp_nexthop_neigh_update(nh, removing); in mlxsw_sp_nexthop_neigh_update()
4076 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_neigh_update()
4080 static void mlxsw_sp_nexthop_rif_init(struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_rif_init() argument
4083 if (nh->rif) in mlxsw_sp_nexthop_rif_init()
4086 nh->rif = rif; in mlxsw_sp_nexthop_rif_init()
4087 list_add(&nh->rif_list_node, &rif->nexthop_list); in mlxsw_sp_nexthop_rif_init()
4090 static void mlxsw_sp_nexthop_rif_fini(struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_rif_fini() argument
4092 if (!nh->rif) in mlxsw_sp_nexthop_rif_fini()
4095 list_del(&nh->rif_list_node); in mlxsw_sp_nexthop_rif_fini()
4096 nh->rif = NULL; in mlxsw_sp_nexthop_rif_fini()
4100 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_neigh_init() argument
4107 if (!nh->nhgi->gateway || nh->neigh_entry) in mlxsw_sp_nexthop_neigh_init()
4115 n = neigh_lookup(nh->neigh_tbl, &nh->gw_addr, nh->rif->dev); in mlxsw_sp_nexthop_neigh_init()
4117 n = neigh_create(nh->neigh_tbl, &nh->gw_addr, nh->rif->dev); in mlxsw_sp_nexthop_neigh_init()
4138 nh->neigh_entry = neigh_entry; in mlxsw_sp_nexthop_neigh_init()
4139 list_add_tail(&nh->neigh_list_node, &neigh_entry->nexthop_list); in mlxsw_sp_nexthop_neigh_init()
4144 __mlxsw_sp_nexthop_neigh_update(nh, !(nud_state & NUD_VALID && !dead)); in mlxsw_sp_nexthop_neigh_init()
4154 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_neigh_fini() argument
4156 struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry; in mlxsw_sp_nexthop_neigh_fini()
4163 __mlxsw_sp_nexthop_neigh_update(nh, true); in mlxsw_sp_nexthop_neigh_fini()
4164 list_del(&nh->neigh_list_node); in mlxsw_sp_nexthop_neigh_fini()
4165 nh->neigh_entry = NULL; in mlxsw_sp_nexthop_neigh_fini()
4193 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_ipip_init() argument
4198 if (!nh->nhgi->gateway || nh->ipip_entry) in mlxsw_sp_nexthop_ipip_init()
4201 nh->ipip_entry = ipip_entry; in mlxsw_sp_nexthop_ipip_init()
4203 __mlxsw_sp_nexthop_neigh_update(nh, removing); in mlxsw_sp_nexthop_ipip_init()
4204 mlxsw_sp_nexthop_rif_init(nh, &ipip_entry->ol_lb->common); in mlxsw_sp_nexthop_ipip_init()
4208 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_ipip_fini() argument
4210 struct mlxsw_sp_ipip_entry *ipip_entry = nh->ipip_entry; in mlxsw_sp_nexthop_ipip_fini()
4215 __mlxsw_sp_nexthop_neigh_update(nh, true); in mlxsw_sp_nexthop_ipip_fini()
4216 nh->ipip_entry = NULL; in mlxsw_sp_nexthop_ipip_fini()
4231 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_type_init() argument
4243 nh->type = MLXSW_SP_NEXTHOP_TYPE_IPIP; in mlxsw_sp_nexthop_type_init()
4244 mlxsw_sp_nexthop_ipip_init(mlxsw_sp, nh, ipip_entry); in mlxsw_sp_nexthop_type_init()
4249 nh->type = MLXSW_SP_NEXTHOP_TYPE_ETH; in mlxsw_sp_nexthop_type_init()
4254 mlxsw_sp_nexthop_rif_init(nh, rif); in mlxsw_sp_nexthop_type_init()
4255 err = mlxsw_sp_nexthop_neigh_init(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_init()
4262 mlxsw_sp_nexthop_rif_fini(nh); in mlxsw_sp_nexthop_type_init()
4267 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_type_fini() argument
4269 switch (nh->type) { in mlxsw_sp_nexthop_type_fini()
4271 mlxsw_sp_nexthop_neigh_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_fini()
4272 mlxsw_sp_nexthop_rif_fini(nh); in mlxsw_sp_nexthop_type_fini()
4275 mlxsw_sp_nexthop_rif_fini(nh); in mlxsw_sp_nexthop_type_fini()
4276 mlxsw_sp_nexthop_ipip_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_fini()
4283 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop4_init() argument
4290 nh->nhgi = nh_grp->nhgi; in mlxsw_sp_nexthop4_init()
4291 nh->key.fib_nh = fib_nh; in mlxsw_sp_nexthop4_init()
4293 nh->nh_weight = fib_nh->fib_nh_weight; in mlxsw_sp_nexthop4_init()
4295 nh->nh_weight = 1; in mlxsw_sp_nexthop4_init()
4297 memcpy(&nh->gw_addr, &fib_nh->fib_nh_gw4, sizeof(fib_nh->fib_nh_gw4)); in mlxsw_sp_nexthop4_init()
4298 nh->neigh_tbl = &arp_tbl; in mlxsw_sp_nexthop4_init()
4299 err = mlxsw_sp_nexthop_insert(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4303 mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4304 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop4_init()
4308 nh->ifindex = dev->ifindex; in mlxsw_sp_nexthop4_init()
4319 err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); in mlxsw_sp_nexthop4_init()
4326 list_del(&nh->router_list_node); in mlxsw_sp_nexthop4_init()
4327 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4328 mlxsw_sp_nexthop_remove(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4333 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop4_fini() argument
4335 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_fini()
4336 list_del(&nh->router_list_node); in mlxsw_sp_nexthop4_fini()
4337 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop4_fini()
4338 mlxsw_sp_nexthop_remove(mlxsw_sp, nh); in mlxsw_sp_nexthop4_fini()
4345 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop4_event() local
4348 nh = mlxsw_sp_nexthop_lookup(mlxsw_sp, key); in mlxsw_sp_nexthop4_event()
4349 if (!nh) in mlxsw_sp_nexthop4_event()
4354 mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, fib_nh->fib_nh_dev); in mlxsw_sp_nexthop4_event()
4357 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_event()
4361 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop4_event()
4367 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_rif_update() local
4370 list_for_each_entry(nh, &rif->nexthop_list, rif_list_node) { in mlxsw_sp_nexthop_rif_update()
4371 switch (nh->type) { in mlxsw_sp_nexthop_rif_update()
4383 __mlxsw_sp_nexthop_neigh_update(nh, removing); in mlxsw_sp_nexthop_rif_update()
4384 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_rif_update()
4392 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_rif_migrate() local
4395 list_for_each_entry(nh, &new_rif->nexthop_list, rif_list_node) in mlxsw_sp_nexthop_rif_migrate()
4396 nh->rif = new_rif; in mlxsw_sp_nexthop_rif_migrate()
4403 struct mlxsw_sp_nexthop *nh, *tmp; in mlxsw_sp_nexthop_rif_gone_sync() local
4405 list_for_each_entry_safe(nh, tmp, &rif->nexthop_list, rif_list_node) { in mlxsw_sp_nexthop_rif_gone_sync()
4406 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_rif_gone_sync()
4407 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_rif_gone_sync()
4552 const struct nh_notifier_single_info *nh, in mlxsw_sp_nexthop_obj_single_validate() argument
4557 if (nh->is_fdb) in mlxsw_sp_nexthop_obj_single_validate()
4559 else if (nh->has_encap) in mlxsw_sp_nexthop_obj_single_validate()
4569 const struct nh_notifier_single_info *nh, in mlxsw_sp_nexthop_obj_group_entry_validate() argument
4574 err = mlxsw_sp_nexthop_obj_single_validate(mlxsw_sp, nh, extack); in mlxsw_sp_nexthop_obj_group_entry_validate()
4581 if (!nh->gw_family && !nh->is_reject && in mlxsw_sp_nexthop_obj_group_entry_validate()
4582 !mlxsw_sp_netdev_ipip_type(mlxsw_sp, nh->dev, NULL)) { in mlxsw_sp_nexthop_obj_group_entry_validate()
4603 const struct nh_notifier_single_info *nh; in mlxsw_sp_nexthop_obj_group_validate() local
4606 nh = &nh_grp->nh_entries[i].nh; in mlxsw_sp_nexthop_obj_group_validate()
4607 err = mlxsw_sp_nexthop_obj_group_entry_validate(mlxsw_sp, nh, in mlxsw_sp_nexthop_obj_group_validate()
4674 const struct nh_notifier_single_info *nh; in mlxsw_sp_nexthop_obj_res_group_validate() local
4677 nh = &nh_res_table->nhs[i]; in mlxsw_sp_nexthop_obj_res_group_validate()
4678 err = mlxsw_sp_nexthop_obj_group_entry_validate(mlxsw_sp, nh, in mlxsw_sp_nexthop_obj_res_group_validate()
4691 struct nh_notifier_single_info *nh; in mlxsw_sp_nexthop_obj_validate() local
4700 return mlxsw_sp_nexthop_obj_single_validate(mlxsw_sp, info->nh, in mlxsw_sp_nexthop_obj_validate()
4711 nh = &info->nh_res_bucket->new_nh; in mlxsw_sp_nexthop_obj_validate()
4712 return mlxsw_sp_nexthop_obj_group_entry_validate(mlxsw_sp, nh, in mlxsw_sp_nexthop_obj_validate()
4727 dev = info->nh->dev; in mlxsw_sp_nexthop_obj_is_gateway()
4728 return info->nh->gw_family || info->nh->is_reject || in mlxsw_sp_nexthop_obj_is_gateway()
4740 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_obj_blackhole_init() argument
4744 nh->action = MLXSW_SP_NEXTHOP_ACTION_DISCARD; in mlxsw_sp_nexthop_obj_blackhole_init()
4745 nh->should_offload = 1; in mlxsw_sp_nexthop_obj_blackhole_init()
4750 nh->rif = mlxsw_sp->router->rifs[lb_rif_index]; in mlxsw_sp_nexthop_obj_blackhole_init()
4754 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_obj_blackhole_fini() argument
4756 nh->rif = NULL; in mlxsw_sp_nexthop_obj_blackhole_fini()
4757 nh->should_offload = 0; in mlxsw_sp_nexthop_obj_blackhole_fini()
4763 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_obj_init() argument
4769 nh->nhgi = nh_grp->nhgi; in mlxsw_sp_nexthop_obj_init()
4770 nh->nh_weight = weight; in mlxsw_sp_nexthop_obj_init()
4774 memcpy(&nh->gw_addr, &nh_obj->ipv4, sizeof(nh_obj->ipv4)); in mlxsw_sp_nexthop_obj_init()
4775 nh->neigh_tbl = &arp_tbl; in mlxsw_sp_nexthop_obj_init()
4778 memcpy(&nh->gw_addr, &nh_obj->ipv6, sizeof(nh_obj->ipv6)); in mlxsw_sp_nexthop_obj_init()
4780 nh->neigh_tbl = &nd_tbl; in mlxsw_sp_nexthop_obj_init()
4785 mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_init()
4786 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop_obj_init()
4787 nh->ifindex = dev->ifindex; in mlxsw_sp_nexthop_obj_init()
4789 err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); in mlxsw_sp_nexthop_obj_init()
4794 mlxsw_sp_nexthop_obj_blackhole_init(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_init()
4800 if (nh_grp->nhgi->is_resilient && !nh->should_offload) { in mlxsw_sp_nexthop_obj_init()
4801 nh->action = MLXSW_SP_NEXTHOP_ACTION_TRAP; in mlxsw_sp_nexthop_obj_init()
4802 nh->should_offload = 1; in mlxsw_sp_nexthop_obj_init()
4808 list_del(&nh->router_list_node); in mlxsw_sp_nexthop_obj_init()
4809 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_init()
4814 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop_obj_fini() argument
4816 if (nh->action == MLXSW_SP_NEXTHOP_ACTION_DISCARD) in mlxsw_sp_nexthop_obj_fini()
4817 mlxsw_sp_nexthop_obj_blackhole_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_fini()
4818 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_fini()
4819 list_del(&nh->router_list_node); in mlxsw_sp_nexthop_obj_fini()
4820 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_fini()
4821 nh->should_offload = 0; in mlxsw_sp_nexthop_obj_fini()
4830 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_obj_group_info_init() local
4862 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_obj_group_info_init()
4865 nh_obj = info->nh; in mlxsw_sp_nexthop_obj_group_info_init()
4869 nh_obj = &info->nh_grp->nh_entries[i].nh; in mlxsw_sp_nexthop_obj_group_info_init()
4880 err = mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, in mlxsw_sp_nexthop_obj_group_info_init()
4911 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_obj_group_info_init()
4912 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_group_info_init()
4934 struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop_obj_group_info_fini() local
4936 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_group_info_fini()
5157 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop_obj_bucket_adj_update() argument
5175 adj_index = nh->nhgi->adj_index + bucket_index; in mlxsw_sp_nexthop_obj_bucket_adj_update()
5176 err = mlxsw_sp_nexthop_update(mlxsw_sp, adj_index, nh, force, ratr_pl); in mlxsw_sp_nexthop_obj_bucket_adj_update()
5197 nh->update = 0; in mlxsw_sp_nexthop_obj_bucket_adj_update()
5198 nh->offloaded = 1; in mlxsw_sp_nexthop_obj_bucket_adj_update()
5199 mlxsw_sp_nexthop_bucket_offload_refresh(mlxsw_sp, nh, bucket_index); in mlxsw_sp_nexthop_obj_bucket_adj_update()
5212 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop_obj_bucket_replace() local
5228 nh = &nhgi->nexthops[bucket_index]; in mlxsw_sp_nexthop_obj_bucket_replace()
5229 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_bucket_replace()
5232 err = mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, 1); in mlxsw_sp_nexthop_obj_bucket_replace()
5238 err = mlxsw_sp_nexthop_obj_bucket_adj_update(mlxsw_sp, nh, info); in mlxsw_sp_nexthop_obj_bucket_replace()
5245 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_bucket_replace()
5248 mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, 1); in mlxsw_sp_nexthop_obj_bucket_replace()
5250 nh->update = 0; in mlxsw_sp_nexthop_obj_bucket_replace()
5251 nh->offloaded = 1; in mlxsw_sp_nexthop_obj_bucket_replace()
5293 const struct fib_nh *nh = fib_info_nh(fi, 0); in mlxsw_sp_fi_is_gateway() local
5295 return nh->fib_nh_gw_family || in mlxsw_sp_fi_is_gateway()
5296 mlxsw_sp_nexthop4_ipip_type(mlxsw_sp, nh, NULL); in mlxsw_sp_fi_is_gateway()
5305 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop4_group_info_init() local
5318 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop4_group_info_init()
5320 err = mlxsw_sp_nexthop4_init(mlxsw_sp, nh_grp, nh, fib_nh); in mlxsw_sp_nexthop4_group_info_init()
5339 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop4_group_info_init()
5340 mlxsw_sp_nexthop4_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_group_info_init()
5355 struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop4_group_info_fini() local
5357 mlxsw_sp_nexthop4_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_group_info_fini()
5425 if (fi->nh) { in mlxsw_sp_nexthop4_group_get()
5427 fi->nh->id); in mlxsw_sp_nexthop4_group_get()
5507 struct mlxsw_sp_nexthop *nh = &nh_grp->nhgi->nexthops[i]; in mlxsw_sp_rt6_nexthop() local
5510 if (nh->rif && nh->rif->dev == rt->fib6_nh->fib_nh_dev && in mlxsw_sp_rt6_nexthop()
5511 ipv6_addr_equal((const struct in6_addr *) &nh->gw_addr, in mlxsw_sp_rt6_nexthop()
5513 return nh; in mlxsw_sp_rt6_nexthop()
6346 if (fen_info->fi->nh && in mlxsw_sp_router_fib4_replace()
6347 !mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, fen_info->fi->nh->id)) in mlxsw_sp_router_fib4_replace()
6462 if (!mlxsw_sp_rt6->rt->nh) in mlxsw_sp_rt6_destroy()
6499 struct mlxsw_sp_nexthop *nh, in mlxsw_sp_nexthop6_init() argument
6505 nh->nhgi = nh_grp->nhgi; in mlxsw_sp_nexthop6_init()
6506 nh->nh_weight = rt->fib6_nh->fib_nh_weight; in mlxsw_sp_nexthop6_init()
6507 memcpy(&nh->gw_addr, &rt->fib6_nh->fib_nh_gw6, sizeof(nh->gw_addr)); in mlxsw_sp_nexthop6_init()
6509 nh->neigh_tbl = &nd_tbl; in mlxsw_sp_nexthop6_init()
6511 mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); in mlxsw_sp_nexthop6_init()
6513 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop6_init()
6517 nh->ifindex = dev->ifindex; in mlxsw_sp_nexthop6_init()
6519 err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); in mlxsw_sp_nexthop6_init()
6526 list_del(&nh->router_list_node); in mlxsw_sp_nexthop6_init()
6527 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop6_init()
6532 struct mlxsw_sp_nexthop *nh) in mlxsw_sp_nexthop6_fini() argument
6534 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop6_fini()
6535 list_del(&nh->router_list_node); in mlxsw_sp_nexthop6_fini()
6536 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop6_fini()
6553 struct mlxsw_sp_nexthop *nh; in mlxsw_sp_nexthop6_group_info_init() local
6569 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop6_group_info_init()
6570 err = mlxsw_sp_nexthop6_init(mlxsw_sp, nh_grp, nh, rt); in mlxsw_sp_nexthop6_group_info_init()
6591 nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop6_group_info_init()
6592 mlxsw_sp_nexthop6_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop6_group_info_init()
6607 struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i]; in mlxsw_sp_nexthop6_group_info_fini() local
6609 mlxsw_sp_nexthop6_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop6_group_info_fini()
6674 if (rt->nh) { in mlxsw_sp_nexthop6_group_get()
6676 rt->nh->id); in mlxsw_sp_nexthop6_group_get()
7042 if (rt->nh && !mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, rt->nh->id)) in mlxsw_sp_router_fib6_replace()