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 void *matchinfo, 26 int offset, 27 unsigned int protoff, 28 int *hotdrop) 29 { 30 const struct xt_pkttype_info *info = matchinfo; 31 32 return (skb->pkt_type == info->pkttype) ^ info->invert; 33 } 34 35 static int checkentry(const char *tablename, 36 const void *ip, 37 void *matchinfo, 38 unsigned int matchsize, 39 unsigned int hook_mask) 40 { 41 if (matchsize != XT_ALIGN(sizeof(struct xt_pkttype_info))) 42 return 0; 43 44 return 1; 45 } 46 47 static struct xt_match pkttype_match = { 48 .name = "pkttype", 49 .match = &match, 50 .checkentry = &checkentry, 51 .me = THIS_MODULE, 52 }; 53 static struct xt_match pkttype6_match = { 54 .name = "pkttype", 55 .match = &match, 56 .checkentry = &checkentry, 57 .me = THIS_MODULE, 58 }; 59 60 61 static int __init init(void) 62 { 63 int ret; 64 ret = xt_register_match(AF_INET, &pkttype_match); 65 if (ret) 66 return ret; 67 68 ret = xt_register_match(AF_INET6, &pkttype6_match); 69 if (ret) 70 xt_unregister_match(AF_INET, &pkttype_match); 71 72 return ret; 73 } 74 75 static void __exit fini(void) 76 { 77 xt_unregister_match(AF_INET, &pkttype_match); 78 xt_unregister_match(AF_INET6, &pkttype6_match); 79 } 80 81 module_init(init); 82 module_exit(fini); 83