callouts.cc 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <hooks/hooks.h>
  2. #include <dhcp/pkt4.h>
  3. #include <dhcp/dhcp6.h>
  4. #include <dhcp/pkt6.h>
  5. #include <dhcpsrv/subnet.h>
  6. #include <dhcpsrv/lease.h>
  7. #include <string>
  8. #include <vector>
  9. #include "runscript.h"
  10. using namespace isc::dhcp;
  11. using namespace isc::hooks;
  12. extern "C" {
  13. /* These are helpers that extract relevant information from Kea data
  14. * structures and store them in environment variables. */
  15. void extract_query4(std::vector<std::string>& env, const Pkt4Ptr query)
  16. {
  17. /* General information */
  18. env.push_back("DHCP4_TYPE=" + std::to_string(query->getType()));
  19. /* Hardware address */
  20. HWAddrPtr hwaddr = query->getHWAddr();
  21. env.push_back("HWADDR_TYPE=" + std::to_string(hwaddr->htype_));
  22. env.push_back("HWADDR_SOURCE=" + std::to_string(hwaddr->source_));
  23. env.push_back("HWADDR=" + hwaddr->toText(false));
  24. /* Misc */
  25. env.push_back("DHCP4_RELAYED=" + std::to_string(query->isRelayed()));
  26. }
  27. /* IPv4 callouts */
  28. int pkt4_receive(CalloutHandle& handle) {
  29. std::vector<std::string> env;
  30. Pkt4Ptr query;
  31. handle.getArgument("query4", query);
  32. extract_query4(env, query);
  33. /* Run script */
  34. int ret;
  35. ret = run_script("pkt4_receive", env);
  36. fprintf(stderr, "ret = %d\n", ret);
  37. return 0;
  38. }
  39. int lease4_select(CalloutHandle& handle) {
  40. std::vector<std::string> env;
  41. Pkt4Ptr query;
  42. Subnet4Ptr subnet;
  43. bool fake_allocation;
  44. Lease4Ptr lease;
  45. handle.getArgument("query4", query);
  46. extract_query4(env, query);
  47. handle.getArgument("subnet4", subnet);
  48. handle.getArgument("fake_allocation", fake_allocation);
  49. handle.getArgument("lease4", lease);
  50. /* Run script */
  51. int ret;
  52. ret = run_script("lease4_select", env);
  53. fprintf(stderr, "ret = %d\n", ret);
  54. return 0;
  55. }
  56. /* IPv6 callouts */
  57. } // end extern "C"