callouts.cc 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. #include <hooks/hooks.h>
  2. #include <dhcp/pkt4.h>
  3. #include <dhcp/hwaddr.h>
  4. #include <dhcpsrv/subnet.h>
  5. #include <dhcpsrv/lease.h>
  6. #include <util/strutil.h>
  7. #include <dhcp/option_string.h>
  8. #include <dhcp/option4_addrlst.h>
  9. #include <dhcp/docsis3_option_defs.h>
  10. #include <string>
  11. #include <dhcp/dhcp6.h>
  12. #include <dhcp/pkt6.h>
  13. #include <dhcp/option6_ia.h>
  14. #include <boost/foreach.hpp>
  15. #include "logger.h"
  16. #include "common.h"
  17. using namespace isc::dhcp;
  18. using namespace isc::hooks;
  19. extern "C" {
  20. #include <numeric> //inner_product
  21. #include <functional> //plus, equal_to, not2
  22. #include <string>
  23. #include <stdexcept>
  24. #include "amqppublisher.h"
  25. AMQPPublisher amqp;
  26. /* IPv4 callouts */
  27. int pkt4_receive(CalloutHandle& handle)
  28. {
  29. Pkt4Ptr query;
  30. handle.getArgument("query4", query);
  31. amqp.publish(query->toText());
  32. return 0;
  33. }
  34. int pkt4_send(CalloutHandle& handle)
  35. {
  36. Pkt4Ptr response;
  37. Pkt4Ptr query;
  38. handle.getArgument("response4", response);
  39. handle.getArgument("query4", query);
  40. amqp.publish(query->toText());
  41. amqp.publish(response->toText());
  42. return 0;
  43. }
  44. int subnet4_select(CalloutHandle& handle) {
  45. std::vector<std::string> env;
  46. Pkt4Ptr query;
  47. Subnet4Ptr subnet;
  48. handle.getArgument("query4", query);
  49. handle.getArgument("subnet4", subnet);
  50. amqp.publish(query->toText());
  51. amqp.publish("subnet4_select: " + subnet->toText());
  52. return 0;
  53. }
  54. int lease4_select(CalloutHandle& handle) {
  55. std::vector<std::string> env;
  56. Pkt4Ptr query;
  57. Subnet4Ptr subnet;
  58. bool fake_allocation;
  59. Lease4Ptr lease;
  60. handle.getArgument("query4", query);
  61. handle.getArgument("subnet4", subnet);
  62. handle.getArgument("fake_allocation", fake_allocation);
  63. handle.getArgument("lease4", lease);
  64. amqp.publish(query->toText());
  65. amqp.publish("lease4_select: " + subnet->toText());
  66. amqp.publish("lease4_select: " + lease->toText());
  67. return 0;
  68. }
  69. int lease4_renew(CalloutHandle& handle) {
  70. std::vector<std::string> env;
  71. Pkt4Ptr query;
  72. Subnet4Ptr subnet;
  73. Lease4Ptr lease;
  74. handle.getArgument("query4", query);
  75. handle.getArgument("subnet4", subnet);
  76. handle.getArgument("lease4", lease);
  77. amqp.publish(query->toText());
  78. amqp.publish("lease4_renew: " + subnet->toText());
  79. amqp.publish("lease4_renew: " + lease->toText());
  80. return 0;
  81. }
  82. int lease4_release(CalloutHandle& handle) {
  83. std::vector<std::string> env;
  84. Pkt4Ptr query;
  85. Lease4Ptr lease;
  86. handle.getArgument("query4", query);
  87. handle.getArgument("lease4", lease);
  88. amqp.publish(query->toText());
  89. amqp.publish("lease4_release: " + lease->toText());
  90. return 0;
  91. }
  92. int lease4_decline(CalloutHandle& handle) {
  93. std::vector<std::string> env;
  94. Pkt4Ptr query;
  95. Lease4Ptr lease;
  96. handle.getArgument("query4", query);
  97. handle.getArgument("lease4", lease);
  98. amqp.publish(query->toText());
  99. amqp.publish("lease4_decline: " + lease->toText());
  100. return 0;
  101. }
  102. int lease4_expire(CalloutHandle& handle) {
  103. std::vector<std::string> env;
  104. Lease4Ptr lease;
  105. bool remove_lease;
  106. handle.getArgument("lease4", lease);
  107. handle.getArgument("remove_lease", remove_lease);
  108. amqp.publish("lease4_expire: " + lease->toText());
  109. return 0;
  110. }
  111. int lease4_recover(CalloutHandle& handle) {
  112. std::vector<std::string> env;
  113. Lease4Ptr lease;
  114. handle.getArgument("lease4", lease);
  115. amqp.publish("lease4_recover: " + lease->toText());
  116. return 0;
  117. }
  118. /* IPv6 callouts */
  119. int pkt6_receive(CalloutHandle& handle) {
  120. std::vector<std::string> env;
  121. Pkt6Ptr query;
  122. handle.getArgument("query6", query);
  123. amqp.publish(query->toText());
  124. return 0;
  125. }
  126. int pkt6_send(CalloutHandle& handle) {
  127. std::vector<std::string> env;
  128. Pkt6Ptr query, response;
  129. handle.getArgument("query6", query);
  130. handle.getArgument("response6", response);
  131. amqp.publish(query->toText());
  132. amqp.publish(response->toText());
  133. return 0;
  134. }
  135. int subnet6_select(CalloutHandle& handle) {
  136. std::vector<std::string> env;
  137. Pkt6Ptr query;
  138. Subnet6Ptr subnet;
  139. handle.getArgument("query6", query);
  140. handle.getArgument("subnet6", subnet);
  141. amqp.publish(query->toText());
  142. amqp.publish("subnet6_select: " + subnet->toText());
  143. return 0;
  144. }
  145. int lease6_select(CalloutHandle& handle) {
  146. std::vector<std::string> env;
  147. Pkt6Ptr query;
  148. Subnet6Ptr subnet;
  149. bool fake_allocation;
  150. Lease6Ptr lease;
  151. handle.getArgument("query6", query);
  152. handle.getArgument("subnet6", subnet);
  153. handle.getArgument("fake_allocation", fake_allocation);
  154. handle.getArgument("lease6", lease);
  155. amqp.publish(query->toText());
  156. amqp.publish("lease6_select: " + subnet->toText());
  157. amqp.publish("lease6_select: " + lease->toText());
  158. return 0;
  159. }
  160. int lease6_renew(CalloutHandle& handle) {
  161. std::vector<std::string> env;
  162. Pkt6Ptr query;
  163. Lease6Ptr lease;
  164. boost::shared_ptr<Option6IA> ia_na;
  165. boost::shared_ptr<Option6IA> ia_pd;
  166. handle.getArgument("query6", query);
  167. handle.getArgument("lease6", lease);
  168. amqp.publish(query->toText());
  169. amqp.publish("lease6_renew: " + lease->toText());
  170. try {
  171. handle.getArgument("ia_na", ia_na);
  172. amqp.publish("lease6_renew: " + ia_na->toText());
  173. } catch (const NoSuchArgument&) { }
  174. try {
  175. handle.getArgument("ia_pd", ia_pd);
  176. amqp.publish("lease6_renew: " + ia_pd->toText());
  177. } catch (const NoSuchArgument&) { }
  178. return 0;
  179. }
  180. int lease6_rebind(CalloutHandle& handle) {
  181. std::vector<std::string> env;
  182. Pkt6Ptr query;
  183. Lease6Ptr lease;
  184. boost::shared_ptr<Option6IA> ia_na;
  185. boost::shared_ptr<Option6IA> ia_pd;
  186. handle.getArgument("query6", query);
  187. handle.getArgument("lease6", lease);
  188. amqp.publish(query->toText());
  189. amqp.publish("lease6_rebind: " + lease->toText());
  190. try {
  191. handle.getArgument("ia_na", ia_na);
  192. amqp.publish("lease6_rebind: " + ia_na->toText());
  193. } catch (const NoSuchArgument&) { }
  194. try {
  195. handle.getArgument("ia_pd", ia_pd);
  196. amqp.publish("lease6_rebind: " + ia_pd->toText());
  197. } catch (const NoSuchArgument&) { }
  198. return 0;
  199. }
  200. int lease6_decline(CalloutHandle& handle) {
  201. std::vector<std::string> env;
  202. Pkt6Ptr query;
  203. Lease6Ptr lease;
  204. handle.getArgument("query6", query);
  205. handle.getArgument("lease6", lease);
  206. amqp.publish(query->toText());
  207. amqp.publish("lease6_decline: " + lease->toText());
  208. return 0;
  209. }
  210. int lease6_release(CalloutHandle& handle) {
  211. std::vector<std::string> env;
  212. Pkt6Ptr query;
  213. Lease6Ptr lease;
  214. handle.getArgument("query6", query);
  215. handle.getArgument("lease6", lease);
  216. amqp.publish(query->toText());
  217. amqp.publish("lease6_release: " + lease->toText());
  218. return 0;
  219. }
  220. int lease6_expire(CalloutHandle& handle) {
  221. std::vector<std::string> env;
  222. Lease6Ptr lease;
  223. bool remove_lease;
  224. handle.getArgument("lease6", lease);
  225. handle.getArgument("remove_lease", remove_lease);
  226. amqp.publish("lease6_expire: " + lease->toText());
  227. return 0;
  228. }
  229. int lease6_recover(CalloutHandle& handle) {
  230. std::vector<std::string> env;
  231. Lease6Ptr lease;
  232. handle.getArgument("lease6", lease);
  233. amqp.publish("lease6_recover: " + lease->toText());
  234. return 0;
  235. }
  236. } // end extern "C"