[Bugfix][API-1100]setup data call success,but iface is not set up 2

Change-Id: Ie6e9c6ad622f593039c8e6694bd405be26f70de0
(cherry picked from commit 73def6d19c0f893d7cdce18c522f5ed806f79f60)
diff --git a/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.c b/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.c
old mode 100644
new mode 100755
index f3201cc..ea0b0be
--- a/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.c
+++ b/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.c
@@ -180,6 +180,7 @@
     uint8_t v6_full_addr_count;
     mipc_v6_full_addr_struct4 *v6_full_addr_list_ptr;
     uint32_t cause;
+    mipc_msg_sim_ps_id_enum sim_ps_id;
 
     causeStr = (char *)calloc(1, MAX_CAUSE_LENGTH);
     if (causeStr == NULL){
@@ -198,6 +199,8 @@
 
     // get cmd
     cmd = mipc_msg_get_val_uint8(msg_ptr, MIPC_INTERNAL_EIF_IND_T_CMD, 0xff);
+    sim_ps_id = (mipc_msg_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id;
+    cmd_obj->sim_id = sim_ps_id;
 
     switch (cmd) {
         case MIPC_INTERNAL_EIF_IND_CMD_IFUP:
@@ -223,6 +226,7 @@
                     MEH_LOG_E("[MEH] can't allocate cmd_obj_for_mtu\n");
                     goto error;
                 }
+                cmd_obj_for_mtu->sim_id = cmd_obj->sim_id;
                 cmd_obj_for_mtu->cmd = NETAGENT_IO_CMD_SETMTU;
                 cmd_obj_for_mtu->parameter.mtu.mtu_size = mtu;
                 MEH_LOG_D("[MEH] EIF_IND cmd_obj_for_mtu->parameter.mtu.mtu_size=%d \n",
@@ -264,6 +268,20 @@
     }
 
     enqueueReqToNa(cmd_obj, REQUEST_TYPE_L5);
+    if (cmd == MIPC_INTERNAL_EIF_IND_CMD_IFUP && mtu > 0) {
+        // needs to update MTU size
+        cmd_obj_for_mtu = netagent_io_cmd_alloc(transid, NETAGENT_IO_CMD_MAX);
+        if (!cmd_obj_for_mtu) {
+            MEH_LOG_E("[MEH] can't allocate cmd_obj_for_mtu\n");
+            goto error;
+        }
+        cmd_obj_for_mtu->sim_id = cmd_obj->sim_id;
+        cmd_obj_for_mtu->cmd = NETAGENT_IO_CMD_SETMTU;
+        cmd_obj_for_mtu->parameter.mtu.mtu_size = mtu;
+        MEH_LOG_D("[MEH] EIF_IND cmd_obj_for_mtu->parameter.mtu.mtu_size=%d \n",
+                cmd_obj_for_mtu->parameter.mtu.mtu_size);
+        enqueueReqToNa(cmd_obj_for_mtu, REQUEST_TYPE_L5);
+    }
     return;
 
 error:
@@ -410,6 +428,7 @@
 
     //register MIPC_INTERNAL_EIF_IND
     mipc_msg_register_ind(MIPC_MSG_PS0, MIPC_INTERNAL_EIF_IND, (void *)onEifIndCallback, NULL);
+    mipc_msg_register_ind(MIPC_MSG_PS1, MIPC_INTERNAL_EIF_IND, (void *)onEifIndCallback, NULL);
 }
 
 unsigned int getIpAddrTypeFromMdMsg(uint8_t v4FullAddrCount, uint8_t v6FullAddrCount) {
@@ -537,8 +556,7 @@
     return 1;
 }
 
-int confirmInterfaceUpToMd(unsigned int transId) {
-    mipc_msg_t *msg_cnf_ptr;
+int confirmInterfaceUpToMd(unsigned int transId, int sim_ps_id) {
     mipc_msg_t *msg_req_ptr;
 
     if (transId == INVALID_TRANS_ID) {
@@ -547,19 +565,17 @@
     }
     MEH_LOG_D("[MEH] confirmInterfaceUpToMd: transId=%d \n", transId);
 
-    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, MIPC_MSG_PS0);
+    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);
     mipc_msg_add_tlv_uint32(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_TRANSID, transId);
     mipc_msg_add_tlv_uint32(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_CMD, MIPC_INTERNAL_EIF_REQ_CMD_IFUP);
 
-    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+    mipc_msg_async(msg_req_ptr, NULL, NULL);
     mipc_msg_deinit(msg_req_ptr);
-    mipc_msg_deinit(msg_cnf_ptr);
     MEH_LOG_D("[MEH] confirmInterfaceUpToMd: transId=%d done!\n", transId);
     return 1;
 }
 
-int confirmInterfaceDownToMd(unsigned int transId){
-    mipc_msg_t *msg_cnf_ptr;
+int confirmInterfaceDownToMd(unsigned int transId, int sim_ps_id){
     mipc_msg_t *msg_req_ptr;
 
     if (transId == INVALID_TRANS_ID) {
@@ -568,19 +584,17 @@
     }
     MEH_LOG_D("[MEH] confirmInterfaceDownToMd: transId=%d \n", transId);
 
-    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, MIPC_MSG_PS0);
+    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);
     mipc_msg_add_tlv_uint32(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_TRANSID, transId);
     mipc_msg_add_tlv_uint32(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_CMD, MIPC_INTERNAL_EIF_REQ_CMD_IFDOWN);
 
-    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+    mipc_msg_async(msg_req_ptr, NULL, NULL);
     mipc_msg_deinit(msg_req_ptr);
-    mipc_msg_deinit(msg_cnf_ptr);
     MEH_LOG_D("[MEH] confirmInterfaceDownToMd: transId=%d done!\n", transId);
     return 1;
 }
 
-int confirmIpUpdateToMd(unsigned int transId, netagent_io_addr_type_e addrType, unsigned int* addr, int ipv6PrefixLength){
-    mipc_msg_t *msg_cnf_ptr = NULL;
+int confirmIpUpdateToMd(unsigned int transId, netagent_io_addr_type_e addrType, unsigned int* addr, int ipv6PrefixLength, int sim_ps_id){
     mipc_msg_t *msg_req_ptr = NULL;
     mipc_full_addr_struct4 full_addr;
     int log_enable = getCfgValue("enable_sensitive_log");
@@ -591,7 +605,7 @@
     }
     MEH_LOG_D("[MEH] confirmIpUpdateToMd: transId=%d addrType=%02X\n", transId, addrType);
 
-    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, MIPC_MSG_PS0);
+    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);
     mipc_msg_add_tlv_uint32(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_TRANSID, transId);
     mipc_msg_add_tlv_uint32(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_CMD, MIPC_INTERNAL_EIF_REQ_CMD_IPUPDATE);
 
@@ -621,22 +635,18 @@
     }
     mipc_msg_add_tlv(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_NEW_ADDR, sizeof(full_addr), &full_addr);
 
-    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+    mipc_msg_async(msg_req_ptr, NULL, NULL);
     mipc_msg_deinit(msg_req_ptr);
-    mipc_msg_deinit(msg_cnf_ptr);
     MEH_LOG_D("[MEH] confirmIpUpdateToMd: transId=%d done!\n", transId);
     return 1;
 
 error:
     if (msg_req_ptr != NULL)
         mipc_msg_deinit(msg_req_ptr);
-    if (msg_cnf_ptr != NULL)
-        mipc_msg_deinit(msg_cnf_ptr);
     return 0;
 }
 
-int confirmNoRaToMd(unsigned int transId, netagent_io_ra_e flag) {
-    mipc_msg_t *msg_cnf_ptr;
+int confirmNoRaToMd(unsigned int transId, netagent_io_ra_e flag, int sim_ps_id) {
     mipc_msg_t *msg_req_ptr;
 
     if (transId == INVALID_TRANS_ID) {
@@ -645,7 +655,7 @@
     }
     MEH_LOG_D("[MEH] confirmNoRaToMd: transId=%d RA_FALG=%d\n", transId, flag);
 
-    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, MIPC_MSG_PS0);
+    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);
     mipc_msg_add_tlv_uint32(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_TRANSID, transId);
 
     if (flag == NETAGENT_IO_NO_RA_INITIAL) {
@@ -658,16 +668,15 @@
         return 0;
     }
 
-    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+    mipc_msg_async(msg_req_ptr, NULL, NULL);
 
     mipc_msg_deinit(msg_req_ptr);
-    mipc_msg_deinit(msg_cnf_ptr);
     MEH_LOG_D("[MEH] confirmNoRaToMd: transId=%d done!\n", transId);
     return 1;
 }
 
-int confirmIpAddOrDelToMd(unsigned int transId, netagent_io_cmd_e cmd, int result, netagent_io_addr_type_e addrType, unsigned int* addr, int ipv6PrefixLength) {
-    mipc_msg_t *msg_cnf_ptr = NULL;
+int confirmIpAddOrDelToMd(unsigned int transId, netagent_io_cmd_e cmd, int result,
+        netagent_io_addr_type_e addrType, unsigned int* addr, int ipv6PrefixLength, int sim_ps_id) {
     mipc_msg_t *msg_req_ptr = NULL;
     mipc_full_addr_struct4 full_addr;
     int log_enable = getCfgValue("enable_sensitive_log");
@@ -678,7 +687,7 @@
     }
     MEH_LOG_D("[MEH] confirmIpAddOrDelToMd: transId=%d cmd=%d addrType=%02X\n", transId, cmd, addrType);
 
-    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, MIPC_MSG_PS0);
+    msg_req_ptr = mipc_msg_init(MIPC_INTERNAL_EIF_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);
     mipc_msg_add_tlv_uint32(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_TRANSID, transId);
 
     if (cmd == NETAGENT_IO_CMD_IPADD) {
@@ -716,18 +725,15 @@
     }
     mipc_msg_add_tlv(msg_req_ptr, MIPC_INTERNAL_EIF_REQ_T_NEW_ADDR, sizeof(full_addr), &full_addr);
 
-    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+    mipc_msg_async(msg_req_ptr, NULL, NULL);
 
     mipc_msg_deinit(msg_req_ptr);
-    mipc_msg_deinit(msg_cnf_ptr);
     MEH_LOG_D("[MEH] confirmIpAddOrDelToMd: transId=%d done!\n", transId);
     return 1;
 
 error:
     if (msg_req_ptr != NULL)
         mipc_msg_deinit(msg_req_ptr);
-    if (msg_cnf_ptr != NULL)
-        mipc_msg_deinit(msg_cnf_ptr);
     return 0;
 }
 
diff --git a/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.h b/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.h
old mode 100644
new mode 100755
index a8a1e3e..758c719
--- a/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.h
+++ b/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.h
@@ -72,11 +72,11 @@
 int copyIpAddressToReqInfo(netagent_io_cmd_obj_t *cmd_obj, mipc_v4_full_addr_struct4 *ipV4list, mipc_v6_full_addr_struct4 *ipV6list);

 

 

-int confirmInterfaceUpToMd(unsigned int transId);

-int confirmInterfaceDownToMd(unsigned int transId);

-int confirmIpUpdateToMd(unsigned int transId, netagent_io_addr_type_e addrType, unsigned int* addr, int ipv6PrefixLength);

-int confirmNoRaToMd(unsigned int transId, netagent_io_ra_e flag);

-int confirmIpAddOrDelToMd(unsigned int transId, netagent_io_cmd_e cmd, int result, netagent_io_addr_type_e addrType, unsigned int* addr, int ipv6PrefixLength);

+int confirmInterfaceUpToMd(unsigned int transId, int sim_ps_id);

+int confirmInterfaceDownToMd(unsigned int transId, int sim_ps_id);

+int confirmIpUpdateToMd(unsigned int transId, netagent_io_addr_type_e addrType, unsigned int* addr, int ipv6PrefixLength, int sim_ps_id);

+int confirmNoRaToMd(unsigned int transId, netagent_io_ra_e flag, int sim_ps_id);

+int confirmIpAddOrDelToMd(unsigned int transId, netagent_io_cmd_e cmd, int result, netagent_io_addr_type_e addrType, unsigned int* addr, int ipv6PrefixLength, int sim_ps_id);

 int confirmTcpUdpRsvnToMd(unsigned int transId, netagent_io_cmd_e cmd, uint8_t rsvnAction, unsigned int response);

 // Sensitive log control

 int getCfgValue(char *name);

diff --git a/src/telephonyware/3.0/netagent/src/libnetagent/NetAgentService.cpp b/src/telephonyware/3.0/netagent/src/libnetagent/NetAgentService.cpp
old mode 100644
new mode 100755
index 777a4e1..343f8de
--- a/src/telephonyware/3.0/netagent/src/libnetagent/NetAgentService.cpp
+++ b/src/telephonyware/3.0/netagent/src/libnetagent/NetAgentService.cpp
@@ -82,7 +82,7 @@
     pthread_cond_init(&mDispatchCond, NULL);
     m_lTransIntfId.clear();
     isMultiHomingFeatureSupport = false;
-
+    m_wait_v6_sim_id = 0;
 
     for (int i = 0; i < 2; i++) {
         cbUpdateKernelAddress[i] = NULL;
@@ -548,8 +548,10 @@
     char addressV4[MAX_IPV4_ADDRESS_LENGTH] = {0};
     char addressV6[MAX_IPV6_ADDRESS_LENGTH] = {0};
     char *reason = NULL;
+    int sim_id = 0;
 
     NA_GET_IFST_STATE(config, state);
+    NA_GET_SIM_ID(pReqInfo->pNetAgentCmdObj, &sim_id);
 
     if (NA_GET_IF_ID(pReqInfo->pNetAgentCmdObj, &interfaceId) != NETAGENT_IO_RET_SUCCESS) {
         NA_LOG_E("[%s] fail to get interface id", __FUNCTION__);
@@ -669,7 +671,7 @@
                     confirmIpUpdateToMd(transId,
                         NETAGENT_IO_ADDR_TYPE_IPv4,
                         &addrV4_,
-                        INVALID_IPV6_PREFIX_LENGTH);
+                        INVALID_IPV6_PREFIX_LENGTH, sim_id);
                 } else {
                     NA_LOG_E("[%s] error occurs when get addressV4", __FUNCTION__);
                 }
@@ -685,9 +687,10 @@
         //confirmInterfaceState(interfaceId, state, addrType);
         NA_LOG_D("[%s] send confirm %d to L5", __FUNCTION__, state);
         if (config == ENABLE) {
-            confirmInterfaceUpToMd(getTransIntfId(interfaceId));
+            confirmInterfaceUpToMd(getTransIntfId(interfaceId), sim_id);
+            m_wait_v6_sim_id = sim_id;
         } else {
-            confirmInterfaceDownToMd(getTransIntfId(interfaceId));
+            confirmInterfaceDownToMd(getTransIntfId(interfaceId), sim_id);
         }
         NA_LOG_D("[%s] confirm complete!", __FUNCTION__);
     }
@@ -742,6 +745,9 @@
     char addressV6[MAX_IPV6_ADDRESS_LENGTH] = {0};
     unsigned int addrV6_binary[4] = {0};
     int log_enable = getCfgValue("enable_sensitive_log");
+    int sim_id = 0;
+
+    NA_GET_SIM_ID(pReqInfo->pNetAgentCmdObj, &sim_id);
 
     // get interface id
     if (NA_GET_IF_ID(pReqInfo->pNetAgentCmdObj, &interfaceId) != NETAGENT_IO_RET_SUCCESS) {
@@ -792,7 +798,7 @@
                 result = 0;
             }
             //confirmIpAddOrDel(interfaceId, NETAGENT_IO_CMD_IPADD, result, addrType, addrV6_binary, INVALID_IPV6_PREFIX_LENGTH);
-            confirmIpAddOrDelToMd(getTransIntfId(interfaceId), NETAGENT_IO_CMD_IPADD, result, addrType, addrV6_binary, INVALID_IPV6_PREFIX_LENGTH);
+            confirmIpAddOrDelToMd(getTransIntfId(interfaceId), NETAGENT_IO_CMD_IPADD, result, addrType, addrV6_binary, INVALID_IPV6_PREFIX_LENGTH, sim_id);
         } else {
             NA_LOG_E("[%s] is not link local address", __FUNCTION__);
             return;
@@ -812,6 +818,9 @@
     char addressV6[MAX_IPV6_ADDRESS_LENGTH] = {0};
     unsigned int addrV6_binary[4] = {0};
     int log_enable = getCfgValue("enable_sensitive_log");
+    int sim_id = 0;
+
+    NA_GET_SIM_ID(pReqInfo->pNetAgentCmdObj, &sim_id);
 
     // get interface id
     if (NA_GET_IF_ID(pReqInfo->pNetAgentCmdObj, &interfaceId) != NETAGENT_IO_RET_SUCCESS) {
@@ -859,7 +868,8 @@
         }
         recordPdnIpInfo(interfaceId, addrType,addressV4, addressV6);
         //confirmIpAddOrDel(interfaceId, NETAGENT_IO_CMD_IPDEL, result, addrType, addrV6_binary, INVALID_IPV6_PREFIX_LENGTH);
-        confirmIpAddOrDelToMd(getTransIntfId(interfaceId), NETAGENT_IO_CMD_IPDEL, result, addrType, addrV6_binary, INVALID_IPV6_PREFIX_LENGTH);
+        confirmIpAddOrDelToMd(getTransIntfId(interfaceId), NETAGENT_IO_CMD_IPDEL, result, addrType, addrV6_binary, INVALID_IPV6_PREFIX_LENGTH, sim_id);
+
     } else {
         NA_LOG_E("[%s] not get address", __FUNCTION__);
         return;
@@ -1769,14 +1779,14 @@
             cmd = (action == ACTION_ADDR_UPDATED) ? NETAGENT_IO_CMD_IPADD : NETAGENT_IO_CMD_IPDEL;
             result = 99;
             //confirmIpAddOrDel(interfaceId, cmd, result, NETAGENT_IO_ADDR_TYPE_IPv6, addrV6_, ipv6PrefixLength);
-            confirmIpAddOrDelToMd(getTransIntfId(interfaceId), cmd, result, NETAGENT_IO_ADDR_TYPE_IPv6, addrV6_, ipv6PrefixLength);
+            confirmIpAddOrDelToMd(getTransIntfId(interfaceId), cmd, result, NETAGENT_IO_ADDR_TYPE_IPv6, addrV6_, ipv6PrefixLength, m_wait_v6_sim_id);
 
         } else {
             //confirmIpUpdate(interfaceId, NETAGENT_IO_ADDR_TYPE_IPv6, addrV6_, ipv6PrefixLength);
             confirmIpUpdateToMd(getTransIntfId(interfaceId),
                     NETAGENT_IO_ADDR_TYPE_IPv6,
                     addrV6_,
-                    INVALID_IPV6_PREFIX_LENGTH);
+                    INVALID_IPV6_PREFIX_LENGTH, m_wait_v6_sim_id);
         }
 
         if (m_pRouteHandler->setLastReqInfo(pReqInfo->pNetAgentCmdObj) != NETLINK_RET_SUCCESS) {
@@ -1784,7 +1794,7 @@
         }
     } else if (action == ACTION_ADDR_REMOVED && isNoRA(address, &flag)) {
         //confirmNoRA(interfaceId, flag);
-        confirmNoRaToMd(getTransIntfId(interfaceId), flag);
+        confirmNoRaToMd(getTransIntfId(interfaceId), flag, m_wait_v6_sim_id);
     }
 }
 
@@ -1963,6 +1973,9 @@
     unsigned int addrV4_;
     unsigned int addrV6_[4];
     int log_enable = getCfgValue("enable_sensitive_log");
+    int sim_id = 0;
+
+    NA_GET_SIM_ID(pReqInfo->pNetAgentCmdObj, &sim_id);
 
     if (NA_GET_IF_ID(pReqInfo->pNetAgentCmdObj, &interfaceId) != NETAGENT_IO_RET_SUCCESS) {
         NA_LOG_E("[%s] fail to get interface id", __FUNCTION__);
@@ -2076,7 +2089,7 @@
             //        NETAGENT_IO_ADDR_TYPE_IPv4,
             //        &addrV4_,
             //        INVALID_IPV6_PREFIX_LENGTH);
-            confirmIpUpdateToMd(getTransIntfId(interfaceId), NETAGENT_IO_ADDR_TYPE_IPv4, &addrV4_, INVALID_IPV6_PREFIX_LENGTH);
+            confirmIpUpdateToMd(getTransIntfId(interfaceId), NETAGENT_IO_ADDR_TYPE_IPv4, &addrV4_, INVALID_IPV6_PREFIX_LENGTH, sim_id);
             break;
         default:
             // No address, shall not go to here.
diff --git a/src/telephonyware/3.0/netagent/src/libnetagent/NetAgentService.h b/src/telephonyware/3.0/netagent/src/libnetagent/NetAgentService.h
old mode 100644
new mode 100755
index dbc2f35..1e43e54
--- a/src/telephonyware/3.0/netagent/src/libnetagent/NetAgentService.h
+++ b/src/telephonyware/3.0/netagent/src/libnetagent/NetAgentService.h
@@ -163,6 +163,7 @@
 #define NA_GET_ADDR_V4(a, b) netagent_io_get_addr_v4(a, b)
 #define NA_GET_ADDR_V6(a, b) netagent_io_get_addr_v6(a, b)
 #define NA_GET_IP_CHANGE_REASON(a, b) netagent_io_get_ip_change_reason(a, b)
+#define NA_GET_SIM_ID(a, b) netagent_io_get_sim_id(a, b)
 #define NA_GET_PDN_HO_INFO(a, b) netagent_io_get_pdnho_info(a, b)
 //#define NA_FLUSH_IPSEC_POLICY(a, b) netagent_io_flush_ipsec_policy(a, b)
 #define NA_GET_NAPTR(a, b) netagent_io_get_naptr(a, b)
@@ -440,6 +441,7 @@
         std::map<int, int> m_rsvnFdMap;
 
         bool isMultiHomingFeatureSupport;
+        int m_wait_v6_sim_id;
 };
 
 #endif /* __NET_AGENT_SERVICE_H__ */
diff --git a/src/telephonyware/3.0/netagent/src/libnetagent/nautils/common/ioutils/netagent_io.c b/src/telephonyware/3.0/netagent/src/libnetagent/nautils/common/ioutils/netagent_io.c
old mode 100644
new mode 100755
index 915dfa3..b4b379a
--- a/src/telephonyware/3.0/netagent/src/libnetagent/nautils/common/ioutils/netagent_io.c
+++ b/src/telephonyware/3.0/netagent/src/libnetagent/nautils/common/ioutils/netagent_io.c
@@ -467,6 +467,20 @@
 }
 
 int
+netagent_io_get_sim_id(void *co, int *sim_id) {
+    netagent_io_cmd_obj_t   *cmd_obj = co;
+
+    if (!cmd_obj) {
+        ErrMsg("obj is NULL");
+        return NETAGENT_IO_RET_GENERIC_FAILURE;
+    }
+
+    *sim_id = cmd_obj->sim_id;
+    return NETAGENT_IO_RET_SUCCESS;
+}
+
+
+int
 netagent_io_get_cmd_type(void *co, netagent_io_cmd_e *cmd) {
     netagent_io_cmd_obj_t   *cmd_obj = co;
 
diff --git a/src/telephonyware/3.0/netagent/src/libnetagent/nautils/include/ioutils/netagent_io.h b/src/telephonyware/3.0/netagent/src/libnetagent/nautils/include/ioutils/netagent_io.h
old mode 100644
new mode 100755
index 6c8e6e0..59c7ef9
--- a/src/telephonyware/3.0/netagent/src/libnetagent/nautils/include/ioutils/netagent_io.h
+++ b/src/telephonyware/3.0/netagent/src/libnetagent/nautils/include/ioutils/netagent_io.h
@@ -213,6 +213,7 @@
     unsigned int    trans_intf_id;
     unsigned int    cmd;
     char*           reason;
+    int             sim_id;
     union {
         netagent_io_ifst_parameter_t        ifst;   // cmd = NETAGENT_IO_CMD_IFST
         netagent_io_mtu_parameter_t         mtu;    // cmd = NETAGENT_IO_CMD_SETMTU
@@ -266,6 +267,7 @@
 
 int netagent_io_get_if_id(void *co, unsigned int *if_id);
 int netagent_io_get_ip_change_reason(void *co, char **reason);
+int netagent_io_get_sim_id(void *co, int* sim_id);
 int netagent_io_get_cmd_type(void *co, netagent_io_cmd_e *cmd);
 int netagent_io_get_addr_type(void *co, netagent_io_addr_type_e *addr_type);
 int netagent_io_get_mtu_size(void *co, unsigned int *mtu_size);