[NBS] Add support for ipv6 addresses. 54/139754/2
authorTomasz Marciniak <t.marciniak@samsung.com>
Thu, 13 Jul 2017 13:35:18 +0000 (15:35 +0200)
committerTomasz Marciniak <t.marciniak@samsung.com>
Thu, 20 Jul 2017 09:45:48 +0000 (11:45 +0200)
[Verification] Code compiles.
TCT pass rate is 100% (24/24/0/0/0)

Change-Id: Iee84d0ba90acfb78ed33c0f759430ffb05644efb
Signed-off-by: Tomasz Marciniak <t.marciniak@samsung.com>
src/networkbearerselection/networkbearerselection_manager.cc

index 34b23e1b758918a553bd378096a0d0f0b8cb578e..4c3ff436e3ed046aa684ab3a1069804c3699612b 100644 (file)
@@ -358,6 +358,7 @@ void NetworkBearerSelectionManager::registStateChangeListener(
   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;
 
@@ -365,6 +366,9 @@ void NetworkBearerSelectionManager::registStateChangeListener(
     if (interfaceName) {
       free(interfaceName);
     }
+    if (gateway) {
+      free(gateway);
+    }
     freeaddrinfo(servinfo);
   };
 
@@ -391,12 +395,15 @@ void NetworkBearerSelectionManager::registStateChangeListener(
 
     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();
@@ -414,8 +421,29 @@ void NetworkBearerSelectionManager::registStateChangeListener(
     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);