IPACM: fix the issue of missing first new neighbor message
IPACM internally posts new neighbor event containing interface
ID and client MAC address when receiving WLAN_CLIENT_CONNECT_EX event.
This fixed the issue of missing first new neighbor event when
we switch a client between 2 APs.
Change-Id: Ic5886b270b2f1ebfef928d36aedc471714728dfd
diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp
index 39a31f5..8e08410 100644
--- a/ipacm/src/IPACM_Main.cpp
+++ b/ipacm/src/IPACM_Main.cpp
@@ -270,6 +270,9 @@
ipacm_event_data_iptype *data_iptype = NULL;
ipacm_event_data_wlan_ex *data_ex;
+ ipacm_cmd_q_data new_neigh_evt;
+ ipacm_event_data_all* new_neigh_data;
+
fd = open(IPA_DRIVER, O_RDWR);
if (fd == 0)
{
@@ -282,6 +285,8 @@
IPACMDBG_H("Waiting for nofications from IPA driver \n");
memset(buffer, 0, sizeof(buffer));
memset(&evt_data, 0, sizeof(evt_data));
+ memset(&new_neigh_evt, 0, sizeof(ipacm_cmd_q_data));
+ new_neigh_data = NULL;
data = NULL;
data_fid = NULL;
@@ -404,6 +409,7 @@
case WLAN_CLIENT_CONNECT_EX:
IPACMDBG_H("Received WLAN_CLIENT_CONNECT_EX\n");
+
memcpy(&event_ex_o, buffer + sizeof(struct ipa_msg_meta),sizeof(struct ipa_wlan_msg_ex));
if(event_ex_o.num_of_attribs > IPA_DRIVER_WLAN_EVENT_MAX_OF_ATTRIBS)
{
@@ -430,10 +436,25 @@
memcpy(data_ex->attribs,
event_ex->attribs,
event_ex->num_of_attribs * sizeof(ipa_wlan_hdr_attrib_val));
+
+ ipa_get_if_index(event_ex->name, &(data_ex->if_index));
+ evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT_EX;
+ evt_data.evt_data = data_ex;
+
+ /* Construct new_neighbor msg with netdev device internally */
+ new_neigh_data = (ipacm_event_data_all*)malloc(sizeof(ipacm_event_data_all));
+ if(new_neigh_data == NULL)
+ {
+ IPACMERR("Failed to allocate memory.\n");
+ return NULL;
+ }
+ memset(new_neigh_data, 0, sizeof(ipacm_event_data_all));
+ new_neigh_data->iptype = IPA_IP_v6;
for(cnt = 0; cnt < event_ex->num_of_attribs; cnt++)
{
if(event_ex->attribs[cnt].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR)
{
+ memcpy(new_neigh_data->mac_addr, event_ex->attribs[cnt].u.mac_addr, sizeof(new_neigh_data->mac_addr));
IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
event_ex->attribs[cnt].u.mac_addr[0], event_ex->attribs[cnt].u.mac_addr[1], event_ex->attribs[cnt].u.mac_addr[2],
event_ex->attribs[cnt].u.mac_addr[3], event_ex->attribs[cnt].u.mac_addr[4], event_ex->attribs[cnt].u.mac_addr[5]);
@@ -447,10 +468,9 @@
IPACMDBG_H("Wlan message has unexpected type!\n");
}
}
-
- ipa_get_if_index(event_ex->name, &(data_ex->if_index));
- evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT_EX;
- evt_data.evt_data = data_ex;
+ new_neigh_data->if_index = data_ex->if_index;
+ new_neigh_evt.evt_data = (void*)new_neigh_data;
+ new_neigh_evt.event = IPA_NEW_NEIGH_EVENT;
free(event_ex);
break;
@@ -598,6 +618,12 @@
/* finish command queue */
IPACMDBG_H("Posting event:%d\n", evt_data.event);
IPACM_EvtDispatcher::PostEvt(&evt_data);
+ /* push new_neighbor with netdev device internally */
+ if(new_neigh_data != NULL)
+ {
+ IPACMDBG_H("Internally post event IPA_NEW_NEIGH_EVENT\n");
+ IPACM_EvtDispatcher::PostEvt(&new_neigh_evt);
+ }
}
(void)close(fd);
diff --git a/ipacm/src/IPACM_Neighbor.cpp b/ipacm/src/IPACM_Neighbor.cpp
index d122b92..91facbd 100644
--- a/ipacm/src/IPACM_Neighbor.cpp
+++ b/ipacm/src/IPACM_Neighbor.cpp
@@ -328,15 +328,14 @@
/* use previous ipv4 first */
if(data->if_index != neighbor_client[i].iface_index)
{
- IPACMERR("update new kernel iface index \n");
+ IPACMDBG_H("update new kernel iface index \n");
neighbor_client[i].iface_index = data->if_index;
}
/* check if client associated with previous network interface */
if(ipa_interface_index != neighbor_client[i].ipa_if_num)
{
- IPACMERR("client associate to different AP \n");
- return;
+ IPACMDBG_H("client associate to different AP \n");
}
if (neighbor_client[i].v4_addr != 0) /* not 0.0.0.0 */