Lines Matching +full:realm +full:-

1 // SPDX-License-Identifier: GPL-2.0-or-later
60 #define ROUTE4_FAILURE ((struct route4_filter *)(-1L))
72 memset(head->fastmap, 0, sizeof(head->fastmap)); in route4_reset_fastmap()
84 head->fastmap[h].id = id; in route4_set_fastmap()
85 head->fastmap[h].iif = iif; in route4_set_fastmap()
86 head->fastmap[h].filter = f; in route4_set_fastmap()
112 *res = f->res; \
113 if (tcf_exts_has_actions(&f->exts)) { \
114 int r = tcf_exts_exec(skb, &f->exts, res); \
129 struct route4_head *head = rcu_dereference_bh(tp->root); in route4_classify()
140 id = dst->tclassid; in route4_classify()
147 if (id == head->fastmap[h].id && in route4_classify()
148 iif == head->fastmap[h].iif && in route4_classify()
149 (f = head->fastmap[h].filter) != NULL) { in route4_classify()
155 *res = f->res; in route4_classify()
164 b = rcu_dereference_bh(head->table[h]); in route4_classify()
166 for (f = rcu_dereference_bh(b->ht[route4_hash_from(id)]); in route4_classify()
168 f = rcu_dereference_bh(f->next)) in route4_classify()
169 if (f->id == id) in route4_classify()
172 for (f = rcu_dereference_bh(b->ht[route4_hash_iif(iif)]); in route4_classify()
174 f = rcu_dereference_bh(f->next)) in route4_classify()
175 if (f->iif == iif) in route4_classify()
178 for (f = rcu_dereference_bh(b->ht[route4_hash_wild()]); in route4_classify()
180 f = rcu_dereference_bh(f->next)) in route4_classify()
192 return -1; in route4_classify()
219 struct route4_head *head = rtnl_dereference(tp->root); in route4_get()
232 b = rtnl_dereference(head->table[h1]); in route4_get()
234 for (f = rtnl_dereference(b->ht[h2]); in route4_get()
236 f = rtnl_dereference(f->next)) in route4_get()
237 if (f->handle == handle) in route4_get()
249 return -ENOBUFS; in route4_init()
251 rcu_assign_pointer(tp->root, head); in route4_init()
257 tcf_exts_destroy(&f->exts); in __route4_delete_filter()
258 tcf_exts_put_net(&f->exts); in __route4_delete_filter()
274 tcf_queue_work(&f->rwork, route4_delete_filter_work); in route4_queue_work()
280 struct route4_head *head = rtnl_dereference(tp->root); in route4_destroy()
289 b = rtnl_dereference(head->table[h1]); in route4_destroy()
294 while ((f = rtnl_dereference(b->ht[h2])) != NULL) { in route4_destroy()
297 next = rtnl_dereference(f->next); in route4_destroy()
298 RCU_INIT_POINTER(b->ht[h2], next); in route4_destroy()
299 tcf_unbind_filter(tp, &f->res); in route4_destroy()
300 if (tcf_exts_get_net(&f->exts)) in route4_destroy()
306 RCU_INIT_POINTER(head->table[h1], NULL); in route4_destroy()
316 struct route4_head *head = rtnl_dereference(tp->root); in route4_delete()
325 return -EINVAL; in route4_delete()
327 h = f->handle; in route4_delete()
328 b = f->bkt; in route4_delete()
330 fp = &b->ht[from_hash(h >> 16)]; in route4_delete()
332 fp = &nf->next, nf = rtnl_dereference(*fp)) { in route4_delete()
335 RCU_INIT_POINTER(*fp, rtnl_dereference(f->next)); in route4_delete()
344 tcf_unbind_filter(tp, &f->res); in route4_delete()
345 tcf_exts_get_net(&f->exts); in route4_delete()
346 tcf_queue_work(&f->rwork, route4_delete_filter_work); in route4_delete()
352 rt = rtnl_dereference(b->ht[i]); in route4_delete()
358 RCU_INIT_POINTER(head->table[to_hash(h)], NULL); in route4_delete()
367 if (rcu_access_pointer(head->table[h1])) { in route4_delete()
395 err = tcf_exts_validate(net, tp, tb, est, &f->exts, flags, extack); in route4_set_parms()
402 return -EINVAL; in route4_set_parms()
411 return -EINVAL; in route4_set_parms()
429 return -EINVAL; in route4_set_parms()
435 return -EINVAL; in route4_set_parms()
439 b = rtnl_dereference(head->table[h1]); in route4_set_parms()
443 return -ENOBUFS; in route4_set_parms()
445 rcu_assign_pointer(head->table[h1], b); in route4_set_parms()
449 for (fp = rtnl_dereference(b->ht[h2]); in route4_set_parms()
451 fp = rtnl_dereference(fp->next)) in route4_set_parms()
452 if (fp->handle == f->handle) in route4_set_parms()
453 return -EEXIST; in route4_set_parms()
457 f->id = to; in route4_set_parms()
460 f->id = to | id<<16; in route4_set_parms()
462 f->iif = id; in route4_set_parms()
464 f->handle = nhandle; in route4_set_parms()
465 f->bkt = b; in route4_set_parms()
466 f->tp = tp; in route4_set_parms()
469 f->res.classid = nla_get_u32(tb[TCA_ROUTE4_CLASSID]); in route4_set_parms()
470 tcf_bind_filter(tp, &f->res, base); in route4_set_parms()
481 struct route4_head *head = rtnl_dereference(tp->root); in route4_change()
492 return -EINVAL; in route4_change()
497 return -EINVAL; in route4_change()
506 if (fold && fold->handle != handle) in route4_change()
507 return -EINVAL; in route4_change()
509 err = -ENOBUFS; in route4_change()
514 err = tcf_exts_init(&f->exts, net, TCA_ROUTE4_ACT, TCA_ROUTE4_POLICE); in route4_change()
519 f->id = fold->id; in route4_change()
520 f->iif = fold->iif; in route4_change()
521 f->handle = fold->handle; in route4_change()
523 f->tp = fold->tp; in route4_change()
524 f->bkt = fold->bkt; in route4_change()
533 h = from_hash(f->handle >> 16); in route4_change()
534 fp = &f->bkt->ht[h]; in route4_change()
537 fp = &f1->next) in route4_change()
538 if (f->handle < f1->handle) in route4_change()
541 tcf_block_netif_keep_dst(tp->chain->block); in route4_change()
542 rcu_assign_pointer(f->next, f1); in route4_change()
546 th = to_hash(fold->handle); in route4_change()
547 h = from_hash(fold->handle >> 16); in route4_change()
548 b = rtnl_dereference(head->table[th]); in route4_change()
550 fp = &b->ht[h]; in route4_change()
552 fp = &pfp->next, pfp = rtnl_dereference(*fp)) { in route4_change()
554 rcu_assign_pointer(*fp, fold->next); in route4_change()
564 tcf_unbind_filter(tp, &fold->res); in route4_change()
565 tcf_exts_get_net(&fold->exts); in route4_change()
566 tcf_queue_work(&fold->rwork, route4_delete_filter_work); in route4_change()
572 tcf_exts_destroy(&f->exts); in route4_change()
580 struct route4_head *head = rtnl_dereference(tp->root); in route4_walk()
583 if (head == NULL || arg->stop) in route4_walk()
587 struct route4_bucket *b = rtnl_dereference(head->table[h]); in route4_walk()
593 for (f = rtnl_dereference(b->ht[h1]); in route4_walk()
595 f = rtnl_dereference(f->next)) { in route4_walk()
612 return skb->len; in route4_dump()
614 t->tcm_handle = f->handle; in route4_dump()
620 if (!(f->handle & 0x8000)) { in route4_dump()
621 id = f->id & 0xFF; in route4_dump()
625 if (f->handle & 0x80000000) { in route4_dump()
626 if ((f->handle >> 16) != 0xFFFF && in route4_dump()
627 nla_put_u32(skb, TCA_ROUTE4_IIF, f->iif)) in route4_dump()
630 id = f->id >> 16; in route4_dump()
634 if (f->res.classid && in route4_dump()
635 nla_put_u32(skb, TCA_ROUTE4_CLASSID, f->res.classid)) in route4_dump()
638 if (tcf_exts_dump(skb, &f->exts) < 0) in route4_dump()
643 if (tcf_exts_dump_stats(skb, &f->exts) < 0) in route4_dump()
646 return skb->len; in route4_dump()
650 return -1; in route4_dump()
658 tc_cls_bind_class(classid, cl, q, &f->res, base); in route4_bind_class()
688 MODULE_DESCRIPTION("Routing table realm based TC classifier");