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