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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Kernel module to match ESP parameters. */
  2. #include <linux/module.h>
  3. #include <linux/skbuff.h>
  4. #include <linux/netfilter_ipv4/ipt_esp.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 esphdr {
  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("esp 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 esphdr *esp = hdr;
  38. const struct ipt_esp *espinfo = matchinfo;
  39. if (offset == 0 && datalen < sizeof(struct esphdr)) {
  40. /* We've been asked to examine this packet, and we
  41.    can't.  Hence, no choice but to drop. */
  42. duprintf("Dropping evil ESP tinygram.n");
  43. *hotdrop = 1;
  44. return 0;
  45. }
  46. /* Must not be a fragment. */
  47. return !offset
  48. && spi_match(espinfo->spis[0], espinfo->spis[1],
  49.       ntohl(esp->spi),
  50.       !!(espinfo->invflags & IPT_ESP_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_esp *espinfo = matchinfo;
  61. /* Must specify proto == ESP, and no unknown invflags */
  62. if (ip->proto != IPPROTO_ESP || (ip->invflags & IPT_INV_PROTO)) {
  63. duprintf("ipt_esp: Protocol %u != %un", ip->proto,
  64.  IPPROTO_ESP);
  65. return 0;
  66. }
  67. if (matchinfosize != IPT_ALIGN(sizeof(struct ipt_esp))) {
  68. duprintf("ipt_esp: matchsize %u != %un",
  69.  matchinfosize, IPT_ALIGN(sizeof(struct ipt_esp)));
  70. return 0;
  71. }
  72. if (espinfo->invflags & ~IPT_ESP_INV_MASK) {
  73. duprintf("ipt_esp: unknown flags %Xn",
  74.  espinfo->invflags);
  75. return 0;
  76. }
  77. return 1;
  78. }
  79. static struct ipt_match esp_match
  80. = { { NULL, NULL }, "esp", &match, &checkentry, NULL, THIS_MODULE };
  81. static int __init init(void)
  82. {
  83. return ipt_register_match(&esp_match);
  84. }
  85. static void __exit cleanup(void)
  86. {
  87. ipt_unregister_match(&esp_match);
  88. }
  89. module_init(init);
  90. module_exit(cleanup);