ipt_MARK.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* This is a module which is used for setting the NFMARK field of an skb. */
  2. #include <linux/module.h>
  3. #include <linux/skbuff.h>
  4. #include <linux/ip.h>
  5. #include <net/checksum.h>
  6. #include <linux/netfilter_ipv4/ip_tables.h>
  7. #include <linux/netfilter_ipv4/ipt_MARK.h>
  8. static unsigned int
  9. target(struct sk_buff **pskb,
  10.        unsigned int hooknum,
  11.        const struct net_device *in,
  12.        const struct net_device *out,
  13.        const void *targinfo,
  14.        void *userinfo)
  15. {
  16. const struct ipt_mark_target_info *markinfo = targinfo;
  17. if((*pskb)->nfmark != markinfo->mark) {
  18. (*pskb)->nfmark = markinfo->mark;
  19. (*pskb)->nfcache |= NFC_ALTERED;
  20. }
  21. return IPT_CONTINUE;
  22. }
  23. static int
  24. checkentry(const char *tablename,
  25.    const struct ipt_entry *e,
  26.            void *targinfo,
  27.            unsigned int targinfosize,
  28.            unsigned int hook_mask)
  29. {
  30. if (targinfosize != IPT_ALIGN(sizeof(struct ipt_mark_target_info))) {
  31. printk(KERN_WARNING "MARK: targinfosize %u != %Zun",
  32.        targinfosize,
  33.        IPT_ALIGN(sizeof(struct ipt_mark_target_info)));
  34. return 0;
  35. }
  36. if (strcmp(tablename, "mangle") != 0) {
  37. printk(KERN_WARNING "MARK: can only be called from "mangle" table, not "%s"n", tablename);
  38. return 0;
  39. }
  40. return 1;
  41. }
  42. static struct ipt_target ipt_mark_reg
  43. = { { NULL, NULL }, "MARK", target, checkentry, NULL, THIS_MODULE };
  44. static int __init init(void)
  45. {
  46. if (ipt_register_target(&ipt_mark_reg))
  47. return -EINVAL;
  48. return 0;
  49. }
  50. static void __exit fini(void)
  51. {
  52. ipt_unregister_target(&ipt_mark_reg);
  53. }
  54. module_init(init);
  55. module_exit(fini);
  56. MODULE_LICENSE("GPL");