summaryrefslogtreecommitdiff
path: root/ipacm/src/IPACM_Iface.cpp
diff options
context:
space:
mode:
authorRavi Gummadidala <rgummadi@codeaurora.org>2013-04-15 08:48:24 -0700
committerRavi Gummadidala <rgummadi@codeaurora.org>2013-04-15 08:55:48 -0700
commit129c14cfc6b417d0beea7763b4412cabad3ccec6 (patch)
tree01fb1a4ef54c15414d73afb871033089319defdd /ipacm/src/IPACM_Iface.cpp
parent87b30d91f84558bca275282bd741f7c48cd1f1a4 (diff)
downloadipacfg-mgr-129c14cfc6b417d0beea7763b4412cabad3ccec6.tar.gz
Support if wlan ipv4 new_addr comes earlier than AP_connect
from WLAN_driver Change-Id: Idf222d0ac9a063af40e199387bffb71a4d434c8f
Diffstat (limited to 'ipacm/src/IPACM_Iface.cpp')
-rw-r--r--ipacm/src/IPACM_Iface.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index 2a9e144..c012287 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -359,6 +359,74 @@ int IPACM_Iface::iface_ipa_index_query
return link;
}
+/* Query ipa_interface ipv4_addr by given linux interface_index */
+void IPACM_Iface::iface_addr_query
+(
+ int interface_index
+)
+{
+ int fd;
+ struct ifreq ifr;
+ ipacm_cmd_q_data evt_data;
+ ipacm_event_data_addr *data_addr;
+ struct in_addr iface_ipv4;
+
+ /* Search/Configure linux interface-index and map it to IPA interface-index */
+ if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ {
+ PERROR("get interface name socket create failed");
+ return ;
+ }
+
+ memset(&ifr, 0, sizeof(struct ifreq));
+
+ ifr.ifr_ifindex = interface_index;
+ IPACMDBG("Interface index %d\n", interface_index);
+
+ if (ioctl(fd, SIOCGIFNAME, &ifr) < 0)
+ {
+ PERROR("call_ioctl_on_dev: ioctl failed:");
+ close(fd);
+ return ;
+ }
+ //close(fd);
+
+ ifr.ifr_addr.sa_family = AF_INET;
+ IPACMDBG("Interface index %d name: %s\n", interface_index,ifr.ifr_name);
+
+ if (ioctl(fd, SIOCGIFADDR, &ifr) < 0)
+ {
+ PERROR("call_ioctl_on_dev: ioctl failed:");
+ close(fd);
+ return ;
+ }
+ close(fd);
+
+ IPACMDBG("GOT interface (%s) address %s\n", ifr.ifr_name,inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
+ iface_ipv4 = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
+
+ data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
+ if(data_addr == NULL)
+ {
+ IPACMERR("unable to allocate memory for event data_addr\n");
+ return ;
+ }
+ data_addr->iptype = IPA_IP_v4;
+ data_addr->if_index = interface_index;
+ data_addr->ipv4_addr = iface_ipv4.s_addr;
+ data_addr->ipv4_addr = ntohl(data_addr->ipv4_addr);
+
+ IPACMDBG("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv4 addr:0x%x\n",
+ data_addr->if_index,
+ data_addr->ipv4_addr);
+
+ evt_data.event = IPA_ADDR_ADD_EVENT;
+ evt_data.evt_data = data_addr;
+ IPACM_EvtDispatcher::PostEvt(&evt_data);
+
+ return ;
+}
+
/*Query the IPA endpoint property */
int IPACM_Iface::query_iface_property(void)
{