| 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); |