Listen for AP_disconnect/STA_disconnect from WLAN-Driver and
post link-down event to IPACM CMD_queue

Change-Id: Ie6f4b161ca042bac0861e0c44329cd7008378a28
diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp
index 9b68171..bf21f3d 100644
--- a/ipacm/src/IPACM_Main.cpp
+++ b/ipacm/src/IPACM_Main.cpp
@@ -173,6 +173,7 @@
 
 	ipacm_cmd_q_data evt_data;
 	ipacm_event_data_mac *data = NULL;
+        ipacm_event_data_fid *data_fid = NULL;
 
 	fd = open(IPA_DRIVER, O_RDWR);
 	if (fd == 0)
@@ -186,6 +187,7 @@
 		memset(buffer, 0, sizeof(buffer));
 		memset(&evt_data, 0, sizeof(evt_data));
 		data = NULL;
+		data_fid = NULL;
 
 		length = read(fd, buffer, IPA_DRIVER_WLAN_BUF_LEN);
 		if (length < 0)
@@ -204,13 +206,6 @@
 		}
 
 		/* Insert WLAN_DRIVER_EVENT to command queue */
-		data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
-		if (data == NULL)
-		{
-			IPACMERR("unable to allocate memory for event data\n");
-			return NULL;
-		}
-		
 		switch (event_hdr->msg_type)
 		{
 
@@ -229,13 +224,31 @@
 			IPACMDBG("AP Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
-
-			memcpy(data->mac_addr,
-						 event->mac_addr,
-						 sizeof(event->mac_addr));
-			ipa_get_if_index(event->name, &(data->if_index));
+                        data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+			if(data_fid == NULL)
+			{
+				IPACMERR("unable to allocate memory for event data_fid\n");
+				return NULL;
+			}			
+			ipa_get_if_index(event->name, &(data_fid->if_index));
 			evt_data.event = IPA_WLAN_AP_LINK_UP_EVENT;
-			evt_data.evt_data = data;
+			evt_data.evt_data = data_fid;
+			break;
+
+		case WLAN_AP_DISCONNECT:
+			IPACMDBG("Received WLAN_AP_DISCONNECT name: %s\n",event->name);
+			IPACMDBG("AP Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
+							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
+							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
+                        data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+			if(data_fid == NULL)
+			{
+				IPACMERR("unable to allocate memory for event data_fid\n");
+				return NULL;
+			}			
+			ipa_get_if_index(event->name, &(data_fid->if_index));
+			evt_data.event = IPA_LINK_DOWN_EVENT;
+			evt_data.evt_data = data_fid;
 			break;
 
 		case WLAN_STA_CONNECT:
@@ -243,26 +256,51 @@
 			IPACMDBG("STA Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
-			memcpy(data->mac_addr,
-						 event->mac_addr,
-						 sizeof(event->mac_addr));
-			ipa_get_if_index(event->name, &(data->if_index));
-
+                        data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+			if(data_fid == NULL)
+			{
+				IPACMERR("unable to allocate memory for event data_fid\n");
+				return NULL;
+			}			
+			ipa_get_if_index(event->name, &(data_fid->if_index));
 			evt_data.event = IPA_WLAN_STA_LINK_UP_EVENT;
-			evt_data.evt_data = data;
+			evt_data.evt_data = data_fid;
+			break;
+
+		case WLAN_STA_DISCONNECT:
+			IPACMDBG("Received WLAN_STA_DISCONNECT name: %s\n",event->name);
+			IPACMDBG("STA Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
+							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
+							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
+                        data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+			if(data_fid == NULL)
+			{
+				IPACMERR("unable to allocate memory for event data_fid\n");
+				return NULL;
+			}			
+			ipa_get_if_index(event->name, &(data_fid->if_index));
+			evt_data.event = IPA_LINK_DOWN_EVENT;
+			evt_data.evt_data = data_fid;
 			break;
 						
+			
 		case WLAN_CLIENT_CONNECT:
 			IPACMDBG("Received WLAN_CLIENT_CONNECT\n");
 			IPACMDBG("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
-		  evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT;
-			evt_data.evt_data = data;
-			ipa_get_if_index(event->name, &(data->if_index));
+		        data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
+		        if (data == NULL)
+		        {
+		    	        IPACMERR("unable to allocate memory for event data\n");
+		    	        return NULL;
+		        }
 			memcpy(data->mac_addr,
 						 event->mac_addr,
 						 sizeof(event->mac_addr));
+			ipa_get_if_index(event->name, &(data->if_index));
+		        evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT;
+			evt_data.evt_data = data;
 			break;
 			
 		case WLAN_CLIENT_DISCONNECT:
@@ -270,11 +308,16 @@
 			IPACMDBG("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
+		        data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
+		        if (data == NULL)
+		        {
+		    	        IPACMERR("unable to allocate memory for event data\n");
+		    	        return NULL;
+		        }				 
 			memcpy(data->mac_addr,
 						 event->mac_addr,
 						 sizeof(event->mac_addr));
 			ipa_get_if_index(event->name, &(data->if_index));
-
 			evt_data.event = IPA_WLAN_CLIENT_DEL_EVENT;
 			evt_data.evt_data = data;			
 			break;
@@ -284,14 +327,18 @@
 			IPACMDBG("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
-
-			ipa_get_if_index(event->name, &(data->if_index));
-
-			evt_data.event = IPA_WLAN_CLIENT_POWER_SAVE_EVENT;
-			evt_data.evt_data = data;
+		        data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
+		        if (data == NULL)
+		        {
+		    	        IPACMERR("unable to allocate memory for event data\n");
+		    	        return NULL;
+		        }
 			memcpy(data->mac_addr,
 						 event->mac_addr,
 						 sizeof(event->mac_addr));			
+			ipa_get_if_index(event->name, &(data->if_index));
+			evt_data.event = IPA_WLAN_CLIENT_POWER_SAVE_EVENT;
+			evt_data.evt_data = data;
 			break;
 
 		case WLAN_CLIENT_NORMAL_MODE:
@@ -299,7 +346,12 @@
 			IPACMDBG("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
 							 event->mac_addr[0], event->mac_addr[1], event->mac_addr[2],
 							 event->mac_addr[3], event->mac_addr[4], event->mac_addr[5]); 
-
+		        data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
+		        if (data == NULL)
+		        {
+		    	       IPACMERR("unable to allocate memory for event data\n");
+		    	       return NULL;
+		        }
 			memcpy(data->mac_addr,
 						 event->mac_addr,
 						 sizeof(event->mac_addr));
@@ -310,17 +362,11 @@
 
 		default:
 			IPACMDBG("Unhandled message type: %d\n", event_hdr->msg_type);
-      free(data);
 			continue;
 
 		}
 
 		/* finish command queue */
-		if (evt_data.evt_data == NULL)
-		{
-			free(data);
-		}
-
 		IPACMDBG("Posting event:%d\n", evt_data.event);
 		IPACM_EvtDispatcher::PostEvt(&evt_data);
 	}