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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* Kernel module to match AH parameters. */
  2. #include <linux/module.h>
  3. #include <linux/skbuff.h>
  4. #include <linux/netfilter_ipv4/ipt_ah.h>
  5. #include <linux/netfilter_ipv4/ip_tables.h>
  6. EXPORT_NO_SYMBOLS;
  7. MODULE_LICENSE("GPL");
  8. #ifdef DEBUG_CONNTRACK
  9. #define duprintf(format, args...) printk(format , ## args)
  10. #else
  11. #define duprintf(format, args...)
  12. #endif
  13. struct ahhdr {
  14. __u32   spi;
  15. };
  16. /* Returns 1 if the spi is matched by the range, 0 otherwise */
  17. static inline int
  18. spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, int invert)
  19. {
  20. int r=0;
  21.         duprintf("ah spi_match:%c 0x%x <= 0x%x <= 0x%x",invert? '!':' ',
  22.          min,spi,max);
  23. r=(spi >= min && spi <= max) ^ invert;
  24. duprintf(" result %sn",r? "PASS" : "FAILED");
  25. return r;
  26. }
  27. static int
  28. match(const struct sk_buff *skb,
  29.       const struct net_device *in,
  30.       const struct net_device *out,
  31.       const void *matchinfo,
  32.       int offset,
  33.       const void *hdr,
  34.       u_int16_t datalen,
  35.       int *hotdrop)
  36. {
  37. const struct ahhdr *ah = hdr;
  38. const struct ipt_ah *ahinfo = matchinfo;
  39. if (offset == 0 && datalen < sizeof(struct ahhdr)) {
  40. /* We've been asked to examine this packet, and we
  41.    can't.  Hence, no choice but to drop. */
  42. duprintf("Dropping evil AH tinygram.n");
  43. *hotdrop = 1;
  44. return 0;
  45. }
  46. /* Must not be a fragment. */
  47. return !offset
  48. && spi_match(ahinfo->spis[0], ahinfo->spis[1],
  49.       ntohl(ah->spi),
  50.       !!(ahinfo->invflags & IPT_AH_INV_SPI));
  51. }
  52. /* Called when user tries to insert an entry of this type. */
  53. static int
  54. checkentry(const char *tablename,
  55.    const struct ipt_ip *ip,
  56.    void *matchinfo,
  57.    unsigned int matchinfosize,
  58.    unsigned int hook_mask)
  59. {
  60. const struct ipt_ah *ahinfo = matchinfo;
  61. /* Must specify proto == AH, and no unknown invflags */
  62. if (ip->proto != IPPROTO_AH || (ip->invflags & IPT_INV_PROTO)) {
  63. duprintf("ipt_ah: Protocol %u != %un", ip->proto,
  64.  IPPROTO_AH);
  65. return 0;
  66. }
  67. if (matchinfosize != IPT_ALIGN(sizeof(struct ipt_ah))) {
  68. duprintf("ipt_ah: matchsize %u != %un",
  69.  matchinfosize, IPT_ALIGN(sizeof(struct ipt_ah)));
  70. return 0;
  71. }
  72. if (ahinfo->invflags & ~IPT_AH_INV_MASK) {
  73. duprintf("ipt_ah: unknown flags %Xn",
  74.  ahinfo->invflags);
  75. return 0;
  76. }
  77. return 1;
  78. }
  79. static struct ipt_match ah_match
  80. = { { NULL, NULL }, "ah", &match, &checkentry, NULL, THIS_MODULE };
  81. int __init init(void)
  82. {
  83. return ipt_register_match(&ah_match);
  84. }
  85. void __exit cleanup(void)
  86. {
  87. ipt_unregister_match(&ah_match);
  88. }
  89. module_init(init);
  90. module_exit(cleanup);