#include #include #include #include //2021-02-25 willa.liu@fibocom.com changed begin for support eipd SN-20210129001 #include #include //2021-02-25 willa.liu@fibocom.com changed end for support eipd SN-20210129001 //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 #include #include //2020-12-23 willa.liu@fibocom.com changed end for support mantis 0065286 #include "QMIThread.h" #include "util.h" //2021-03-24 willa.liu@fibocom.com changed begin for support mantis 0071817 #include "query_pcie_mode.h" //2021-03-24 willa.liu@fibocom.com changed begin for support mantis 0071817 #define MAJOR 2 #define MINOR 0 #define REVISION 10 /* * Generally, we do not modify version info, so several modifications will share * the same version code. SUBVERSION is used for customized modification to * distinguise this version from previous one. SUBVERSION adds up before you * send the code to customers and it should be set to 0 if VERSION_STRING info * is changed. */ #define SUBVERSION 0 #define STRINGIFY_HELPER(v) #v #define STRINGIFY(v) STRINGIFY_HELPER(v) #define VERSION_STRING() \ STRINGIFY(MAJOR) "." STRINGIFY(MINOR) "." STRINGIFY(REVISION) #define MAX_PATH 256 //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 struct sockaddr_un { sa_family_t sun_family; char sun_path[100]; }; //2020-12-23 willa.liu@fibocom.com changed end for support mantis 0065286 int query_pcie_mode = 0; int debug_qmi = 0; int main_loop = 0; int qmidevice_control_fd[2]; static int signal_control_fd[2]; pthread_t gQmiThreadID; USHORT g_MobileCountryCode = 0; USHORT g_MobileNetworkCode = 0; //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 sem_t sem; int socket_server_fd = 0; int cli_accept_fd = 0; char fibo_dial_filepath[100] = {0}; //2020-12-23 willa.liu@fibocom.com changed end for support mantis 0065286 extern const struct qmi_device_ops qmiwwan_qmidev_ops; extern const struct qmi_device_ops gobi_qmidev_ops; //2021-03-24 willa.liu@fibocom.com changed begin for support mantis 0071817 //extern int *speed_arr; //extern int *name_arr; //extern int get_private_gateway_debug; //2021-03-24 willa.liu@fibocom.com changed end for support mantis 0071817 static int s_link = -1; static int is_pcie_dial() { return (access("/dev/mhi_QMI0", F_OK) == 0); } //2021-02-25 willa.liu@fibocom.com changed begin for support eipd SN-20210129001 int split_gateway(char *str ,char* split, int index, char *outgateway) { char chBuffer[1024]; char *pchStrTmpIn = NULL; char *pchTmp = NULL; int i = 1; strncpy(chBuffer, str, sizeof(chBuffer)-1); pchTmp = chBuffer; //printf("pchTmp is [%s]\n", pchTmp); while(NULL != (pchTmp = strtok_r( pchTmp, split, &pchStrTmpIn))) { //printf("line %d::::::::::::[%s]\n", i, pchTmp); if(i == index) { memcpy(outgateway, pchTmp, strlen(pchTmp)); break; } //if(strstr(pchTmp, "+CGCONTRDP") != -1) i++; pchTmp = NULL; } return strlen(outgateway); } int get_private_gateway(char *outgateway) { int i; int fd; int ret; char buffer[1024] = {0}; int rate; char *sendbuffer; char prigateways[1024*2] = {0}; char prigateway[256] = {0}; int totallen = 0; fd_set readfds; struct timeval timeout; struct termios tiosfd, tio; int timeoutVal = 5; char *dev = "/dev/ttyUSB1"; //The port under Linux is operated by opening the device file rate = 115200; sendbuffer = "AT+CGCONTRDP=1"; fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK); if(fd < 0) goto ERR; fcntl(fd, F_SETFL, O_RDWR); xget1(fd, &tio, &tiosfd); for(i = 0; i < sizeof(speed_arr)/sizeof(int); i++) { if(rate == name_arr[i])//Judge if the pass is equal to the pass { break; } } if(i >= sizeof(speed_arr)/sizeof(int)) { printf("bound rate set failed\n"); goto ERR; } cfsetspeed(&tio, speed_arr[i]); if(xset1(fd, &tio, dev)) goto ERR; tcflush(fd, TCIOFLUSH); FD_ZERO(&readfds); FD_SET(fd, &readfds); sprintf(buffer, "%s\r", sendbuffer); ret = write (fd, buffer, strlen(buffer)); if(ret < 0) { printf("write failed\n"); goto ERR; } printf("dev: %s\nrate:%d\nsendbuffer:%s\n", dev, rate, sendbuffer); sleep(1); if(get_private_gateway_debug)printf("write %d\n", ret); while(1) { timeout.tv_sec = timeoutVal; timeout.tv_usec = 0; ret = select(fd+1, &readfds, (fd_set *)0, (fd_set *)0, &timeout); if(ret > 0) { ret = read(fd, buffer+totallen, sizeof(buffer)-totallen-1); if(ret < 0) { printf("read failed\n"); goto ERR; } if(ret == 0) { goto ERR; } totallen += ret; buffer[totallen] = '\0'; if(get_private_gateway_debug)printf("read %d(%s)\n", ret, &buffer[totallen-ret]); //printf("buffer is %s\n", buffer); if(totallen == sizeof(buffer)-1) break; if(strstr(buffer, "\nOK")) { split_gateway(buffer, "\r", 3, prigateways); //printf("test1 %s\n", prigateways); split_gateway(prigateways, ",", 5, prigateway); //printf("test2 %s\n", prigateway); break; } else { goto ERR; } } else { printf("select timeout\n"); goto ERR; } } tcsetattr(fd, TCSAFLUSH, &tiosfd); if(strstr(buffer, "\nERROR") || strstr(buffer, "\n+CME ERROR:") || strstr(buffer, "\n+CMS ERROR:")) goto ERR; close(fd); memcpy(outgateway, prigateway+1, strlen(prigateway)-2); printf("private gateway is %s\n", outgateway); return 0; ERR: if(fd > 0) close(fd); return -1; } //2021-02-25 willa.liu@fibocom.com changed end for support eipd SN-20210129001 // UINT ifc_get_addr(const char *ifname); static void usbnet_link_change(int link, PROFILE_T *profile) { // static int s_link = 0; dbg_time("%s :link:%d ", __func__, link); if (s_link == link) return; s_link = link; if (link) { if (profile->ipv4_flag) requestGetIPAddress(profile, IpFamilyV4); if (profile->ipv6_flag) requestGetIPAddress(profile, IpFamilyV6); if (qmidev_is_pciemhi(profile->qmichannel)) udhcpc_start_pcie(profile); else udhcpc_start(profile); } else { if (qmidev_is_pciemhi(profile->qmichannel)) udhcpc_stop_pcie(profile); else udhcpc_stop(profile); } } static int check_address(PROFILE_T *now_profile,int ipfamily) { PROFILE_T new_profile_v; PROFILE_T *new_profile = &new_profile_v; static int time_out_count = 0; int ret = 0; #define QMITHREADSENDQMITIMEOUT 110 memcpy(new_profile, now_profile, sizeof(PROFILE_T)); if(ipfamily == IpFamilyV4) { ret = requestGetIPAddress(new_profile, 0x04); if (ret == 0) { time_out_count = 0; if (new_profile->ipv4.Address != now_profile->ipv4.Address || debug_qmi) { unsigned char *l = (unsigned char *)&now_profile->ipv4.Address; unsigned char *r = (unsigned char *)&new_profile->ipv4.Address; dbg_time("localIP: %d.%d.%d.%d VS remoteIP: %d.%d.%d.%d", l[3], l[2], l[1], l[0], r[3], r[2], r[1], r[0]); } return (new_profile->ipv4.Address == now_profile->ipv4.Address); } else if (ret == QMITHREADSENDQMITIMEOUT) { time_out_count++; dbg_time("%s %d time_out_count %d\n", __func__, __LINE__, time_out_count); if (time_out_count >= 3) { return 0; } else { return 1; } } } if(ipfamily == IpFamilyV6) { return 1; } return 0; } static void main_send_event_to_qmidevice(int triger_event) { write(qmidevice_control_fd[0], &triger_event, sizeof(triger_event)); } static void send_signo_to_main(int signo) { write(signal_control_fd[0], &signo, sizeof(signo)); dbg_time("write signo: %d to signal_control_fd",signo); } void qmidevice_send_event_to_main(int triger_event) { write(qmidevice_control_fd[1], &triger_event, sizeof(triger_event)); dbg_time("write triger_event: %d to qmidevice_control_fd",triger_event); } static int ls_dir(const char *dir, int (*match)(const char *dir, const char *file, void *argv[]), void *argv[]) { DIR *pDir; struct dirent *ent = NULL; int match_times = 0; pDir = opendir(dir); if (pDir == NULL) { dbg_time("Cannot open directory: %s, errno: %d (%s)", dir, errno, strerror(errno)); return 0; } while ((ent = readdir(pDir)) != NULL) { match_times += match(dir, ent->d_name, argv); } closedir(pDir); return match_times; } static int is_same_linkfile(const char *dir, const char *file, void *argv[]) { const char *qmichannel = (const char *)argv[1]; char linkname[MAX_PATH]; char filename[MAX_PATH]; int linksize; snprintf(linkname, MAX_PATH, "%s/%s", dir, file); linksize = readlink(linkname, filename, MAX_PATH); if (linksize <= 0) return 0; filename[linksize] = 0; if (strcmp(filename, qmichannel)) return 0; dbg_time("%s -> %s", linkname, filename); return 1; } static int is_brother_process(const char *dir, const char *file, void *argv[]) { // const char *myself = (const char *)argv[0]; char linkname[MAX_PATH]; char filename[MAX_PATH]; int linksize; int i = 0, kill_timeout = 15; pid_t pid; // dbg_time("%s", file); while (file[i]) { if (!isdigit(file[i])) break; i++; } if (file[i]) { // dbg_time("%s not digit", file); return 0; } snprintf(linkname, MAX_PATH, "%s/%s/exe", dir, file); linksize = readlink(linkname, filename, MAX_PATH); if (linksize <= 0) return 0; filename[linksize] = 0; pid = atoi(file); if (pid >= getpid()) return 0; snprintf(linkname, MAX_PATH, "%s/%s/fd", dir, file); if (!ls_dir(linkname, is_same_linkfile, argv)) return 0; dbg_time("%s/%s/exe -> %s", dir, file, filename); while (kill_timeout-- && !kill(pid, 0)) { kill(pid, SIGTERM); sleep(1); } if (!kill(pid, 0)) { dbg_time("force kill %s/%s/exe -> %s", dir, file, filename); kill(pid, SIGKILL); sleep(1); } return 1; } static int kill_brothers(const char *qmichannel) { char myself[MAX_PATH]; int filenamesize; void *argv[2] = {myself, (void *)qmichannel}; filenamesize = readlink("/proc/self/exe", myself, MAX_PATH); if (filenamesize <= 0) return 0; myself[filenamesize] = 0; if (ls_dir("/proc", is_brother_process, argv)) sleep(1); return 0; } static void fibo_sigaction(int signo) { if (SIGCHLD == signo) waitpid(-1, NULL, WNOHANG); else if (SIGALRM == signo) send_signo_to_main(SIGUSR1); else { if (SIGTERM == signo || SIGHUP == signo || SIGINT == signo) main_loop = 0; send_signo_to_main(signo); main_send_event_to_qmidevice(signo); // main may be wating qmi response } } static int usage(const char *progname) { dbg_time("Usage: %s [options]", progname); dbg_time( "-s [apn [user password auth]] Set " "apn/user/password/auth get from your network provider"); dbg_time( "-p pincode Verify sim card pin if " "sim card is locked"); dbg_time( "-f logfilename Save log message of this " "program to file"); dbg_time( "-i interface Specify network " "interface(default auto-detect)"); dbg_time("-4 IPv4 protocol"); dbg_time("-6 IPv6 protocol"); //2021-02-25 willa.liu@fibocom.com changed begin for support eipd SN-20210129001 dbg_time("-g IPv6 private gateway"); //2021-02-25 willa.liu@fibocom.com changed begin for support eipd SN-20210129001 //2020-12-29 willa.liu@fibocom.com changed begin for support mantis 0066901 //dbg_time( //"-P profile index Specify profile index " //"when start network data connection(default 1)."); //2020-12-29 willa.liu@fibocom.com changed end for support mantis 0066901 dbg_time( "-m muxID Specify muxid when set " "multi-pdn data connection."); dbg_time( "-n channelID Specify channelID when " "set multi-pdn data connection(default 1)."); dbg_time( "-N Number of channel Specify total channels " "when set multi-pdn data connection(default 1)."); //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 dbg_time( "-k number kill specified process "); //2020-12-23 willa.liu@fibocom.com changed end for support mantis 0065286 dbg_time("[Examples]"); dbg_time("Example 1: %s ", progname); dbg_time("Example 2: %s -s 3gnet ", progname); dbg_time("Example 3: %s -s 3gnet carl 1234 0 -p 1234 -f gobinet_log.txt", progname); return 0; } static int charsplit(const char *src, char *desc, int n, const char *splitStr) { char *p; char *p1; int len; len = strlen(splitStr); p = strstr(src, splitStr); if (p == NULL) return -1; p1 = strstr(p, "\n"); if (p1 == NULL) return -1; memset(desc, 0, n); memcpy(desc, p + len, p1 - p - len); return 0; } static int get_dev_major_minor(char *path, int *major, int *minor) { int fd = -1; char desc[128] = {0}; char devmajor[64], devminor[64]; int n = 0; if (access(path, R_OK | W_OK)) { return 1; } if ((fd = open(path, O_RDWR)) < 0) { return 1; } n = read(fd, desc, sizeof(desc)); if (n == sizeof(desc)) { dbg_time("may be overflow"); } close(fd); if (charsplit(desc, devmajor, 64, "MAJOR=") == -1 || charsplit(desc, devminor, 64, "MINOR=") == -1) { return 2; } *major = atoi(devmajor); *minor = atoi(devminor); return 0; } #ifdef GHT_FEATURE_PCIE_AUTO //begin modified by zhangkaibo add PCIe auto detect feature on x55/x24 platform. 20200605 static int qmipciedevice_detect(char **pp_qmichannel, char **pp_usbnet_adapter) { struct dirent *ent = NULL; DIR *pDir; char dir[255] = "/sys/bus/pci/devices"; struct { char subdir[255 * 2]; char subdir2[255 * 3 + 16]; char qmifile[255 * 2]; } * pl; pl = (typeof(pl))malloc(sizeof(*pl)); memset(pl, 0x00, sizeof(*pl)); pDir = opendir(dir); if (pDir) { while ((ent = readdir(pDir)) != NULL) { struct dirent *subent = NULL; DIR *psubDir; char idVendor[4 + 1] = {0}; char idDevice[4 + 1] = {0}; char tempNetpath[256] = {0}; int fd = 0; char netcard[32] = "\0"; memset(pl, 0x00, sizeof(*pl)); snprintf(pl->subdir, sizeof(pl->subdir), "%s/%s/vendor", dir, ent->d_name); fd = open(pl->subdir, O_RDONLY); if (fd > 0) { read(fd, idVendor, 6); close(fd); } snprintf(pl->subdir, sizeof(pl->subdir), "%s/%s/device", dir, ent->d_name); fd = open(pl->subdir, O_RDONLY); if (fd > 0) { read(fd, idDevice, 6); close(fd); } if (!strncasecmp(idVendor, "0x17cb", 6)) ; else continue; dbg_time("Find %s/%s vendor=%s device=%s", dir, ent->d_name, idVendor,idDevice); //find pcie netdevicename snprintf(tempNetpath,256,"%s%s_IP_HW0", idDevice+2 , ent->d_name+2); snprintf(pl->subdir, sizeof(pl->subdir), "%s/%s/%s/net", dir, ent->d_name,tempNetpath); psubDir = opendir(pl->subdir); if (psubDir == NULL) { dbg_time("Cannot open directory: %s, errno: %d (%s)", pl->subdir, errno, strerror(errno)); continue; } while ((subent = readdir(psubDir)) != NULL) { if (subent->d_name[0] == '.') continue; dbg_time("Find pcienet_adapter = %s", subent->d_name); strcpy(netcard, subent->d_name); break; } closedir(psubDir); if (netcard[0]) { } else { continue; } *pp_usbnet_adapter = strdup(netcard); break; } closedir(pDir); } //find pcie qmi control name if ((pDir = opendir("/dev")) == NULL) { dbg_time("Cannot open directory: %s, errno:%d (%s)", "/dev", errno, strerror(errno)); return -ENODEV; } while ((ent = readdir(pDir)) != NULL) { if ( strncmp(ent->d_name, "mhi_QMI", strlen("mhi_QMI")) == 0 ) { *pp_qmichannel = (char *)malloc(32); sprintf(*pp_qmichannel, "/dev/%s", ent->d_name); dbg_time("Find qmichannel = %s", *pp_qmichannel); break; } } closedir(pDir); free(pl); return (*pp_qmichannel && *pp_usbnet_adapter); } //end modified by zhangkaibo add PCIe auto detect feature on x55/x24 platform. 20200605 #endif static int qmidevice_detect(char **pp_qmichannel, char **pp_usbnet_adapter,PROFILE_T *profile) { struct dirent *ent = NULL; DIR *pDir; char dir[255] = "/sys/bus/usb/devices"; int major = 0, minor = 0; int indexid = 4; struct { char subdir[255 * 3]; char subdir2[255 * 4 + 16]; char qmifile[255 * 2]; } * pl; #ifdef GHT_FEATURE_PCIE_AUTO //begin modified by zhangkaibo add PCIe auto detect feature on x55/x24 platform. 20200605 if (qmipciedevice_detect(pp_qmichannel, pp_usbnet_adapter)) { return (*pp_qmichannel && *pp_usbnet_adapter); } //end modified by zhangkaibo add PCIe auto detect feature on x55/x24 platform. 20200605 #endif pl = (typeof(pl))malloc(sizeof(*pl)); memset(pl, 0x00, sizeof(*pl)); pDir = opendir(dir); if (pDir) { while ((ent = readdir(pDir)) != NULL) { struct dirent *subent = NULL; DIR *psubDir; char idVendor[4 + 1] = {0}; char idProduct[4 + 1] = {0}; int fd = 0; char netcard[32] = "\0"; memset(pl, 0x00, sizeof(*pl)); snprintf(pl->subdir, sizeof(pl->subdir), "%s/%s/idVendor", dir, ent->d_name); fd = open(pl->subdir, O_RDONLY); if (fd > 0) { read(fd, idVendor, 4); close(fd); } snprintf(pl->subdir, sizeof(pl->subdir), "%s/%s/idProduct", dir, ent->d_name); fd = open(pl->subdir, O_RDONLY); if (fd > 0) { read(fd, idProduct, 4); close(fd); } if (!strncasecmp(idVendor, "05c6", 4) || !strncasecmp(idVendor, "2cb7", 4)) ; else continue; dbg_time("Find %s/%s idVendor=%s idProduct=%s", dir, ent->d_name, idVendor, idProduct); //2021-02-08 zhangkaibo@fibocom.com changed start for mantis 0070613 if(!strncasecmp(idProduct, "0109", 4)) { indexid = 2; profile->interfacenum = 2; } //2021-09-09 willa.liu@fibocom.com changed start for mantis 0086219 else if(!strncasecmp(idProduct, "0113", 4)) { indexid = 0; profile->interfacenum = 0; } //2021-09-09 willa.liu@fibocom.com changed end for mantis 0086219 else { profile->interfacenum = 4; } snprintf(pl->subdir, sizeof(pl->subdir), "%s/%s:1.%d/net", dir, ent->d_name,indexid); psubDir = opendir(pl->subdir); if (psubDir == NULL) { dbg_time("Cannot open directory: %s, errno: %d (%s)", pl->subdir, errno, strerror(errno)); continue; } while ((subent = readdir(psubDir)) != NULL) { if (subent->d_name[0] == '.') continue; dbg_time("Find %s/%s", pl->subdir, subent->d_name); dbg_time("Find usbnet_adapter = %s", subent->d_name); strcpy(netcard, subent->d_name); break; } closedir(psubDir); if (netcard[0]) { } else { continue; } if (*pp_usbnet_adapter && strcmp(*pp_usbnet_adapter, netcard)) continue; snprintf(pl->subdir, sizeof(pl->subdir), "%s/%s:1.%d/GobiQMI", dir, ent->d_name,indexid); if (access(pl->subdir, R_OK)) { snprintf(pl->subdir, sizeof(pl->subdir), "%s/%s:1.%d/usbmisc", dir, ent->d_name,indexid); if (access(pl->subdir, R_OK)) { snprintf(pl->subdir, sizeof(pl->subdir), "%s/%s:1.%d/usb", dir, ent->d_name,indexid); if (access(pl->subdir, R_OK)) { dbg_time("no GobiQMI/usbmic/usb found in %s/%s:1.%d", dir, ent->d_name,indexid); continue; } } } //2021-02-08 zhangkaibo@fibocom.com changed end for mantis 0070613 psubDir = opendir(pl->subdir); if (pDir == NULL) { dbg_time("Cannot open directory: %s, errno: %d (%s)", dir, errno, strerror(errno)); continue; } while ((subent = readdir(psubDir)) != NULL) { if (subent->d_name[0] == '.') continue; dbg_time("Find %s/%s", pl->subdir, subent->d_name); dbg_time("Find qmichannel = /dev/%s", subent->d_name); snprintf(pl->qmifile, sizeof(pl->qmifile), "/dev/%s", subent->d_name); // get major minor snprintf(pl->subdir2, sizeof(pl->subdir2), "%s/%s/uevent", pl->subdir, subent->d_name); if (!get_dev_major_minor(pl->subdir2, &major, &minor)) { // dbg_time("%s major = %d, minor = %d\n",pl->qmifile, // major, minor); } else { dbg_time("get %s major and minor failed\n", pl->qmifile); } // get major minor if ((fd = open(pl->qmifile, R_OK)) < 0) { dbg_time("%s open failed", pl->qmifile); dbg_time("please mknod %s c %d %d", pl->qmifile, major, minor); } else { close(fd); } break; } closedir(psubDir); if (netcard[0] && pl->qmifile[0]) { *pp_qmichannel = strdup(pl->qmifile); *pp_usbnet_adapter = strdup(netcard); closedir(pDir); return 1; } } closedir(pDir); } if ((pDir = opendir("/dev")) == NULL) { dbg_time("Cannot open directory: %s, errno:%d (%s)", "/dev", errno, strerror(errno)); return -ENODEV; } while ((ent = readdir(pDir)) != NULL) { if ((strncmp(ent->d_name, "cdc-wdm", strlen("cdc-wdm")) == 0) || (strncmp(ent->d_name, "qcqmi", strlen("qcqmi")) == 0)) { char net_path[255*2]; *pp_qmichannel = (char *)malloc(32); sprintf(*pp_qmichannel, "/dev/%s", ent->d_name); dbg_time("Find qmichannel = %s", *pp_qmichannel); if (strncmp(ent->d_name, "cdc-wdm", strlen("cdc-wdm")) == 0) sprintf(net_path, "/sys/class/net/wwan%s", &ent->d_name[strlen("cdc-wdm")]); else { sprintf(net_path, "/sys/class/net/usb%s", &ent->d_name[strlen("qcqmi")]); if (access(net_path, R_OK) && errno == ENOENT) sprintf(net_path, "/sys/class/net/eth%s", &ent->d_name[strlen("qcqmi")]); } if (access(net_path, R_OK) == 0) { if (*pp_usbnet_adapter && strcmp(*pp_usbnet_adapter, (net_path + strlen("/sys/class/net/")))) { free(*pp_qmichannel); *pp_qmichannel = NULL; continue; } *pp_usbnet_adapter = strdup(net_path + strlen("/sys/class/net/")); dbg_time("Find usbnet_adapter = %s", *pp_usbnet_adapter); break; } else { dbg_time("Failed to access %s, errno:%d (%s)", net_path, errno, strerror(errno)); free(*pp_qmichannel); *pp_qmichannel = NULL; } } } closedir(pDir); free(pl); return (*pp_qmichannel && *pp_usbnet_adapter); } //begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605 int IsInt(char* str) { int len; len = strlen(str); int i=0; for(; i < len ; i++) { if(!(isdigit(str[i]))) return 0; } return 1; } //end modified by zhangkaibo limit input parameters. mantis 0048965 20200605 //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 int rdwr_init(int clienfd, char * msg) { char buf[512]; int rv = 0; memset(buf, 0, 512); while(1) { if ((rv = read(clienfd, buf, 512)) < 0) { dbg_time("Read by socket[%d] error:%s", clienfd, strerror(errno)); goto STOP; } else if (0 == rv) { goto STOP; } else if (rv > 0) { dbg_time("Read %d bytes data from client, there are :[%s]", rv, buf); } if ((rv =write(clienfd, msg, strlen(msg))) < 0) { dbg_time("write to cilent by socket[%d] error:%s",clienfd, strerror(errno)); goto STOP; } } STOP: dbg_time("The socket[%d] will exit!", clienfd); return 0; } void *thread_socket_server(void *args) { int on = 1; int rv = 0; struct sockaddr_un serv_addr; struct sockaddr_un cli_addr; socklen_t len = sizeof(serv_addr); sprintf(fibo_dial_filepath,"/tmp/fibocom_dial_%d",*(int*)args); char* msg = "receive quit request\n"; if ((socket_server_fd = socket(AF_UNIX,SOCK_STREAM,0))< 0) { dbg_time("Socket error:%s\a\n", strerror(errno)); return ; } dbg_time("socket[%d] successfuly!", socket_server_fd); if (!access(fibo_dial_filepath, F_OK)) { unlink(fibo_dial_filepath); } setsockopt(socket_server_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sun_family = AF_UNIX; strncpy(serv_addr.sun_path, fibo_dial_filepath, sizeof(serv_addr.sun_path) - 1); if ((rv = bind(socket_server_fd, (struct sockaddr *)&serv_addr, len)) < 0) { dbg_time("Bind error %s", strerror(errno)); goto EXIT; } if ((rv = listen(socket_server_fd, 13)) < 0) { dbg_time("Listen error:%s", strerror(errno)); goto EXIT; } dbg_time("Waiting client to connect....."); sem_post(&sem); while(1) { if ((cli_accept_fd = accept(socket_server_fd, (struct sockaddr *)&cli_addr, &len))< 0) { dbg_time("accept error:%s", strerror(errno)); goto EXIT; } dbg_time("client to connected"); rv = rdwr_init(cli_accept_fd, msg); goto EXIT; } EXIT: unlink(fibo_dial_filepath); close(socket_server_fd ); close(cli_accept_fd ); send_signo_to_main(SIGTERM); return ((void *)0); } //2020-12-29 willa.liu@fibocom.com changed begin for support mantis 0066901 int startSocketserver(int pdpindex) { pthread_t ntid; //sem_init(&sem, 0, 2); sem_init(&sem, 0, 0); if (pthread_create(&ntid, 0, thread_socket_server, (void *)(&pdpindex)) != 0) { dbg_time("%s Failed to create QMIThread: %d (%s)", __func__, errno, strerror(errno)); } sem_wait(&sem); sem_destroy(&sem); return 0; } //2020-12-29 willa.liu@fibocom.com changed begin for support mantis 0066901 int startSocketclient(int pdpindex) { int socket_client_fd; int rv = -1; struct sockaddr_un servaddr; char fibo_dial_filepath[100] = {0}; sprintf(fibo_dial_filepath,"/tmp/fibocom_dial_%d",pdpindex); dbg_time("enter startSocketclient %s.",fibo_dial_filepath); char* message = "fibocom-dial quit request"; char buf[1024]; if(access(fibo_dial_filepath, F_OK) != 0) { return -1; } socket_client_fd = socket(AF_UNIX,SOCK_STREAM,0); if(socket_client_fd < 0) { dbg_time("Cearte socket failure :%s\a",strerror(errno)); return -1; } dbg_time("Create socket [%d] sucessfully.",socket_client_fd); memset(&servaddr,0,sizeof(servaddr)); servaddr.sun_family = AF_UNIX; strncpy(servaddr.sun_path, fibo_dial_filepath, sizeof(servaddr.sun_path) - 1); rv = connect(socket_client_fd,(struct sockaddr *)&servaddr,sizeof(servaddr)); if(rv <0) { dbg_time("connect to server [%s] failure :%s\a",fibo_dial_filepath,strerror(errno)); return -2; } dbg_time("connect to server [%s] successfully!",fibo_dial_filepath); rv = write(socket_client_fd,message,strlen(message)); if(rv <0) { dbg_time("Write to server failure by socket[%d] failure: %s",socket_client_fd,strerror(errno)); return -3; } else { dbg_time("Write [%s] to server by socket[%d] successfuly!", message, socket_client_fd); } memset(buf,0,sizeof(buf)); rv = read(socket_client_fd,buf,1024); if(rv < 0) { dbg_time("Read to server socket[%d] failure: %s",socket_client_fd,strerror(errno)); return -4; } else if(rv == 0) { dbg_time("socket [%d] get disconnected",socket_client_fd); return -4; } else if(rv >0) { dbg_time("Read [%d] bytes data from Server: [%s]",rv,buf); } close(socket_client_fd); unlink(fibo_dial_filepath); return 0; } //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 int main(int argc, char *argv[]) { int triger_event = 0; int opt = 1; int signo; //2021-03-24 willa.liu@fibocom.com changed begin for support mantis 0071817 int sim_number = 0; //begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605 char argvtemp[256] = {0}; //end modified by zhangkaibo limit input parameters. mantis 0048965 20200605 //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 int killnumber = -1; //2020-12-23 willa.liu@fibocom.com changed end for support mantis 0065286 #ifdef CONFIG_SIM SIM_Select SIMNumber; //2021-03-24 willa.liu@fibocom.com changed end for support mantis 0071817 SIM_Status SIMStatus; #endif UCHAR PSAttachedState; UCHAR IPv4ConnectionStatus = 0xff; // unknow state UCHAR IPV6ConnectionStatus = 0xff; // unknow state int qmierr = 0; char *save_usbnet_adapter = NULL; PROFILE_T profile; #ifdef CONFIG_RESET_RADIO struct timeval resetRadioTime = {0}; struct timeval FailDailRadioTime = {0}; struct timeval nowTime; gettimeofday(&resetRadioTime, (struct timezone *)NULL); #endif dbg_time("Fibocom-dial_Linux_Tool_V%s", VERSION_STRING()); memset(&profile, 0x00, sizeof(profile)); profile.pdp = CONFIG_DEFAULT_PDP; profile.pdpindex = CONFIG_DEFAULT_PDPINDEX; profile.pdpnum = 1; if (!strcmp(argv[argc - 1], "&")) argc--; opt = 1; while (opt < argc) { if (argv[opt][0] != '-') return usage(argv[0]); switch (argv[opt++][1]) { #define has_more_argv() ((opt < argc) && (argv[opt][0] != '-')) case 's': profile.apn = profile.user = profile.password = ""; if (has_more_argv()) profile.apn = argv[opt++]; if (has_more_argv()) profile.user = argv[opt++]; if (has_more_argv()) { profile.password = argv[opt++]; if (profile.password && profile.password[0]) profile.auth = 2; // default chap, customers may miss auth } if (has_more_argv()) //begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605 { memset(argvtemp,0,256); strcpy(argvtemp,argv[opt++]); if(strlen(argvtemp) > 1 || !IsInt(argvtemp)) { dbg_time("Invalid parament for \"-s\""); return -1; } profile.auth = argvtemp[0] - '0'; //begin modified by zhangkaibo limit input parameters. mantis 0077949 20200513 if(profile.auth < 0 || profile.auth > 3) { dbg_time("auth must be 0~3"); //end modified by zhangkaibo limit input parameters. mantis 0077949 20200513 return -1; } } //end modified by zhangkaibo limit input parameters. mantis 0048965 20200605 break; case 'm': if (has_more_argv()) { if (is_pcie_dial()) profile.muxid = argv[opt++][0] - '0'; else { memset(argvtemp,0,256); strcpy(argvtemp,argv[opt++]); if(strlen(argvtemp) > 1 || !IsInt(argvtemp)) { dbg_time("Invalid parament for \"-P\""); return -1; } profile.pdpindex = argvtemp[0] - '0'; if(profile.pdpindex < 1 || profile.pdpindex > 10) { dbg_time("pdpindex must be 1~10"); return -1; } } } break; case 'p': if (has_more_argv()) profile.pincode = argv[opt++]; break; #if 0 case 'P': if (has_more_argv()) //begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605 { memset(argvtemp,0,256); strcpy(argvtemp,argv[opt++]); if(strlen(argvtemp) > 1 || !IsInt(argvtemp)) { dbg_time("Invalid parament for \"-P\""); return -1; } profile.pdpindex = argvtemp[0] - '0'; if(profile.pdpindex < 1 || profile.pdpindex > 10) { dbg_time("pdpindex must be 1~10"); return -1; } } //end modified by zhangkaibo limit input parameters. mantis 0048965 20200605 break; #endif case 'n': if (has_more_argv()) //begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605 { memset(argvtemp,0,256); strcpy(argvtemp,argv[opt++]); if(strlen(argvtemp) > 1 || !IsInt(argvtemp)) { dbg_time("Invalid parament for \"-n\""); return -1; } profile.pdp = argvtemp[0] - '0'; if(profile.pdp < 1 || profile.pdp > 8) { dbg_time("pdpindex must be 1~8"); return -1; } if (is_pcie_dial()) profile.pdpindex = profile.pdp; } break; //end modified by zhangkaibo limit input parameters. mantis 0048965 20200605 case 'N': if (has_more_argv()) //begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605 { memset(argvtemp,0,256); strcpy(argvtemp,argv[opt++]); if(strlen(argvtemp) > 1 || !IsInt(argvtemp)) { dbg_time("Invalid parament for \"-N\""); return -1; } profile.pdpnum = argvtemp[0] - '0'; if(profile.pdpnum < 0 || profile.pdpnum > 8) { dbg_time("pdpnum must be 0~8"); return -1; } } //end modified by zhangkaibo limit input parameters. mantis 0048965 20200605 break; case 'f': if (has_more_argv()) { const char *filename = argv[opt++]; logfilefp = fopen(filename, "a+"); if (!logfilefp) { dbg_time("Fail to open %s, errno: %d(%s)", filename, errno, strerror(errno)); } } break; case 'i': if (has_more_argv()) profile.usbnet_adapter = save_usbnet_adapter = argv[opt++]; break; case 'v': debug_qmi = 1; break; case 'l': if (has_more_argv()) { profile.replication_factor = atoi(argv[opt++]); if (profile.replication_factor > 0) profile.loopback_state = 1; } else main_loop = 1; break; case '4': profile.ipv4_flag = 1; break; case '6': profile.ipv6_flag = 1; break; //2021-02-25 willa.liu@fibocom.com changed begin for support eipd SN-20210129001 case 'g': profile.ipv6_prigateway_flag = 1; break; //2021-02-25 willa.liu@fibocom.com changed end for support eipd SN-20210129001 case 'd': if (has_more_argv()) { profile.qmichannel = argv[opt++]; if (qmidev_is_pciemhi(profile.qmichannel)) profile.usbnet_adapter = "pcie_mhi0"; } break; case 'U': query_pcie_mode = 1; break; //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 case 'k': if (has_more_argv()) { memset(argvtemp,0,256); strcpy(argvtemp,argv[opt++]); if(strlen(argvtemp) > 1 || !IsInt(argvtemp)) { dbg_time("Invalid parament for \"-n\""); return -1; } killnumber = argvtemp[0] - '0'; //2021-02-01 willa.liu@fibocom.com changed begin for support mantis 0069837 //if(killnumber < 1 || killnumber > 5) if(killnumber < 1 || killnumber > 8) { dbg_time("pdpindex must be 1~8"); return -1; } //2021-02-01 willa.liu@fibocom.com changed end for support mantis 0069837 } break; //2020-12-23 willa.liu@fibocom.com changed end for support mantis 0065286 default: return usage(argv[0]); break; } } if (profile.ipv4_flag != 1 && profile.ipv6_flag != 1) { // default enable IPv4 profile.ipv4_flag = 1; } dbg_time("%s profile[%d] = %s/%s/%s/%d, pincode = %s", argv[0], profile.pdp, profile.apn, profile.user, profile.password, profile.auth, profile.pincode); signal(SIGUSR1, fibo_sigaction); signal(SIGUSR2, fibo_sigaction); signal(SIGINT, fibo_sigaction); signal(SIGTERM, fibo_sigaction); signal(SIGHUP, fibo_sigaction); signal(SIGCHLD, fibo_sigaction); signal(SIGALRM, fibo_sigaction); //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 if(killnumber == -1) { startSocketserver(profile.pdp); } else{ startSocketclient(killnumber); return 0; } //2020-12-23 willa.liu@fibocom.com changed end for support mantis 0065286 if (socketpair(AF_LOCAL, SOCK_STREAM, 0, signal_control_fd) < 0) { dbg_time("%s Faild to create main_control_fd: %d (%s)", __func__, errno, strerror(errno)); return -1; } if (socketpair(AF_LOCAL, SOCK_STREAM, 0, qmidevice_control_fd) < 0) { dbg_time("%s Failed to create thread control socket pair: %d (%s)", __func__, errno, strerror(errno)); return 0; } // sudo apt-get install udhcpc // sudo apt-get remove ModemManager __main_loop: while (!profile.qmichannel) { //2021-02-08 zhangkaibo@fibocom.com changed start for mantis 0070613 if (qmidevice_detect(&profile.qmichannel, &profile.usbnet_adapter,&profile)) //2021-02-08 zhangkaibo@fibocom.com changed end for mantis 0070613 { if (query_pcie_mode) get_pcie_mode(); break; } if (main_loop) { int wait_for_device = 3000; dbg_time("Wait for fibo modules connect"); while (wait_for_device && main_loop) { wait_for_device -= 100; usleep(100 * 1000); } continue; } dbg_time( "Cannot find qmichannel(%s) usbnet_adapter(%s) for fibo modules", profile.qmichannel, profile.usbnet_adapter); return -ENODEV; } if (access(profile.qmichannel, R_OK | W_OK)) { dbg_time("Fail to access %s, errno: %d (%s)", profile.qmichannel, errno, strerror(errno)); return errno; } dbg_time( "qmichannel(%s) usbnet_adapter(%s) ", profile.qmichannel, profile.usbnet_adapter); if (qmidev_is_gobinet(profile.qmichannel)) { profile.qmi_ops = &gobi_qmidev_ops; dbg_time("usb rmnet mode"); } else { profile.qmi_ops = &qmiwwan_qmidev_ops; dbg_time("pcie mode"); } qmidev_send = profile.qmi_ops->send; fibo_qmap_mode_detect(&profile); if (profile.pdpnum > 1 && profile.pdpnum != profile.qmap_mode && !qmidev_is_pciemhi(profile.qmichannel)) { if (profile.qmap_mode > 1) { dbg_time("qmap_mode=%d,profile.pdpnum %d",profile.qmap_mode,profile.pdpnum); kill_brothers(profile.qmichannel); } fibo_qmap_mode_set(&profile); } fibo_qmap_mode_detect(&profile); //begin modified by zhangkaibo limit input parameters. mantis 0048965 20200605 if(profile.qmap_mode < profile.pdp && profile.qmap_mode > 0 && !qmidev_is_pciemhi(profile.qmichannel)) { dbg_time("invalid pdpindex"); return -1; } //end modified by zhangkaibo limit input parameters. mantis 0048965 20200605 if (profile.qmap_mode == 0 || profile.qmap_mode == 1) { dbg_time("qmap_mode=%d",profile.qmap_mode); kill_brothers(profile.qmichannel); } if (pthread_create(&gQmiThreadID, 0, profile.qmi_ops->read, (void *)&profile) != 0) { dbg_time("%s Failed to create QMIThread: %d (%s)", __func__, errno, strerror(errno)); return 0; } if ((read(qmidevice_control_fd[0], &triger_event, sizeof(triger_event)) != sizeof(triger_event)) || (triger_event != RIL_INDICATE_DEVICE_CONNECTED)) { dbg_time("%s Failed to init QMIThread: %d (%s)", __func__, errno, strerror(errno)); return 0; } if (profile.qmi_ops->init && profile.qmi_ops->init(&profile)) { dbg_time("%s Failed to qmi init: %d (%s)", __func__, errno, strerror(errno)); return 0; } #ifdef CONFIG_VERSION requestBaseBandVersion(NULL); #endif requestSetEthMode(&profile); #ifdef CONFIG_SIM //2021-03-24 willa.liu@fibocom.com changed begin for support mantis 0071817 sim_number = requestGetSIMCardNumber(&profile); if(sim_number == 1){ requestSimBindSubscription_NAS_WMS(); requestSimBindSubscription_WDS_DMS_QOS(); } //qmierr = requestGetSIMStatus(&SIMStatus); qmierr = requestGetSIMStatus(&SIMStatus, sim_number); while (qmierr == QMI_ERR_OP_DEVICE_UNSUPPORTED) { sleep(1); //qmierr = requestGetSIMStatus(&SIMStatus); qmierr = requestGetSIMStatus(&SIMStatus, sim_number); //2021-03-24 willa.liu@fibocom.com changed begin for support mantis 0071817 } if ((SIMStatus == SIM_PIN) && profile.pincode) { requestEnterSimPin(profile.pincode); } #ifdef CONFIG_IMSI_ICCID if (SIMStatus == SIM_READY) { requestGetICCID(); requestGetIMSI(); } #endif #endif #ifdef CONFIG_APN if (profile.apn || profile.user || profile.password) { requestSetProfile(&profile); } requestGetProfile(&profile); #endif requestRegistrationState2(&PSAttachedState); /* if (!requestQueryDataCall(&IPv4ConnectionStatus, IpFamilyV4) && (QWDS_PKT_DATA_CONNECTED == IPv4ConnectionStatus)) usbnet_link_change(1, &profile); else usbnet_link_change(0, &profile); */ send_signo_to_main(SIGUSR2); while (1) { struct pollfd pollfds[] = {{signal_control_fd[1], POLLIN, 0}, {qmidevice_control_fd[0], POLLIN, 0}}; int ne, ret, nevents = sizeof(pollfds) / sizeof(pollfds[0]); do { ret = poll(pollfds, nevents, 15 * 1000); } while ((ret < 0) && (errno == EINTR)); if (ret == 0) { send_signo_to_main(SIGUSR2); continue; } if (ret <= 0) { dbg_time("%s poll=%d, errno: %d (%s)", __func__, ret, errno, strerror(errno)); goto __main_quit; } for (ne = 0; ne < nevents; ne++) { int fd = pollfds[ne].fd; short revents = pollfds[ne].revents; dbg_time("epoll fd = %d, events = 0x%04x", fd, revents); if (revents & (POLLERR | POLLHUP | POLLNVAL)) { dbg_time("%s poll err/hup", __func__); dbg_time("epoll fd = %d, events = 0x%04x", fd, revents); main_send_event_to_qmidevice(RIL_REQUEST_QUIT); if (revents & POLLHUP) goto __main_quit; } if ((revents & POLLIN) == 0) continue; if (fd == signal_control_fd[1]) { if (read(fd, &signo, sizeof(signo)) == sizeof(signo)) { alarm(0); dbg_time("get signo: %d ",signo); switch (signo) { case SIGUSR1: { if(profile.ipv4_flag) { if (QWDS_PKT_DATA_CONNECTED != IPv4ConnectionStatus) { usbnet_link_change(0, &profile); requestRegistrationState2(&PSAttachedState); //2021-02-05 willa.liu@fibocom.com changed begin for support mantis 0070460 //if (PSAttachedState == 1 || profile.loopback_state == 0) { if (PSAttachedState == 1 || profile.loopback_state == 1) { qmierr = requestSetupDataCall(&profile, IpFamilyV4); if ((qmierr > 0) && profile.user && profile.user[0] && profile.password && profile.password[0]) { int old_auto = profile.auth; // may be fail because wrong auth mode, try // pap->chap, or chap->pap profile.auth = (profile.auth == 1) ? 2 : 1; qmierr = requestSetupDataCall(&profile, IpFamilyV4); if (qmierr) profile.auth = old_auto; // still fail, restore // old auth moe } if (!qmierr) { requestGetIPAddress(&profile, IpFamilyV4); } if (!qmierr){ IPv4ConnectionStatus = QWDS_PKT_DATA_CONNECTED; FailDailRadioTime.tv_sec = 0; } else if(FailDailRadioTime.tv_sec == 0) { gettimeofday(&FailDailRadioTime, (struct timezone *)NULL); } } } } if(profile.ipv6_flag) { if (QWDS_PKT_DATA_CONNECTED != IPV6ConnectionStatus) { if(!profile.ipv4_flag) { usbnet_link_change(0, &profile); requestRegistrationState2(&PSAttachedState); } else { profile.dual_flag = 1; //PSAttachedState = 1; // for dual stack requestRegistrationState2(&PSAttachedState); } //2021-02-05 willa.liu@fibocom.com changed end for support mantis 0070460 if (PSAttachedState == 1) { qmierr = requestSetupDataCall(&profile, IpFamilyV6); if ((g_MobileCountryCode == 460) && (g_MobileNetworkCode == 1 || g_MobileNetworkCode == 6)) { if (qmierr > 0 && profile.dual_flag == 1) { profile.dual_flag = 0; profile.ipv6_flag = 0; dbg_time("%s Dual stack dial IPv6 failed, quit", __func__); break; } } if ((qmierr > 0) && profile.user && profile.user[0] && profile.password && profile.password[0]) { int old_auto = profile.auth; // may be fail because wrong auth mode, try // pap->chap, or chap->pap profile.auth = (profile.auth == 1) ? 2 : 1; qmierr = requestSetupDataCall(&profile, IpFamilyV6); if (qmierr) profile.auth = old_auto; // still fail, restore // old auth moe } if (!qmierr) { requestGetIPAddress(&profile, IpFamilyV6); } if (!qmierr){ IPV6ConnectionStatus = QWDS_PKT_DATA_CONNECTED; FailDailRadioTime.tv_sec = 0; } else if(FailDailRadioTime.tv_sec == 0) { gettimeofday(&FailDailRadioTime, (struct timezone *)NULL); } } } } #ifdef CONFIG_RESET_RADIO if( ((profile.ipv4_flag)&&(IPv4ConnectionStatus != QWDS_PKT_DATA_CONNECTED))|| ((profile.ipv6_flag)&&(IPV6ConnectionStatus != QWDS_PKT_DATA_CONNECTED))) { gettimeofday(&nowTime, (struct timezone *)NULL); if( ((abs(nowTime.tv_sec - FailDailRadioTime.tv_sec) > CONFIG_RESET_RADIO)) &&(FailDailRadioTime.tv_sec > resetRadioTime.tv_sec)){ resetRadioTime = nowTime; // requestSetOperatingMode(0x06); //same as // AT+CFUN=0 requestSetOperatingMode( 0x01); // same as AT+CFUN=4 requestSetOperatingMode( 0x00); // same as AT+CFUN=1 } } #endif alarm(5); // try to setup data call 5 seconds later } break; case SIGUSR2: { if (profile.ipv4_flag) { requestQueryDataCall(&IPv4ConnectionStatus, IpFamilyV4); //local ip is different with remote ip if (QWDS_PKT_DATA_CONNECTED == IPv4ConnectionStatus && check_address(&profile,IpFamilyV4) == 0) { requestDeactivateDefaultPDP(&profile, IpFamilyV4); IPv4ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; } } else IPv4ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; if (profile.ipv6_flag) requestQueryDataCall(&IPV6ConnectionStatus, IpFamilyV6); else IPV6ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; if(IPv4ConnectionStatus == QWDS_PKT_DATA_DISCONNECTED && IPV6ConnectionStatus == QWDS_PKT_DATA_DISCONNECTED) { usbnet_link_change(0, &profile); } if((profile.ipv6_flag && profile.ipv6_flag ) && ((IPv4ConnectionStatus == QWDS_PKT_DATA_CONNECTED && IPV6ConnectionStatus == QWDS_PKT_DATA_CONNECTED)) ) { usbnet_link_change(1, &profile); } else if(IPv4ConnectionStatus == QWDS_PKT_DATA_CONNECTED || IPV6ConnectionStatus == QWDS_PKT_DATA_CONNECTED) { usbnet_link_change(1, &profile); } if((profile.ipv4_flag && IPv4ConnectionStatus == QWDS_PKT_DATA_DISCONNECTED ) || (profile.ipv6_flag && IPV6ConnectionStatus == QWDS_PKT_DATA_DISCONNECTED )) { send_signo_to_main(SIGUSR1); } } break; case SIGTERM: case SIGHUP: case SIGINT: if(profile.ipv4_flag && IPv4ConnectionStatus == QWDS_PKT_DATA_CONNECTED) requestDeactivateDefaultPDP(&profile, IpFamilyV4); if(profile.ipv6_flag && IPV6ConnectionStatus == QWDS_PKT_DATA_CONNECTED) requestDeactivateDefaultPDP(&profile, IpFamilyV6); usbnet_link_change(0, &profile); if (profile.qmi_ops->deinit) profile.qmi_ops->deinit(); main_send_event_to_qmidevice(RIL_REQUEST_QUIT); goto __main_quit; break; default: break; } } } if (fd == qmidevice_control_fd[0]) { if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) { switch (triger_event) { case RIL_INDICATE_DEVICE_DISCONNECTED: usbnet_link_change(0, &profile); if (main_loop) { if (pthread_join(gQmiThreadID, NULL)) { dbg_time( "%s Error joining to listener thread (%s)", __func__, strerror(errno)); } profile.qmichannel = NULL; profile.usbnet_adapter = save_usbnet_adapter; goto __main_loop; } goto __main_quit; break; case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: requestRegistrationState2(&PSAttachedState); if (PSAttachedState == 1) { //begin modify for mantis 0050112 by kaibo.zhangkaibo@fibocom.com if((profile.ipv4_flag && IPv4ConnectionStatus == QWDS_PKT_DATA_DISCONNECTED) ||(profile.ipv6_flag && IPV6ConnectionStatus == QWDS_PKT_DATA_DISCONNECTED)) //end modify for mantis 0050112 by kaibo.zhangkaibo@fibocom.com send_signo_to_main(SIGUSR1); } break; case RIL_UNSOL_DATA_CALL_LIST_CHANGED: if (IPv4ConnectionStatus == QWDS_PKT_DATA_CONNECTED || IPV6ConnectionStatus == QWDS_PKT_DATA_CONNECTED) send_signo_to_main(SIGUSR2); break; default: break; } } } } } __main_quit: usbnet_link_change(0, &profile); if (pthread_join(gQmiThreadID, NULL)) { dbg_time("%s Error joining to listener thread (%s)", __func__, strerror(errno)); } close(signal_control_fd[0]); close(signal_control_fd[1]); close(qmidevice_control_fd[0]); close(qmidevice_control_fd[1]); dbg_time("%s exit", __func__); if (logfilefp) fclose(logfilefp); //2020-12-23 willa.liu@fibocom.com changed begin for support mantis 0065286 unlink(fibo_dial_filepath); close(socket_server_fd ); close(cli_accept_fd ); //2020-12-23 willa.liu@fibocom.com changed end for support mantis 0065286 return 0; }