at v2.6.16 92 lines 2.3 kB view raw
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 13#include <linux/config.h> 14#include <linux/module.h> 15#include <linux/init.h> 16#include <linux/kernel.h> 17#include <linux/netdevice.h> 18#include <linux/skbuff.h> 19#include <linux/rtnetlink.h> 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) 33static u32 idx_gen; 34static struct tcf_defact *tcf_simp_ht[MY_TAB_SIZE]; 35static 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 47static int tcf_simp(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res) 48{ 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 65static 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 74MODULE_AUTHOR("Jamal Hadi Salim(2005)"); 75MODULE_DESCRIPTION("Simple example action"); 76MODULE_LICENSE("GPL"); 77 78static 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 86static void __exit simp_cleanup_module(void) 87{ 88 tcf_unregister_action(&act_simp_ops); 89} 90 91module_init(simp_init_module); 92module_exit(simp_cleanup_module);