| /* | |
| * net/sched/simp.c Simple example of an action | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License | |
| * as published by the Free Software Foundation; either version | |
| * 2 of the License, or (at your option) any later version. | |
| * | |
| * Authors: Jamal Hadi Salim (2005) | |
| * | |
| */ | |
| #include <linux/config.h> | |
| #include <linux/module.h> | |
| #include <linux/init.h> | |
| #include <linux/kernel.h> | |
| #include <linux/netdevice.h> | |
| #include <linux/skbuff.h> | |
| #include <linux/rtnetlink.h> | |
| #include <net/pkt_sched.h> | |
| #define TCA_ACT_SIMP 22 | |
| /* XXX: Hide all these common elements under some macro | |
| * probably | |
| */ | |
| #include <linux/tc_act/tc_defact.h> | |
| #include <net/tc_act/tc_defact.h> | |
| /* use generic hash table with 8 buckets */ | |
| #define MY_TAB_SIZE 8 | |
| #define MY_TAB_MASK (MY_TAB_SIZE - 1) | |
| static u32 idx_gen; | |
| static struct tcf_defact *tcf_simp_ht[MY_TAB_SIZE]; | |
| static DEFINE_RWLOCK(simp_lock); | |
| /* override the defaults */ | |
| #define tcf_st tcf_defact | |
| #define tc_st tc_defact | |
| #define tcf_t_lock simp_lock | |
| #define tcf_ht tcf_simp_ht | |
| #define CONFIG_NET_ACT_INIT 1 | |
| #include <net/pkt_act.h> | |
| #include <net/act_generic.h> | |
| static int tcf_simp(struct sk_buff **pskb, struct tc_action *a) | |
| { | |
| struct sk_buff *skb = *pskb; | |
| struct tcf_defact *p = PRIV(a, defact); | |
| spin_lock(&p->lock); | |
| p->tm.lastuse = jiffies; | |
| p->bstats.bytes += skb->len; | |
| p->bstats.packets++; | |
| /* print policy string followed by _ then packet count | |
| * Example if this was the 3rd packet and the string was "hello" | |
| * then it would look like "hello_3" (without quotes) | |
| **/ | |
| printk("simple: %s_%d\n", (char *)p->defdata, p->bstats.packets); | |
| spin_unlock(&p->lock); | |
| return p->action; | |
| } | |
| static struct tc_action_ops act_simp_ops = { | |
| .kind = "simple", | |
| .type = TCA_ACT_SIMP, | |
| .capab = TCA_CAP_NONE, | |
| .owner = THIS_MODULE, | |
| .act = tcf_simp, | |
| tca_use_default_ops | |
| }; | |
| MODULE_AUTHOR("Jamal Hadi Salim(2005)"); | |
| MODULE_DESCRIPTION("Simple example action"); | |
| MODULE_LICENSE("GPL"); | |
| static int __init simp_init_module(void) | |
| { | |
| int ret = tcf_register_action(&act_simp_ops); | |
| if (!ret) | |
| printk("Simple TC action Loaded\n"); | |
| return ret; | |
| } | |
| static void __exit simp_cleanup_module(void) | |
| { | |
| tcf_unregister_action(&act_simp_ops); | |
| } | |
| module_init(simp_init_module); | |
| module_exit(simp_cleanup_module); |