Lines Matching refs:sw

106 static int prestera_util_nhc2nc_key(struct prestera_switch *sw,
133 prestera_util_nhc_eq_n_cache_key(struct prestera_switch *sw,
140 err = prestera_util_nhc2nc_key(sw, nhc, &tk);
151 prestera_util_neigh2nc_key(struct prestera_switch *sw, struct neighbour *n,
430 prestera_neigh_iface_init(struct prestera_switch *sw,
452 prestera_kern_neigh_cache_find(struct prestera_switch *sw,
458 rhashtable_lookup_fast(&sw->router->kern_neigh_cache_ht, key,
464 __prestera_kern_neigh_cache_destruct(struct prestera_switch *sw,
471 __prestera_kern_neigh_cache_destroy(struct prestera_switch *sw,
474 rhashtable_remove_fast(&sw->router->kern_neigh_cache_ht,
477 __prestera_kern_neigh_cache_destruct(sw, n_cache);
482 __prestera_kern_neigh_cache_create(struct prestera_switch *sw,
496 err = rhashtable_insert_fast(&sw->router->kern_neigh_cache_ht,
512 prestera_kern_neigh_cache_get(struct prestera_switch *sw,
517 n_cache = prestera_kern_neigh_cache_find(sw, key);
519 n_cache = __prestera_kern_neigh_cache_create(sw, key);
525 prestera_kern_neigh_cache_put(struct prestera_switch *sw,
530 __prestera_kern_neigh_cache_destroy(sw, n_cache);
538 prestera_kern_fib_cache_find(struct prestera_switch *sw,
544 rhashtable_lookup_fast(&sw->router->kern_fib_cache_ht, key,
550 __prestera_kern_fib_cache_destruct(struct prestera_switch *sw,
560 prestera_kern_neigh_cache_put(sw, n_cache);
568 prestera_kern_fib_cache_destroy(struct prestera_switch *sw,
571 rhashtable_remove_fast(&sw->router->kern_fib_cache_ht,
574 __prestera_kern_fib_cache_destruct(sw, fib_cache);
579 __prestera_kern_fib_cache_create_nhs(struct prestera_switch *sw,
596 err = prestera_util_nhc2nc_key(sw, nhc, &nc_key);
600 n_cache = prestera_kern_neigh_cache_get(sw, &nc_key);
617 prestera_kern_fib_cache_create(struct prestera_switch *sw,
634 err = rhashtable_insert_fast(&sw->router->kern_fib_cache_ht,
641 err = __prestera_kern_fib_cache_create_nhs(sw, fib_cache);
656 __prestera_k_arb_fib_nh_offload_set(struct prestera_switch *sw,
672 if (prestera_util_nhc_eq_n_cache_key(sw, nhc, &nc->key)) {
680 __prestera_k_arb_n_offload_set(struct prestera_switch *sw,
696 __prestera_k_arb_fib_lpm_offload_set(struct prestera_switch *sw,
724 __prestera_k_arb_n_lpm_set(struct prestera_switch *sw,
745 fib_cache = prestera_kern_fib_cache_find(sw, &fc_key);
750 fib_node = prestera_fib_node_find(sw, &fib_key);
754 prestera_fib_node_destroy(sw, fib_node);
763 fib_node = prestera_fib_node_create(sw, &fib_key,
774 __prestera_k_arb_nc_kern_fib_fetch(struct prestera_switch *sw,
786 __prestera_k_arb_nc_kern_n_fetch(struct prestera_switch *sw,
799 err = prestera_neigh_iface_init(sw, &nc->nh_neigh_info.iface,
817 __prestera_k_arb_nc_apply(struct prestera_switch *sw,
825 __prestera_k_arb_n_lpm_set(sw, nc, nc->reachable && nc->in_kernel);
826 __prestera_k_arb_n_offload_set(sw, nc, nc->reachable && nc->in_kernel);
829 nh_neigh = prestera_nh_neigh_find(sw, &nh_key);
838 err = prestera_nh_neigh_set(sw, nh_neigh);
850 __prestera_k_arb_fib_nh_offload_set(sw, nhead->this, nc,
857 __prestera_pr_k_arb_fc_lpm_info_calc(struct prestera_switch *sw,
918 dev_err(sw->dev->dev, "Unsupported fib_type");
929 static int __prestera_k_arb_f_lpm_set(struct prestera_switch *sw,
935 fib_node = prestera_fib_node_find(sw, &fc->lpm_info.fib_key);
937 prestera_fib_node_destroy(sw, fib_node);
942 fib_node = prestera_fib_node_create(sw, &fc->lpm_info.fib_key,
947 dev_err(sw->dev->dev, "fib_node=NULL %pI4n/%d kern_tb_id = %d",
956 static int __prestera_k_arb_fc_apply(struct prestera_switch *sw,
961 err = __prestera_pr_k_arb_fc_lpm_info_calc(sw, fc);
965 err = __prestera_k_arb_f_lpm_set(sw, fc, fc->reachable);
967 __prestera_k_arb_fib_lpm_offload_set(sw, fc,
974 __prestera_k_arb_fib_lpm_offload_set(sw, fc, false,
978 __prestera_k_arb_fib_lpm_offload_set(sw, fc, false,
982 __prestera_k_arb_fib_lpm_offload_set(sw, fc, false, true,
993 __prestera_k_arb_util_fib_overlaps(struct prestera_switch *sw,
1004 rfc = prestera_kern_fib_cache_find(sw, &fc_key);
1011 __prestera_k_arb_util_fib_overlapped(struct prestera_switch *sw,
1022 rfc = prestera_kern_fib_cache_find(sw, &fc_key);
1028 static void __prestera_k_arb_hw_state_upd(struct prestera_switch *sw,
1037 nh_neigh = prestera_nh_neigh_find(sw, &nh_key);
1044 hw_active = prestera_nh_neigh_util_hw_state(sw, nh_neigh);
1076 static void prestera_k_arb_hw_evt(struct prestera_switch *sw)
1081 rhashtable_walk_enter(&sw->router->kern_neigh_cache_ht, &iter);
1093 __prestera_k_arb_hw_state_upd(sw, n_cache);
1101 static void prestera_k_arb_n_evt(struct prestera_switch *sw,
1108 err = prestera_util_neigh2nc_key(sw, n, &n_key);
1112 n_cache = prestera_kern_neigh_cache_find(sw, &n_key);
1114 n_cache = prestera_kern_neigh_cache_get(sw, &n_key);
1117 __prestera_k_arb_nc_kern_fib_fetch(sw, n_cache);
1120 __prestera_k_arb_nc_kern_n_fetch(sw, n_cache);
1121 __prestera_k_arb_nc_apply(sw, n_cache);
1123 prestera_kern_neigh_cache_put(sw, n_cache);
1126 static void __prestera_k_arb_fib_evt2nc(struct prestera_switch *sw)
1131 rhashtable_walk_enter(&sw->router->kern_neigh_cache_ht, &iter);
1143 __prestera_k_arb_nc_kern_fib_fetch(sw, n_cache);
1144 __prestera_k_arb_nc_apply(sw, n_cache);
1152 prestera_k_arb_fib_evt(struct prestera_switch *sw,
1162 fib_cache = prestera_kern_fib_cache_find(sw, &fc_key);
1165 err = __prestera_k_arb_fc_apply(sw, fib_cache);
1167 dev_err(sw->dev->dev,
1170 bfib_cache = __prestera_k_arb_util_fib_overlaps(sw, fib_cache);
1171 tfib_cache = __prestera_k_arb_util_fib_overlapped(sw, fib_cache);
1174 err = __prestera_k_arb_fc_apply(sw, bfib_cache);
1176 dev_err(sw->dev->dev,
1180 prestera_kern_fib_cache_destroy(sw, fib_cache);
1184 fib_cache = prestera_kern_fib_cache_create(sw, &fc_key, info);
1186 dev_err(sw->dev->dev, "fib_cache == NULL");
1190 bfib_cache = __prestera_k_arb_util_fib_overlaps(sw, fib_cache);
1191 tfib_cache = __prestera_k_arb_util_fib_overlapped(sw, fib_cache);
1197 err = __prestera_k_arb_fc_apply(sw, bfib_cache);
1199 dev_err(sw->dev->dev,
1203 err = __prestera_k_arb_fc_apply(sw, fib_cache);
1205 dev_err(sw->dev->dev, "Applying fib_cache failed");
1209 __prestera_k_arb_fib_evt2nc(sw);
1217 struct prestera_switch *sw = arg;
1223 __prestera_k_arb_n_offload_set(sw, n_cache, false);
1228 __prestera_kern_neigh_cache_destruct(sw, n_cache);
1235 struct prestera_switch *sw = arg;
1237 __prestera_k_arb_fib_lpm_offload_set(sw, fib_cache,
1240 __prestera_k_arb_fib_nh_offload_set(sw, fib_cache, NULL,
1245 __prestera_kern_fib_cache_destruct(sw, fib_cache);
1249 static void prestera_k_arb_abort(struct prestera_switch *sw)
1259 rhashtable_free_and_destroy(&sw->router->kern_fib_cache_ht,
1261 sw);
1262 rhashtable_free_and_destroy(&sw->router->kern_neigh_cache_ht,
1264 sw);
1287 re = prestera_rif_entry_find(port->sw, &re_key);
1295 re = prestera_rif_entry_create(port->sw, &re_key,
1309 prestera_rif_entry_destroy(port->sw, re);
1317 static int __prestera_inetaddr_event(struct prestera_switch *sw,
1348 err = __prestera_inetaddr_event(router->sw, dev, event, NULL);
1379 err = __prestera_inetaddr_event(router->sw, dev, event, ivi->extack);
1386 struct prestera_switch *sw;
1395 struct prestera_switch *sw = fib_work->sw;
1402 err = prestera_k_arb_fib_evt(sw, true,
1409 err = prestera_k_arb_fib_evt(sw, false,
1420 dev_err(sw->dev->dev, "Error when processing %pI4h/%d",
1458 fib_work->sw = router->sw;
1471 struct prestera_switch *sw;
1479 struct prestera_switch *sw = net_work->sw;
1485 prestera_k_arb_n_evt(sw, n);
1512 net_work->sw = router->sw;
1528 prestera_k_arb_hw_evt(router->sw);
1535 static int prestera_neigh_work_init(struct prestera_switch *sw)
1537 INIT_DELAYED_WORK(&sw->router->neighs_update.dw,
1539 prestera_queue_delayed_work(&sw->router->neighs_update.dw, 0);
1543 static void prestera_neigh_work_fini(struct prestera_switch *sw)
1545 cancel_delayed_work_sync(&sw->router->neighs_update.dw);
1548 int prestera_router_init(struct prestera_switch *sw)
1553 router = kzalloc(sizeof(*sw->router), GFP_KERNEL);
1557 sw->router = router;
1558 router->sw = sw;
1560 err = prestera_router_hw_init(sw);
1574 nhgrp_cache_bytes = sw->size_tbl_router_nexthop / 8 + 1;
1581 err = prestera_neigh_work_init(sw);
1615 prestera_neigh_work_fini(sw);
1623 prestera_router_hw_fini(sw);
1625 kfree(sw->router);
1629 void prestera_router_fini(struct prestera_switch *sw)
1631 unregister_fib_notifier(&init_net, &sw->router->fib_nb);
1632 unregister_netevent_notifier(&sw->router->netevent_nb);
1633 unregister_inetaddr_notifier(&sw->router->inetaddr_nb);
1634 unregister_inetaddr_validator_notifier(&sw->router->inetaddr_valid_nb);
1635 prestera_neigh_work_fini(sw);
1638 prestera_k_arb_abort(sw);
1640 kfree(sw->router->nhgrp_hw_state_cache);
1641 rhashtable_destroy(&sw->router->kern_fib_cache_ht);
1642 prestera_router_hw_fini(sw);
1643 kfree(sw->router);
1644 sw->router = NULL;