Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pkt_sched: namespace aware act_mirred

Eric Dumazet pointed out that act_mirred needs to find the current net_ns,
and struct net pointer is not provided in the call chain. His original
patch made use of current->nsproxy->net_ns to find the network namespace,
but this fails to work correctly for userspace code that makes use of
netlink sockets in different network namespaces. Instead, pass the
"struct net *" down along the call chain to where it is needed.

This version removes the ifb changes as Eric has submitted that patch
separately, but is otherwise identical to the previous version.

Signed-off-by: Benjamin LaHaise <bcrl@kvack.org>
Tested-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Benjamin LaHaise and committed by
David S. Miller
c1b52739 60592833

+94 -72
+9 -3
include/net/act_api.h
··· 91 91 int (*dump)(struct sk_buff *, struct tc_action *, int, int); 92 92 int (*cleanup)(struct tc_action *, int bind); 93 93 int (*lookup)(struct tc_action *, u32); 94 - int (*init)(struct nlattr *, struct nlattr *, struct tc_action *, int , int); 94 + int (*init)(struct net *net, struct nlattr *nla, 95 + struct nlattr *est, struct tc_action *act, int ovr, 96 + int bind); 95 97 int (*walk)(struct sk_buff *, struct netlink_callback *, int, struct tc_action *); 96 98 }; 97 99 ··· 118 116 extern int tcf_unregister_action(struct tc_action_ops *a); 119 117 extern void tcf_action_destroy(struct tc_action *a, int bind); 120 118 extern int tcf_action_exec(struct sk_buff *skb, const struct tc_action *a, struct tcf_result *res); 121 - extern struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est, char *n, int ovr, int bind); 122 - extern struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est, char *n, int ovr, int bind); 119 + extern struct tc_action *tcf_action_init(struct net *net, struct nlattr *nla, 120 + struct nlattr *est, char *n, int ovr, 121 + int bind); 122 + extern struct tc_action *tcf_action_init_1(struct net *net, struct nlattr *nla, 123 + struct nlattr *est, char *n, int ovr, 124 + int bind); 123 125 extern int tcf_action_dump(struct sk_buff *skb, struct tc_action *a, int, int); 124 126 extern int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int); 125 127 extern int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int);
+4 -3
include/net/pkt_cls.h
··· 126 126 return 0; 127 127 } 128 128 129 - extern int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb, 130 - struct nlattr *rate_tlv, struct tcf_exts *exts, 131 - const struct tcf_ext_map *map); 129 + extern int tcf_exts_validate(struct net *net, struct tcf_proto *tp, 130 + struct nlattr **tb, struct nlattr *rate_tlv, 131 + struct tcf_exts *exts, 132 + const struct tcf_ext_map *map); 132 133 extern void tcf_exts_destroy(struct tcf_proto *tp, struct tcf_exts *exts); 133 134 extern void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst, 134 135 struct tcf_exts *src);
+1 -1
include/net/sch_generic.h
··· 195 195 196 196 unsigned long (*get)(struct tcf_proto*, u32 handle); 197 197 void (*put)(struct tcf_proto*, unsigned long); 198 - int (*change)(struct sk_buff *, 198 + int (*change)(struct net *net, struct sk_buff *, 199 199 struct tcf_proto*, unsigned long, 200 200 u32 handle, struct nlattr **, 201 201 unsigned long *);
+10 -8
net/sched/act_api.c
··· 485 485 return err; 486 486 } 487 487 488 - struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est, 489 - char *name, int ovr, int bind) 488 + struct tc_action *tcf_action_init_1(struct net *net, struct nlattr *nla, 489 + struct nlattr *est, char *name, int ovr, 490 + int bind) 490 491 { 491 492 struct tc_action *a; 492 493 struct tc_action_ops *a_o; ··· 543 542 544 543 /* backward compatibility for policer */ 545 544 if (name == NULL) 546 - err = a_o->init(tb[TCA_ACT_OPTIONS], est, a, ovr, bind); 545 + err = a_o->init(net, tb[TCA_ACT_OPTIONS], est, a, ovr, bind); 547 546 else 548 - err = a_o->init(nla, est, a, ovr, bind); 547 + err = a_o->init(net, nla, est, a, ovr, bind); 549 548 if (err < 0) 550 549 goto err_free; 551 550 ··· 567 566 return ERR_PTR(err); 568 567 } 569 568 570 - struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est, 571 - char *name, int ovr, int bind) 569 + struct tc_action *tcf_action_init(struct net *net, struct nlattr *nla, 570 + struct nlattr *est, char *name, int ovr, 571 + int bind) 572 572 { 573 573 struct nlattr *tb[TCA_ACT_MAX_PRIO + 1]; 574 574 struct tc_action *head = NULL, *act, *act_prev = NULL; ··· 581 579 return ERR_PTR(err); 582 580 583 581 for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) { 584 - act = tcf_action_init_1(tb[i], est, name, ovr, bind); 582 + act = tcf_action_init_1(net, tb[i], est, name, ovr, bind); 585 583 if (IS_ERR(act)) 586 584 goto err; 587 585 act->order = i; ··· 962 960 struct tc_action *a; 963 961 u32 seq = n->nlmsg_seq; 964 962 965 - act = tcf_action_init(nla, NULL, NULL, ovr, 0); 963 + act = tcf_action_init(net, nla, NULL, NULL, ovr, 0); 966 964 if (act == NULL) 967 965 goto done; 968 966 if (IS_ERR(act)) {
+1 -1
net/sched/act_csum.c
··· 51 51 [TCA_CSUM_PARMS] = { .len = sizeof(struct tc_csum), }, 52 52 }; 53 53 54 - static int tcf_csum_init(struct nlattr *nla, struct nlattr *est, 54 + static int tcf_csum_init(struct net *n, struct nlattr *nla, struct nlattr *est, 55 55 struct tc_action *a, int ovr, int bind) 56 56 { 57 57 struct nlattr *tb[TCA_CSUM_MAX + 1];
+3 -2
net/sched/act_gact.c
··· 58 58 [TCA_GACT_PROB] = { .len = sizeof(struct tc_gact_p) }, 59 59 }; 60 60 61 - static int tcf_gact_init(struct nlattr *nla, struct nlattr *est, 62 - struct tc_action *a, int ovr, int bind) 61 + static int tcf_gact_init(struct net *net, struct nlattr *nla, 62 + struct nlattr *est, struct tc_action *a, 63 + int ovr, int bind) 63 64 { 64 65 struct nlattr *tb[TCA_GACT_MAX + 1]; 65 66 struct tc_gact *parm;
+1 -1
net/sched/act_ipt.c
··· 102 102 [TCA_IPT_TARG] = { .len = sizeof(struct xt_entry_target) }, 103 103 }; 104 104 105 - static int tcf_ipt_init(struct nlattr *nla, struct nlattr *est, 105 + static int tcf_ipt_init(struct net *net, struct nlattr *nla, struct nlattr *est, 106 106 struct tc_action *a, int ovr, int bind) 107 107 { 108 108 struct nlattr *tb[TCA_IPT_MAX + 1];
+4 -3
net/sched/act_mirred.c
··· 62 62 [TCA_MIRRED_PARMS] = { .len = sizeof(struct tc_mirred) }, 63 63 }; 64 64 65 - static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est, 66 - struct tc_action *a, int ovr, int bind) 65 + static int tcf_mirred_init(struct net *net, struct nlattr *nla, 66 + struct nlattr *est, struct tc_action *a, int ovr, 67 + int bind) 67 68 { 68 69 struct nlattr *tb[TCA_MIRRED_MAX + 1]; 69 70 struct tc_mirred *parm; ··· 89 88 return -EINVAL; 90 89 } 91 90 if (parm->ifindex) { 92 - dev = __dev_get_by_index(&init_net, parm->ifindex); 91 + dev = __dev_get_by_index(net, parm->ifindex); 93 92 if (dev == NULL) 94 93 return -ENODEV; 95 94 switch (dev->type) {
+1 -1
net/sched/act_nat.c
··· 44 44 [TCA_NAT_PARMS] = { .len = sizeof(struct tc_nat) }, 45 45 }; 46 46 47 - static int tcf_nat_init(struct nlattr *nla, struct nlattr *est, 47 + static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est, 48 48 struct tc_action *a, int ovr, int bind) 49 49 { 50 50 struct nlattr *tb[TCA_NAT_MAX + 1];
+3 -2
net/sched/act_pedit.c
··· 38 38 [TCA_PEDIT_PARMS] = { .len = sizeof(struct tc_pedit) }, 39 39 }; 40 40 41 - static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est, 42 - struct tc_action *a, int ovr, int bind) 41 + static int tcf_pedit_init(struct net *net, struct nlattr *nla, 42 + struct nlattr *est, struct tc_action *a, 43 + int ovr, int bind) 43 44 { 44 45 struct nlattr *tb[TCA_PEDIT_MAX + 1]; 45 46 struct tc_pedit *parm;
+3 -2
net/sched/act_police.c
··· 130 130 [TCA_POLICE_RESULT] = { .type = NLA_U32 }, 131 131 }; 132 132 133 - static int tcf_act_police_locate(struct nlattr *nla, struct nlattr *est, 134 - struct tc_action *a, int ovr, int bind) 133 + static int tcf_act_police_locate(struct net *net, struct nlattr *nla, 134 + struct nlattr *est, struct tc_action *a, 135 + int ovr, int bind) 135 136 { 136 137 unsigned int h; 137 138 int ret = 0, err;
+3 -2
net/sched/act_simple.c
··· 95 95 [TCA_DEF_DATA] = { .type = NLA_STRING, .len = SIMP_MAX_DATA }, 96 96 }; 97 97 98 - static int tcf_simp_init(struct nlattr *nla, struct nlattr *est, 99 - struct tc_action *a, int ovr, int bind) 98 + static int tcf_simp_init(struct net *net, struct nlattr *nla, 99 + struct nlattr *est, struct tc_action *a, 100 + int ovr, int bind) 100 101 { 101 102 struct nlattr *tb[TCA_DEF_MAX + 1]; 102 103 struct tc_defact *parm;
+3 -2
net/sched/act_skbedit.c
··· 67 67 [TCA_SKBEDIT_MARK] = { .len = sizeof(u32) }, 68 68 }; 69 69 70 - static int tcf_skbedit_init(struct nlattr *nla, struct nlattr *est, 71 - struct tc_action *a, int ovr, int bind) 70 + static int tcf_skbedit_init(struct net *net, struct nlattr *nla, 71 + struct nlattr *est, struct tc_action *a, 72 + int ovr, int bind) 72 73 { 73 74 struct nlattr *tb[TCA_SKBEDIT_MAX + 1]; 74 75 struct tc_skbedit *parm;
+6 -5
net/sched/cls_api.c
··· 321 321 } 322 322 } 323 323 324 - err = tp->ops->change(skb, tp, cl, t->tcm_handle, tca, &fh); 324 + err = tp->ops->change(net, skb, tp, cl, t->tcm_handle, tca, &fh); 325 325 if (err == 0) { 326 326 if (tp_created) { 327 327 spin_lock_bh(root_lock); ··· 508 508 } 509 509 EXPORT_SYMBOL(tcf_exts_destroy); 510 510 511 - int tcf_exts_validate(struct tcf_proto *tp, struct nlattr **tb, 511 + int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb, 512 512 struct nlattr *rate_tlv, struct tcf_exts *exts, 513 513 const struct tcf_ext_map *map) 514 514 { ··· 519 519 struct tc_action *act; 520 520 521 521 if (map->police && tb[map->police]) { 522 - act = tcf_action_init_1(tb[map->police], rate_tlv, 522 + act = tcf_action_init_1(net, tb[map->police], rate_tlv, 523 523 "police", TCA_ACT_NOREPLACE, 524 524 TCA_ACT_BIND); 525 525 if (IS_ERR(act)) ··· 528 528 act->type = TCA_OLD_COMPAT; 529 529 exts->action = act; 530 530 } else if (map->action && tb[map->action]) { 531 - act = tcf_action_init(tb[map->action], rate_tlv, NULL, 532 - TCA_ACT_NOREPLACE, TCA_ACT_BIND); 531 + act = tcf_action_init(net, tb[map->action], rate_tlv, 532 + NULL, TCA_ACT_NOREPLACE, 533 + TCA_ACT_BIND); 533 534 if (IS_ERR(act)) 534 535 return PTR_ERR(act); 535 536
+7 -6
net/sched/cls_basic.c
··· 132 132 [TCA_BASIC_EMATCHES] = { .type = NLA_NESTED }, 133 133 }; 134 134 135 - static int basic_set_parms(struct tcf_proto *tp, struct basic_filter *f, 136 - unsigned long base, struct nlattr **tb, 135 + static int basic_set_parms(struct net *net, struct tcf_proto *tp, 136 + struct basic_filter *f, unsigned long base, 137 + struct nlattr **tb, 137 138 struct nlattr *est) 138 139 { 139 140 int err = -EINVAL; 140 141 struct tcf_exts e; 141 142 struct tcf_ematch_tree t; 142 143 143 - err = tcf_exts_validate(tp, tb, est, &e, &basic_ext_map); 144 + err = tcf_exts_validate(net, tp, tb, est, &e, &basic_ext_map); 144 145 if (err < 0) 145 146 return err; 146 147 ··· 163 162 return err; 164 163 } 165 164 166 - static int basic_change(struct sk_buff *in_skb, 165 + static int basic_change(struct net *net, struct sk_buff *in_skb, 167 166 struct tcf_proto *tp, unsigned long base, u32 handle, 168 167 struct nlattr **tca, unsigned long *arg) 169 168 { ··· 183 182 if (f != NULL) { 184 183 if (handle && f->handle != handle) 185 184 return -EINVAL; 186 - return basic_set_parms(tp, f, base, tb, tca[TCA_RATE]); 185 + return basic_set_parms(net, tp, f, base, tb, tca[TCA_RATE]); 187 186 } 188 187 189 188 err = -ENOBUFS; ··· 209 208 f->handle = head->hgenerator; 210 209 } 211 210 212 - err = basic_set_parms(tp, f, base, tb, tca[TCA_RATE]); 211 + err = basic_set_parms(net, tp, f, base, tb, tca[TCA_RATE]); 213 212 if (err < 0) 214 213 goto errout; 215 214
+3 -2
net/sched/cls_cgroup.c
··· 178 178 [TCA_CGROUP_EMATCHES] = { .type = NLA_NESTED }, 179 179 }; 180 180 181 - static int cls_cgroup_change(struct sk_buff *in_skb, 181 + static int cls_cgroup_change(struct net *net, struct sk_buff *in_skb, 182 182 struct tcf_proto *tp, unsigned long base, 183 183 u32 handle, struct nlattr **tca, 184 184 unsigned long *arg) ··· 215 215 if (err < 0) 216 216 return err; 217 217 218 - err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &cgroup_ext_map); 218 + err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, 219 + &cgroup_ext_map); 219 220 if (err < 0) 220 221 return err; 221 222
+2 -2
net/sched/cls_flow.c
··· 351 351 [TCA_FLOW_PERTURB] = { .type = NLA_U32 }, 352 352 }; 353 353 354 - static int flow_change(struct sk_buff *in_skb, 354 + static int flow_change(struct net *net, struct sk_buff *in_skb, 355 355 struct tcf_proto *tp, unsigned long base, 356 356 u32 handle, struct nlattr **tca, 357 357 unsigned long *arg) ··· 397 397 return -EOPNOTSUPP; 398 398 } 399 399 400 - err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &flow_ext_map); 400 + err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &flow_ext_map); 401 401 if (err < 0) 402 402 return err; 403 403
+5 -5
net/sched/cls_fw.c
··· 192 192 }; 193 193 194 194 static int 195 - fw_change_attrs(struct tcf_proto *tp, struct fw_filter *f, 195 + fw_change_attrs(struct net *net, struct tcf_proto *tp, struct fw_filter *f, 196 196 struct nlattr **tb, struct nlattr **tca, unsigned long base) 197 197 { 198 198 struct fw_head *head = (struct fw_head *)tp->root; ··· 200 200 u32 mask; 201 201 int err; 202 202 203 - err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &fw_ext_map); 203 + err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &fw_ext_map); 204 204 if (err < 0) 205 205 return err; 206 206 ··· 233 233 return err; 234 234 } 235 235 236 - static int fw_change(struct sk_buff *in_skb, 236 + static int fw_change(struct net *net, struct sk_buff *in_skb, 237 237 struct tcf_proto *tp, unsigned long base, 238 238 u32 handle, 239 239 struct nlattr **tca, ··· 255 255 if (f != NULL) { 256 256 if (f->id != handle && handle) 257 257 return -EINVAL; 258 - return fw_change_attrs(tp, f, tb, tca, base); 258 + return fw_change_attrs(net, tp, f, tb, tca, base); 259 259 } 260 260 261 261 if (!handle) ··· 282 282 283 283 f->id = handle; 284 284 285 - err = fw_change_attrs(tp, f, tb, tca, base); 285 + err = fw_change_attrs(net, tp, f, tb, tca, base); 286 286 if (err < 0) 287 287 goto errout; 288 288
+8 -7
net/sched/cls_route.c
··· 335 335 [TCA_ROUTE4_IIF] = { .type = NLA_U32 }, 336 336 }; 337 337 338 - static int route4_set_parms(struct tcf_proto *tp, unsigned long base, 339 - struct route4_filter *f, u32 handle, struct route4_head *head, 340 - struct nlattr **tb, struct nlattr *est, int new) 338 + static int route4_set_parms(struct net *net, struct tcf_proto *tp, 339 + unsigned long base, struct route4_filter *f, 340 + u32 handle, struct route4_head *head, 341 + struct nlattr **tb, struct nlattr *est, int new) 341 342 { 342 343 int err; 343 344 u32 id = 0, to = 0, nhandle = 0x8000; ··· 347 346 struct route4_bucket *b; 348 347 struct tcf_exts e; 349 348 350 - err = tcf_exts_validate(tp, tb, est, &e, &route_ext_map); 349 + err = tcf_exts_validate(net, tp, tb, est, &e, &route_ext_map); 351 350 if (err < 0) 352 351 return err; 353 352 ··· 428 427 return err; 429 428 } 430 429 431 - static int route4_change(struct sk_buff *in_skb, 430 + static int route4_change(struct net *net, struct sk_buff *in_skb, 432 431 struct tcf_proto *tp, unsigned long base, 433 432 u32 handle, 434 433 struct nlattr **tca, ··· 458 457 if (f->bkt) 459 458 old_handle = f->handle; 460 459 461 - err = route4_set_parms(tp, base, f, handle, head, tb, 460 + err = route4_set_parms(net, tp, base, f, handle, head, tb, 462 461 tca[TCA_RATE], 0); 463 462 if (err < 0) 464 463 return err; ··· 481 480 if (f == NULL) 482 481 goto errout; 483 482 484 - err = route4_set_parms(tp, base, f, handle, head, tb, 483 + err = route4_set_parms(net, tp, base, f, handle, head, tb, 485 484 tca[TCA_RATE], 1); 486 485 if (err < 0) 487 486 goto errout;
+2 -2
net/sched/cls_rsvp.h
··· 416 416 [TCA_RSVP_PINFO] = { .len = sizeof(struct tc_rsvp_pinfo) }, 417 417 }; 418 418 419 - static int rsvp_change(struct sk_buff *in_skb, 419 + static int rsvp_change(struct net *net, struct sk_buff *in_skb, 420 420 struct tcf_proto *tp, unsigned long base, 421 421 u32 handle, 422 422 struct nlattr **tca, ··· 440 440 if (err < 0) 441 441 return err; 442 442 443 - err = tcf_exts_validate(tp, tb, tca[TCA_RATE], &e, &rsvp_ext_map); 443 + err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &rsvp_ext_map); 444 444 if (err < 0) 445 445 return err; 446 446
+8 -6
net/sched/cls_tcindex.c
··· 197 197 }; 198 198 199 199 static int 200 - tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle, 201 - struct tcindex_data *p, struct tcindex_filter_result *r, 202 - struct nlattr **tb, struct nlattr *est) 200 + tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, 201 + u32 handle, struct tcindex_data *p, 202 + struct tcindex_filter_result *r, struct nlattr **tb, 203 + struct nlattr *est) 203 204 { 204 205 int err, balloc = 0; 205 206 struct tcindex_filter_result new_filter_result, *old_r = r; ··· 209 208 struct tcindex_filter *f = NULL; /* make gcc behave */ 210 209 struct tcf_exts e; 211 210 212 - err = tcf_exts_validate(tp, tb, est, &e, &tcindex_ext_map); 211 + err = tcf_exts_validate(net, tp, tb, est, &e, &tcindex_ext_map); 213 212 if (err < 0) 214 213 return err; 215 214 ··· 333 332 } 334 333 335 334 static int 336 - tcindex_change(struct sk_buff *in_skb, 335 + tcindex_change(struct net *net, struct sk_buff *in_skb, 337 336 struct tcf_proto *tp, unsigned long base, u32 handle, 338 337 struct nlattr **tca, unsigned long *arg) 339 338 { ··· 354 353 if (err < 0) 355 354 return err; 356 355 357 - return tcindex_set_parms(tp, base, handle, p, r, tb, tca[TCA_RATE]); 356 + return tcindex_set_parms(net, tp, base, handle, p, r, tb, 357 + tca[TCA_RATE]); 358 358 } 359 359 360 360
+7 -6
net/sched/cls_u32.c
··· 488 488 [TCA_U32_MARK] = { .len = sizeof(struct tc_u32_mark) }, 489 489 }; 490 490 491 - static int u32_set_parms(struct tcf_proto *tp, unsigned long base, 492 - struct tc_u_hnode *ht, 491 + static int u32_set_parms(struct net *net, struct tcf_proto *tp, 492 + unsigned long base, struct tc_u_hnode *ht, 493 493 struct tc_u_knode *n, struct nlattr **tb, 494 494 struct nlattr *est) 495 495 { 496 496 int err; 497 497 struct tcf_exts e; 498 498 499 - err = tcf_exts_validate(tp, tb, est, &e, &u32_ext_map); 499 + err = tcf_exts_validate(net, tp, tb, est, &e, &u32_ext_map); 500 500 if (err < 0) 501 501 return err; 502 502 ··· 544 544 return err; 545 545 } 546 546 547 - static int u32_change(struct sk_buff *in_skb, 547 + static int u32_change(struct net *net, struct sk_buff *in_skb, 548 548 struct tcf_proto *tp, unsigned long base, u32 handle, 549 549 struct nlattr **tca, 550 550 unsigned long *arg) ··· 570 570 if (TC_U32_KEY(n->handle) == 0) 571 571 return -EINVAL; 572 572 573 - return u32_set_parms(tp, base, n->ht_up, n, tb, tca[TCA_RATE]); 573 + return u32_set_parms(net, tp, base, n->ht_up, n, tb, 574 + tca[TCA_RATE]); 574 575 } 575 576 576 577 if (tb[TCA_U32_DIVISOR]) { ··· 657 656 } 658 657 #endif 659 658 660 - err = u32_set_parms(tp, base, ht, n, tb, tca[TCA_RATE]); 659 + err = u32_set_parms(net, tp, base, ht, n, tb, tca[TCA_RATE]); 661 660 if (err == 0) { 662 661 struct tc_u_knode **ins; 663 662 for (ins = &ht->ht[TC_U32_HASH(handle)]; *ins; ins = &(*ins)->next)