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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* Kernel module to match packet length. */
  2. #include <linux/module.h>
  3. #include <linux/skbuff.h>
  4. #include <linux/netfilter_ipv4/ipt_length.h>
  5. #include <linux/netfilter_ipv4/ip_tables.h>
  6. MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
  7. MODULE_DESCRIPTION("IP tables packet length matching module");
  8. MODULE_LICENSE("GPL");
  9. static int
  10. match(const struct sk_buff *skb,
  11.       const struct net_device *in,
  12.       const struct net_device *out,
  13.       const void *matchinfo,
  14.       int offset,
  15.       const void *hdr,
  16.       u_int16_t datalen,
  17.       int *hotdrop)
  18. {
  19. const struct ipt_length_info *info = matchinfo;
  20. u_int16_t pktlen = ntohs(skb->nh.iph->tot_len);
  21. return (pktlen >= info->min && pktlen <= info->max) ^ info->invert;
  22. }
  23. static int
  24. checkentry(const char *tablename,
  25.            const struct ipt_ip *ip,
  26.            void *matchinfo,
  27.            unsigned int matchsize,
  28.            unsigned int hook_mask)
  29. {
  30. if (matchsize != IPT_ALIGN(sizeof(struct ipt_length_info)))
  31. return 0;
  32. return 1;
  33. }
  34. static struct ipt_match length_match
  35. = { { NULL, NULL }, "length", &match, &checkentry, NULL, THIS_MODULE };
  36. static int __init init(void)
  37. {
  38. return ipt_register_match(&length_match);
  39. }
  40. static void __exit fini(void)
  41. {
  42. ipt_unregister_match(&length_match);
  43. }
  44. module_init(init);
  45. module_exit(fini);