| Jamal Hadi Salim | db75307 | 2005-04-24 20:10:16 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * net/sched/simp.c	Simple example of an action | 
 | 3 |  * | 
 | 4 |  *		This program is free software; you can redistribute it and/or | 
 | 5 |  *		modify it under the terms of the GNU General Public License | 
 | 6 |  *		as published by the Free Software Foundation; either version | 
 | 7 |  *		2 of the License, or (at your option) any later version. | 
 | 8 |  * | 
 | 9 |  * Authors:	Jamal Hadi Salim (2005) | 
 | 10 |  * | 
 | 11 |  */ | 
 | 12 |  | 
| Jamal Hadi Salim | db75307 | 2005-04-24 20:10:16 -0700 | [diff] [blame] | 13 | #include <linux/config.h> | 
| David S. Miller | cbdbf00 | 2005-04-25 12:15:01 -0700 | [diff] [blame] | 14 | #include <linux/module.h> | 
 | 15 | #include <linux/init.h> | 
| Jamal Hadi Salim | db75307 | 2005-04-24 20:10:16 -0700 | [diff] [blame] | 16 | #include <linux/kernel.h> | 
| Jamal Hadi Salim | db75307 | 2005-04-24 20:10:16 -0700 | [diff] [blame] | 17 | #include <linux/netdevice.h> | 
 | 18 | #include <linux/skbuff.h> | 
 | 19 | #include <linux/rtnetlink.h> | 
| Jamal Hadi Salim | db75307 | 2005-04-24 20:10:16 -0700 | [diff] [blame] | 20 | #include <net/pkt_sched.h> | 
 | 21 |  | 
 | 22 | #define TCA_ACT_SIMP 22 | 
 | 23 |  | 
 | 24 | /* XXX: Hide all these common elements under some macro  | 
 | 25 |  * probably | 
 | 26 | */ | 
 | 27 | #include <linux/tc_act/tc_defact.h> | 
 | 28 | #include <net/tc_act/tc_defact.h> | 
 | 29 |  | 
 | 30 | /* use generic hash table with 8 buckets */ | 
 | 31 | #define MY_TAB_SIZE     8 | 
 | 32 | #define MY_TAB_MASK     (MY_TAB_SIZE - 1) | 
 | 33 | static u32 idx_gen; | 
 | 34 | static struct tcf_defact *tcf_simp_ht[MY_TAB_SIZE]; | 
 | 35 | static DEFINE_RWLOCK(simp_lock); | 
 | 36 |  | 
 | 37 | /* override the defaults */ | 
 | 38 | #define tcf_st		tcf_defact | 
 | 39 | #define tc_st		tc_defact | 
 | 40 | #define tcf_t_lock	simp_lock | 
 | 41 | #define tcf_ht		tcf_simp_ht | 
 | 42 |  | 
 | 43 | #define CONFIG_NET_ACT_INIT 1 | 
 | 44 | #include <net/pkt_act.h> | 
 | 45 | #include <net/act_generic.h> | 
 | 46 |  | 
| Patrick McHardy | f43c5a0 | 2006-01-08 22:15:34 -0800 | [diff] [blame] | 47 | static int tcf_simp(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res) | 
| Jamal Hadi Salim | db75307 | 2005-04-24 20:10:16 -0700 | [diff] [blame] | 48 | { | 
| Jamal Hadi Salim | db75307 | 2005-04-24 20:10:16 -0700 | [diff] [blame] | 49 | 	struct tcf_defact *p = PRIV(a, defact); | 
 | 50 |  | 
 | 51 | 	spin_lock(&p->lock); | 
 | 52 | 	p->tm.lastuse = jiffies; | 
 | 53 | 	p->bstats.bytes += skb->len; | 
 | 54 | 	p->bstats.packets++; | 
 | 55 |  | 
 | 56 | 	/* print policy string followed by _ then packet count  | 
 | 57 | 	 * Example if this was the 3rd packet and the string was "hello"  | 
 | 58 | 	 * then it would look like "hello_3" (without quotes)  | 
 | 59 | 	 **/ | 
 | 60 | 	printk("simple: %s_%d\n", (char *)p->defdata, p->bstats.packets); | 
 | 61 | 	spin_unlock(&p->lock); | 
 | 62 | 	return p->action; | 
 | 63 | } | 
 | 64 |  | 
 | 65 | static struct tc_action_ops act_simp_ops = { | 
 | 66 | 	.kind = "simple", | 
 | 67 | 	.type = TCA_ACT_SIMP, | 
 | 68 | 	.capab = TCA_CAP_NONE, | 
 | 69 | 	.owner = THIS_MODULE, | 
 | 70 | 	.act = tcf_simp, | 
 | 71 | 	tca_use_default_ops | 
 | 72 | }; | 
 | 73 |  | 
 | 74 | MODULE_AUTHOR("Jamal Hadi Salim(2005)"); | 
 | 75 | MODULE_DESCRIPTION("Simple example action"); | 
 | 76 | MODULE_LICENSE("GPL"); | 
 | 77 |  | 
 | 78 | static int __init simp_init_module(void) | 
 | 79 | { | 
 | 80 | 	int ret = tcf_register_action(&act_simp_ops); | 
 | 81 | 	if (!ret) | 
 | 82 | 		printk("Simple TC action Loaded\n"); | 
 | 83 | 	return ret; | 
 | 84 | } | 
 | 85 |  | 
 | 86 | static void __exit simp_cleanup_module(void) | 
 | 87 | { | 
 | 88 | 	tcf_unregister_action(&act_simp_ops); | 
 | 89 | } | 
 | 90 |  | 
 | 91 | module_init(simp_init_module); | 
 | 92 | module_exit(simp_cleanup_module); |