X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=blobdiff_plain;f=extras%2Fvom%2Fvom%2Fapi_types.cpp;h=4a81a41daa99b385228e1a1d3f0b677876085a7a;hp=53cd047332a9066d4a60084a143ed02c0b948510;hb=7c03ed4;hpb=e26c81fc80d1ce9a8746ebf4009149849b04f60f diff --git a/extras/vom/vom/api_types.cpp b/extras/vom/vom/api_types.cpp index 53cd047332a..4a81a41daa9 100644 --- a/extras/vom/vom/api_types.cpp +++ b/extras/vom/vom/api_types.cpp @@ -28,6 +28,21 @@ to_api(const ip_address_t& a, vapi_type_address& v) memcpy(v.un.ip6, a.to_v6().to_bytes().data(), 16); } } + +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 boost::asio::ip::address& a, vapi_type_ip4_address& v) { @@ -54,6 +69,26 @@ from_api(const vapi_type_address& v) return addr; } +ip_address_t +from_api(const vapi_union_address_union& u, vapi_enum_address_family af) +{ + boost::asio::ip::address addr; + + if (ADDRESS_IP6 == af) { + std::array a; + std::copy(u.ip6, u.ip6 + 16, std::begin(a)); + boost::asio::ip::address_v6 v6(a); + addr = v6; + } else { + std::array a; + std::copy(u.ip6, u.ip6 + 4, std::begin(a)); + boost::asio::ip::address_v4 v4(a); + addr = v4; + } + + return addr; +} + void to_api(const mac_address_t& a, vapi_type_mac_address& v) { @@ -80,6 +115,25 @@ to_api(const route::prefix_t& p) v.address_length = p.mask_width(); return v; } + +route::mprefix_t +from_api(const vapi_type_mprefix& v) +{ + return route::mprefix_t(from_api(v.src_address, v.af), + from_api(v.grp_address, v.af), v.grp_address_length); +} + +vapi_type_mprefix +to_api(const route::mprefix_t& p) +{ + vapi_enum_address_family af; + vapi_type_mprefix v; + to_api(p.grp_address(), v.grp_address, af); + to_api(p.src_address(), v.src_address, af); + v.grp_address_length = p.mask_width(); + v.af = af; + return v; +} }; /*