LoggerD("enter");
char* interfaceName = nullptr;
char* hostAddr = nullptr;
+ char* gateway = nullptr;
std::unique_ptr<char, void(*)(void*)> host_addr_ptr(nullptr, &std::free);
struct addrinfo* servinfo = nullptr;
if (interfaceName) {
free(interfaceName);
}
+ if (gateway) {
+ free(gateway);
+ }
freeaddrinfo(servinfo);
};
struct in_addr *addr = nullptr;
if (AF_INET == servinfo->ai_family) {
+ LoggerD("IPv4 address");
struct sockaddr_in *ipv = (struct sockaddr_in *)servinfo->ai_addr;
addr = &(ipv->sin_addr);
} else {
+ LoggerD("IPv6 address");
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)servinfo->ai_addr;
addr = (struct in_addr *) &(ipv6->sin6_addr);
}
+
if (nullptr == inet_ntop(servinfo->ai_family, addr, hostAddr, servinfo->ai_addrlen)) {
LoggerE("Error while calling inet_ntop()");
destroyProfileHandle();
LoggerE("Callback register is failed.");
destroyProfileHandle();
} else {
- if (connection_add_route(m_connection_handle_, interfaceName, hostAddr) !=
- CONNECTION_ERROR_NONE) {
+ int ret = CONNECTION_ERROR_NONE;
+ if (AF_INET == servinfo->ai_family) {
+ LoggerD("IPv4 add route");
+ ret = connection_add_route(m_connection_handle_, interfaceName, hostAddr);
+ } else if (AF_INET6 == servinfo->ai_family) {
+ LoggerD("IPv6 add route");
+ ret = connection_profile_get_gateway_address(
+ m_profile_handle_, CONNECTION_ADDRESS_FAMILY_IPV6, &gateway);
+
+ if (CONNECTION_ERROR_NONE != ret) {
+ LoggerD("Error %d", ret);
+ makeErrorCallback(domain_name, kPlatformError);
+ return;
+ }
+
+ ret = connection_add_route_ipv6(m_connection_handle_, interfaceName, hostAddr, gateway);
+ } else {
+ LoggerE("Unknown ai_family address");
+ makeErrorCallback(domain_name, kPlatformError);
+ return;
+ }
+
+ if (CONNECTION_ERROR_NONE != ret) {
LoggerE("add route is failed.");
connection_profile_unset_state_changed_cb(m_profile_handle_);
makeErrorCallback(domain_name, kPlatformError);