Lines Matching refs:nhg

121 				       struct nh_group *nhg)
123 u16 num_nh = nhg->num_nh;
133 info->nh_grp->is_fdb = nhg->fdb_nh;
136 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
150 struct nh_group *nhg)
152 struct nh_res_table *res_table = rtnl_dereference(nhg->res_table);
183 struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
185 if (nhg->hash_threshold)
186 return nh_notifier_mpath_info_init(info, nhg);
187 else if (nhg->resilient)
188 return nh_notifier_res_table_info_init(info, nhg);
195 struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
197 if (nhg->hash_threshold)
199 else if (nhg->resilient)
257 struct nh_group *nhg;
283 nhg = rcu_dereference(nh->nh_grp);
284 res_table = rcu_dereference(nhg->res_table);
397 struct nh_group *nhg;
409 nhg = rtnl_dereference(nh->nh_grp);
410 err = nh_notifier_mpath_info_init(&info, nhg);
469 struct nh_group *nhg;
472 nhg = rcu_dereference_raw(nh->nh_grp);
473 for (i = 0; i < nhg->num_nh; ++i) {
474 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
480 WARN_ON(nhg->spare == nhg);
482 if (nhg->resilient)
483 vfree(rcu_dereference_raw(nhg->res_table));
485 kfree(nhg->spare);
486 kfree(nhg);
534 struct nh_group *nhg;
536 nhg = kzalloc(struct_size(nhg, nh_entries, num_nh), GFP_KERNEL);
537 if (nhg)
538 nhg->num_nh = num_nh;
540 return nhg;
629 static int nla_put_nh_group_res(struct sk_buff *skb, struct nh_group *nhg)
631 struct nh_res_table *res_table = rtnl_dereference(nhg->res_table);
657 static int nla_put_nh_group(struct sk_buff *skb, struct nh_group *nhg)
660 size_t len = nhg->num_nh * sizeof(*p);
665 if (nhg->hash_threshold)
667 else if (nhg->resilient)
678 for (i = 0; i < nhg->num_nh; ++i) {
679 p->id = nhg->nh_entries[i].nh->id;
680 p->weight = nhg->nh_entries[i].weight - 1;
684 if (nhg->resilient && nla_put_nh_group_res(skb, nhg))
717 struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
719 if (nhg->fdb_nh && nla_put_flag(skb, NHA_FDB))
721 if (nla_put_nh_group(skb, nhg))
774 static size_t nh_nlmsg_size_grp_res(struct nh_group *nhg)
785 struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
786 size_t sz = sizeof(struct nexthop_grp) * nhg->num_nh;
790 if (nhg->resilient)
791 tot += nh_nlmsg_size_grp_res(nhg);
993 struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
996 if (nhg->hash_threshold) {
1001 if (nhg->resilient) {
1006 *is_fdb = nhg->fdb_nh;
1049 struct nexthop_grp *nhg;
1060 len /= sizeof(*nhg);
1062 nhg = nla_data(tb[NHA_GROUP]);
1064 if (nhg[i].resvd1 || nhg[i].resvd2) {
1068 if (nhg[i].weight > 254) {
1073 if (nhg[i].id == nhg[j].id) {
1082 nhg = nla_data(tb[NHA_GROUP]);
1087 nh = nexthop_find_by_id(net, nhg[i].id);
1169 static struct nexthop *nexthop_select_path_fdb(struct nh_group *nhg, int hash)
1173 for (i = 0; i < nhg->num_nh; i++) {
1174 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
1186 static struct nexthop *nexthop_select_path_hthr(struct nh_group *nhg, int hash)
1191 if (nhg->fdb_nh)
1192 return nexthop_select_path_fdb(nhg, hash);
1194 for (i = 0; i < nhg->num_nh; ++i) {
1195 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
1212 return rc ? : nhg->nh_entries[0].nh;
1215 static struct nexthop *nexthop_select_path_res(struct nh_group *nhg, int hash)
1217 struct nh_res_table *res_table = rcu_dereference(nhg->res_table);
1233 struct nh_group *nhg;
1238 nhg = rcu_dereference(nh->nh_grp);
1239 if (nhg->hash_threshold)
1240 return nexthop_select_path_hthr(nhg, hash);
1241 else if (nhg->resilient)
1242 return nexthop_select_path_res(nhg, hash);
1257 struct nh_group *nhg;
1260 nhg = rcu_dereference_rtnl(nh->nh_grp);
1261 for (i = 0; i < nhg->num_nh; i++) {
1262 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
1306 struct nh_group *nhg;
1308 nhg = rtnl_dereference(nh->nh_grp);
1309 if (nhg->has_v4)
1311 is_fdb_nh = nhg->fdb_nh;
1378 struct nh_group *nhg;
1380 nhg = rtnl_dereference(nh->nh_grp);
1381 if (nhg->fdb_nh) {
1394 nhi = rtnl_dereference(nhg->nh_entries[0].nh->nh_info);
1654 static void nh_res_group_rebalance(struct nh_group *nhg,
1664 for (i = 0; i < nhg->num_nh; ++i)
1665 total += nhg->nh_entries[i].weight;
1667 for (i = 0; i < nhg->num_nh; ++i) {
1668 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
1691 struct nh_group *nhg)
1701 for (j = 0; j < nhg->num_nh; j++) {
1702 struct nh_grp_entry *nhge = &nhg->nh_entries[j];
1737 static void nh_hthr_group_rebalance(struct nh_group *nhg)
1743 for (i = 0; i < nhg->num_nh; ++i)
1744 total += nhg->nh_entries[i].weight;
1746 for (i = 0; i < nhg->num_nh; ++i) {
1747 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
1763 struct nh_group *nhg, *newg;
1768 nhg = rtnl_dereference(nhp->nh_grp);
1769 newg = nhg->spare;
1772 if (nhg->num_nh == 1) {
1778 newg->is_multipath = nhg->is_multipath;
1779 newg->hash_threshold = nhg->hash_threshold;
1780 newg->resilient = nhg->resilient;
1781 newg->fdb_nh = nhg->fdb_nh;
1782 newg->num_nh = nhg->num_nh;
1785 nhges = nhg->nh_entries;
1787 for (i = 0, j = 0; i < nhg->num_nh; ++i) {
1791 if (nhg->nh_entries[i].nh == nh) {
1811 replace_nexthop_grp_res(nhg, newg);
1846 struct nh_group *nhg = rcu_dereference_rtnl(nh->nh_grp);
1848 int i, num_nh = nhg->num_nh;
1851 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
1859 if (nhg->resilient) {
1860 res_table = rtnl_dereference(nhg->res_table);
1930 struct nh_group *nhg;
1945 nhg = rtnl_dereference(replaced_nh->nh_grp);
1946 for (i = 0; i < nhg->num_nh; i++) {
1947 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
2042 static void nh_group_v4_update(struct nh_group *nhg)
2048 nhges = nhg->nh_entries;
2049 for (i = 0; i < nhg->num_nh; i++) {
2056 nhg->has_v4 = has_v4;
2108 struct nh_group *nhg = rtnl_dereference(group_nh->nh_grp);
2111 if (nhg->hash_threshold) {
2114 } else if (nhg->resilient) {
2115 res_table = rtnl_dereference(nhg->res_table);
2178 struct nh_group *nhg;
2180 nhg = rtnl_dereference(nhp->nh_grp);
2181 nh_group_v4_update(nhg);
2349 struct nh_group *nhg = rtnl_dereference(new_nh->nh_grp);
2352 if (nhg->resilient) {
2353 res_table = rtnl_dereference(nhg->res_table);
2364 nh_res_group_rebalance(nhg, res_table);
2437 struct nh_group *nhg;
2451 nhg = nexthop_grp_alloc(num_nh);
2452 if (!nhg) {
2458 nhg->spare = nexthop_grp_alloc(num_nh);
2459 if (!nhg->spare) {
2460 kfree(nhg);
2464 nhg->spare->spare = nhg;
2466 for (i = 0; i < nhg->num_nh; ++i) {
2478 nhg->has_v4 = true;
2480 nhg->nh_entries[i].nh = nhe;
2481 nhg->nh_entries[i].weight = entry[i].weight + 1;
2482 list_add(&nhg->nh_entries[i].nh_list, &nhe->grp_list);
2483 nhg->nh_entries[i].nh_parent = nh;
2487 nhg->hash_threshold = 1;
2488 nhg->is_multipath = true;
2498 rcu_assign_pointer(nhg->spare->res_table, res_table);
2499 rcu_assign_pointer(nhg->res_table, res_table);
2500 nhg->resilient = true;
2501 nhg->is_multipath = true;
2504 WARN_ON_ONCE(nhg->hash_threshold + nhg->resilient != 1);
2506 if (nhg->hash_threshold)
2507 nh_hthr_group_rebalance(nhg);
2510 nhg->fdb_nh = 1;
2512 rcu_assign_pointer(nh->nh_grp, nhg);
2518 list_del(&nhg->nh_entries[i].nh_list);
2519 nexthop_put(nhg->nh_entries[i].nh);
2522 kfree(nhg->spare);
2523 kfree(nhg);
3258 struct nh_group *nhg;
3270 nhg = rtnl_dereference(nh->nh_grp);
3271 if (!nhg->resilient) {
3363 struct nh_group *nhg;
3367 nhg = rtnl_dereference(nh->nh_grp);
3368 res_table = rtnl_dereference(nhg->res_table);
3403 struct nh_group *nhg;
3408 nhg = rtnl_dereference(nh->nh_grp);
3409 if (!nhg->resilient)
3510 struct nh_group *nhg;
3524 nhg = rtnl_dereference(nh->nh_grp);
3525 res_table = rtnl_dereference(nhg->res_table);
3677 struct nh_group *nhg;
3685 nhg = rcu_dereference(nexthop->nh_grp);
3686 if (!nhg->resilient)
3689 if (bucket_index >= nhg->res_table->num_nh_buckets)
3692 res_table = rcu_dereference(nhg->res_table);
3710 struct nh_group *nhg;
3719 nhg = rcu_dereference(nexthop->nh_grp);
3720 if (!nhg->resilient)
3726 res_table = rcu_dereference(nhg->res_table);