Browse Source

Refactor code that parses DHCP packets

We want to parse both queries and responses, but they have the same type,
so just make the parsing code common.
Baptiste Jonglez 7 years ago
parent
commit
0184589ba7
1 changed files with 54 additions and 48 deletions
  1. 54 48
      src/callouts.cc

+ 54 - 48
src/callouts.cc

@@ -23,78 +23,84 @@ void extract_bool(std::vector<std::string>& env, const std::string variable, boo
     env.push_back(variable + "=" + std::string(value ? "1" : "0"));
 }
 
-void extract_query4(std::vector<std::string>& env, const Pkt4Ptr query)
+/* Extract information from a DHCPv4 packet (query received, or response
+ * about to be sent) */
+void extract_pkt4(std::vector<std::string>& env, const std::string envprefix, const Pkt4Ptr pkt4)
 {
     /* General information */
-    env.push_back("KEA_QUERY4_TYPE=" + std::string(query->getName()));
-    env.push_back("KEA_QUERY4_INTERFACE=" + query->getIface());
+    env.push_back(envprefix + "TYPE=" + std::string(pkt4->getName()));
+    env.push_back(envprefix + "INTERFACE=" + pkt4->getIface());
     /* Hardware address */
-    HWAddrPtr hwaddr = query->getMAC(HWAddr::HWADDR_SOURCE_ANY);
+    HWAddrPtr hwaddr = pkt4->getMAC(HWAddr::HWADDR_SOURCE_ANY);
     if (hwaddr) {
-        env.push_back("KEA_QUERY4_HWADDR=" + hwaddr->toText(false));
-        env.push_back("KEA_QUERY4_HWADDR_TYPE=" + std::to_string(hwaddr->htype_));
-        env.push_back("KEA_QUERY4_HWADDR_SOURCE=" + std::to_string(hwaddr->source_));
+        env.push_back(envprefix + "HWADDR=" + hwaddr->toText(false));
+        env.push_back(envprefix + "HWADDR_TYPE=" + std::to_string(hwaddr->htype_));
+        env.push_back(envprefix + "HWADDR_SOURCE=" + std::to_string(hwaddr->source_));
     } else {
-        env.push_back("KEA_QUERY4_HWADDR=");
-        env.push_back("KEA_QUERY4_HWADDR_TYPE=");
-        env.push_back("KEA_QUERY4_HWADDR_SOURCE=");
+        env.push_back(envprefix + "HWADDR=");
+        env.push_back(envprefix + "HWADDR_TYPE=");
+        env.push_back(envprefix + "HWADDR_SOURCE=");
     }
     /* Misc */
-    env.push_back("KEA_QUERY4_CIADDR=" + query->getCiaddr().toText());
-    env.push_back("KEA_QUERY4_SIADDR=" + query->getSiaddr().toText());
-    env.push_back("KEA_QUERY4_YIADDR=" + query->getYiaddr().toText());
-    env.push_back("KEA_QUERY4_GIADDR=" + query->getGiaddr().toText());
-    env.push_back("KEA_QUERY4_RELAYED=" + std::to_string(query->isRelayed()));
-    env.push_back("KEA_QUERY4_RELAY_HOPS=" + std::to_string(query->getHops()));
+    env.push_back(envprefix + "CIADDR=" + pkt4->getCiaddr().toText());
+    env.push_back(envprefix + "SIADDR=" + pkt4->getSiaddr().toText());
+    env.push_back(envprefix + "YIADDR=" + pkt4->getYiaddr().toText());
+    env.push_back(envprefix + "GIADDR=" + pkt4->getGiaddr().toText());
+    env.push_back(envprefix + "RELAYED=" + std::to_string(pkt4->isRelayed()));
+    env.push_back(envprefix + "RELAY_HOPS=" + std::to_string(pkt4->getHops()));
+
 }
 
-void extract_query6(std::vector<std::string>& env, const Pkt6Ptr query)
+void extract_query4(std::vector<std::string>& env, const Pkt4Ptr query)
+{
+    extract_pkt4(env, "KEA_QUERY4_", query);
+}
+
+void extract_response4(std::vector<std::string>& env, const Pkt4Ptr response)
+{
+    extract_pkt4(env, "KEA_RESPONSE4_", response);
+}
+
+/* Extract information from a DHCPv6 packet (query received, or response
+ * about to be sent) */
+void extract_pkt6(std::vector<std::string>& env, const std::string envprefix, const Pkt6Ptr pkt6)
 {
     /* General information */
-    env.push_back("KEA_QUERY6_TYPE=" + std::string(query->getName()));
-    env.push_back("KEA_QUERY6_INTERFACE=" + query->getIface());
-    env.push_back("KEA_QUERY6_IFINDEX=" + std::to_string(query->getIndex()));
-    HWAddrPtr hwaddr = query->getMAC(HWAddr::HWADDR_SOURCE_ANY);
+    env.push_back(envprefix + "TYPE=" + std::string(pkt6->getName()));
+    env.push_back(envprefix + "INTERFACE=" + pkt6->getIface());
+    env.push_back(envprefix + "IFINDEX=" + std::to_string(pkt6->getIndex()));
+    HWAddrPtr hwaddr = pkt6->getMAC(HWAddr::HWADDR_SOURCE_ANY);
     if (hwaddr) {
-        env.push_back("KEA_QUERY6_HWADDR=" + hwaddr->toText(false));
-        env.push_back("KEA_QUERY6_HWADDR_TYPE=" + std::to_string(hwaddr->htype_));
-        env.push_back("KEA_QUERY6_HWADDR_SOURCE=" + std::to_string(hwaddr->source_));
+        env.push_back(envprefix + "HWADDR=" + hwaddr->toText(false));
+        env.push_back(envprefix + "HWADDR_TYPE=" + std::to_string(hwaddr->htype_));
+        env.push_back(envprefix + "HWADDR_SOURCE=" + std::to_string(hwaddr->source_));
     } else {
-        env.push_back("KEA_QUERY6_HWADDR=");
-        env.push_back("KEA_QUERY6_HWADDR_TYPE=");
-        env.push_back("KEA_QUERY6_HWADDR_SOURCE=");
+        env.push_back(envprefix + "HWADDR=");
+        env.push_back(envprefix + "HWADDR_TYPE=");
+        env.push_back(envprefix + "HWADDR_SOURCE=");
     }
-    env.push_back("KEA_QUERY6_LOCAL_ADDRESS=" + query->getLocalAddr().toText());
-    env.push_back("KEA_QUERY6_LOCAL_PORT=" + std::to_string(query->getLocalPort()));
-    env.push_back("KEA_QUERY6_REMOTE_ADDRESS=" + query->getRemoteAddr().toText());
-    env.push_back("KEA_QUERY6_REMOTE_PORT=" + std::to_string(query->getRemotePort()));
-    env.push_back("KEA_QUERY6_LABEL=" + query->getLabel());
-    env.push_back("KEA_QUERY6_TRANSACTION_ID=" + std::to_string(query->getTransid()));
+    env.push_back(envprefix + "LOCAL_ADDRESS=" + pkt6->getLocalAddr().toText());
+    env.push_back(envprefix + "LOCAL_PORT=" + std::to_string(pkt6->getLocalPort()));
+    env.push_back(envprefix + "REMOTE_ADDRESS=" + pkt6->getRemoteAddr().toText());
+    env.push_back(envprefix + "REMOTE_PORT=" + std::to_string(pkt6->getRemotePort()));
+    env.push_back(envprefix + "LABEL=" + pkt6->getLabel());
+    env.push_back(envprefix + "TRANSACTION_ID=" + std::to_string(pkt6->getTransid()));
     /* TODO */
-    env.push_back("KEA_QUERY6_DUID=");
+    env.push_back(envprefix + "DUID=");
     /* TODO: all options?  Only common ones?  Which format? */
     /* TODO */
-    env.push_back("KEA_QUERY6_DEBUG=" + query->toText());
+    env.push_back(envprefix + "DEBUG=" + pkt6->toText());
 }
 
-void extract_response4(std::vector<std::string>& env, const Pkt4Ptr response)
+void extract_query6(std::vector<std::string>& env, const Pkt6Ptr query)
 {
-    /* General information */
-    env.push_back("KEA_RESPONSE4_TYPE=" + std::string(response->getName()));
-    env.push_back("KEA_RESPONSE4_INTERFACE=" + response->getIface());
+    extract_pkt6(env, "KEA_QUERY6_", query);
 }
 
+
 void extract_response6(std::vector<std::string>& env, const Pkt6Ptr response)
 {
-    /* General information */
-    env.push_back("KEA_RESPONSE6_TYPE=" + std::string(response->getName()));
-    env.push_back("KEA_RESPONSE6_INTERFACE=" + response->getIface());
-    /* TODO, this may not always exist in the response */
-    env.push_back("KEA_RESPONSE6_ADDRESS=");
-    env.push_back("KEA_RESPONSE6_PREFERRED_LIFETIME=");
-    env.push_back("KEA_RESPONSE6_VALID_LIFETIME=");
-    /* TODO */
-    env.push_back("KEA_RESPONSE6_DEBUG=" + response->toText());
+    extract_pkt6(env, "KEA_RESPONSE6_", response);
 }
 
 void extract_subnet4(std::vector<std::string>& env, const Subnet4Ptr subnet)