Merge "PACM: fix missing RTM_NEWLINK for ECM disconnect"
diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp
index b5be24e..6fb037a 100644
--- a/ipacm/src/IPACM_Main.cpp
+++ b/ipacm/src/IPACM_Main.cpp
@@ -206,8 +206,9 @@
 	int length, fd, cnt;
 	char buffer[IPA_DRIVER_WLAN_BUF_LEN];
 	struct ipa_msg_meta *event_hdr = NULL;
-	struct ipa_wlan_msg *event = NULL;
 	struct ipa_wlan_msg_ex *event_ex = NULL;
+	struct ipa_wlan_msg *event_wlan = NULL;
+	struct ipa_ecm_msg *event_ecm = NULL;
 
 	ipacm_cmd_q_data evt_data;
 	ipacm_event_data_mac *data = NULL;
@@ -245,9 +246,13 @@
 			{
 				event_ex = (struct ipa_wlan_msg_ex *)(buffer + sizeof(struct ipa_msg_meta));
 			}
+			else if (event_hdr->msg_type < IPA_WLAN_EVENT_MAX)
+			{
+				event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta));	
+			}
 			else
 			{
-				event = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta));
+				event_ecm = (struct ipa_ecm_msg *)(buffer + sizeof(struct ipa_msg_meta));
 			}
 		}
 
@@ -266,65 +271,64 @@
 			break;
 
 		case WLAN_AP_CONNECT:
-			IPACMDBG("Received WLAN_AP_CONNECT name: %s\n",event->name);
+			IPACMDBG("Received WLAN_AP_CONNECT name: %s\n",event_wlan->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]); 
+							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
+							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->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");
+				IPACMERR("unable to allocate memory for event_wlan data_fid\n");
 				return NULL;
 			}			
-			ipa_get_if_index(event->name, &(data_fid->if_index));
+			ipa_get_if_index(event_wlan->name, &(data_fid->if_index));
 			evt_data.event = IPA_WLAN_AP_LINK_UP_EVENT;
 			evt_data.evt_data = data_fid;
 			break;
 
 		case WLAN_AP_DISCONNECT:
-			IPACMDBG("Received WLAN_AP_DISCONNECT name: %s\n",event->name);
+			IPACMDBG("Received WLAN_AP_DISCONNECT name: %s\n",event_wlan->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]); 
+							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
+							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->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");
+				IPACMERR("unable to allocate memory for event_wlan data_fid\n");
 				return NULL;
 			}			
-			ipa_get_if_index(event->name, &(data_fid->if_index));
+			ipa_get_if_index(event_wlan->name, &(data_fid->if_index));
 			evt_data.event = IPA_LINK_DOWN_EVENT;
 			evt_data.evt_data = data_fid;
 			break;
-
 		case WLAN_STA_CONNECT:
-			IPACMDBG("Received WLAN_STA_CONNECT name: %s\n",event->name);
+			IPACMDBG("Received WLAN_STA_CONNECT name: %s\n",event_wlan->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]); 
+							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
+							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->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");
+				IPACMERR("unable to allocate memory for event_wlan data_fid\n");
 				return NULL;
 			}			
-			ipa_get_if_index(event->name, &(data_fid->if_index));
+			ipa_get_if_index(event_wlan->name, &(data_fid->if_index));
 			evt_data.event = IPA_WLAN_STA_LINK_UP_EVENT;
 			evt_data.evt_data = data_fid;
 			break;
 
 		case WLAN_STA_DISCONNECT:
-			IPACMDBG("Received WLAN_STA_DISCONNECT name: %s\n",event->name);
+			IPACMDBG("Received WLAN_STA_DISCONNECT name: %s\n",event_wlan->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]); 
+							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
+							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->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");
+				IPACMERR("unable to allocate memory for event_wlan data_fid\n");
 				return NULL;
 			}			
-			ipa_get_if_index(event->name, &(data_fid->if_index));
+			ipa_get_if_index(event_wlan->name, &(data_fid->if_index));
 			evt_data.event = IPA_LINK_DOWN_EVENT;
 			evt_data.evt_data = data_fid;
 			break;
@@ -332,18 +336,18 @@
 		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]); 
+							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
+							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->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");
+		    	        IPACMERR("unable to allocate memory for event_wlan data\n");
 		    	        return NULL;
 		        }
 			memcpy(data->mac_addr,
-						 event->mac_addr,
-						 sizeof(event->mac_addr));
-			ipa_get_if_index(event->name, &(data->if_index));
+						 event_wlan->mac_addr,
+						 sizeof(event_wlan->mac_addr));
+			ipa_get_if_index(event_wlan->name, &(data->if_index));
 		        evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT;
 			evt_data.evt_data = data;
 			break;
@@ -388,18 +392,18 @@
 		case WLAN_CLIENT_DISCONNECT:
 			IPACMDBG("Received WLAN_CLIENT_DISCONNECT\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]); 
+							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
+							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->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");
+		    	        IPACMERR("unable to allocate memory for event_wlan data\n");
 		    	        return NULL;
 		        }				 
 			memcpy(data->mac_addr,
-						 event->mac_addr,
-						 sizeof(event->mac_addr));
-			ipa_get_if_index(event->name, &(data->if_index));
+						 event_wlan->mac_addr,
+						 sizeof(event_wlan->mac_addr));
+			ipa_get_if_index(event_wlan->name, &(data->if_index));
 			evt_data.event = IPA_WLAN_CLIENT_DEL_EVENT;
 			evt_data.evt_data = data;			
 			break;
@@ -407,18 +411,18 @@
 		case WLAN_CLIENT_POWER_SAVE_MODE:
 			IPACMDBG("Received WLAN_CLIENT_POWER_SAVE_MODE\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]); 
+							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
+							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->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");
+		    	        IPACMERR("unable to allocate memory for event_wlan data\n");
 		    	        return NULL;
 		        }
 			memcpy(data->mac_addr,
-						 event->mac_addr,
-						 sizeof(event->mac_addr));			
-			ipa_get_if_index(event->name, &(data->if_index));
+						 event_wlan->mac_addr,
+						 sizeof(event_wlan->mac_addr));			
+			ipa_get_if_index(event_wlan->name, &(data->if_index));
 			evt_data.event = IPA_WLAN_CLIENT_POWER_SAVE_EVENT;
 			evt_data.evt_data = data;
 			break;
@@ -426,22 +430,47 @@
 		case WLAN_CLIENT_NORMAL_MODE:
 			IPACMDBG("Received WLAN_CLIENT_NORMAL_MODE\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]); 
+							 event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2],
+							 event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->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");
+		    	       IPACMERR("unable to allocate memory for event_wlan data\n");
 		    	       return NULL;
 		        }
 			memcpy(data->mac_addr,
-						 event->mac_addr,
-						 sizeof(event->mac_addr));
-			ipa_get_if_index(event->name, &(data->if_index));
+						 event_wlan->mac_addr,
+						 sizeof(event_wlan->mac_addr));
+			ipa_get_if_index(event_wlan->name, &(data->if_index));
 			evt_data.evt_data = data;
 			evt_data.event = IPA_WLAN_CLIENT_RECOVER_EVENT;
 			break;
 
+		case ECM_CONNECT:
+			IPACMDBG("Received ECM_CONNECT name: %s\n",event_ecm->name);
+            data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+			if(data_fid == NULL)
+			{
+				IPACMERR("unable to allocate memory for event_ecm data_fid\n");
+				return NULL;
+			}
+			data_fid->if_index = event_ecm->ifindex;
+			evt_data.event = IPA_LINK_UP_EVENT;
+			evt_data.evt_data = data_fid;
+			break;
+
+		case ECM_DISCONNECT:
+			IPACMDBG("Received ECM_DISCONNECT name: %s\n",event_ecm->name);
+			data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+			if(data_fid == NULL)
+			{
+				IPACMERR("unable to allocate memory for event_ecm data_fid\n");
+				return NULL;
+			}
+			data_fid->if_index = event_ecm->ifindex;
+			evt_data.event = IPA_LINK_DOWN_EVENT;
+			evt_data.evt_data = data_fid;
+			break;
 		default:
 			IPACMDBG("Unhandled message type: %d\n", event_hdr->msg_type);
 			continue;