Lines Matching refs:mr_route

48 	struct mlxsw_sp_mr_route *mr_route;  member
59 const struct mlxsw_sp_mr_route *mr_route);
108 mlxsw_sp_mr_route_ivif_in_evifs(const struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route_ivif_in_evifs() argument
110 vifi_t ivif = mr_route->mfc->mfc_parent; in mlxsw_sp_mr_route_ivif_in_evifs()
112 return mr_route->mfc->mfc_un.res.ttls[ivif] != 255; in mlxsw_sp_mr_route_ivif_in_evifs()
116 mlxsw_sp_mr_route_valid_evifs_num(const struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route_valid_evifs_num() argument
122 list_for_each_entry(rve, &mr_route->evif_list, route_node) in mlxsw_sp_mr_route_valid_evifs_num()
129 mlxsw_sp_mr_route_action(const struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route_action() argument
134 if (!mlxsw_sp_mr_vif_valid(mr_route->ivif.mr_vif)) in mlxsw_sp_mr_route_action()
140 if (mr_route->mr_table->ops->is_route_starg(mr_route->mr_table, in mlxsw_sp_mr_route_action()
141 mr_route) && in mlxsw_sp_mr_route_action()
142 !mlxsw_sp_mr_route_ivif_in_evifs(mr_route)) in mlxsw_sp_mr_route_action()
146 if (!mlxsw_sp_mr_route_valid_evifs_num(mr_route)) in mlxsw_sp_mr_route_action()
152 list_for_each_entry(rve, &mr_route->evif_list, route_node) in mlxsw_sp_mr_route_action()
160 mlxsw_sp_mr_route_prio(const struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route_prio() argument
162 return mr_route->mr_table->ops->is_route_starg(mr_route->mr_table, in mlxsw_sp_mr_route_prio()
163 mr_route) ? in mlxsw_sp_mr_route_prio()
167 static int mlxsw_sp_mr_route_evif_link(struct mlxsw_sp_mr_route *mr_route, in mlxsw_sp_mr_route_evif_link() argument
175 rve->mr_route = mr_route; in mlxsw_sp_mr_route_evif_link()
177 list_add_tail(&rve->route_node, &mr_route->evif_list); in mlxsw_sp_mr_route_evif_link()
190 static void mlxsw_sp_mr_route_ivif_link(struct mlxsw_sp_mr_route *mr_route, in mlxsw_sp_mr_route_ivif_link() argument
193 mr_route->ivif.mr_route = mr_route; in mlxsw_sp_mr_route_ivif_link()
194 mr_route->ivif.mr_vif = mr_vif; in mlxsw_sp_mr_route_ivif_link()
195 list_add_tail(&mr_route->ivif.vif_node, &mr_vif->route_ivif_list); in mlxsw_sp_mr_route_ivif_link()
198 static void mlxsw_sp_mr_route_ivif_unlink(struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route_ivif_unlink() argument
200 list_del(&mr_route->ivif.vif_node); in mlxsw_sp_mr_route_ivif_unlink()
205 struct mlxsw_sp_mr_route *mr_route, in mlxsw_sp_mr_route_info_create() argument
218 list_for_each_entry(rve, &mr_route->evif_list, route_node) { in mlxsw_sp_mr_route_info_create()
226 if (mlxsw_sp_mr_vif_valid(mr_route->ivif.mr_vif)) in mlxsw_sp_mr_route_info_create()
227 irif_index = mlxsw_sp_rif_index(mr_route->ivif.mr_vif->rif); in mlxsw_sp_mr_route_info_create()
233 route_info->min_mtu = mr_route->min_mtu; in mlxsw_sp_mr_route_info_create()
234 route_info->route_action = mr_route->route_action; in mlxsw_sp_mr_route_info_create()
246 struct mlxsw_sp_mr_route *mr_route, in mlxsw_sp_mr_route_write() argument
254 err = mlxsw_sp_mr_route_info_create(mr_table, mr_route, &route_info); in mlxsw_sp_mr_route_write()
261 mr_route->route_priv = kzalloc(mr->mr_ops->route_priv_size, in mlxsw_sp_mr_route_write()
263 if (!mr_route->route_priv) { in mlxsw_sp_mr_route_write()
268 route_params.key = mr_route->key; in mlxsw_sp_mr_route_write()
270 route_params.prio = mlxsw_sp_mr_route_prio(mr_route); in mlxsw_sp_mr_route_write()
272 mr_route->route_priv, in mlxsw_sp_mr_route_write()
275 kfree(mr_route->route_priv); in mlxsw_sp_mr_route_write()
277 err = mr->mr_ops->route_update(mlxsw_sp, mr_route->route_priv, in mlxsw_sp_mr_route_write()
286 struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route_erase() argument
291 mr->mr_ops->route_destroy(mlxsw_sp, mr->priv, mr_route->route_priv); in mlxsw_sp_mr_route_erase()
292 kfree(mr_route->route_priv); in mlxsw_sp_mr_route_erase()
300 struct mlxsw_sp_mr_route *mr_route; in mlxsw_sp_mr_route_create() local
305 mr_route = kzalloc(sizeof(*mr_route), GFP_KERNEL); in mlxsw_sp_mr_route_create()
306 if (!mr_route) in mlxsw_sp_mr_route_create()
308 INIT_LIST_HEAD(&mr_route->evif_list); in mlxsw_sp_mr_route_create()
311 mr_route->min_mtu = ETH_MAX_MTU; in mlxsw_sp_mr_route_create()
313 mr_route->mfc = mfc; in mlxsw_sp_mr_route_create()
314 mr_table->ops->key_create(mr_table, &mr_route->key, mr_route->mfc); in mlxsw_sp_mr_route_create()
316 mr_route->mr_table = mr_table; in mlxsw_sp_mr_route_create()
319 err = mlxsw_sp_mr_route_evif_link(mr_route, in mlxsw_sp_mr_route_create()
324 mr_table->vifs[i].dev->mtu < mr_route->min_mtu) in mlxsw_sp_mr_route_create()
325 mr_route->min_mtu = mr_table->vifs[i].dev->mtu; in mlxsw_sp_mr_route_create()
328 mlxsw_sp_mr_route_ivif_link(mr_route, in mlxsw_sp_mr_route_create()
331 mr_route->route_action = mlxsw_sp_mr_route_action(mr_route); in mlxsw_sp_mr_route_create()
332 return mr_route; in mlxsw_sp_mr_route_create()
335 list_for_each_entry_safe(rve, tmp, &mr_route->evif_list, route_node) in mlxsw_sp_mr_route_create()
337 kfree(mr_route); in mlxsw_sp_mr_route_create()
342 struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route_destroy() argument
346 mlxsw_sp_mr_route_ivif_unlink(mr_route); in mlxsw_sp_mr_route_destroy()
347 mr_cache_put(mr_route->mfc); in mlxsw_sp_mr_route_destroy()
348 list_for_each_entry_safe(rve, tmp, &mr_route->evif_list, route_node) in mlxsw_sp_mr_route_destroy()
350 kfree(mr_route); in mlxsw_sp_mr_route_destroy()
353 static void mlxsw_sp_mr_mfc_offload_set(struct mlxsw_sp_mr_route *mr_route, in mlxsw_sp_mr_mfc_offload_set() argument
357 mr_route->mfc->mfc_flags |= MFC_OFFLOAD; in mlxsw_sp_mr_mfc_offload_set()
359 mr_route->mfc->mfc_flags &= ~MFC_OFFLOAD; in mlxsw_sp_mr_mfc_offload_set()
362 static void mlxsw_sp_mr_mfc_offload_update(struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_mfc_offload_update() argument
366 offload = mr_route->route_action != MLXSW_SP_MR_ROUTE_ACTION_TRAP; in mlxsw_sp_mr_mfc_offload_update()
367 mlxsw_sp_mr_mfc_offload_set(mr_route, offload); in mlxsw_sp_mr_mfc_offload_update()
371 struct mlxsw_sp_mr_route *mr_route) in __mlxsw_sp_mr_route_del() argument
373 mlxsw_sp_mr_mfc_offload_set(mr_route, false); in __mlxsw_sp_mr_route_del()
374 mlxsw_sp_mr_route_erase(mr_table, mr_route); in __mlxsw_sp_mr_route_del()
375 rhashtable_remove_fast(&mr_table->route_ht, &mr_route->ht_node, in __mlxsw_sp_mr_route_del()
377 list_del(&mr_route->node); in __mlxsw_sp_mr_route_del()
378 mlxsw_sp_mr_route_destroy(mr_table, mr_route); in __mlxsw_sp_mr_route_del()
385 struct mlxsw_sp_mr_route *mr_route; in mlxsw_sp_mr_route_add() local
392 mr_route = mlxsw_sp_mr_route_create(mr_table, mfc); in mlxsw_sp_mr_route_add()
393 if (IS_ERR(mr_route)) in mlxsw_sp_mr_route_add()
394 return PTR_ERR(mr_route); in mlxsw_sp_mr_route_add()
398 &mr_route->key, in mlxsw_sp_mr_route_add()
407 mr_route->route_priv = mr_orig_route->route_priv; in mlxsw_sp_mr_route_add()
419 list_add_tail(&mr_route->node, &mr_table->route_list); in mlxsw_sp_mr_route_add()
421 &mr_route->ht_node, in mlxsw_sp_mr_route_add()
427 err = mlxsw_sp_mr_route_write(mr_table, mr_route, replace); in mlxsw_sp_mr_route_add()
440 mlxsw_sp_mr_mfc_offload_update(mr_route); in mlxsw_sp_mr_route_add()
444 rhashtable_remove_fast(&mr_table->route_ht, &mr_route->ht_node, in mlxsw_sp_mr_route_add()
447 list_del(&mr_route->node); in mlxsw_sp_mr_route_add()
450 mlxsw_sp_mr_route_destroy(mr_table, mr_route); in mlxsw_sp_mr_route_add()
457 struct mlxsw_sp_mr_route *mr_route; in mlxsw_sp_mr_route_del() local
461 mr_route = rhashtable_lookup_fast(&mr_table->route_ht, &key, in mlxsw_sp_mr_route_del()
463 if (mr_route) in mlxsw_sp_mr_route_del()
464 __mlxsw_sp_mr_route_del(mr_table, mr_route); in mlxsw_sp_mr_route_del()
478 route_action = mlxsw_sp_mr_route_action(rve->mr_route); in mlxsw_sp_mr_route_ivif_resolve()
484 err = mr->mr_ops->route_irif_update(mlxsw_sp, rve->mr_route->route_priv, in mlxsw_sp_mr_route_ivif_resolve()
490 rve->mr_route->route_priv, in mlxsw_sp_mr_route_ivif_resolve()
498 rve->mr_route->route_action = route_action; in mlxsw_sp_mr_route_ivif_resolve()
499 mlxsw_sp_mr_mfc_offload_update(rve->mr_route); in mlxsw_sp_mr_route_ivif_resolve()
510 mr->mr_ops->route_action_update(mlxsw_sp, rve->mr_route->route_priv, in mlxsw_sp_mr_route_ivif_unresolve()
512 rve->mr_route->route_action = MLXSW_SP_MR_ROUTE_ACTION_TRAP; in mlxsw_sp_mr_route_ivif_unresolve()
513 mlxsw_sp_mr_mfc_offload_update(rve->mr_route); in mlxsw_sp_mr_route_ivif_unresolve()
530 route_action = mlxsw_sp_mr_route_action(rve->mr_route); in mlxsw_sp_mr_route_evif_resolve()
531 if (route_action != rve->mr_route->route_action) { in mlxsw_sp_mr_route_evif_resolve()
533 rve->mr_route->route_priv, in mlxsw_sp_mr_route_evif_resolve()
543 rve->mr_route->route_priv, in mlxsw_sp_mr_route_evif_resolve()
550 if (rve->mr_vif->dev->mtu < rve->mr_route->min_mtu) { in mlxsw_sp_mr_route_evif_resolve()
551 rve->mr_route->min_mtu = rve->mr_vif->dev->mtu; in mlxsw_sp_mr_route_evif_resolve()
553 rve->mr_route->route_priv, in mlxsw_sp_mr_route_evif_resolve()
554 rve->mr_route->min_mtu); in mlxsw_sp_mr_route_evif_resolve()
559 rve->mr_route->route_action = route_action; in mlxsw_sp_mr_route_evif_resolve()
560 mlxsw_sp_mr_mfc_offload_update(rve->mr_route); in mlxsw_sp_mr_route_evif_resolve()
565 mr->mr_ops->route_erif_del(mlxsw_sp, rve->mr_route->route_priv, in mlxsw_sp_mr_route_evif_resolve()
568 if (route_action != rve->mr_route->route_action) in mlxsw_sp_mr_route_evif_resolve()
570 rve->mr_route->route_priv, in mlxsw_sp_mr_route_evif_resolve()
571 rve->mr_route->route_action); in mlxsw_sp_mr_route_evif_resolve()
594 if (mlxsw_sp_mr_route_valid_evifs_num(rve->mr_route) == 1) in mlxsw_sp_mr_route_evif_unresolve()
597 route_action = mlxsw_sp_mr_route_action(rve->mr_route); in mlxsw_sp_mr_route_evif_unresolve()
598 if (route_action != rve->mr_route->route_action) in mlxsw_sp_mr_route_evif_unresolve()
600 rve->mr_route->route_priv, in mlxsw_sp_mr_route_evif_unresolve()
605 mr->mr_ops->route_erif_del(mlxsw_sp, rve->mr_route->route_priv, rifi); in mlxsw_sp_mr_route_evif_unresolve()
606 rve->mr_route->route_action = route_action; in mlxsw_sp_mr_route_evif_unresolve()
607 mlxsw_sp_mr_mfc_offload_update(rve->mr_route); in mlxsw_sp_mr_route_evif_unresolve()
756 if (mtu < rve->mr_route->min_mtu) { in mlxsw_sp_mr_rif_mtu_update()
757 rve->mr_route->min_mtu = mtu; in mlxsw_sp_mr_rif_mtu_update()
759 rve->mr_route->route_priv, in mlxsw_sp_mr_rif_mtu_update()
803 const struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route4_starg() argument
805 return mr_route->key.source_mask.addr4 == htonl(INADDR_ANY); in mlxsw_sp_mr_route4_starg()
849 const struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route6_starg() argument
851 return ipv6_addr_any(&mr_route->key.source_mask.addr6); in mlxsw_sp_mr_route6_starg()
955 struct mlxsw_sp_mr_route *mr_route, *tmp; in mlxsw_sp_mr_table_flush() local
958 list_for_each_entry_safe(mr_route, tmp, &mr_table->route_list, node) in mlxsw_sp_mr_table_flush()
959 __mlxsw_sp_mr_route_del(mr_table, mr_route); in mlxsw_sp_mr_table_flush()
978 struct mlxsw_sp_mr_route *mr_route) in mlxsw_sp_mr_route_stats_update() argument
983 if (mr_route->route_action == MLXSW_SP_MR_ROUTE_ACTION_TRAP) in mlxsw_sp_mr_route_stats_update()
986 mr->mr_ops->route_stats(mlxsw_sp, mr_route->route_priv, &packets, in mlxsw_sp_mr_route_stats_update()
989 if (mr_route->mfc->mfc_un.res.pkt != packets) in mlxsw_sp_mr_route_stats_update()
990 mr_route->mfc->mfc_un.res.lastuse = jiffies; in mlxsw_sp_mr_route_stats_update()
991 mr_route->mfc->mfc_un.res.pkt = packets; in mlxsw_sp_mr_route_stats_update()
992 mr_route->mfc->mfc_un.res.bytes = bytes; in mlxsw_sp_mr_route_stats_update()
1000 struct mlxsw_sp_mr_route *mr_route; in mlxsw_sp_mr_stats_update() local
1005 list_for_each_entry(mr_route, &mr_table->route_list, node) in mlxsw_sp_mr_stats_update()
1007 mr_route); in mlxsw_sp_mr_stats_update()