ipt_MARK.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
- /* This is a module which is used for setting the NFMARK field of an skb. */
- #include <linux/module.h>
- #include <linux/skbuff.h>
- #include <linux/ip.h>
- #include <net/checksum.h>
- #include <linux/netfilter_ipv4/ip_tables.h>
- #include <linux/netfilter_ipv4/ipt_MARK.h>
- static unsigned int
- target(struct sk_buff **pskb,
- unsigned int hooknum,
- const struct net_device *in,
- const struct net_device *out,
- const void *targinfo,
- void *userinfo)
- {
- const struct ipt_mark_target_info *markinfo = targinfo;
- if((*pskb)->nfmark != markinfo->mark) {
- (*pskb)->nfmark = markinfo->mark;
- (*pskb)->nfcache |= NFC_ALTERED;
- }
- return IPT_CONTINUE;
- }
- static int
- checkentry(const char *tablename,
- const struct ipt_entry *e,
- void *targinfo,
- unsigned int targinfosize,
- unsigned int hook_mask)
- {
- if (targinfosize != IPT_ALIGN(sizeof(struct ipt_mark_target_info))) {
- printk(KERN_WARNING "MARK: targinfosize %u != %Zun",
- targinfosize,
- IPT_ALIGN(sizeof(struct ipt_mark_target_info)));
- return 0;
- }
- if (strcmp(tablename, "mangle") != 0) {
- printk(KERN_WARNING "MARK: can only be called from "mangle" table, not "%s"n", tablename);
- return 0;
- }
- return 1;
- }
- static struct ipt_target ipt_mark_reg
- = { { NULL, NULL }, "MARK", target, checkentry, NULL, THIS_MODULE };
- static int __init init(void)
- {
- if (ipt_register_target(&ipt_mark_reg))
- return -EINVAL;
- return 0;
- }
- static void __exit fini(void)
- {
- ipt_unregister_target(&ipt_mark_reg);
- }
- module_init(init);
- module_exit(fini);
- MODULE_LICENSE("GPL");