Lines Matching refs:chain

155 					  u32 prio, struct tcf_chain *chain,  in tcf_proto_create()  argument
173 tp->chain = chain; in tcf_proto_create()
204 struct tcf_chain *chain; in tcf_chain_create() local
206 chain = kzalloc(sizeof(*chain), GFP_KERNEL); in tcf_chain_create()
207 if (!chain) in tcf_chain_create()
209 list_add_tail(&chain->list, &block->chain_list); in tcf_chain_create()
210 chain->block = block; in tcf_chain_create()
211 chain->index = chain_index; in tcf_chain_create()
212 chain->refcnt = 1; in tcf_chain_create()
213 if (!chain->index) in tcf_chain_create()
214 block->chain0.chain = chain; in tcf_chain_create()
215 return chain; in tcf_chain_create()
225 static void tcf_chain0_head_change(struct tcf_chain *chain, in tcf_chain0_head_change() argument
229 struct tcf_block *block = chain->block; in tcf_chain0_head_change()
231 if (chain->index) in tcf_chain0_head_change()
237 static void tcf_chain_destroy(struct tcf_chain *chain) in tcf_chain_destroy() argument
239 struct tcf_block *block = chain->block; in tcf_chain_destroy()
241 list_del(&chain->list); in tcf_chain_destroy()
242 if (!chain->index) in tcf_chain_destroy()
243 block->chain0.chain = NULL; in tcf_chain_destroy()
244 kfree(chain); in tcf_chain_destroy()
249 static void tcf_chain_hold(struct tcf_chain *chain) in tcf_chain_hold() argument
251 ++chain->refcnt; in tcf_chain_hold()
254 static bool tcf_chain_held_by_acts_only(struct tcf_chain *chain) in tcf_chain_held_by_acts_only() argument
259 return chain->refcnt == chain->action_refcnt; in tcf_chain_held_by_acts_only()
265 struct tcf_chain *chain; in tcf_chain_lookup() local
267 list_for_each_entry(chain, &block->chain_list, list) { in tcf_chain_lookup()
268 if (chain->index == chain_index) in tcf_chain_lookup()
269 return chain; in tcf_chain_lookup()
274 static int tc_chain_notify(struct tcf_chain *chain, struct sk_buff *oskb,
281 struct tcf_chain *chain = tcf_chain_lookup(block, chain_index); in __tcf_chain_get() local
283 if (chain) { in __tcf_chain_get()
284 tcf_chain_hold(chain); in __tcf_chain_get()
288 chain = tcf_chain_create(block, chain_index); in __tcf_chain_get()
289 if (!chain) in __tcf_chain_get()
294 ++chain->action_refcnt; in __tcf_chain_get()
301 if (chain->refcnt - chain->action_refcnt == 1 && !by_act) in __tcf_chain_get()
302 tc_chain_notify(chain, NULL, 0, NLM_F_CREATE | NLM_F_EXCL, in __tcf_chain_get()
305 return chain; in __tcf_chain_get()
320 static void tc_chain_tmplt_del(struct tcf_chain *chain);
322 static void __tcf_chain_put(struct tcf_chain *chain, bool by_act) in __tcf_chain_put() argument
325 chain->action_refcnt--; in __tcf_chain_put()
326 chain->refcnt--; in __tcf_chain_put()
329 if (chain->refcnt - chain->action_refcnt == 0 && !by_act) in __tcf_chain_put()
330 tc_chain_notify(chain, NULL, 0, 0, RTM_DELCHAIN, false); in __tcf_chain_put()
332 if (chain->refcnt == 0) { in __tcf_chain_put()
333 tc_chain_tmplt_del(chain); in __tcf_chain_put()
334 tcf_chain_destroy(chain); in __tcf_chain_put()
338 static void tcf_chain_put(struct tcf_chain *chain) in tcf_chain_put() argument
340 __tcf_chain_put(chain, false); in tcf_chain_put()
343 void tcf_chain_put_by_act(struct tcf_chain *chain) in tcf_chain_put_by_act() argument
345 __tcf_chain_put(chain, true); in tcf_chain_put_by_act()
349 static void tcf_chain_put_explicitly_created(struct tcf_chain *chain) in tcf_chain_put_explicitly_created() argument
351 if (chain->explicitly_created) in tcf_chain_put_explicitly_created()
352 tcf_chain_put(chain); in tcf_chain_put_explicitly_created()
355 static void tcf_chain_flush(struct tcf_chain *chain) in tcf_chain_flush() argument
357 struct tcf_proto *tp = rtnl_dereference(chain->filter_chain); in tcf_chain_flush()
359 tcf_chain0_head_change(chain, NULL); in tcf_chain_flush()
361 RCU_INIT_POINTER(chain->filter_chain, tp->next); in tcf_chain_flush()
363 tp = rtnl_dereference(chain->filter_chain); in tcf_chain_flush()
364 tcf_chain_put(chain); in tcf_chain_flush()
440 struct tcf_chain *chain0 = block->chain0.chain; in tcf_chain0_head_change_cb_add()
460 struct tcf_chain *chain0 = block->chain0.chain; in tcf_chain0_head_change_cb_del()
752 struct tcf_chain *chain, *tmp; in tcf_block_put_ext() local
766 list_for_each_entry(chain, &block->chain_list, list) in tcf_block_put_ext()
767 tcf_chain_hold(chain); in tcf_block_put_ext()
769 list_for_each_entry(chain, &block->chain_list, list) in tcf_block_put_ext()
770 tcf_chain_flush(chain); in tcf_block_put_ext()
777 list_for_each_entry_safe(chain, tmp, &block->chain_list, list) { in tcf_block_put_ext()
778 tcf_chain_put_explicitly_created(chain); in tcf_block_put_ext()
779 tcf_chain_put(chain); in tcf_block_put_ext()
844 struct tcf_chain *chain; in tcf_block_playback_offloads() local
848 list_for_each_entry(chain, &block->chain_list, list) { in tcf_block_playback_offloads()
849 for (tp = rtnl_dereference(chain->filter_chain); tp; in tcf_block_playback_offloads()
998 tp->chain->block->index, in tcf_classify()
1021 static void tcf_chain_tp_insert(struct tcf_chain *chain, in tcf_chain_tp_insert() argument
1025 if (*chain_info->pprev == chain->filter_chain) in tcf_chain_tp_insert()
1026 tcf_chain0_head_change(chain, tp); in tcf_chain_tp_insert()
1029 tcf_chain_hold(chain); in tcf_chain_tp_insert()
1032 static void tcf_chain_tp_remove(struct tcf_chain *chain, in tcf_chain_tp_remove() argument
1038 if (tp == chain->filter_chain) in tcf_chain_tp_remove()
1039 tcf_chain0_head_change(chain, next); in tcf_chain_tp_remove()
1041 tcf_chain_put(chain); in tcf_chain_tp_remove()
1044 static struct tcf_proto *tcf_chain_tp_find(struct tcf_chain *chain, in tcf_chain_tp_find() argument
1053 for (pprev = &chain->filter_chain; in tcf_chain_tp_find()
1097 if (nla_put_u32(skb, TCA_CHAIN, tp->chain->index)) in tcf_fill_node()
1179 struct tcf_chain *chain, int event) in tfilter_notify_chain() argument
1183 for (tp = rtnl_dereference(chain->filter_chain); in tfilter_notify_chain()
1202 struct tcf_chain *chain = NULL; in tc_new_tfilter() local
1255 chain = tcf_chain_get(block, chain_index, true); in tc_new_tfilter()
1256 if (!chain) { in tc_new_tfilter()
1262 tp = tcf_chain_tp_find(chain, &chain_info, protocol, in tc_new_tfilter()
1289 protocol, prio, chain, extack); in tc_new_tfilter()
1315 if (chain->tmplt_ops && chain->tmplt_ops != tp->ops) { in tc_new_tfilter()
1326 tcf_chain_tp_insert(chain, &chain_info, tp); in tc_new_tfilter()
1335 if (chain) in tc_new_tfilter()
1336 tcf_chain_put(chain); in tc_new_tfilter()
1355 struct tcf_chain *chain = NULL; in tc_del_tfilter() local
1394 chain = tcf_chain_get(block, chain_index, false); in tc_del_tfilter()
1395 if (!chain) { in tc_del_tfilter()
1410 chain, RTM_DELTFILTER); in tc_del_tfilter()
1411 tcf_chain_flush(chain); in tc_del_tfilter()
1416 tp = tcf_chain_tp_find(chain, &chain_info, protocol, in tc_del_tfilter()
1432 tcf_chain_tp_remove(chain, &chain_info, tp); in tc_del_tfilter()
1450 tcf_chain_tp_remove(chain, &chain_info, tp); in tc_del_tfilter()
1456 if (chain) in tc_del_tfilter()
1457 tcf_chain_put(chain); in tc_del_tfilter()
1473 struct tcf_chain *chain = NULL; in tc_get_tfilter() local
1509 chain = tcf_chain_get(block, chain_index, false); in tc_get_tfilter()
1510 if (!chain) { in tc_get_tfilter()
1516 tp = tcf_chain_tp_find(chain, &chain_info, protocol, in tc_get_tfilter()
1541 if (chain) in tc_get_tfilter()
1542 tcf_chain_put(chain); in tc_get_tfilter()
1566 static bool tcf_chain_dump(struct tcf_chain *chain, struct Qdisc *q, u32 parent, in tcf_chain_dump() argument
1571 struct tcf_block *block = chain->block; in tcf_chain_dump()
1576 for (tp = rtnl_dereference(chain->filter_chain); in tcf_chain_dump()
1626 struct tcf_chain *chain; in tc_dump_tfilter() local
1689 list_for_each_entry(chain, &block->chain_list, list) { in tc_dump_tfilter()
1691 nla_get_u32(tca[TCA_CHAIN]) != chain->index) in tc_dump_tfilter()
1693 if (!tcf_chain_dump(chain, q, parent, skb, cb, in tc_dump_tfilter()
1709 static int tc_chain_fill_node(struct tcf_chain *chain, struct net *net, in tc_chain_fill_node() argument
1719 ops = chain->tmplt_ops; in tc_chain_fill_node()
1720 priv = chain->tmplt_priv; in tc_chain_fill_node()
1738 if (nla_put_u32(skb, TCA_CHAIN, chain->index)) in tc_chain_fill_node()
1757 static int tc_chain_notify(struct tcf_chain *chain, struct sk_buff *oskb, in tc_chain_notify() argument
1761 struct tcf_block *block = chain->block; in tc_chain_notify()
1769 if (tc_chain_fill_node(chain, net, skb, block, portid, in tc_chain_notify()
1781 static int tc_chain_tmplt_add(struct tcf_chain *chain, struct net *net, in tc_chain_tmplt_add() argument
1800 tmplt_priv = ops->tmplt_create(net, chain, tca, extack); in tc_chain_tmplt_add()
1805 chain->tmplt_ops = ops; in tc_chain_tmplt_add()
1806 chain->tmplt_priv = tmplt_priv; in tc_chain_tmplt_add()
1810 static void tc_chain_tmplt_del(struct tcf_chain *chain) in tc_chain_tmplt_del() argument
1812 const struct tcf_proto_ops *ops = chain->tmplt_ops; in tc_chain_tmplt_del()
1818 ops->tmplt_destroy(chain->tmplt_priv); in tc_chain_tmplt_del()
1833 struct tcf_chain *chain = NULL; in tc_ctl_chain() local
1861 chain = tcf_chain_lookup(block, chain_index); in tc_ctl_chain()
1863 if (chain) { in tc_ctl_chain()
1864 if (tcf_chain_held_by_acts_only(chain)) { in tc_ctl_chain()
1868 tcf_chain_hold(chain); in tc_ctl_chain()
1878 chain = tcf_chain_create(block, chain_index); in tc_ctl_chain()
1879 if (!chain) { in tc_ctl_chain()
1885 if (!chain || tcf_chain_held_by_acts_only(chain)) { in tc_ctl_chain()
1889 tcf_chain_hold(chain); in tc_ctl_chain()
1894 err = tc_chain_tmplt_add(chain, net, tca, extack); in tc_ctl_chain()
1901 tcf_chain_hold(chain); in tc_ctl_chain()
1902 chain->explicitly_created = true; in tc_ctl_chain()
1903 tc_chain_notify(chain, NULL, 0, NLM_F_CREATE | NLM_F_EXCL, in tc_ctl_chain()
1908 chain, RTM_DELTFILTER); in tc_ctl_chain()
1910 tcf_chain_flush(chain); in tc_ctl_chain()
1914 tcf_chain_put_explicitly_created(chain); in tc_ctl_chain()
1915 chain->explicitly_created = false; in tc_ctl_chain()
1918 err = tc_chain_notify(chain, skb, n->nlmsg_seq, in tc_ctl_chain()
1930 tcf_chain_put(chain); in tc_ctl_chain()
1944 struct tcf_chain *chain; in tc_dump_chain() local
2008 list_for_each_entry(chain, &block->chain_list, list) { in tc_dump_chain()
2010 nla_get_u32(tca[TCA_CHAIN]) != chain->index)) in tc_dump_chain()
2016 if (tcf_chain_held_by_acts_only(chain)) in tc_dump_chain()
2018 err = tc_chain_fill_node(chain, net, skb, block, in tc_dump_chain()