ubusd
数据结构
struct ubus_msg_buf {
uint32_t refcount; /* ~0: uses external data buffer */
struct ubus_msghdr hdr;
struct blob_attr *data;
int fd; /** 发送msg端进程传过来的fd,用于UBUS_MSG_STATUS消息 */
int len;
};
struct ubus_client {
struct ubus_id id;
struct uloop_fd sock;
struct list_head objects;
struct ubus_msg_buf *tx_queue[UBUSD_CLIENT_BACKLOG];
/**
* txq_cur - tx队列未处理头结点
* txq_tail - tx队列可用结点头
* txq_ofs - 当前结点已发送offset
*/
unsigned int txq_cur, txq_tail, txq_ofs;
struct ubus_msg_buf *pending_msg;
int pending_msg_offset;
int pending_msg_fd; /** 对端进程传过来的fd */
struct {
struct ubus_msghdr hdr;
struct blob_attr data;
} hdrbuf; /** 报文格式头 */
};
struct ubus_path {
struct list_head list;
const char name[];
};
处理流程
ubusd
启动时自动调用初始化函数ubusd_obj_init(void)
分别创建objects、obj_types、path三个AVL tree头节点,同时调用ubusd_event_init()
函数初始化patterns AVL tree头节点,创建event_obj全局事件对象,对象ID等于1(UBUS_SYSTEM_OBJECT_EVENT)
Server_fd监听函数server_cb注册到uloop中
-
新client连接时
创建struct ubus_client数据结构,初始化client fd回调函数client_cb,并加入到全局clients avl_tree中进行维护,最后把此client注册到uloop中 -
收到client报文时
如果发送队列中存在数据,则尽量把队列中所有内容发出
先收取报文头部数据,以确定整个报文内容长度,报文头部数据结构如下
struct {