+void
+to_api(const ip_address_t& a,
+ vapi_union_address_union& u,
+ vapi_enum_address_family& af)
+{
+ if (a.is_v4()) {
+ af = ADDRESS_IP4;
+ memcpy(u.ip4, a.to_v4().to_bytes().data(), 4);
+ } else {
+ af = ADDRESS_IP6;
+ memcpy(u.ip6, a.to_v6().to_bytes().data(), 16);
+ }
+}
+
+void
+to_api(const ip_address_t& a, vapi_union_address_union& u)
+{
+ if (a.is_v4()) {
+ memcpy(u.ip4, a.to_v4().to_bytes().data(), 4);
+ } else {
+ memcpy(u.ip6, a.to_v6().to_bytes().data(), 16);
+ }
+}
+
+boost::asio::ip::address_v6
+from_api(const vapi_type_ip6_address& v)
+{
+ std::array<uint8_t, 16> a;
+ std::copy(v, v + 16, std::begin(a));
+ boost::asio::ip::address_v6 v6(a);
+
+ return v6;
+}
+
+boost::asio::ip::address_v4
+from_api(const vapi_type_ip4_address& v)
+{
+ std::array<uint8_t, 4> a;
+ std::copy(v, v + 4, std::begin(a));
+ boost::asio::ip::address_v4 v4(a);
+
+ return v4;
+}
+