RILD - 第七章 - RILProxy

本文详细介绍了RILProxy在MTK平台的作用,包括RilProxy层的处理流程,如何通过Rfx模块将请求分发到不同socket,以及socket_fds的初始化过程,揭示了RilProxy作为RILC与RILJ之间中介的角色及其灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

七、RilProxy

对于MTK平台,在RILC与RILJ之间,有一个RilProxy层。

之所以要使用proxy,一个好处是在上层,不仅仅是RILJ与RILC通过Socket连接,还有其他地方也可以与RILC连接,来向下才层Modem通信,比如如可以通过终端ATCI接口直接向Modem发送命令。

另一个好处是proxy层的下层,可以自由选择切换其所对接的RILC层,因为对于不同的项目,所需要适配的RILC层不同,比如可以从默认切换到C2K RIL。

当然,proxy层的作用不仅仅连接上层和下层的中介,而且也可以在其中进行一些消息的过滤操作,如当Radio unavailable 时,就可以过滤一些需要Radio工作的request。

关于RilProxy的结构,其实和RILC差不多,也是分为LibRIL层和MtkRIL层。可以说在LibRIL层,他们是完全相似的,只是RilProxy在这里直接监听了RILJ的Socket接口。那么关于RilProxy从Socket句柄监听,建立流套接字,处理流套接字的流程就不在此说明,详细流程可以参考第二章。

7.1 RilProxy层处理流程

与之前说的RILC不同的是,在RILProxy中,从LibRIL调用MtkRIL回调函数onRequest这一步开始,它的流程就开始了不同。因此,我们就从这个地方着手来分析其流程。
先来一张总体的流程图:
这里写图片描述

首先来回顾一下RILC的onRequest函数,它通过不同的request码来判断,最后使用不同函数来预处理请求,最终将请求解释成AT命令并发送到AT通道。

如下代码,来看RilProxy层的onRequest函数:
1. 首先在ril_callbacks中直接将request发到了Rfx中,Rfx是处理不同的request,并将其发送到不同socket的模块,其代码主要在/ril/rilproxy/mtk-rilproxy/framework/core/目录中。
2. Rfx中有一个是属于dispatch thread的dispatch queue。Rfx先将request封装成Message对象并放入dispatch queue中,在dispatch thread会有一个looper读取dispatch queue的Message,并将其分发到main thread,让main thread的Looper去处理。

//ril_callbacks.c
static void
onRequest (int request, void *data, size_t datalen, RIL_Token t){
    //Radio不可用,过滤request
    if (radioState == RADIO_STATE_UNAVAILABLE &&
        request != RIL_REQUEST_OEM_HOOK_RAW && //This is for ATCI
        ...){

    }
    //添加到请求队列
    rfx_enqueue_request_message(request, data, datalen, t, socket_id);
}

//Rfx.cpp
void rfx_enqueue_request_message(int request, void *data, size_t datalen, RIL_Token t,
        RIL_SOCKET_ID socket_id) {
    //添加到请求队列
    dispatchThread->enqueueRequestMessage(request, data, datalen, t, socket_id);
}

//RfxDispatchThread.cpp
void RfxDispatchThread::enqueueRequestMessage(int request, void *data, size_t datalen,
        RIL_Token t, RIL_SOCKET_ID socket_id) {
    RequestInfo *requestInfo = (RequestInfo *)t;

    ...
    //使用请求数据购进R分析Message对象
    sp<RfxMessage> msg = RfxMessage::obtainRequest(socket_id, dest, request, requestInfo->token,
            parcel, t);
    //构建MessageObj
    MessageObj *obj = createMessageObj(msg);
    //将消息添加到了dispatchRequestQueue中
    dispatchRequestQueue.enqueue(obj);
}
// RfxDispatchThread.cpp
extern "C"
void *rfx_process_request_messages_loop(void *arg) {
    while (1) {
        RfxDispatchThread *dispatchThread = (RfxDispatchThread *) arg;
        dispatchThread->processRequestMessageLooper();
    }
    return 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值