1 /* (C) 1999-2001 Michal Ludvig <michal@logix.cz> 2 * 3 * This program is free software; you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License version 2 as 5 * published by the Free Software Foundation. 6 */ 7 8 #include <linux/module.h> 9 #include <linux/skbuff.h> 10 #include <linux/if_ether.h> 11 #include <linux/if_packet.h> 12 13 #include <linux/netfilter/xt_pkttype.h> 14 #include <linux/netfilter/x_tables.h> 15 16 MODULE_LICENSE("GPL"); 17 MODULE_AUTHOR("Michal Ludvig <michal@logix.cz>"); 18 MODULE_DESCRIPTION("IP tables match to match on linklayer packet type"); 19 MODULE_ALIAS("ipt_pkttype"); 20 MODULE_ALIAS("ip6t_pkttype"); 21 22 static int match(const struct sk_buff *skb, 23 const struct net_device *in, 24 const struct net_device *out, 25 const struct xt_match *match, 26 const void *matchinfo, 27 int offset, 28 unsigned int protoff, 29 int *hotdrop) 30 { 31 const struct xt_pkttype_info *info = matchinfo; 32 33 return (skb->pkt_type == info->pkttype) ^ info->invert; 34 } 35 36 static struct xt_match pkttype_match = { 37 .name = "pkttype", 38 .match = match, 39 .matchsize = sizeof(struct xt_pkttype_info), 40 .family = AF_INET, 41 .me = THIS_MODULE, 42 }; 43 44 static struct xt_match pkttype6_match = { 45 .name = "pkttype", 46 .match = match, 47 .matchsize = sizeof(struct xt_pkttype_info), 48 .family = AF_INET6, 49 .me = THIS_MODULE, 50 }; 51 52 static int __init init(void) 53 { 54 int ret; 55 ret = xt_register_match(&pkttype_match); 56 if (ret) 57 return ret; 58 59 ret = xt_register_match(&pkttype6_match); 60 if (ret) 61 xt_unregister_match(&pkttype_match); 62 63 return ret; 64 } 65 66 static void __exit fini(void) 67 { 68 xt_unregister_match(&pkttype_match); 69 xt_unregister_match(&pkttype6_match); 70 } 71 72 module_init(init); 73 module_exit(fini); 74