linux-2.6.22.6-openswan-2.4.9.kernel-2.6-natt.patch 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. diff -rdupN linux-2.6.22.6.oorig/include/net/xfrmudp.h linux-2.6.22.6/include/net/xfrmudp.h
  2. --- linux-2.6.22.6.oorig/include/net/xfrmudp.h 1970-01-01 01:00:00.000000000 +0100
  3. +++ linux-2.6.22.6/include/net/xfrmudp.h 2007-09-17 06:10:19.000000000 +0200
  4. @@ -0,0 +1,10 @@
  5. +/*
  6. + * pointer to function for type that xfrm4_input wants, to permit
  7. + * decoupling of XFRM from udp.c
  8. + */
  9. +#define HAVE_XFRM4_UDP_REGISTER
  10. +
  11. +typedef int (*xfrm4_rcv_encap_t)(struct sk_buff *skb, __u16 encap_type);
  12. +extern int udp4_register_esp_rcvencap(xfrm4_rcv_encap_t func
  13. + , xfrm4_rcv_encap_t *oldfunc);
  14. +extern int udp4_unregister_esp_rcvencap(xfrm4_rcv_encap_t func);
  15. diff -rdupN linux-2.6.22.6.oorig/net/ipv4/Kconfig linux-2.6.22.6/net/ipv4/Kconfig
  16. --- linux-2.6.22.6.oorig/net/ipv4/Kconfig 2007-08-31 08:21:01.000000000 +0200
  17. +++ linux-2.6.22.6/net/ipv4/Kconfig 2007-09-17 06:13:08.000000000 +0200
  18. @@ -362,6 +360,15 @@ config SYN_COOKIES
  19. If unsure, say N.
  20. +config IPSEC_NAT_TRAVERSAL
  21. + bool "IPSEC NAT-Traversal (KLIPS compatible)"
  22. + depends on INET
  23. + ---help---
  24. + Includes support for RFC3947/RFC3948 NAT-Traversal of ESP over UDP.
  25. +
  26. + server is really overloaded. If this happens frequently better turn
  27. + them off.
  28. +
  29. config INET_AH
  30. tristate "IP: AH transformation"
  31. select XFRM
  32. diff -rdupN linux-2.6.22.6.oorig/net/ipv4/udp.c linux-2.6.22.6/net/ipv4/udp.c
  33. --- linux-2.6.22.6.oorig/net/ipv4/udp.c 2007-08-31 08:21:01.000000000 +0200
  34. +++ linux-2.6.22.6/net/ipv4/udp.c 2007-09-17 06:10:19.000000000 +0200
  35. @@ -108,6 +108,7 @@
  36. */
  37. DEFINE_SNMP_STAT(struct udp_mib, udp_statistics) __read_mostly;
  38. +#include <net/xfrmudp.h>
  39. struct hlist_head udp_hash[UDP_HTABLE_SIZE];
  40. DEFINE_RWLOCK(udp_hash_lock);
  41. @@ -919,6 +920,44 @@ int udp_disconnect(struct sock *sk, int
  42. return 0;
  43. }
  44. +#if defined(CONFIG_XFRM) || defined(CONFIG_IPSEC_NAT_TRAVERSAL)
  45. +
  46. +/* if XFRM isn't a module, then register it directly. */
  47. +#if !defined(CONFIG_XFRM_MODULE)
  48. +static xfrm4_rcv_encap_t xfrm4_rcv_encap_func = xfrm4_rcv_encap;
  49. +#else
  50. +static xfrm4_rcv_encap_t xfrm4_rcv_encap_func = NULL;
  51. +#endif
  52. +
  53. +static xfrm4_rcv_encap_t xfrm4_rcv_encap_func;
  54. +
  55. +int udp4_register_esp_rcvencap(xfrm4_rcv_encap_t func
  56. + , xfrm4_rcv_encap_t *oldfunc)
  57. +{
  58. + if(oldfunc != NULL) {
  59. + *oldfunc = xfrm4_rcv_encap_func;
  60. + }
  61. +
  62. +#if 0
  63. + if(xfrm4_rcv_encap_func != NULL)
  64. + return -1;
  65. +#endif
  66. +
  67. + xfrm4_rcv_encap_func = func;
  68. + return 0;
  69. +}
  70. +
  71. +int udp4_unregister_esp_rcvencap(xfrm4_rcv_encap_t func)
  72. +{
  73. + if(xfrm4_rcv_encap_func != func)
  74. + return -1;
  75. +
  76. + xfrm4_rcv_encap_func = NULL;
  77. + return 0;
  78. +}
  79. +#endif /* CONFIG_XFRM || defined(CONFIG_IPSEC_NAT_TRAVERSAL)*/
  80. +
  81. +
  82. /* return:
  83. * 1 if the UDP system should process it
  84. * 0 if we should drop this packet
  85. @@ -926,9 +965,9 @@ int udp_disconnect(struct sock *sk, int
  86. */
  87. static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb)
  88. {
  89. -#ifndef CONFIG_XFRM
  90. +#if !defined(CONFIG_XFRM) && !defined(CONFIG_IPSEC_NAT_TRAVERSAL)
  91. return 1;
  92. -#else
  93. +#else /* either CONFIG_XFRM or CONFIG_IPSEC_NAT_TRAVERSAL */
  94. struct udp_sock *up = udp_sk(sk);
  95. struct udphdr *uh;
  96. struct iphdr *iph;
  97. @@ -1056,10 +1095,14 @@ int udp_queue_rcv_skb(struct sock * sk,
  98. return 0;
  99. }
  100. if (ret < 0) {
  101. - /* process the ESP packet */
  102. - ret = xfrm4_rcv_encap(skb, up->encap_type);
  103. - UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag);
  104. - return -ret;
  105. + if(xfrm4_rcv_encap_func != NULL) {
  106. + ret = (*xfrm4_rcv_encap_func)(skb, up->encap_type);
  107. + UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag);
  108. + } else {
  109. + UDP_INC_STATS_BH(UDP_MIB_INERRORS, up->pcflag);
  110. + ret = 1;
  111. + }
  112. + return ret;
  113. }
  114. /* FALLTHROUGH -- it's a UDP Packet */
  115. }
  116. @@ -1742,3 +1785,9 @@ EXPORT_SYMBOL(udp_poll);
  117. EXPORT_SYMBOL(udp_proc_register);
  118. EXPORT_SYMBOL(udp_proc_unregister);
  119. #endif
  120. +
  121. +#if defined(CONFIG_IPSEC_NAT_TRAVERSAL)
  122. +EXPORT_SYMBOL(udp4_register_esp_rcvencap);
  123. +EXPORT_SYMBOL(udp4_unregister_esp_rcvencap);
  124. +#endif
  125. +