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.

310 lines
10 KiB

2 years ago
  1. #ifndef __QMI_THREAD_H__
  2. #define __QMI_THREAD_H__
  3. #define CONFIG_GOBINET
  4. #define CONFIG_QMIWWAN
  5. #define CONFIG_SIM
  6. #define CONFIG_APN
  7. #define CONFIG_VERSION
  8. // #define CONFIG_SIGNALINFO
  9. #define CONFIG_DEFAULT_PDP 1
  10. //#define CONFIG_IMSI_ICCID
  11. #define QUECTEL_UL_DATA_AGG
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <termios.h>
  15. #include <stdio.h>
  16. #include <ctype.h>
  17. #include <time.h>
  18. #include <fcntl.h>
  19. #include <signal.h>
  20. #include <errno.h>
  21. #include <string.h>
  22. #include <stdlib.h>
  23. #include <unistd.h>
  24. #include <errno.h>
  25. #include <pthread.h>
  26. #include <sys/types.h>
  27. #include <sys/stat.h>
  28. #include <sys/epoll.h>
  29. #include <poll.h>
  30. #include <sys/ioctl.h>
  31. #include <sys/socket.h>
  32. #include <stddef.h>
  33. #include "MPQMI.h"
  34. #include "MPQCTL.h"
  35. #include "MPQMUX.h"
  36. #include "util.h"
  37. #define DEVICE_CLASS_UNKNOWN 0
  38. #define DEVICE_CLASS_CDMA 1
  39. #define DEVICE_CLASS_GSM 2
  40. #define WWAN_DATA_CLASS_NONE 0x00000000
  41. #define WWAN_DATA_CLASS_GPRS 0x00000001
  42. #define WWAN_DATA_CLASS_EDGE 0x00000002 /* EGPRS */
  43. #define WWAN_DATA_CLASS_UMTS 0x00000004
  44. #define WWAN_DATA_CLASS_HSDPA 0x00000008
  45. #define WWAN_DATA_CLASS_HSUPA 0x00000010
  46. #define WWAN_DATA_CLASS_LTE 0x00000020
  47. #define WWAN_DATA_CLASS_5G_NSA 0x00000040
  48. #define WWAN_DATA_CLASS_5G_SA 0x00000080
  49. #define WWAN_DATA_CLASS_1XRTT 0x00010000
  50. #define WWAN_DATA_CLASS_1XEVDO 0x00020000
  51. #define WWAN_DATA_CLASS_1XEVDO_REVA 0x00040000
  52. #define WWAN_DATA_CLASS_1XEVDV 0x00080000
  53. #define WWAN_DATA_CLASS_3XRTT 0x00100000
  54. #define WWAN_DATA_CLASS_1XEVDO_REVB 0x00200000 /* for future use */
  55. #define WWAN_DATA_CLASS_UMB 0x00400000
  56. #define WWAN_DATA_CLASS_CUSTOM 0x80000000
  57. struct wwan_data_class_str {
  58. ULONG class;
  59. CHAR *str;
  60. };
  61. #pragma pack(push, 1)
  62. typedef struct _QCQMIMSG {
  63. QCQMI_HDR QMIHdr;
  64. union {
  65. QMICTL_MSG CTLMsg;
  66. QMUX_MSG MUXMsg;
  67. };
  68. } __attribute__ ((packed)) QCQMIMSG, *PQCQMIMSG;
  69. typedef struct __IPV4 {
  70. uint32_t Address;
  71. uint32_t Gateway;
  72. uint32_t SubnetMask;
  73. uint32_t DnsPrimary;
  74. uint32_t DnsSecondary;
  75. uint32_t Mtu;
  76. } IPV4_T;
  77. typedef struct __IPV6 {
  78. UCHAR Address[16];
  79. UCHAR Gateway[16];
  80. UCHAR SubnetMask[16];
  81. UCHAR DnsPrimary[16];
  82. UCHAR DnsSecondary[16];
  83. UCHAR PrefixLengthIPAddr;
  84. UCHAR PrefixLengthGateway;
  85. ULONG Mtu;
  86. } IPV6_T;
  87. typedef struct {
  88. UINT size;
  89. UINT rx_urb_size;
  90. UINT ep_type;
  91. UINT iface_id;
  92. UINT MuxId;
  93. UINT ul_data_aggregation_max_datagrams; //0x17
  94. UINT ul_data_aggregation_max_size ;//0x18
  95. UINT dl_minimum_padding; //0x1A
  96. } QMAP_SETTING;
  97. //Configured downlink data aggregationprotocol
  98. #define WDA_DL_DATA_AGG_DISABLED (0x00) //DL data aggregation is disabled (default)
  99. #define WDA_DL_DATA_AGG_TLP_ENABLED (0x01) // DL TLP is enabled
  100. #define WDA_DL_DATA_AGG_QC_NCM_ENABLED (0x02) // DL QC_NCM isenabled
  101. #define WDA_DL_DATA_AGG_MBIM_ENABLED (0x03) // DL MBIM isenabled
  102. #define WDA_DL_DATA_AGG_RNDIS_ENABLED (0x04) // DL RNDIS is enabled
  103. #define WDA_DL_DATA_AGG_QMAP_ENABLED (0x05) // DL QMAP isenabled
  104. #define WDA_DL_DATA_AGG_QMAP_V2_ENABLED (0x06) // DL QMAP V2 is enabled
  105. #define WDA_DL_DATA_AGG_QMAP_V3_ENABLED (0x07) // DL QMAP V3 is enabled
  106. #define WDA_DL_DATA_AGG_QMAP_V4_ENABLED (0x08) // DL QMAP V4 is enabled
  107. #define WDA_DL_DATA_AGG_QMAP_V5_ENABLED (0x09) // DL QMAP V5 is enabled
  108. typedef struct {
  109. unsigned int size;
  110. unsigned int rx_urb_size;
  111. unsigned int ep_type;
  112. unsigned int iface_id;
  113. unsigned int qmap_mode;
  114. unsigned int qmap_version;
  115. unsigned int dl_minimum_padding;
  116. char ifname[8][16];
  117. unsigned char mux_id[8];
  118. } RMNET_INFO;
  119. #define IpFamilyV4 (0x04)
  120. #define IpFamilyV6 (0x06)
  121. struct __PROFILE;
  122. struct qmi_device_ops {
  123. int (*init)(struct __PROFILE *profile);
  124. int (*deinit)(void);
  125. int (*send)(PQCQMIMSG pRequest);
  126. void* (*read)(void *pData);
  127. // int (*thread_read)(struct __PROFILE *profile);
  128. // int (*init)(struct __PROFILE *profile);
  129. // int (*open)(struct __PROFILE *profile);
  130. // int (*close)(struct __PROFILE *profile);
  131. // int (*reopen)(struct __PROFILE *profile);
  132. // int (*start_network)(struct __PROFILE *profile);
  133. // int (*stop_network)(struct __PROFILE *profile);
  134. // int (*query_network)(struct __PROFILE *profile);
  135. };
  136. extern int (*qmidev_send)(PQCQMIMSG pRequest);
  137. #ifndef bool
  138. #define bool uint8_t
  139. #endif
  140. typedef struct __PROFILE {
  141. char *qmichannel;
  142. char *usbnet_adapter;
  143. char *qmapnet_adapter;
  144. char *driver_name;
  145. int qmap_mode;
  146. int qmap_size;
  147. int qmap_version;
  148. const char *apn;
  149. const char *user;
  150. const char *password;
  151. const char *pincode;
  152. int auth;
  153. int pdp;
  154. int curIpFamily;
  155. int rawIP;
  156. int muxid;
  157. int enable_bridge;
  158. IPV4_T ipv4;
  159. IPV6_T ipv6;
  160. UINT PCSCFIpv4Addr1;
  161. UINT PCSCFIpv4Addr2;
  162. UCHAR PCSCFIpv6Addr1[16];
  163. UCHAR PCSCFIpv6Addr2[16];
  164. bool enable_ipv4;
  165. bool enable_ipv6;
  166. int apntype;
  167. bool reattach_flag;
  168. int hardware_interface;
  169. int software_interface;
  170. int busnum;
  171. int devnum;
  172. int usbmon_fd;
  173. int usbmon_logfile_fd;
  174. bool loopback_state;
  175. int replication_factor;
  176. const struct qmi_device_ops *qmi_ops;
  177. RMNET_INFO rmnet_info;
  178. } PROFILE_T;
  179. typedef enum {
  180. SIM_ABSENT = 0,
  181. SIM_NOT_READY = 1,
  182. SIM_READY = 2, /* SIM_READY means the radio state is RADIO_STATE_SIM_READY */
  183. SIM_PIN = 3,
  184. SIM_PUK = 4,
  185. SIM_NETWORK_PERSONALIZATION = 5,
  186. SIM_BAD = 6,
  187. } SIM_Status;
  188. #pragma pack(pop)
  189. #define WDM_DEFAULT_BUFSIZE 256
  190. #define RIL_REQUEST_QUIT 0x1000
  191. #define RIL_INDICATE_DEVICE_CONNECTED 0x1002
  192. #define RIL_INDICATE_DEVICE_DISCONNECTED 0x1003
  193. #define RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED 0x1004
  194. #define RIL_UNSOL_DATA_CALL_LIST_CHANGED 0x1005
  195. #define MODEM_REPORT_RESET_EVENT 0x1006
  196. #define RIL_UNSOL_LOOPBACK_CONFIG_IND 0x1007
  197. extern int pthread_cond_timeout_np(pthread_cond_t *cond, pthread_mutex_t * mutex, unsigned msecs);
  198. extern int QmiThreadSendQMI(PQCQMIMSG pRequest, PQCQMIMSG *ppResponse);
  199. extern int QmiThreadSendQMITimeout(PQCQMIMSG pRequest, PQCQMIMSG *ppResponse, unsigned msecs);
  200. extern void QmiThreadRecvQMI(PQCQMIMSG pResponse);
  201. extern void udhcpc_start(PROFILE_T *profile);
  202. extern void udhcpc_stop(PROFILE_T *profile);
  203. extern void ql_set_driver_link_state(PROFILE_T *profile, int link_state);
  204. extern void ql_set_driver_qmap_setting(PROFILE_T *profile, QMAP_SETTING *qmap_settings);
  205. extern void ql_get_driver_rmnet_info(PROFILE_T *profile, RMNET_INFO *rmnet_info);
  206. extern void dump_qmi(void *dataBuffer, int dataLen);
  207. extern void qmidevice_send_event_to_main(int triger_event);
  208. extern void qmidevice_send_event_to_main_ext(int triger_event, void *data, unsigned len);
  209. extern int requestSetEthMode(PROFILE_T *profile);
  210. extern int requestGetSIMStatus(SIM_Status *pSIMStatus);
  211. extern int requestEnterSimPin(const CHAR *pPinCode);
  212. extern int requestGetICCID(void);
  213. extern int requestGetIMSI(void);
  214. extern int requestRegistrationState(UCHAR *pPSAttachedState);
  215. extern int requestQueryDataCall(UCHAR *pConnectionStatus, int curIpFamily);
  216. extern int requestSetupDataCall(PROFILE_T *profile, int curIpFamily);
  217. extern int requestDeactivateDefaultPDP(PROFILE_T *profile, int curIpFamily);
  218. extern int requestSetProfile(PROFILE_T *profile);
  219. extern int requestGetProfile(PROFILE_T *profile);
  220. extern int requestGetSignalInfo(void);
  221. extern int requestBaseBandVersion(const char **pp_reversion);
  222. extern int requestGetIPAddress(PROFILE_T *profile, int curIpFamily);
  223. extern int requestSetOperatingMode(UCHAR OperatingMode);
  224. extern int requestSetLoopBackState(UCHAR loopback_state, ULONG replication_factor);
  225. extern void cond_setclock_attr(pthread_cond_t *cond, clockid_t clock);
  226. extern int mbim_main(PROFILE_T *profile);
  227. extern int get_driver_type(PROFILE_T *profile);
  228. extern BOOL qmidevice_detect(char *qmichannel, char *usbnet_adapter, unsigned bufsize, int *pbusnum, int *pdevnum);
  229. int mhidevice_detect(char *qmichannel, char *usbnet_adapter, PROFILE_T *profile);
  230. extern int ql_bridge_mode_detect(PROFILE_T *profile);
  231. extern int ql_enable_qmi_wwan_rawip_mode(PROFILE_T *profile);
  232. extern int ql_driver_type_detect(PROFILE_T *profile);
  233. extern int ql_qmap_mode_detect(PROFILE_T *profile);
  234. extern const struct qmi_device_ops gobi_qmidev_ops;
  235. extern const struct qmi_device_ops qmiwwan_qmidev_ops;
  236. #define qmidev_is_gobinet(_qmichannel) (strncmp(_qmichannel, "/dev/qcqmi", strlen("/dev/qcqmi")) == 0)
  237. #define qmidev_is_qmiwwan(_qmichannel) (strncmp(_qmichannel, "/dev/cdc-wdm", strlen("/dev/cdc-wdm")) == 0)
  238. #define qmidev_is_pciemhi(_qmichannel) (strncmp(_qmichannel, "/dev/mhi_", strlen("/dev/mhi_")) == 0)
  239. #define driver_is_qmi(_drv_name) (strncasecmp(_drv_name, "qmi_wwan", strlen("qmi_wwan")) == 0)
  240. #define driver_is_mbim(_drv_name) (strncasecmp(_drv_name, "cdc_mbim", strlen("cdc_mbim")) == 0)
  241. extern FILE *logfilefp;
  242. extern int debug_qmi;
  243. extern int qmidevice_control_fd[2];
  244. extern int qmiclientId[QMUX_TYPE_WDS_ADMIN + 1];
  245. extern USHORT le16_to_cpu(USHORT v16);
  246. extern UINT le32_to_cpu (UINT v32);
  247. extern UINT ql_swap32(UINT v32);
  248. extern USHORT cpu_to_le16(USHORT v16);
  249. extern UINT cpu_to_le32(UINT v32);
  250. extern void update_resolv_conf(int iptype, const char *ifname, const char *dns1, const char *dns2);
  251. int reattach_driver(PROFILE_T *profile);
  252. enum
  253. {
  254. DRV_INVALID,
  255. SOFTWARE_QMI,
  256. SOFTWARE_MBIM,
  257. HARDWARE_PCIE,
  258. HARDWARE_USB,
  259. };
  260. enum
  261. {
  262. SIG_EVENT_START,
  263. SIG_EVENT_CHECK,
  264. SIG_EVENT_STOP,
  265. };
  266. #define CM_MAX_BUFF 256
  267. #define strset(k, v) {if (k) free(k); k = strdup(v);}
  268. #define mfree(v) {if (v) {free(v); v = NULL;}
  269. #ifdef CM_DEBUG
  270. #define dbg_time(fmt, args...) do { \
  271. fprintf(stdout, "[%15s-%04d: %s] " fmt "\n", __FILE__, __LINE__, get_time(), ##args); \
  272. if (logfilefp) fprintf(logfilefp, "[%s-%04d: %s] " fmt "\n", __FILE__, __LINE__, get_time(), ##args); \
  273. } while(0)
  274. #else
  275. #define dbg_time(fmt, args...) do { \
  276. fprintf(stdout, "[%s] " fmt "\n", get_time(), ##args); \
  277. if (logfilefp) fprintf(logfilefp, "[%s] " fmt "\n", get_time(), ##args); \
  278. } while(0)
  279. #endif
  280. #endif