Lines Matching refs:nhg
74 struct nh_group *nhg;
77 nhg = rcu_dereference_raw(nh->nh_grp);
78 for (i = 0; i < nhg->num_nh; ++i) {
79 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
85 WARN_ON(nhg->spare == nhg);
87 kfree(nhg->spare);
88 kfree(nhg);
136 struct nh_group *nhg;
138 nhg = kzalloc(struct_size(nhg, nh_entries, num_nh), GFP_KERNEL);
139 if (nhg)
140 nhg->num_nh = num_nh;
142 return nhg;
193 static int nla_put_nh_group(struct sk_buff *skb, struct nh_group *nhg)
196 size_t len = nhg->num_nh * sizeof(*p);
201 if (nhg->mpath)
212 for (i = 0; i < nhg->num_nh; ++i) {
214 .id = nhg->nh_entries[i].nh->id,
215 .weight = nhg->nh_entries[i].weight - 1,
249 struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
251 if (nhg->fdb_nh && nla_put_flag(skb, NHA_FDB))
253 if (nla_put_nh_group(skb, nhg))
308 struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
309 size_t sz = sizeof(struct nexthop_grp) * nhg->num_nh;
391 struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
396 if (nhg->mpath) {
401 *is_fdb = nhg->fdb_nh;
443 struct nexthop_grp *nhg;
454 len /= sizeof(*nhg);
456 nhg = nla_data(tb[NHA_GROUP]);
458 if (nhg[i].resvd1 || nhg[i].resvd2) {
462 if (nhg[i].weight > 254) {
467 if (nhg[i].id == nhg[j].id) {
476 nhg = nla_data(tb[NHA_GROUP]);
481 nh = nexthop_find_by_id(net, nhg[i].id);
546 struct nh_group *nhg;
552 nhg = rcu_dereference(nh->nh_grp);
553 for (i = 0; i < nhg->num_nh; ++i) {
554 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
594 struct nh_group *nhg;
597 nhg = rcu_dereference_rtnl(nh->nh_grp);
598 for (i = 0; i < nhg->num_nh; i++) {
599 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
643 struct nh_group *nhg;
645 nhg = rtnl_dereference(nh->nh_grp);
646 if (nhg->has_v4)
648 is_fdb_nh = nhg->fdb_nh;
715 struct nh_group *nhg;
717 nhg = rtnl_dereference(nh->nh_grp);
718 if (nhg->fdb_nh) {
731 nhi = rtnl_dereference(nhg->nh_entries[0].nh->nh_info);
762 static void nh_group_rebalance(struct nh_group *nhg)
768 for (i = 0; i < nhg->num_nh; ++i)
769 total += nhg->nh_entries[i].weight;
771 for (i = 0; i < nhg->num_nh; ++i) {
772 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
787 struct nh_group *nhg, *newg;
792 nhg = rtnl_dereference(nhp->nh_grp);
793 newg = nhg->spare;
796 if (nhg->num_nh == 1) {
802 newg->mpath = nhg->mpath;
803 newg->fdb_nh = nhg->fdb_nh;
804 newg->num_nh = nhg->num_nh;
807 nhges = nhg->nh_entries;
809 for (i = 0, j = 0; i < nhg->num_nh; ++i) {
813 if (nhg->nh_entries[i].nh == nh) {
854 struct nh_group *nhg = rcu_dereference_rtnl(nh->nh_grp);
855 int i, num_nh = nhg->num_nh;
858 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
932 struct nh_group *nhg;
950 nhg = rtnl_dereference(replaced_nh->nh_grp);
951 for (i = 0; i < nhg->num_nh; i++) {
952 struct nh_grp_entry *nhge = &nhg->nh_entries[i];
989 static void nh_group_v4_update(struct nh_group *nhg)
995 nhges = nhg->nh_entries;
996 for (i = 0; i < nhg->num_nh; i++) {
1003 nhg->has_v4 = has_v4;
1037 struct nh_group *nhg;
1039 nhg = rtnl_dereference(nhp->nh_grp);
1040 nh_group_v4_update(nhg);
1248 struct nh_group *nhg;
1261 nhg = nexthop_grp_alloc(num_nh);
1262 if (!nhg) {
1268 nhg->spare = nexthop_grp_alloc(num_nh);
1269 if (!nhg->spare) {
1270 kfree(nhg);
1274 nhg->spare->spare = nhg;
1276 for (i = 0; i < nhg->num_nh; ++i) {
1286 nhg->has_v4 = true;
1288 nhg->nh_entries[i].nh = nhe;
1289 nhg->nh_entries[i].weight = entry[i].weight + 1;
1290 list_add(&nhg->nh_entries[i].nh_list, &nhe->grp_list);
1291 nhg->nh_entries[i].nh_parent = nh;
1295 nhg->mpath = 1;
1296 nh_group_rebalance(nhg);
1300 nhg->fdb_nh = 1;
1302 rcu_assign_pointer(nh->nh_grp, nhg);
1308 list_del(&nhg->nh_entries[i].nh_list);
1309 nexthop_put(nhg->nh_entries[i].nh);
1312 kfree(nhg->spare);
1313 kfree(nhg);