<div><div>Hello!</div><div> </div><div>I made brief experiment with modified libqrtr-glib</div><div>I changed a bit build (removed qrtr.h deps and so on).</div><div> </div><div>qrtr-bus.c</div><div> </div><div>static gboolean</div><div>common_init (QrtrBus  *self,</div><div>             GError  **error)</div><div>{<!-- --></div><div>    gint fd;</div><div>    </div><div>    struct server_lookup_args *lookup_arg;</div><div>    int r, i, j, flags;</div><div> </div><div>    guint32               node_id;</div><div>    guint32               port;</div><div>    guint32               service;</div><div>    guint32               version;</div><div>    guint32               instance;</div><div> </div><div> </div><div>    lookup_arg = (struct server_lookup_args *)malloc(sizeof(*lookup_arg) + (1024 * sizeof(struct msm_ipc_server_info)));</div><div>    if (!lookup_arg) {<!-- --></div><div>        printf("malloc error\n");</div><div>        return FALSE;</div><div>    }</div><div> </div><div>    fd = socket (AF_MSM_IPC /*AF_QIPCRTR*/, SOCK_DGRAM, 0);</div><div>    if (fd < 0) {<!-- --></div><div>        printf("socket error\n");</div><div>        g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),</div><div>                     "Failed to create QRTR socket");</div><div>        return FALSE;</div><div>    }</div><div> </div><div>    for (j=0;j<2048;j++) {<!-- --></div><div> </div><div>        //for (j=0;j<1000;j++) {<!-- --></div><div>        lookup_arg->port_name.service = j;</div><div>        lookup_arg->port_name.instance = 1;;//GET_XPORT_SVC_INSTANCE(version);</div><div>        lookup_arg->num_entries_in_array = 1024;</div><div>        lookup_arg->lookup_mask = 0xFFFFFFFF;</div><div>        lookup_arg->num_entries_found = 0;</div><div> </div><div>        r = ioctl(fd, IPC_ROUTER_IOCTL_LOOKUP_SERVER, lookup_arg);</div><div>        if (r < 0) {<!-- --></div><div>            free(lookup_arg);</div><div>            return FALSE;</div><div>        }</div><div> </div><div>        if (!lookup_arg->num_entries_found) {<!-- --></div><div>            continue;</div><div>        }</div><div> </div><div>        for (i = 0; ((i < 1024) && (i < lookup_arg->num_entries_found)); i++) {<!-- --></div><div>            node_id = lookup_arg->srv_info[i].node_id;</div><div>            port = lookup_arg->srv_info[i].port_id;</div><div>            service = lookup_arg->srv_info[i].service;</div><div>            version = 0;</div><div>            instance = lookup_arg->srv_info[i].instance;</div><div>       </div><div>            printf("[qrtr] added server on %u:%u -> service %u, version %u, instance %u\n", node_id, port, service, version, instance);</div><div>            g_debug ("[qrtr] added server on %u:%u -> service %u, version %u, instance %u", node_id, port, service, version, instance);</div><div>            add_service_info (self, node_id, port, service, version, instance);</div><div> </div><div>        }</div><div>        //}</div><div>    }</div><div> </div><div>    /******/</div><div> </div><div>    self->priv->socket = g_socket_new_from_fd (fd, error);</div><div>    if (!self->priv->socket) {<!-- --></div><div>        printf("g_socket_new_from_fd error\n" /*, error->message*/);</div><div>        close (fd);</div><div>        return FALSE;</div><div>    }</div><div> </div><div>    g_socket_set_timeout (self->priv->socket, 0);</div><div> </div><div> </div><div>    return TRUE;</div><div>}</div><div> </div><div>Finally I got this</div><div><div># qmicli -d qrtr://0 --wds-noop</div><div>[qrtr] added server on 3:32 -> service 1, version 0, instance 1</div><div>[qrtr] added server on 3:43 -> service 2, version 0, instance 1</div><div>[qrtr] added server on 3:29 -> service 3, version 0, instance 1</div><div>[qrtr] added server on 3:33 -> service 4, version 0, instance 1</div><div>[qrtr] added server on 3:41 -> service 5, version 0, instance 1</div><div>[qrtr] added server on 3:35 -> service 7, version 0, instance 1</div><div>[qrtr] added server on 3:36 -> service 8, version 0, instance 1</div><div>[qrtr] added server on 3:39 -> service 11, version 0, instance 1</div><div>[qrtr] added server on 3:31 -> service 12, version 0, instance 1</div><div>[qrtr] added server on 3:4 -> service 15, version 0, instance 1</div><div>[qrtr] added server on 3:12 -> service 17, version 0, instance 1</div><div>[qrtr] added server on 3:8 -> service 22, version 0, instance 1</div><div>[qrtr] added server on 3:7 -> service 23, version 0, instance 1</div><div>[qrtr] added server on 3:6 -> service 24, version 0, instance 1</div><div>[qrtr] added server on 3:30 -> service 25, version 0, instance 1</div><div>[qrtr] added server on 3:34 -> service 26, version 0, instance 1</div><div>[qrtr] added server on 3:37 -> service 29, version 0, instance 1</div><div>[qrtr] added server on 3:13 -> service 34, version 0, instance 1</div><div>[qrtr] added server on 3:9 -> service 36, version 0, instance 1</div><div>[qrtr] added server on 3:42 -> service 42, version 0, instance 1</div><div>[qrtr] added server on 3:26 -> service 45, version 0, instance 1</div><div>[qrtr] added server on 3:38 -> service 47, version 0, instance 1</div><div>[qrtr] added server on 3:44 -> service 48, version 0, instance 1</div><div>[qrtr] added server on 3:27 -> service 50, version 0, instance 1</div><div>[qrtr] added server on 3:11 -> service 54, version 0, instance 1</div><div>[qrtr] added server on 3:5 -> service 227, version 0, instance 1</div><div>[qrtr] added server on 3:14 -> service 228, version 0, instance 1</div><div>g_socket_new_from_fd error</div><div>error: couldn't access QRTR bus: creating GSocket from fd: Operation not supported</div><div> </div><div>I have no idea what operation can't be done by GSocket.</div><div><code>G_MESSAGES_DEBUG=all and G_DEBUG=all env vars didn't help at all (I still can't see any debug messages).</code></div></div><div><br /></div><div>Maybe somebody know way to debug or know the error reason?</div></div><div> </div><div>28.12.2021, 12:45, "Nikita Orlov" <nikitos1550@yandex.ru>:</div><blockquote><div>Hi!</div><div> </div><div>Yep, just today morning I inspected QRTR support in libqmi and realized that it is closest thing, that I am looking for.</div><div>I will try to modify libqrtr-glib to work with AS_MSM.</div><div> </div><div>But I am still confused about CID.</div><div> </div><div> </div><div>27.12.2021, 16:10, "Aleksander Morgado" <<a href="mailto:aleksander@aleksander.es" rel="noopener noreferrer">aleksander@aleksander.es</a>>:</div><blockquote><p>Hey Nikita,<br /> </p><blockquote><br /> I am still researching EC25 mdm9607 based modem and looking for some way to send qmi command directly via AF_MSM_IPC socket.<br /><br /> Using some code and info from <a href="https://github.com/Biktorgj/meta-qcom/blob/honister/recipes-modem/openqti/files/src/ipc.c" rel="noopener noreferrer">https://github.com/Biktorgj/meta-qcom/blob/honister/recipes-modem/openqti/files/src/ipc.c</a><br /> I can open AF_MSM_IPC socket and look for avalible services there:<br /><br /> lookup test<br /> service 1 instance 1 node_id 3 port_id 33 resolve 'Wireless Data Service'<br /> service 2 instance 1 node_id 3 port_id 47 resolve 'Device Management Service'<br /> service 3 instance 1 node_id 3 port_id 29 resolve 'Network Access Service'<br /> service 4 instance 1 node_id 3 port_id 34 resolve 'Quality Of Service service'<br /> service 5 instance 1 node_id 3 port_id 41 resolve 'Wireless Messaging Service'<br /> service 7 instance 1 node_id 3 port_id 36 resolve 'Authentication service'<br /> service 8 instance 1 node_id 3 port_id 37 resolve 'AT service'<br /> service 11 instance 1 node_id 3 port_id 39 resolve 'User Identity Module service'<br /> service 12 instance 1 node_id 3 port_id 30 resolve 'Phonebook Management service'<br /> service 15 instance 1 node_id 3 port_id 4 resolve 'Test service'<br /> service 17 instance 1 node_id 3 port_id 12 resolve 'Specific absorption rate service'<br /> service 22 instance 1 node_id 3 port_id 8 resolve 'Time service'<br /> service 23 instance 1 node_id 3 port_id 7 resolve 'Thermal sensors service'<br /> service 24 instance 1 node_id 3 port_id 6 resolve 'Thermal mitigation device service'<br /> service 25 instance 1 node_id 3 port_id 32 resolve 'Service access proxy service'<br /> service 26 instance 1 node_id 3 port_id 35 resolve 'Wireless data administrative service'<br /> service 29 instance 1 node_id 3 port_id 38 resolve 'Circuit switched videotelephony service'<br /> service 34 instance 1 node_id 3 port_id 13 resolve 'Coexistence service'<br /> service 36 instance 1 node_id 3 port_id 9 resolve 'Persistent device configuration service'<br /> service 41 instance 257 node_id 3 port_id 10 resolve 'RF radiated performance enhancement service'<br /> service 42 instance 1 node_id 3 port_id 46 resolve 'Data system determination service'<br /> service 45 instance 1 node_id 3 port_id 26 resolve 'unknown'<br /> service 47 instance 1 node_id 3 port_id 31 resolve 'Data Port Mapper service'<br /> service 48 instance 1 node_id 3 port_id 48 resolve 'unknown'<br /> service 50 instance 1 node_id 3 port_id 27 resolve 'unknown'<br /> service 54 instance 1 node_id 3 port_id 11 resolve 'unknown'<br /> service 55 instance 513 node_id 3 port_id 25 resolve 'unknown'<br /> service 227 instance 1 node_id 3 port_id 5 resolve 'unknown'<br /> service 228 instance 1 node_id 3 port_id 14 resolve 'unknown'<br /><br /> I also made several experiments and for example I can send Get Time query to DMS directly via node_id 3 port_id 47<br /><br /> <<<<<< RAW:<br /> <<<<<< length = 13<br /> <<<<<< data = 01:0C:00:00:02:01:00:01:00:2F:00:00:00<br /><br /> [01 Jan 1970, 02:52:36] [Debug] [/dev/smdcntl0] Sent generic request (translated)...<br /> <<<<<< QMUX:<br /> <<<<<< length = 12<br /> <<<<<< flags = 0x00<br /> <<<<<< service = "dms"<br /> <<<<<< client = 1<br /> <<<<<< QMI:<br /> <<<<<< flags = "none"<br /> <<<<<< transaction = 1<br /> <<<<<< tlv_length = 0<br /> <<<<<< message = "Get Time" (0x002F)<br /><br /> But in order to get proper answer I have to delete first 6 bytes (01:0C:00:00:02:01) - QMUX header.<br /> So seems CID is not handled by the service itself (as qmicli always query CID before any query).<br /> Here I don't understand the overall conception of QMI routing, CID and other things.<br /><br /> Sending message 7 bytes<br /> buffer[7]: 00:01:00:2f:00:00:00:<br /> sendto() 7<br /> recv() got 47 bytes<br /> buffer[47]: 02:01:00:2f:00:28:00:02:04:00:00:00:00:00:01:08:00:2d:a4:db:b8:f6:00:00:00:10:08:00:39:8d:12:67:34:01:00:00:11:08:00:6c:14:9e:00:00:00:00:00:<br /><br /> First I thought to add some feature to libqmi in order to send qmi directly via AF_MSM, but now it seems too complicated (moreover I am not familiar with libglib2).<br /> Now think that some proxy app that expose serial port (like socat) and send queries to socket will be ok.<br /> I didn't manage tune qmuxd to work directly with AF_MSM, only with /dev/smdcntl0 and it not exposed after system startup.<br /><br /> The idea is to send several qmi queries to Data Port Mapper service in order to expose dev/smdcntl0 and rmnet_dataX.<br /> After I can use qmicli (or even ModemManager) ordinary way and avoid any qualcomm proprietary sw stack.<br /><br /> Maybe somebody can somehow comment on this?</blockquote><p><br />Isn't all this overlapping with the already upstreamed rpmsg and QRTR<br />channel support in the Linux kernel? @Stephan Gerhold may be able to<br />comment here.<br /> </p>--<br />Aleksander<br /><a href="https://aleksander.es/" rel="noopener noreferrer">https://aleksander.es</a></blockquote><div> </div><div> </div><div>-- </div><div>Nikita Orlov</div><div>Skype: nik_stet</div><div>QQ: 2717846083</div><div> </div></blockquote><div> </div><div> </div><div>-- </div><div>Nikita Orlov</div><div>Skype: nik_stet</div><div>QQ: 2717846083</div><div> </div>