You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

446 lines
21 KiB

2 years ago
  1. /******************************************************************************
  2. @file MPQMUX.c
  3. @brief QMI mux.
  4. DESCRIPTION
  5. Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.
  6. INITIALIZATION AND SEQUENCING REQUIREMENTS
  7. None.
  8. ---------------------------------------------------------------------------
  9. Copyright (c) 2016 - 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
  10. Quectel Wireless Solution Proprietary and Confidential.
  11. ---------------------------------------------------------------------------
  12. ******************************************************************************/
  13. #include "QMIThread.h"
  14. static char line[1024];
  15. static pthread_mutex_t dumpQMIMutex = PTHREAD_MUTEX_INITIALIZER;
  16. #undef dbg
  17. #define dbg( format, arg... ) do {if (strlen(line) < sizeof(line)) snprintf(&line[strlen(line)], sizeof(line) - strlen(line), format, ## arg);} while (0)
  18. PQMI_TLV_HDR GetTLV (PQCQMUX_MSG_HDR pQMUXMsgHdr, int TLVType);
  19. typedef struct {
  20. UINT type;
  21. const char *name;
  22. } QMI_NAME_T;
  23. #define qmi_name_item(type) {type, #type}
  24. #if 0
  25. static const QMI_NAME_T qmi_IFType[] = {
  26. {USB_CTL_MSG_TYPE_QMI, "USB_CTL_MSG_TYPE_QMI"},
  27. };
  28. static const QMI_NAME_T qmi_CtlFlags[] = {
  29. qmi_name_item(QMICTL_CTL_FLAG_CMD),
  30. qmi_name_item(QCQMI_CTL_FLAG_SERVICE),
  31. };
  32. static const QMI_NAME_T qmi_QMIType[] = {
  33. qmi_name_item(QMUX_TYPE_CTL),
  34. qmi_name_item(QMUX_TYPE_WDS),
  35. qmi_name_item(QMUX_TYPE_DMS),
  36. qmi_name_item(QMUX_TYPE_NAS),
  37. qmi_name_item(QMUX_TYPE_QOS),
  38. qmi_name_item(QMUX_TYPE_WMS),
  39. qmi_name_item(QMUX_TYPE_PDS),
  40. qmi_name_item(QMUX_TYPE_WDS_ADMIN),
  41. };
  42. static const QMI_NAME_T qmi_ctl_CtlFlags[] = {
  43. qmi_name_item(QMICTL_FLAG_REQUEST),
  44. qmi_name_item(QMICTL_FLAG_RESPONSE),
  45. qmi_name_item(QMICTL_FLAG_INDICATION),
  46. };
  47. #endif
  48. static const QMI_NAME_T qmux_ctl_QMICTLType[] = {
  49. // QMICTL Type
  50. qmi_name_item(QMICTL_SET_INSTANCE_ID_REQ), // 0x0020
  51. qmi_name_item(QMICTL_SET_INSTANCE_ID_RESP), // 0x0020
  52. qmi_name_item(QMICTL_GET_VERSION_REQ), // 0x0021
  53. qmi_name_item(QMICTL_GET_VERSION_RESP), // 0x0021
  54. qmi_name_item(QMICTL_GET_CLIENT_ID_REQ), // 0x0022
  55. qmi_name_item(QMICTL_GET_CLIENT_ID_RESP), // 0x0022
  56. qmi_name_item(QMICTL_RELEASE_CLIENT_ID_REQ), // 0x0023
  57. qmi_name_item(QMICTL_RELEASE_CLIENT_ID_RESP), // 0x0023
  58. qmi_name_item(QMICTL_REVOKE_CLIENT_ID_IND), // 0x0024
  59. qmi_name_item(QMICTL_INVALID_CLIENT_ID_IND), // 0x0025
  60. qmi_name_item(QMICTL_SET_DATA_FORMAT_REQ), // 0x0026
  61. qmi_name_item(QMICTL_SET_DATA_FORMAT_RESP), // 0x0026
  62. qmi_name_item(QMICTL_SYNC_REQ), // 0x0027
  63. qmi_name_item(QMICTL_SYNC_RESP), // 0x0027
  64. qmi_name_item(QMICTL_SYNC_IND), // 0x0027
  65. };
  66. static const QMI_NAME_T qmux_CtlFlags[] = {
  67. qmi_name_item(QMUX_CTL_FLAG_TYPE_CMD),
  68. qmi_name_item(QMUX_CTL_FLAG_TYPE_RSP),
  69. qmi_name_item(QMUX_CTL_FLAG_TYPE_IND),
  70. };
  71. static const QMI_NAME_T qmux_wds_Type[] = {
  72. qmi_name_item(QMIWDS_SET_EVENT_REPORT_REQ), // 0x0001
  73. qmi_name_item(QMIWDS_SET_EVENT_REPORT_RESP), // 0x0001
  74. qmi_name_item(QMIWDS_EVENT_REPORT_IND), // 0x0001
  75. qmi_name_item(QMIWDS_START_NETWORK_INTERFACE_REQ), // 0x0020
  76. qmi_name_item(QMIWDS_START_NETWORK_INTERFACE_RESP), // 0x0020
  77. qmi_name_item(QMIWDS_STOP_NETWORK_INTERFACE_REQ), // 0x0021
  78. qmi_name_item(QMIWDS_STOP_NETWORK_INTERFACE_RESP), // 0x0021
  79. qmi_name_item(QMIWDS_GET_PKT_SRVC_STATUS_REQ), // 0x0022
  80. qmi_name_item(QMIWDS_GET_PKT_SRVC_STATUS_RESP), // 0x0022
  81. qmi_name_item(QMIWDS_GET_PKT_SRVC_STATUS_IND), // 0x0022
  82. qmi_name_item(QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ), // 0x0023
  83. qmi_name_item(QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP), // 0x0023
  84. qmi_name_item(QMIWDS_GET_PKT_STATISTICS_REQ), // 0x0024
  85. qmi_name_item(QMIWDS_GET_PKT_STATISTICS_RESP), // 0x0024
  86. qmi_name_item(QMIWDS_MODIFY_PROFILE_SETTINGS_REQ), // 0x0028
  87. qmi_name_item(QMIWDS_MODIFY_PROFILE_SETTINGS_RESP), // 0x0028
  88. qmi_name_item(QMIWDS_GET_PROFILE_SETTINGS_REQ), // 0x002B
  89. qmi_name_item(QMIWDS_GET_PROFILE_SETTINGS_RESP), // 0x002BD
  90. qmi_name_item(QMIWDS_GET_DEFAULT_SETTINGS_REQ), // 0x002C
  91. qmi_name_item(QMIWDS_GET_DEFAULT_SETTINGS_RESP), // 0x002C
  92. qmi_name_item(QMIWDS_GET_RUNTIME_SETTINGS_REQ), // 0x002D
  93. qmi_name_item(QMIWDS_GET_RUNTIME_SETTINGS_RESP), // 0x002D
  94. qmi_name_item(QMIWDS_GET_MIP_MODE_REQ), // 0x002F
  95. qmi_name_item(QMIWDS_GET_MIP_MODE_RESP), // 0x002F
  96. qmi_name_item(QMIWDS_GET_DATA_BEARER_REQ), // 0x0037
  97. qmi_name_item(QMIWDS_GET_DATA_BEARER_RESP), // 0x0037
  98. qmi_name_item(QMIWDS_DUN_CALL_INFO_REQ), // 0x0038
  99. qmi_name_item(QMIWDS_DUN_CALL_INFO_RESP), // 0x0038
  100. qmi_name_item(QMIWDS_DUN_CALL_INFO_IND), // 0x0038
  101. qmi_name_item(QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ), // 0x004D
  102. qmi_name_item(QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP), // 0x004D
  103. qmi_name_item(QMIWDS_SET_AUTO_CONNECT_REQ), // 0x0051
  104. qmi_name_item(QMIWDS_SET_AUTO_CONNECT_RESP), // 0x0051
  105. qmi_name_item(QMIWDS_BIND_MUX_DATA_PORT_REQ), // 0x00A2
  106. qmi_name_item(QMIWDS_BIND_MUX_DATA_PORT_RESP), // 0x00A2
  107. };
  108. static const QMI_NAME_T qmux_dms_Type[] = {
  109. // ======================= DMS ==============================
  110. qmi_name_item(QMIDMS_SET_EVENT_REPORT_REQ), // 0x0001
  111. qmi_name_item(QMIDMS_SET_EVENT_REPORT_RESP), // 0x0001
  112. qmi_name_item(QMIDMS_EVENT_REPORT_IND), // 0x0001
  113. qmi_name_item(QMIDMS_GET_DEVICE_CAP_REQ), // 0x0020
  114. qmi_name_item(QMIDMS_GET_DEVICE_CAP_RESP), // 0x0020
  115. qmi_name_item(QMIDMS_GET_DEVICE_MFR_REQ), // 0x0021
  116. qmi_name_item(QMIDMS_GET_DEVICE_MFR_RESP), // 0x0021
  117. qmi_name_item(QMIDMS_GET_DEVICE_MODEL_ID_REQ), // 0x0022
  118. qmi_name_item(QMIDMS_GET_DEVICE_MODEL_ID_RESP), // 0x0022
  119. qmi_name_item(QMIDMS_GET_DEVICE_REV_ID_REQ), // 0x0023
  120. qmi_name_item(QMIDMS_GET_DEVICE_REV_ID_RESP), // 0x0023
  121. qmi_name_item(QMIDMS_GET_MSISDN_REQ), // 0x0024
  122. qmi_name_item(QMIDMS_GET_MSISDN_RESP), // 0x0024
  123. qmi_name_item(QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ), // 0x0025
  124. qmi_name_item(QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP), // 0x0025
  125. qmi_name_item(QMIDMS_UIM_SET_PIN_PROTECTION_REQ), // 0x0027
  126. qmi_name_item(QMIDMS_UIM_SET_PIN_PROTECTION_RESP), // 0x0027
  127. qmi_name_item(QMIDMS_UIM_VERIFY_PIN_REQ), // 0x0028
  128. qmi_name_item(QMIDMS_UIM_VERIFY_PIN_RESP), // 0x0028
  129. qmi_name_item(QMIDMS_UIM_UNBLOCK_PIN_REQ), // 0x0029
  130. qmi_name_item(QMIDMS_UIM_UNBLOCK_PIN_RESP), // 0x0029
  131. qmi_name_item(QMIDMS_UIM_CHANGE_PIN_REQ), // 0x002A
  132. qmi_name_item(QMIDMS_UIM_CHANGE_PIN_RESP), // 0x002A
  133. qmi_name_item(QMIDMS_UIM_GET_PIN_STATUS_REQ), // 0x002B
  134. qmi_name_item(QMIDMS_UIM_GET_PIN_STATUS_RESP), // 0x002B
  135. qmi_name_item(QMIDMS_GET_DEVICE_HARDWARE_REV_REQ), // 0x002C
  136. qmi_name_item(QMIDMS_GET_DEVICE_HARDWARE_REV_RESP), // 0x002C
  137. qmi_name_item(QMIDMS_GET_OPERATING_MODE_REQ), // 0x002D
  138. qmi_name_item(QMIDMS_GET_OPERATING_MODE_RESP), // 0x002D
  139. qmi_name_item(QMIDMS_SET_OPERATING_MODE_REQ), // 0x002E
  140. qmi_name_item(QMIDMS_SET_OPERATING_MODE_RESP), // 0x002E
  141. qmi_name_item(QMIDMS_GET_ACTIVATED_STATUS_REQ), // 0x0031
  142. qmi_name_item(QMIDMS_GET_ACTIVATED_STATUS_RESP), // 0x0031
  143. qmi_name_item(QMIDMS_ACTIVATE_AUTOMATIC_REQ), // 0x0032
  144. qmi_name_item(QMIDMS_ACTIVATE_AUTOMATIC_RESP), // 0x0032
  145. qmi_name_item(QMIDMS_ACTIVATE_MANUAL_REQ), // 0x0033
  146. qmi_name_item(QMIDMS_ACTIVATE_MANUAL_RESP), // 0x0033
  147. qmi_name_item(QMIDMS_UIM_GET_ICCID_REQ), // 0x003C
  148. qmi_name_item(QMIDMS_UIM_GET_ICCID_RESP), // 0x003C
  149. qmi_name_item(QMIDMS_UIM_GET_CK_STATUS_REQ), // 0x0040
  150. qmi_name_item(QMIDMS_UIM_GET_CK_STATUS_RESP), // 0x0040
  151. qmi_name_item(QMIDMS_UIM_SET_CK_PROTECTION_REQ), // 0x0041
  152. qmi_name_item(QMIDMS_UIM_SET_CK_PROTECTION_RESP), // 0x0041
  153. qmi_name_item(QMIDMS_UIM_UNBLOCK_CK_REQ), // 0x0042
  154. qmi_name_item(QMIDMS_UIM_UNBLOCK_CK_RESP), // 0x0042
  155. qmi_name_item(QMIDMS_UIM_GET_IMSI_REQ), // 0x0043
  156. qmi_name_item(QMIDMS_UIM_GET_IMSI_RESP), // 0x0043
  157. qmi_name_item(QMIDMS_UIM_GET_STATE_REQ), // 0x0044
  158. qmi_name_item(QMIDMS_UIM_GET_STATE_RESP), // 0x0044
  159. qmi_name_item(QMIDMS_GET_BAND_CAP_REQ), // 0x0045
  160. qmi_name_item(QMIDMS_GET_BAND_CAP_RESP), // 0x0045
  161. };
  162. static const QMI_NAME_T qmux_nas_Type[] = {
  163. // ======================= NAS ==============================
  164. qmi_name_item(QMINAS_SET_EVENT_REPORT_REQ), // 0x0002
  165. qmi_name_item(QMINAS_SET_EVENT_REPORT_RESP), // 0x0002
  166. qmi_name_item(QMINAS_EVENT_REPORT_IND), // 0x0002
  167. qmi_name_item(QMINAS_GET_SIGNAL_STRENGTH_REQ), // 0x0020
  168. qmi_name_item(QMINAS_GET_SIGNAL_STRENGTH_RESP), // 0x0020
  169. qmi_name_item(QMINAS_PERFORM_NETWORK_SCAN_REQ), // 0x0021
  170. qmi_name_item(QMINAS_PERFORM_NETWORK_SCAN_RESP), // 0x0021
  171. qmi_name_item(QMINAS_INITIATE_NW_REGISTER_REQ), // 0x0022
  172. qmi_name_item(QMINAS_INITIATE_NW_REGISTER_RESP), // 0x0022
  173. qmi_name_item(QMINAS_INITIATE_ATTACH_REQ), // 0x0023
  174. qmi_name_item(QMINAS_INITIATE_ATTACH_RESP), // 0x0023
  175. qmi_name_item(QMINAS_GET_SERVING_SYSTEM_REQ), // 0x0024
  176. qmi_name_item(QMINAS_GET_SERVING_SYSTEM_RESP), // 0x0024
  177. qmi_name_item(QMINAS_SERVING_SYSTEM_IND), // 0x0024
  178. qmi_name_item(QMINAS_GET_HOME_NETWORK_REQ), // 0x0025
  179. qmi_name_item(QMINAS_GET_HOME_NETWORK_RESP), // 0x0025
  180. qmi_name_item(QMINAS_GET_PREFERRED_NETWORK_REQ), // 0x0026
  181. qmi_name_item(QMINAS_GET_PREFERRED_NETWORK_RESP), // 0x0026
  182. qmi_name_item(QMINAS_SET_PREFERRED_NETWORK_REQ), // 0x0027
  183. qmi_name_item(QMINAS_SET_PREFERRED_NETWORK_RESP), // 0x0027
  184. qmi_name_item(QMINAS_GET_FORBIDDEN_NETWORK_REQ), // 0x0028
  185. qmi_name_item(QMINAS_GET_FORBIDDEN_NETWORK_RESP), // 0x0028
  186. qmi_name_item(QMINAS_SET_FORBIDDEN_NETWORK_REQ), // 0x0029
  187. qmi_name_item(QMINAS_SET_FORBIDDEN_NETWORK_RESP), // 0x0029
  188. qmi_name_item(QMINAS_SET_TECHNOLOGY_PREF_REQ), // 0x002A
  189. qmi_name_item(QMINAS_SET_TECHNOLOGY_PREF_RESP), // 0x002A
  190. qmi_name_item(QMINAS_GET_RF_BAND_INFO_REQ), // 0x0031
  191. qmi_name_item(QMINAS_GET_RF_BAND_INFO_RESP), // 0x0031
  192. qmi_name_item(QMINAS_GET_PLMN_NAME_REQ), // 0x0044
  193. qmi_name_item(QMINAS_GET_PLMN_NAME_RESP), // 0x0044
  194. qmi_name_item(QUECTEL_PACKET_TRANSFER_START_IND), // 0X100
  195. qmi_name_item(QUECTEL_PACKET_TRANSFER_END_IND), // 0X101
  196. qmi_name_item(QMINAS_GET_SYS_INFO_REQ), // 0x004D
  197. qmi_name_item(QMINAS_GET_SYS_INFO_RESP), // 0x004D
  198. qmi_name_item(QMINAS_SYS_INFO_IND), // 0x004D
  199. };
  200. static const QMI_NAME_T qmux_wms_Type[] = {
  201. // ======================= WMS ==============================
  202. qmi_name_item(QMIWMS_SET_EVENT_REPORT_REQ), // 0x0001
  203. qmi_name_item(QMIWMS_SET_EVENT_REPORT_RESP), // 0x0001
  204. qmi_name_item(QMIWMS_EVENT_REPORT_IND), // 0x0001
  205. qmi_name_item(QMIWMS_RAW_SEND_REQ), // 0x0020
  206. qmi_name_item(QMIWMS_RAW_SEND_RESP), // 0x0020
  207. qmi_name_item(QMIWMS_RAW_WRITE_REQ), // 0x0021
  208. qmi_name_item(QMIWMS_RAW_WRITE_RESP), // 0x0021
  209. qmi_name_item(QMIWMS_RAW_READ_REQ), // 0x0022
  210. qmi_name_item(QMIWMS_RAW_READ_RESP), // 0x0022
  211. qmi_name_item(QMIWMS_MODIFY_TAG_REQ), // 0x0023
  212. qmi_name_item(QMIWMS_MODIFY_TAG_RESP), // 0x0023
  213. qmi_name_item(QMIWMS_DELETE_REQ), // 0x0024
  214. qmi_name_item(QMIWMS_DELETE_RESP), // 0x0024
  215. qmi_name_item(QMIWMS_GET_MESSAGE_PROTOCOL_REQ), // 0x0030
  216. qmi_name_item(QMIWMS_GET_MESSAGE_PROTOCOL_RESP), // 0x0030
  217. qmi_name_item(QMIWMS_LIST_MESSAGES_REQ), // 0x0031
  218. qmi_name_item(QMIWMS_LIST_MESSAGES_RESP), // 0x0031
  219. qmi_name_item(QMIWMS_GET_SMSC_ADDRESS_REQ), // 0x0034
  220. qmi_name_item(QMIWMS_GET_SMSC_ADDRESS_RESP), // 0x0034
  221. qmi_name_item(QMIWMS_SET_SMSC_ADDRESS_REQ), // 0x0035
  222. qmi_name_item(QMIWMS_SET_SMSC_ADDRESS_RESP), // 0x0035
  223. qmi_name_item(QMIWMS_GET_STORE_MAX_SIZE_REQ), // 0x0036
  224. qmi_name_item(QMIWMS_GET_STORE_MAX_SIZE_RESP), // 0x0036
  225. };
  226. static const QMI_NAME_T qmux_wds_admin_Type[] = {
  227. qmi_name_item(QMIWDS_ADMIN_SET_DATA_FORMAT_REQ), // 0x0020
  228. qmi_name_item(QMIWDS_ADMIN_SET_DATA_FORMAT_RESP), // 0x0020
  229. qmi_name_item(QMIWDS_ADMIN_GET_DATA_FORMAT_REQ), // 0x0021
  230. qmi_name_item(QMIWDS_ADMIN_GET_DATA_FORMAT_RESP), // 0x0021
  231. qmi_name_item(QMIWDS_ADMIN_SET_QMAP_SETTINGS_REQ), // 0x002B
  232. qmi_name_item(QMIWDS_ADMIN_SET_QMAP_SETTINGS_RESP), // 0x002B
  233. qmi_name_item(QMIWDS_ADMIN_GET_QMAP_SETTINGS_REQ), // 0x002C
  234. qmi_name_item(QMIWDS_ADMIN_GET_QMAP_SETTINGS_RESP), // 0x002C
  235. qmi_name_item(QMI_WDA_SET_LOOPBACK_CONFIG_REQ), // 0x002F
  236. qmi_name_item(QMI_WDA_SET_LOOPBACK_CONFIG_RESP), // 0x002F
  237. qmi_name_item(QMI_WDA_SET_LOOPBACK_CONFIG_IND), // 0x002F
  238. };
  239. static const QMI_NAME_T qmux_uim_Type[] = {
  240. qmi_name_item( QMIUIM_READ_TRANSPARENT_REQ), // 0x0020
  241. qmi_name_item( QMIUIM_READ_TRANSPARENT_RESP), // 0x0020
  242. qmi_name_item( QMIUIM_READ_TRANSPARENT_IND), // 0x0020
  243. qmi_name_item( QMIUIM_READ_RECORD_REQ), // 0x0021
  244. qmi_name_item( QMIUIM_READ_RECORD_RESP), // 0x0021
  245. qmi_name_item( QMIUIM_READ_RECORD_IND), // 0x0021
  246. qmi_name_item( QMIUIM_WRITE_TRANSPARENT_REQ), // 0x0022
  247. qmi_name_item( QMIUIM_WRITE_TRANSPARENT_RESP), // 0x0022
  248. qmi_name_item( QMIUIM_WRITE_TRANSPARENT_IND), // 0x0022
  249. qmi_name_item( QMIUIM_WRITE_RECORD_REQ), // 0x0023
  250. qmi_name_item( QMIUIM_WRITE_RECORD_RESP), // 0x0023
  251. qmi_name_item( QMIUIM_WRITE_RECORD_IND), // 0x0023
  252. qmi_name_item( QMIUIM_SET_PIN_PROTECTION_REQ), // 0x0025
  253. qmi_name_item( QMIUIM_SET_PIN_PROTECTION_RESP), // 0x0025
  254. qmi_name_item( QMIUIM_SET_PIN_PROTECTION_IND), // 0x0025
  255. qmi_name_item( QMIUIM_VERIFY_PIN_REQ), // 0x0026
  256. qmi_name_item( QMIUIM_VERIFY_PIN_RESP), // 0x0026
  257. qmi_name_item( QMIUIM_VERIFY_PIN_IND), // 0x0026
  258. qmi_name_item( QMIUIM_UNBLOCK_PIN_REQ), // 0x0027
  259. qmi_name_item( QMIUIM_UNBLOCK_PIN_RESP), // 0x0027
  260. qmi_name_item( QMIUIM_UNBLOCK_PIN_IND), // 0x0027
  261. qmi_name_item( QMIUIM_CHANGE_PIN_REQ), // 0x0028
  262. qmi_name_item( QMIUIM_CHANGE_PIN_RESP), // 0x0028
  263. qmi_name_item( QMIUIM_CHANGE_PIN_IND), // 0x0028
  264. qmi_name_item( QMIUIM_DEPERSONALIZATION_REQ), // 0x0029
  265. qmi_name_item( QMIUIM_DEPERSONALIZATION_RESP), // 0x0029
  266. qmi_name_item( QMIUIM_EVENT_REG_REQ), // 0x002E
  267. qmi_name_item( QMIUIM_EVENT_REG_RESP), // 0x002E
  268. qmi_name_item( QMIUIM_GET_CARD_STATUS_REQ), // 0x002F
  269. qmi_name_item( QMIUIM_GET_CARD_STATUS_RESP), // 0x002F
  270. qmi_name_item( QMIUIM_STATUS_CHANGE_IND), // 0x0032
  271. };
  272. static const char * qmi_name_get(const QMI_NAME_T *table, size_t size, int type, const char *tag) {
  273. static char unknow[40];
  274. size_t i;
  275. if (qmux_CtlFlags == table) {
  276. if (!strcmp(tag, "_REQ"))
  277. tag = "_CMD";
  278. else if (!strcmp(tag, "_RESP"))
  279. tag = "_RSP";
  280. }
  281. for (i = 0; i < size; i++) {
  282. if (table[i].type == (UINT)type) {
  283. if (!tag || (strstr(table[i].name, tag)))
  284. return table[i].name;
  285. }
  286. }
  287. sprintf(unknow, "unknow_%x", type);
  288. return unknow;
  289. }
  290. #define QMI_NAME(table, type) qmi_name_get(table, sizeof(table) / sizeof(table[0]), type, 0)
  291. #define QMUX_NAME(table, type, tag) qmi_name_get(table, sizeof(table) / sizeof(table[0]), type, tag)
  292. void dump_tlv(PQCQMUX_MSG_HDR pQMUXMsgHdr) {
  293. int TLVFind = 0;
  294. int i;
  295. //dbg("QCQMUX_TLV-----------------------------------\n");
  296. //dbg("{Type,\tLength,\tValue}\n");
  297. while (1) {
  298. PQMI_TLV_HDR TLVHdr = GetTLV(pQMUXMsgHdr, 0x1000 + (++TLVFind));
  299. if (TLVHdr == NULL)
  300. break;
  301. //if ((TLVHdr->TLVType == 0x02) && ((USHORT *)(TLVHdr+1))[0])
  302. {
  303. dbg("{%02x,\t%04x,\t", TLVHdr->TLVType, le16_to_cpu(TLVHdr->TLVLength));
  304. for (i = 0; i < le16_to_cpu(TLVHdr->TLVLength); i++) {
  305. dbg("%02x ", ((UCHAR *)(TLVHdr+1))[i]);
  306. }
  307. dbg("}\n");
  308. }
  309. } // while
  310. }
  311. void dump_ctl(PQCQMICTL_MSG_HDR CTLHdr) {
  312. const char *tag;
  313. //dbg("QCQMICTL_MSG--------------------------------------------\n");
  314. //dbg("CtlFlags: %02x\t\t%s\n", CTLHdr->CtlFlags, QMI_NAME(qmi_ctl_CtlFlags, CTLHdr->CtlFlags));
  315. dbg("TransactionId: %02x\n", CTLHdr->TransactionId);
  316. switch (CTLHdr->CtlFlags) {
  317. case QMICTL_FLAG_REQUEST: tag = "_REQ"; break;
  318. case QMICTL_FLAG_RESPONSE: tag = "_RESP"; break;
  319. case QMICTL_FLAG_INDICATION: tag = "_IND"; break;
  320. default: tag = 0; break;
  321. }
  322. dbg("QMICTLType: %04x\t%s\n", le16_to_cpu(CTLHdr->QMICTLType),
  323. QMUX_NAME(qmux_ctl_QMICTLType, le16_to_cpu(CTLHdr->QMICTLType), tag));
  324. dbg("Length: %04x\n", le16_to_cpu(CTLHdr->Length));
  325. dump_tlv((PQCQMUX_MSG_HDR)(&CTLHdr->QMICTLType));
  326. }
  327. int dump_qmux(QMI_SERVICE_TYPE serviceType, PQCQMUX_HDR QMUXHdr) {
  328. PQCQMUX_MSG_HDR QMUXMsgHdr = (PQCQMUX_MSG_HDR) (QMUXHdr + 1);
  329. CHAR *tag;
  330. //dbg("QCQMUX--------------------------------------------\n");
  331. switch (QMUXHdr->CtlFlags&QMUX_CTL_FLAG_MASK_TYPE) {
  332. case QMUX_CTL_FLAG_TYPE_CMD: tag = "_REQ"; break;
  333. case QMUX_CTL_FLAG_TYPE_RSP: tag = "_RESP"; break;
  334. case QMUX_CTL_FLAG_TYPE_IND: tag = "_IND"; break;
  335. default: tag = 0; break;
  336. }
  337. //dbg("CtlFlags: %02x\t\t%s\n", QMUXHdr->CtlFlags, QMUX_NAME(qmux_CtlFlags, QMUXHdr->CtlFlags, tag));
  338. dbg("TransactionId: %04x\n", le16_to_cpu(QMUXHdr->TransactionId));
  339. //dbg("QCQMUX_MSG_HDR-----------------------------------\n");
  340. switch (serviceType) {
  341. case QMUX_TYPE_DMS:
  342. dbg("Type: %04x\t%s\n", le16_to_cpu(QMUXMsgHdr->Type),
  343. QMUX_NAME(qmux_dms_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));
  344. break;
  345. case QMUX_TYPE_NAS:
  346. dbg("Type: %04x\t%s\n", le16_to_cpu(QMUXMsgHdr->Type),
  347. QMUX_NAME(qmux_nas_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));
  348. break;
  349. case QMUX_TYPE_WDS:
  350. case QMUX_TYPE_WDS_IPV6:
  351. dbg("Type: %04x\t%s\n", le16_to_cpu(QMUXMsgHdr->Type),
  352. QMUX_NAME(qmux_wds_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));
  353. break;
  354. case QMUX_TYPE_WMS:
  355. dbg("Type: %04x\t%s\n", le16_to_cpu(QMUXMsgHdr->Type),
  356. QMUX_NAME(qmux_wms_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));
  357. break;
  358. case QMUX_TYPE_WDS_ADMIN:
  359. dbg("Type: %04x\t%s\n", le16_to_cpu(QMUXMsgHdr->Type),
  360. QMUX_NAME(qmux_wds_admin_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));
  361. break;
  362. case QMUX_TYPE_UIM:
  363. dbg("Type: %04x\t%s\n", le16_to_cpu(QMUXMsgHdr->Type),
  364. QMUX_NAME(qmux_uim_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));
  365. break;
  366. case QMUX_TYPE_PDS:
  367. case QMUX_TYPE_QOS:
  368. case QMUX_TYPE_CTL:
  369. default:
  370. dbg("Type: %04x\t%s\n", le16_to_cpu(QMUXMsgHdr->Type), "PDS/QOS/CTL/unknown!");
  371. break;
  372. }
  373. dbg("Length: %04x\n", le16_to_cpu(QMUXMsgHdr->Length));
  374. dump_tlv(QMUXMsgHdr);
  375. return 0;
  376. }
  377. void dump_qmi(void *dataBuffer, int dataLen)
  378. {
  379. PQCQMI_HDR QMIHdr = (PQCQMI_HDR)dataBuffer;
  380. PQCQMUX_HDR QMUXHdr = (PQCQMUX_HDR) (QMIHdr + 1);
  381. PQCQMICTL_MSG_HDR CTLHdr = (PQCQMICTL_MSG_HDR) (QMIHdr + 1);
  382. int i;
  383. if (!debug_qmi)
  384. return;
  385. pthread_mutex_lock(&dumpQMIMutex);
  386. line[0] = 0;
  387. for (i = 0; i < dataLen; i++) {
  388. dbg("%02x ", ((unsigned char *)dataBuffer)[i]);
  389. }
  390. dbg_time("%s", line);
  391. line[0] = 0;
  392. //dbg("QCQMI_HDR-----------------------------------------");
  393. //dbg("IFType: %02x\t\t%s", QMIHdr->IFType, QMI_NAME(qmi_IFType, QMIHdr->IFType));
  394. //dbg("Length: %04x", le16_to_cpu(QMIHdr->Length));
  395. //dbg("CtlFlags: %02x\t\t%s", QMIHdr->CtlFlags, QMI_NAME(qmi_CtlFlags, QMIHdr->CtlFlags));
  396. //dbg("QMIType: %02x\t\t%s", QMIHdr->QMIType, QMI_NAME(qmi_QMIType, QMIHdr->QMIType));
  397. //dbg("ClientId: %02x", QMIHdr->ClientId);
  398. if (QMIHdr->QMIType == QMUX_TYPE_CTL) {
  399. dump_ctl(CTLHdr);
  400. } else {
  401. dump_qmux(QMIHdr->QMIType, QMUXHdr);
  402. }
  403. dbg_time("%s", line);
  404. pthread_mutex_unlock(&dumpQMIMutex);
  405. }