ipt_dscp.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* IP tables module for matching the value of the IPv4 DSCP field
  2.  *
  3.  * ipt_dscp.c,v 1.3 2002/08/05 19:00:21 laforge Exp
  4.  *
  5.  * (C) 2002 by Harald Welte <laforge@gnumonks.org>
  6.  *
  7.  * This software is distributed under the terms  GNU GPL
  8.  */
  9. #include <linux/module.h>
  10. #include <linux/skbuff.h>
  11. #include <linux/netfilter_ipv4/ipt_dscp.h>
  12. #include <linux/netfilter_ipv4/ip_tables.h>
  13. MODULE_AUTHOR("Harald Welte <laforge@gnumonks.org>");
  14. MODULE_DESCRIPTION("IP tables DSCP matching module");
  15. MODULE_LICENSE("GPL");
  16. static int match(const struct sk_buff *skb, const struct net_device *in,
  17.  const struct net_device *out, const void *matchinfo,
  18.  int offset, const void *hdr, u_int16_t datalen,
  19.  int *hotdrop)
  20. {
  21. const struct ipt_dscp_info *info = matchinfo;
  22. const struct iphdr *iph = skb->nh.iph;
  23. u_int8_t sh_dscp = ((info->dscp << IPT_DSCP_SHIFT) & IPT_DSCP_MASK);
  24. return ((iph->tos&IPT_DSCP_MASK) == sh_dscp) ^ info->invert;
  25. }
  26. static int checkentry(const char *tablename, const struct ipt_ip *ip,
  27.       void *matchinfo, unsigned int matchsize,
  28.       unsigned int hook_mask)
  29. {
  30. if (matchsize != IPT_ALIGN(sizeof(struct ipt_dscp_info)))
  31. return 0;
  32. return 1;
  33. }
  34. static struct ipt_match dscp_match = { { NULL, NULL }, "dscp", &match,
  35. &checkentry, NULL, THIS_MODULE };
  36. static int __init init(void)
  37. {
  38. return ipt_register_match(&dscp_match);
  39. }
  40. static void __exit fini(void)
  41. {
  42. ipt_unregister_match(&dscp_match);
  43. }
  44. module_init(init);
  45. module_exit(fini);