Lines Matching refs:data

110 	struct nsim_fib_data *data;
209 static int nsim_fib_rule_event(struct nsim_fib_data *data,
217 err = nsim_fib_rule_account(&data->ipv4.rules, add, extack);
220 err = nsim_fib_rule_account(&data->ipv6.rules, add, extack);
241 static void nsim_fib_rt_init(struct nsim_fib_data *data,
250 list_add(&fib_rt->list, &data->fib_rt_list);
275 nsim_fib4_rt_create(struct nsim_fib_data *data,
284 nsim_fib_rt_init(data, &fib4_rt->common, &fen_info->dst, sizeof(u32),
356 static int nsim_fib4_rt_add(struct nsim_fib_data *data,
359 struct net *net = devlink_net(data->devlink);
362 err = rhashtable_insert_fast(&data->fib_rt_ht,
378 nsim_fib_account(&data->ipv4.fib, false);
382 static int nsim_fib4_rt_replace(struct nsim_fib_data *data,
386 struct net *net = devlink_net(data->devlink);
392 err = nsim_fib_account(&data->ipv4.fib, false);
395 err = rhashtable_replace_fast(&data->fib_rt_ht,
411 static int nsim_fib4_rt_insert(struct nsim_fib_data *data,
417 if (data->fail_route_offload) {
426 fib4_rt = nsim_fib4_rt_create(data, fen_info);
430 fib4_rt_old = nsim_fib4_rt_lookup(&data->fib_rt_ht, fen_info);
432 err = nsim_fib4_rt_add(data, fib4_rt);
434 err = nsim_fib4_rt_replace(data, fib4_rt, fib4_rt_old);
442 static void nsim_fib4_rt_remove(struct nsim_fib_data *data,
447 fib4_rt = nsim_fib4_rt_lookup(&data->fib_rt_ht, fen_info);
451 rhashtable_remove_fast(&data->fib_rt_ht, &fib4_rt->common.ht_node,
456 static int nsim_fib4_event(struct nsim_fib_data *data,
464 err = nsim_fib4_rt_insert(data, fen_info);
466 struct net *net = devlink_net(data->devlink);
472 nsim_fib4_rt_remove(data, fen_info);
539 nsim_fib6_rt_create(struct nsim_fib_data *data,
551 nsim_fib_rt_init(data, &fib6_rt->common, &rt->fib6_dst.addr,
604 static int nsim_fib6_rt_append(struct nsim_fib_data *data,
611 if (data->fail_route_offload) {
620 fib6_rt = nsim_fib6_rt_lookup(&data->fib_rt_ht, rt);
643 static void nsim_fib6_rt_offload_failed_flag_set(struct nsim_fib_data *data,
648 struct net *net = devlink_net(data->devlink);
655 static void nsim_fib6_rt_offload_failed_flag_set(struct nsim_fib_data *data,
663 static void nsim_fib6_rt_hw_flags_set(struct nsim_fib_data *data,
667 struct net *net = devlink_net(data->devlink);
674 static void nsim_fib6_rt_hw_flags_set(struct nsim_fib_data *data,
681 static int nsim_fib6_rt_add(struct nsim_fib_data *data,
686 err = rhashtable_insert_fast(&data->fib_rt_ht,
694 nsim_fib6_rt_hw_flags_set(data, fib6_rt, true);
702 nsim_fib_account(&data->ipv6.fib, false);
706 static int nsim_fib6_rt_replace(struct nsim_fib_data *data,
715 err = nsim_fib_account(&data->ipv6.fib, false);
719 err = rhashtable_replace_fast(&data->fib_rt_ht,
728 nsim_fib6_rt_hw_flags_set(data, fib6_rt, true);
730 nsim_fib6_rt_hw_flags_set(data, fib6_rt_old, false);
736 static int nsim_fib6_rt_insert(struct nsim_fib_data *data,
743 if (data->fail_route_offload) {
752 fib6_rt = nsim_fib6_rt_create(data, fib6_event->rt_arr,
757 fib6_rt_old = nsim_fib6_rt_lookup(&data->fib_rt_ht, rt);
759 err = nsim_fib6_rt_add(data, fib6_rt);
761 err = nsim_fib6_rt_replace(data, fib6_rt, fib6_rt_old);
769 static void nsim_fib6_rt_remove(struct nsim_fib_data *data,
781 fib6_rt = nsim_fib6_rt_lookup(&data->fib_rt_ht, rt);
794 rhashtable_remove_fast(&data->fib_rt_ht, &fib6_rt->common.ht_node,
845 static int nsim_fib6_event(struct nsim_fib_data *data,
856 err = nsim_fib6_rt_insert(data, fib6_event);
861 err = nsim_fib6_rt_append(data, fib6_event);
866 nsim_fib6_rt_remove(data, fib6_event);
875 nsim_fib6_rt_offload_failed_flag_set(data, fib6_event->rt_arr,
884 nsim_fib4_event(fib_event->data, &fib_event->fen_info,
889 nsim_fib6_event(fib_event->data, &fib_event->fib6_event,
900 struct nsim_fib_data *data = fib_event->data;
912 err = nsim_fib_account(&data->ipv4.fib, true);
919 if (data->fail_route_delete) {
923 nsim_fib_account(&data->ipv4.fib, false);
939 struct nsim_fib_data *data = fib_event->data;
954 err = nsim_fib_account(&data->ipv6.fib, true);
961 if (data->fail_route_delete) {
966 nsim_fib_account(&data->ipv6.fib, false);
977 static int nsim_fib_event_schedule_work(struct nsim_fib_data *data,
994 fib_event->data = data;
1011 spin_lock_bh(&data->fib_event_queue_lock);
1012 list_add_tail(&fib_event->list, &data->fib_event_queue);
1013 spin_unlock_bh(&data->fib_event_queue_lock);
1014 schedule_work(&data->fib_event_work);
1022 schedule_work(&data->fib_flush_work);
1029 struct nsim_fib_data *data = container_of(nb, struct nsim_fib_data,
1037 err = nsim_fib_rule_event(data, info,
1043 return nsim_fib_event_schedule_work(data, info, event);
1050 struct nsim_fib_data *data)
1052 struct devlink *devlink = data->devlink;
1057 nsim_fib_account(&data->ipv4.fib, false);
1062 struct nsim_fib_data *data)
1067 nsim_fib6_rt_hw_flags_set(data, fib6_rt, false);
1068 nsim_fib_account(&data->ipv6.fib, false);
1075 struct nsim_fib_data *data = arg;
1079 nsim_fib4_rt_free(fib_rt, data);
1082 nsim_fib6_rt_free(fib_rt, data);
1092 struct nsim_fib_data *data = container_of(nb, struct nsim_fib_data,
1097 flush_work(&data->fib_event_work);
1102 list_for_each_entry_safe(fib_rt, fib_rt_tmp, &data->fib_rt_list, list) {
1103 rhashtable_remove_fast(&data->fib_rt_ht, &fib_rt->ht_node,
1105 nsim_fib_rt_free(fib_rt, data);
1108 atomic64_set(&data->ipv4.rules.num, 0ULL);
1109 atomic64_set(&data->ipv6.rules.num, 0ULL);
1112 static struct nsim_nexthop *nsim_nexthop_create(struct nsim_fib_data *data,
1156 static int nsim_nexthop_account(struct nsim_fib_data *data, u64 occ,
1163 if (!atomic64_add_unless(&data->nexthops.num, 1,
1164 data->nexthops.max)) {
1170 if (WARN_ON(occ > atomic64_read(&data->nexthops.num)))
1172 atomic64_sub(occ, &data->nexthops.num);
1178 atomic64_sub(i, &data->nexthops.num);
1198 static int nsim_nexthop_add(struct nsim_fib_data *data,
1202 struct net *net = devlink_net(data->devlink);
1205 err = nsim_nexthop_account(data, nexthop->occ, true, extack);
1209 err = rhashtable_insert_fast(&data->nexthop_ht, &nexthop->ht_node,
1221 nsim_nexthop_account(data, nexthop->occ, false, extack);
1225 static int nsim_nexthop_replace(struct nsim_fib_data *data,
1230 struct net *net = devlink_net(data->devlink);
1233 err = nsim_nexthop_account(data, nexthop->occ, true, extack);
1237 err = rhashtable_replace_fast(&data->nexthop_ht,
1246 nsim_nexthop_account(data, nexthop_old->occ, false, extack);
1252 nsim_nexthop_account(data, nexthop->occ, false, extack);
1256 static int nsim_nexthop_insert(struct nsim_fib_data *data,
1262 nexthop = nsim_nexthop_create(data, info);
1266 nexthop_old = rhashtable_lookup_fast(&data->nexthop_ht, &info->id,
1269 err = nsim_nexthop_add(data, nexthop, info->extack);
1271 err = nsim_nexthop_replace(data, nexthop, nexthop_old,
1280 static void nsim_nexthop_remove(struct nsim_fib_data *data,
1285 nexthop = rhashtable_lookup_fast(&data->nexthop_ht, &info->id,
1290 rhashtable_remove_fast(&data->nexthop_ht, &nexthop->ht_node,
1292 nsim_nexthop_account(data, nexthop->occ, false, info->extack);
1296 static int nsim_nexthop_res_table_pre_replace(struct nsim_fib_data *data,
1299 if (data->fail_res_nexthop_group_replace) {
1307 static int nsim_nexthop_bucket_replace(struct nsim_fib_data *data,
1310 if (data->fail_nexthop_bucket_replace) {
1325 struct nsim_fib_data *data = container_of(nb, struct nsim_fib_data,
1330 mutex_lock(&data->nh_lock);
1333 err = nsim_nexthop_insert(data, info);
1336 nsim_nexthop_remove(data, info);
1339 err = nsim_nexthop_res_table_pre_replace(data, info);
1342 err = nsim_nexthop_bucket_replace(data, info);
1348 mutex_unlock(&data->nh_lock);
1355 struct nsim_fib_data *data = arg;
1358 net = devlink_net(data->devlink);
1360 nsim_nexthop_account(data, nexthop->occ, false, NULL);
1368 struct nsim_fib_data *data = file->private_data;
1369 struct net *net = devlink_net(data->devlink);
1389 nexthop = rhashtable_lookup_fast(&data->nexthop_ht, &nhid,
1423 struct nsim_fib_data *data = priv;
1425 return nsim_fib_get_val(data, NSIM_RESOURCE_IPV4_FIB, false);
1430 struct nsim_fib_data *data = priv;
1432 return nsim_fib_get_val(data, NSIM_RESOURCE_IPV4_FIB_RULES, false);
1437 struct nsim_fib_data *data = priv;
1439 return nsim_fib_get_val(data, NSIM_RESOURCE_IPV6_FIB, false);
1444 struct nsim_fib_data *data = priv;
1446 return nsim_fib_get_val(data, NSIM_RESOURCE_IPV6_FIB_RULES, false);
1451 struct nsim_fib_data *data = priv;
1453 return nsim_fib_get_val(data, NSIM_RESOURCE_NEXTHOPS, false);
1456 static void nsim_fib_set_max_all(struct nsim_fib_data *data,
1473 nsim_fib_set_max(data, res_ids[i], val);
1479 struct nsim_fib_data *data = container_of(work, struct nsim_fib_data,
1485 spin_lock_bh(&data->fib_event_queue_lock);
1486 list_splice_init(&data->fib_event_queue, &fib_event_queue);
1487 spin_unlock_bh(&data->fib_event_queue_lock);
1489 mutex_lock(&data->fib_lock);
1497 mutex_unlock(&data->fib_lock);
1502 struct nsim_fib_data *data = container_of(work, struct nsim_fib_data,
1507 flush_work(&data->fib_event_work);
1509 mutex_lock(&data->fib_lock);
1510 list_for_each_entry_safe(fib_rt, fib_rt_tmp, &data->fib_rt_list, list) {
1511 rhashtable_remove_fast(&data->fib_rt_ht, &fib_rt->ht_node,
1513 nsim_fib_rt_free(fib_rt, data);
1515 mutex_unlock(&data->fib_lock);
1519 nsim_fib_debugfs_init(struct nsim_fib_data *data, struct nsim_dev *nsim_dev)
1521 data->ddir = debugfs_create_dir("fib", nsim_dev->ddir);
1522 if (IS_ERR(data->ddir))
1523 return PTR_ERR(data->ddir);
1525 data->fail_route_offload = false;
1526 debugfs_create_bool("fail_route_offload", 0600, data->ddir,
1527 &data->fail_route_offload);
1529 data->fail_res_nexthop_group_replace = false;
1530 debugfs_create_bool("fail_res_nexthop_group_replace", 0600, data->ddir,
1531 &data->fail_res_nexthop_group_replace);
1533 data->fail_nexthop_bucket_replace = false;
1534 debugfs_create_bool("fail_nexthop_bucket_replace", 0600, data->ddir,
1535 &data->fail_nexthop_bucket_replace);
1537 debugfs_create_file("nexthop_bucket_activity", 0200, data->ddir,
1538 data, &nsim_nexthop_bucket_activity_fops);
1540 data->fail_route_delete = false;
1541 debugfs_create_bool("fail_route_delete", 0600, data->ddir,
1542 &data->fail_route_delete);
1546 static void nsim_fib_debugfs_exit(struct nsim_fib_data *data)
1548 debugfs_remove_recursive(data->ddir);
1554 struct nsim_fib_data *data;
1558 data = kzalloc(sizeof(*data), GFP_KERNEL);
1559 if (!data)
1561 data->devlink = devlink;
1564 err = nsim_fib_debugfs_init(data, nsim_dev);
1568 mutex_init(&data->nh_lock);
1569 err = rhashtable_init(&data->nexthop_ht, &nsim_nexthop_ht_params);
1573 mutex_init(&data->fib_lock);
1574 INIT_LIST_HEAD(&data->fib_rt_list);
1575 err = rhashtable_init(&data->fib_rt_ht, &nsim_fib_rt_ht_params);
1579 INIT_WORK(&data->fib_event_work, nsim_fib_event_work);
1580 INIT_WORK(&data->fib_flush_work, nsim_fib_flush_work);
1581 INIT_LIST_HEAD(&data->fib_event_queue);
1582 spin_lock_init(&data->fib_event_queue_lock);
1584 nsim_fib_set_max_all(data, devlink);
1586 data->nexthop_nb.notifier_call = nsim_nexthop_event_nb;
1587 err = register_nexthop_notifier(devlink_net(devlink), &data->nexthop_nb,
1594 data->fib_nb.notifier_call = nsim_fib_event_nb;
1595 err = register_fib_notifier(devlink_net(devlink), &data->fib_nb,
1605 data);
1609 data);
1613 data);
1617 data);
1621 data);
1622 return data;
1625 unregister_nexthop_notifier(devlink_net(devlink), &data->nexthop_nb);
1627 cancel_work_sync(&data->fib_flush_work);
1628 flush_work(&data->fib_event_work);
1629 rhashtable_free_and_destroy(&data->fib_rt_ht, nsim_fib_rt_free,
1630 data);
1632 rhashtable_free_and_destroy(&data->nexthop_ht, nsim_nexthop_free,
1633 data);
1634 mutex_destroy(&data->fib_lock);
1636 mutex_destroy(&data->nh_lock);
1637 nsim_fib_debugfs_exit(data);
1639 kfree(data);
1643 void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *data)
1655 unregister_fib_notifier(devlink_net(devlink), &data->fib_nb);
1656 unregister_nexthop_notifier(devlink_net(devlink), &data->nexthop_nb);
1657 cancel_work_sync(&data->fib_flush_work);
1658 flush_work(&data->fib_event_work);
1659 rhashtable_free_and_destroy(&data->fib_rt_ht, nsim_fib_rt_free,
1660 data);
1661 rhashtable_free_and_destroy(&data->nexthop_ht, nsim_nexthop_free,
1662 data);
1663 WARN_ON_ONCE(!list_empty(&data->fib_event_queue));
1664 WARN_ON_ONCE(!list_empty(&data->fib_rt_list));
1665 mutex_destroy(&data->fib_lock);
1666 mutex_destroy(&data->nh_lock);
1667 nsim_fib_debugfs_exit(data);
1668 kfree(data);