// File: /workspace/github_c_makefile_star2_O0/Carton32[P]quectel-CM/quectel-qmi-proxy.c
// Function: recv_qmi_from_dev
static void recv_qmi_from_dev(PQCQMIMSG pQMI) {
    struct qlistnode *con_node, *client_node;

    if (qmi_proxy_server_fd == -1) {
        qmi_sync_done = 1;
    }
    else if (pQMI->QMIHdr.QMIType == QMUX_TYPE_CTL) {
        if (pQMI->CTLMsg.QMICTLMsgHdr.CtlFlags == QMICTL_CTL_FLAG_RSP) {            
            if (!qlist_empty(&qmi_proxy_ctl_msg)) {
                QMI_PROXY_MSG *qmi_msg = qnode_to_item(qlist_head(&qmi_proxy_ctl_msg), QMI_PROXY_MSG, qnode);

                qlist_for_each(con_node, &qmi_proxy_connection) {
                    QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);

                    if (qmi_con->ClientFd == qmi_msg->ClientFd) {
                        send_qmi_to_client(pQMI, qmi_msg->ClientFd);

                        if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_GET_CLIENT_ID_RESP)
                            get_client_id(qmi_con, &pQMI->CTLMsg.GetClientIdRsp);                                                        
                        else if ((le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_RELEASE_CLIENT_ID_RESP) ||
                                (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_REVOKE_CLIENT_ID_IND)) {
                            release_client_id(qmi_con, &pQMI->CTLMsg.ReleaseClientIdRsp);
                            if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_REVOKE_CLIENT_ID_IND)
                                modem_reset_flag = 1;
                        }
                        else {
                        }
                    }
                }

                qlist_remove(&qmi_msg->qnode);
                free(qmi_msg);
            }
        }

        if (!qlist_empty(&qmi_proxy_ctl_msg)) {
            QMI_PROXY_MSG *qmi_msg = qnode_to_item(qlist_head(&qmi_proxy_ctl_msg), QMI_PROXY_MSG, qnode);

            qlist_for_each(con_node, &qmi_proxy_connection) {
                QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);

                if (qmi_con->ClientFd == qmi_msg->ClientFd) {
                    send_qmi_to_cdc_wdm(qmi_msg->qmi);
                }
            }
        }
    }
    else  {
        qlist_for_each(con_node, &qmi_proxy_connection) {
            QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);
            
            qlist_for_each(client_node, &qmi_con->client_qnode) {
                QMI_PROXY_CLINET *qmi_client = qnode_to_item(client_node, QMI_PROXY_CLINET, qnode);
                if (pQMI->QMIHdr.QMIType == qmi_client->QMIType) {
                    if (pQMI->QMIHdr.ClientId == 0 || pQMI->QMIHdr.ClientId == qmi_client->ClientId) {
                        send_qmi_to_client(pQMI, qmi_con->ClientFd);
                    }
                }
            }
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
cmpl $-0x1, 0x3a41(%rip)     # 0x6134
jne 0x2704
movl $0x1, 0x4b11(%rip)      # 0x7210
jmp 0x2960
movq -0x8(%rbp), %rax
movzbl 0x4(%rax), %eax
cmpl $0x0, %eax
jne 0x28ab
movq -0x8(%rbp), %rax
movzbl 0x6(%rax), %eax
cmpl $0x1, %eax
jne 0x283d
leaq 0x4ad3(%rip), %rax      # 0x7200
cmpq 0x4acc(%rip), %rax      # 0x7200
je 0x283b
movq 0x4abf(%rip), %rax      # 0x7200
movq %rax, -0x20(%rbp)
movq 0x4aa4(%rip), %rax      # 0x71f0
movq %rax, -0x10(%rbp)
leaq 0x4a99(%rip), %rax      # 0x71f0
cmpq %rax, -0x10(%rbp)
je 0x2829
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movl 0x20(%rax), %eax
movq -0x20(%rbp), %rcx
cmpl 0x10(%rcx), %eax
jne 0x2817
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movl 0x10(%rax), %esi
callq 0x2af0
movq -0x8(%rbp), %rax
movzwl 0x8(%rax), %edi
callq 0x2620
movzwl %ax, %eax
cmpl $0x22, %eax
jne 0x27b5
movq -0x28(%rbp), %rdi
movq -0x8(%rbp), %rsi
addq $0x6, %rsi
callq 0x2bc0
jmp 0x2815
movq -0x8(%rbp), %rax
movzwl 0x8(%rax), %edi
callq 0x2620
movzwl %ax, %eax
cmpl $0x23, %eax
je 0x27df
movq -0x8(%rbp), %rax
movzwl 0x8(%rax), %edi
callq 0x2620
movzwl %ax, %eax
cmpl $0x24, %eax
jne 0x2811
movq -0x28(%rbp), %rdi
movq -0x8(%rbp), %rsi
addq $0x6, %rsi
callq 0x2c90
movq -0x8(%rbp), %rax
movzwl 0x8(%rax), %edi
callq 0x2620
movzwl %ax, %eax
cmpl $0x24, %eax
jne 0x280f
movl $0x1, 0x39d1(%rip)      # 0x61e0
jmp 0x2813
jmp 0x2813
jmp 0x2815
jmp 0x2817
jmp 0x2819
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x2750
movq -0x20(%rbp), %rdi
callq 0x2a70
movq -0x20(%rbp), %rdi
callq 0x1030
jmp 0x283d
leaq 0x49bc(%rip), %rax      # 0x7200
cmpq 0x49b5(%rip), %rax      # 0x7200
je 0x28a6
movq 0x49ac(%rip), %rax      # 0x7200
movq %rax, -0x30(%rbp)
movq 0x4991(%rip), %rax      # 0x71f0
movq %rax, -0x10(%rbp)
leaq 0x4986(%rip), %rax      # 0x71f0
cmpq %rax, -0x10(%rbp)
je 0x28a4
movq -0x10(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movl 0x20(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0x10(%rcx), %eax
jne 0x2895
movq -0x30(%rbp), %rdi
addq $0x14, %rdi
callq 0x2d90
jmp 0x2897
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x2863
jmp 0x28a6
jmp 0x295e
movq 0x493e(%rip), %rax      # 0x71f0
movq %rax, -0x10(%rbp)
leaq 0x4933(%rip), %rax      # 0x71f0
cmpq %rax, -0x10(%rbp)
je 0x295c
movq -0x10(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq -0x40(%rbp), %rcx
addq $0x10, %rcx
cmpq %rcx, %rax
je 0x294a
movq -0x18(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x8(%rbp), %rax
movzbl 0x4(%rax), %eax
movq -0x48(%rbp), %rcx
movzbl 0x10(%rcx), %ecx
cmpl %ecx, %eax
jne 0x293b
movq -0x8(%rbp), %rax
movzbl 0x5(%rax), %eax
cmpl $0x0, %eax
je 0x2929
movq -0x8(%rbp), %rax
movzbl 0x5(%rax), %eax
movq -0x48(%rbp), %rcx
movzbl 0x11(%rcx), %ecx
cmpl %ecx, %eax
jne 0x2939
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movl 0x20(%rax), %esi
callq 0x2af0
jmp 0x293b
jmp 0x293d
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x28db
jmp 0x294c
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x28b6
jmp 0x295e
jmp 0x2960
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)