| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * net/sched/em_u32.c	U32 Ematch | 
|  | 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:	Thomas Graf <tgraf@suug.ch> | 
|  | 10 | *		Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> | 
|  | 11 | * | 
|  | 12 | * Based on net/sched/cls_u32.c | 
|  | 13 | */ | 
|  | 14 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 15 | #include <linux/module.h> | 
|  | 16 | #include <linux/types.h> | 
|  | 17 | #include <linux/kernel.h> | 
|  | 18 | #include <linux/skbuff.h> | 
|  | 19 | #include <net/pkt_cls.h> | 
|  | 20 |  | 
|  | 21 | static int em_u32_match(struct sk_buff *skb, struct tcf_ematch *em, | 
|  | 22 | struct tcf_pkt_info *info) | 
|  | 23 | { | 
|  | 24 | struct tc_u32_key *key = (struct tc_u32_key *) em->data; | 
|  | 25 | unsigned char *ptr = skb->nh.raw; | 
| YOSHIFUJI Hideaki | 10297b9 | 2007-02-09 23:25:16 +0900 | [diff] [blame] | 26 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 27 | if (info) { | 
|  | 28 | if (info->ptr) | 
|  | 29 | ptr = info->ptr; | 
|  | 30 | ptr += (info->nexthdr & key->offmask); | 
|  | 31 | } | 
|  | 32 |  | 
|  | 33 | ptr += key->off; | 
|  | 34 |  | 
|  | 35 | if (!tcf_valid_offset(skb, ptr, sizeof(u32))) | 
|  | 36 | return 0; | 
| YOSHIFUJI Hideaki | 10297b9 | 2007-02-09 23:25:16 +0900 | [diff] [blame] | 37 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 38 | return !(((*(u32*) ptr)  ^ key->val) & key->mask); | 
|  | 39 | } | 
|  | 40 |  | 
|  | 41 | static struct tcf_ematch_ops em_u32_ops = { | 
|  | 42 | .kind	  = TCF_EM_U32, | 
|  | 43 | .datalen  = sizeof(struct tc_u32_key), | 
|  | 44 | .match	  = em_u32_match, | 
|  | 45 | .owner	  = THIS_MODULE, | 
|  | 46 | .link	  = LIST_HEAD_INIT(em_u32_ops.link) | 
|  | 47 | }; | 
|  | 48 |  | 
|  | 49 | static int __init init_em_u32(void) | 
|  | 50 | { | 
|  | 51 | return tcf_em_register(&em_u32_ops); | 
|  | 52 | } | 
|  | 53 |  | 
| YOSHIFUJI Hideaki | 10297b9 | 2007-02-09 23:25:16 +0900 | [diff] [blame] | 54 | static void __exit exit_em_u32(void) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 55 | { | 
|  | 56 | tcf_em_unregister(&em_u32_ops); | 
|  | 57 | } | 
|  | 58 |  | 
|  | 59 | MODULE_LICENSE("GPL"); | 
|  | 60 |  | 
|  | 61 | module_init(init_em_u32); | 
|  | 62 | module_exit(exit_em_u32); |