net_addr_s IpAddr; /** IP Address for the connection link */
char BNetmask; /** Whether subnet mask present or not. */
net_addr_s SubnetMask; /** Subnet mask */
+ int PrefixLen; /** IPv4 Prefix Length for the connection link */
char BDefGateway; /** Whether gateway address present or not */
net_addr_s GatewayAddr; /** Gateway address */
net_proxy_type_e ProxyMethod; /** Proxy Method type */
char ProxyAddr[NET_PROXY_LEN_MAX+1]; /** Proxy address */
char MacAddr[NET_MAX_MAC_ADDR_LEN+1]; /** MAC address */
net_addr_s IpAddr6; /** IP Address for the connection link */
- int PrefixLen6; /** Prefix Length for the connection link */
+ int PrefixLen6; /** IPv6 Prefix Length for the connection link */
char BDefGateway6; /** Whether gateway address present or not */
net_addr_s GatewayAddr6; /** Gateway address */
char Privacy6[NET_IPV6_MAX_PRIVACY_LEN+1]; /** Privacy of the connection link */
return Error;
}
+static int __net_get_prefix_len(const char *netmask)
+{
+ __NETWORK_FUNC_ENTER__;
+
+ in_addr_t mask = inet_network(netmask);
+ int prefix_len = 0;
+
+ for (; mask; mask <<= 1)
+ ++prefix_len;
+
+ __NETWORK_FUNC_EXIT__;
+
+ return prefix_len;
+}
+
static net_wifi_state_e __net_get_wifi_connection_state(net_err_e *net_error)
{
net_err_e Error = NET_ERR_NONE;
value = g_variant_get_string(var, NULL);
__net_extract_ip(value, &net_info->SubnetMask);
+ net_info->PrefixLen = __net_get_prefix_len(value);
net_info->BNetmask = TRUE;
} else if (g_strcmp0(subKey, "Gateway") == 0) {
value = g_variant_get_string(var, NULL);
value = g_variant_get_string(var, NULL);
__net_extract_ip(value, &net_info->SubnetMask);
+ net_info->PrefixLen = __net_get_prefix_len(value);
net_info->BNetmask = TRUE;
} else if (g_strcmp0(subKey, "Gateway") == 0 &&
net_info->GatewayAddr.Data.Ipv4.s_addr == 0) {
return buf;
}
+static int __ap_convert_netmask_to_prefix_len(const char *netmask)
+{
+ if (netmask == NULL)
+ return 0;
+
+ in_addr_t mask = inet_network(netmask);
+ int prefix_len = 0;
+
+ for (; mask; mask <<= 1)
+ ++prefix_len;
+
+ return prefix_len;
+}
+
+static in_addr_t __ap_convert_prefix_len_to_netmask(int prefix_len)
+{
+ return (prefix_len ? (in_addr_t) 0xFFFFFFFFu >> (32 - prefix_len) : 0);
+}
+
+
static bool _wifi_set_profile_name_to_ap(net_profile_info_s *ap_info)
{
char *profile_name = NULL;
else if (inet_pton(AF_INET, subnet_mask,
&(profile_info->net_info.SubnetMask.Data.Ipv4)) < 1)
return WIFI_MANAGER_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+
+ profile_info->net_info.PrefixLen = __ap_convert_netmask_to_prefix_len(subnet_mask);
}
return WIFI_MANAGER_ERROR_NONE;
net_profile_info_s *profile_info = ap;
- *prefix_len = profile_info->net_info.PrefixLen6;
+ if (address_family == WIFI_MANAGER_ADDRESS_FAMILY_IPV4)
+ *prefix_len = profile_info->net_info.PrefixLen;
+ else if (address_family == WIFI_MANAGER_ADDRESS_FAMILY_IPV6)
+ *prefix_len = profile_info->net_info.PrefixLen6;
return WIFI_MANAGER_ERROR_NONE;
}
net_profile_info_s *profile_info = ap;
- profile_info->net_info.PrefixLen6 = prefix_len;
+ if (address_family == WIFI_MANAGER_ADDRESS_FAMILY_IPV4) {
+ profile_info->net_info.PrefixLen = prefix_len;
+ profile_info->net_info.SubnetMask.Data.Ipv4.s_addr =
+ __ap_convert_prefix_len_to_netmask(prefix_len);
+ } else if (address_family == WIFI_MANAGER_ADDRESS_FAMILY_IPV6)
+ profile_info->net_info.PrefixLen6 = prefix_len;
return WIFI_MANAGER_ERROR_NONE;
}