Browse Source

Add all IPv6 callouts, with preliminary information extracted

Baptiste Jonglez 7 years ago
parent
commit
332755aae8
1 changed files with 182 additions and 0 deletions
  1. 182 0
      src/callouts.cc

+ 182 - 0
src/callouts.cc

@@ -2,6 +2,7 @@
 #include <dhcp/pkt4.h>
 #include <dhcp/dhcp6.h>
 #include <dhcp/pkt6.h>
+#include <dhcp/option6_ia.h>
 #include <dhcpsrv/subnet.h>
 #include <dhcpsrv/lease.h>
 
@@ -30,12 +31,36 @@ void extract_query4(std::vector<std::string>& env, const Pkt4Ptr query)
     env.push_back("QUERY4_RELAYED=" + std::to_string(query->isRelayed()));
 }
 
+void extract_query6(std::vector<std::string>& env, const Pkt6Ptr query)
+{
+    /* General information */
+    env.push_back("QUERY6_TYPE=" + std::string(query->getName()));
+    /* TODO */
+    env.push_back("QUERY6_DUID=");
+    env.push_back("QUERY6_HWADDR=");
+    /* TODO: all options?  Only common ones?  Which format? */
+    /* TODO */
+    env.push_back("QUERY6_TEXT=" + query->toText());
+}
+
 void extract_response4(std::vector<std::string>& env, const Pkt4Ptr response)
 {
     /* General information */
     env.push_back("RESPONSE4_TYPE=" + std::string(response->getName()));
 }
 
+void extract_response6(std::vector<std::string>& env, const Pkt6Ptr response)
+{
+    /* General information */
+    env.push_back("RESPONSE6_TYPE=" + std::string(response->getName()));
+    /* TODO, this may not always exist in the response */
+    env.push_back("RESPONSE6_ADDRESS=");
+    env.push_back("RESPONSE6_PREFERRED_LIFETIME=");
+    env.push_back("RESPONSE6_VALID_LIFETIME=");
+    /* TODO */
+    env.push_back("RESPONSE6_TEXT=" + response->toText());
+}
+
 void extract_subnet4(std::vector<std::string>& env, const Subnet4Ptr subnet)
 {
     env.push_back("SUBNET4=" + subnet->toText());
@@ -44,11 +69,24 @@ void extract_subnet4(std::vector<std::string>& env, const Subnet4Ptr subnet)
     env.push_back("SUBNET4_PREFIXLEN=" + std::to_string(prefix.second));
 }
 
+void extract_subnet6(std::vector<std::string>& env, const Subnet6Ptr subnet)
+{
+    env.push_back("SUBNET6=" + subnet->toText());
+    std::pair<isc::asiolink::IOAddress, uint8_t> prefix = subnet->get();
+    env.push_back("SUBNET6_PREFIX=" + prefix.first.toText());
+    env.push_back("SUBNET6_PREFIXLEN=" + std::to_string(prefix.second));
+}
+
 void extract_lease4(std::vector<std::string>& env, const Lease4Ptr lease)
 {
     env.push_back("LEASE4_ADDRESS=" + lease->addr_.toText());
 }
 
+void extract_lease6(std::vector<std::string>& env, const Lease6Ptr lease)
+{
+    env.push_back("LEASE6_ADDRESS=" + lease->addr_.toText());
+}
+
 /* IPv4 callouts */
 int pkt4_receive(CalloutHandle& handle) {
     std::vector<std::string> env;
@@ -183,5 +221,149 @@ int lease4_recover(CalloutHandle& handle) {
 }
 
 /* IPv6 callouts */
+int pkt6_receive(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Pkt6Ptr query;
+    handle.getArgument("query6", query);
+    extract_query6(env, query);
+    /* Run script */
+    int ret;
+    ret = run_script("pkt6_receive", env);
+    return 0;
+}
+
+int pkt6_send(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Pkt6Ptr query, response;
+    handle.getArgument("query6", query);
+    extract_query6(env, query);
+    handle.getArgument("response6", response);
+    extract_response6(env, response);
+    /* Run script */
+    int ret;
+    ret = run_script("pkt6_send", env);
+    return 0;
+}
+
+int subnet6_select(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Pkt6Ptr query;
+    Subnet6Ptr subnet;
+    handle.getArgument("query6", query);
+    extract_query6(env, query);
+    handle.getArgument("subnet6", subnet);
+    extract_subnet6(env, subnet);
+    /* Run script */
+    int ret;
+    ret = run_script("subnet6_select", env);
+    return 0;
+}
+
+int lease6_select(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Pkt6Ptr query;
+    Subnet6Ptr subnet;
+    bool fake_allocation;
+    Lease6Ptr lease;
+    handle.getArgument("query6", query);
+    extract_query6(env, query);
+    handle.getArgument("subnet6", subnet);
+    extract_subnet6(env, subnet);
+    handle.getArgument("fake_allocation", fake_allocation);
+    env.push_back("FAKE_ALLOCATION=" + fake_allocation ? "1" : "0");
+    handle.getArgument("lease6", lease);
+    extract_lease6(env, lease);
+    /* Run script */
+    int ret;
+    ret = run_script("lease6_select", env);
+    return 0;
+}
+
+int lease6_renew(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Pkt6Ptr query;
+    Lease6Ptr lease;
+    boost::shared_ptr<Option6IA> ia_na;
+    handle.getArgument("query6", query);
+    extract_query6(env, query);
+    handle.getArgument("lease6", lease);
+    extract_lease6(env, lease);
+    handle.getArgument("ia_na", ia_na);
+    /* TODO */
+    /* Run script */
+    int ret;
+    ret = run_script("lease6_renew", env);
+    return 0;
+}
+
+int lease6_rebind(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Pkt6Ptr query;
+    Lease6Ptr lease;
+    boost::shared_ptr<Option6IA> ia_na;
+    handle.getArgument("query6", query);
+    extract_query6(env, query);
+    handle.getArgument("lease6", lease);
+    extract_lease6(env, lease);
+    handle.getArgument("ia_na", ia_na);
+    /* TODO */
+    /* Run script */
+    int ret;
+    ret = run_script("lease6_rebind", env);
+    return 0;
+}
+
+int lease6_decline(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Pkt6Ptr query;
+    Lease6Ptr lease;
+    handle.getArgument("query6", query);
+    extract_query6(env, query);
+    handle.getArgument("lease6", lease);
+    extract_lease6(env, lease);
+    /* Run script */
+    int ret;
+    ret = run_script("lease6_decline", env);
+    return 0;
+}
+
+int lease6_release(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Pkt6Ptr query;
+    Lease6Ptr lease;
+    handle.getArgument("query6", query);
+    extract_query6(env, query);
+    handle.getArgument("lease6", lease);
+    extract_lease6(env, lease);
+    /* Run script */
+    int ret;
+    ret = run_script("lease6_release", env);
+    return 0;
+}
+
+int lease6_expire(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Lease6Ptr lease;
+    bool remove_lease;
+    handle.getArgument("lease6", lease);
+    extract_lease6(env, lease);
+    handle.getArgument("remove_lease", remove_lease);
+    env.push_back("REMOVE_LEASE=" + remove_lease ? "1" : "0");
+    /* Run script */
+    int ret;
+    ret = run_script("lease6_expire", env);
+    return 0;
+}
+
+int lease6_recover(CalloutHandle& handle) {
+    std::vector<std::string> env;
+    Lease6Ptr lease;
+    handle.getArgument("lease6", lease);
+    extract_lease6(env, lease);
+    /* Run script */
+    int ret;
+    ret = run_script("lease6_recover", env);
+    return 0;
+}
 
 } // end extern "C"