mgmt接口调用

mgmt接口调用

在bluetoothd启动是,会进行初始化,在这里会获取mgmt句柄来进行和内核之间的通信

8677 int adapter_init(void)
8678 {
8679     dbus_conn = btd_get_dbus_connection();/*获取dbus连接后的句柄*/
8680     /*获取mgmt句柄,用于和内核层mgmt进行通信*/
8681     mgmt_master = mgmt_new_default();
8682     if (!mgmt_master) {
8683         error("Failed to access management interface");
8684         return -EIO;
8685     }
8686 
8687     if (getenv("MGMT_DEBUG"))
8688         mgmt_set_debug(mgmt_master, mgmt_debug, "mgmt: ", NULL);
8689 
8690     DBG("sending read version command");
8691     /*向内核发送读取mgmt版本号,具体定义在net/bluetooth/mgmt.c中MGMT_VERSION与MGMT_REVISION*/
8692     if (mgmt_send(mgmt_master, MGMT_OP_READ_VERSION,
8693                 MGMT_INDEX_NONE, 0, NULL,
8694                 read_version_complete, NULL, NULL) > 0)
8695         return 0;
8696 
8697     error("Failed to read management version information");
8698 
8699     return -EIO;
8700 }
struct mgmt *mgmt_new_default(void)
{struct mgmt *mgmt;union {struct sockaddr common;struct sockaddr_hci hci;} addr;int fd;fd = socket(PF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC | SOCK_NONBLOCK,BTPROTO_HCI);    //获取内核蓝牙协议栈句柄if (fd < 0)return NULL;memset(&addr, 0, sizeof(addr));addr.hci.hci_family = AF_BLUETOOTH;addr.hci.hci_dev = HCI_DEV_NONE;addr.hci.hci_channel = HCI_CHANNEL_CONTROL;if (bind(fd, &addr.common, sizeof(addr.hci)) < 0) {   //绑定control通道close(fd);return NULL;}mgmt = mgmt_new(fd);if (!mgmt) {close(fd);return NULL;}mgmt->close_on_unref = true;return mgmt;
}
unsigned int mgmt_send(struct mgmt *mgmt, uint16_t opcode, uint16_t index,uint16_t length, const void *param,mgmt_request_func_t callback,void *user_data, mgmt_destroy_func_t destroy)
{return mgmt_send_timeout(mgmt, opcode, index, length, param, callback,user_data, destroy, 0);
}-->unsigned int mgmt_send_timeout(struct mgmt *mgmt, uint16_t opcode,uint16_t index, uint16_t length,const void *param, mgmt_request_func_t callback,void *user_data, mgmt_destroy_func_t destroy,int timeout)
{struct mgmt_request *request;if (!mgmt)return 0;request = create_request(mgmt, opcode, index, length, param,callback, user_data, destroy, timeout);   //创建请求if (!request)return 0;if (mgmt->next_request_id < 1)mgmt->next_request_id = 1;request->id = mgmt->next_request_id++;if (!queue_push_tail(mgmt->request_queue, request)) {   //如mgmt请求队列free(request->buf);free(request);return 0;}wakeup_writer(mgmt);       //return request->id;
}-->static void wakeup_writer(struct mgmt *mgmt)
{if (!queue_isempty(mgmt->pending_list)) {/* only queued reply commands trigger wakeup */if (queue_isempty(mgmt->reply_queue))return;}if (mgmt->writer_active)return;mgmt->writer_active = true;io_set_write_handler(mgmt->io, can_write_data, mgmt,write_watch_destroy);        //设置写入句柄
}-->static bool can_write_data(struct io *io, void *user_data)
{struct mgmt *mgmt = user_data;struct mgmt_request *request;bool can_write;request = queue_pop_head(mgmt->reply_queue);if (!request) {/* only reply commands can jump the queue */if (!queue_isempty(mgmt->pending_list))return false;request = queue_pop_head(mgmt->request_queue);if (!request)return false;can_write = false;} else {/* allow multiple replies to jump the queue */can_write = !queue_isempty(mgmt->reply_queue);}if (!send_request(mgmt, request))return true;return can_write;
}--->static bool send_request(struct mgmt *mgmt, struct mgmt_request *request)
{struct iovec iov;ssize_t ret;iov.iov_base = request->buf;iov.iov_len = request->len;ret = io_send(mgmt->io, &iov, 1);     //这里到内核层if (ret < 0) {DBG(mgmt, "write failed: %s", strerror(-ret));if (request->callback)request->callback(MGMT_STATUS_FAILED, 0, NULL,request->user_data);destroy_request(request);return false;}if (request->timeout)request->timeout_id = timeout_add_seconds(request->timeout,request_timeout,request,NULL);DBG(mgmt, "[0x%04x] command 0x%04x", request->index, request->opcode);queue_push_tail(mgmt->pending_list, request);return true;
}

内核层处理

初始化mgmt

static struct hci_mgmt_chan chan = {.channel	= HCI_CHANNEL_CONTROL,.handler_count	= ARRAY_SIZE(mgmt_handlers),.handlers	= mgmt_handlers,.hdev_init	= mgmt_init_hdev,
};     //mgmt_handlers这个对应的就是对于上层传递的处理int mgmt_init(void)
{mgmt_chanreturn hci_mgmt_chan_register(&chan);   //注册mgmt_chan
}void mgmt_exit(void)
{hci_mgmt_chan_unregister(&chan);
}//hci_sock.c
int hci_mgmt_chan_register(struct hci_mgmt_chan *c)
{if (c->channel < HCI_CHANNEL_CONTROL)return -EINVAL;mutex_lock(&mgmt_chan_list_lock);if (__hci_mgmt_chan_find(c->channel)) {mutex_unlock(&mgmt_chan_list_lock);return -EALREADY;}list_add_tail(&c->list, &mgmt_chan_list);mutex_unlock(&mgmt_chan_list_lock);return 0;
}
EXPORT_SYMBOL(hci_mgmt_chan_register);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.点赞 + 我收到的赞

1.点赞 点赞&#xff1a;支持对帖子、评论点赞&#xff1b;第1次点赞&#xff0c;第2次取消点赞首页点赞数量&#xff1a;统计帖子的点赞数量详情页点赞数量&#xff1a;统计点赞数量、显示点赞状态 1.1 生成 redis 工具类 将数据存入到 redis 中&#xff0c;以 key 为关键&…

Spring Boot 整合RabbitMQ

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

Nginx访问控制

Nginx的location块用于基于接收到的请求字符串(例如:www.test.com/uri-string)对虚拟主机之外的部分进行匹配,并对特定的请求进行处理。它可以用于地址重定向、数据缓存、应答控制等功能,并且还可以配置许多第三方模块。 location块的基本格式: location [= | ~ | ~*] …

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑不确定性的火电发电商现货-深度调峰市场优化决策》

标题涉及到电力行业的领域&#xff0c;尤其是火电发电商在电力市场中面对深度调峰需求时的决策问题。下面是对标题的解读&#xff1a; 考虑不确定性&#xff1a; 这指的是在制定优化决策时&#xff0c;考虑到环境的不确定性&#xff0c;可能包括但不限于电力市场的价格波动、发…

算法—双指针

双指针算法可以帮忙把时间复杂度降低一个维度&#xff0c;即原本O&#xff08;n2&#xff09;降为O(n)&#xff1b;将O(n)降为O(1) 移动零 移动零 题目解析 将所有0移动到末尾保持非0元素相对顺序对数组进行原地操作&#xff08;不开辟额外空间&#xff09; 算法原理 数组…

等保——密评技术要求

密评简介 密评定义&#xff1a;全称商用密码应用安全评估, 是指对采用商用密码技术、产品和服务集成建设的网络和信息系统密码应用的合规性、正确性、有效性进行评估。密评对象&#xff1a;重要信息系统、关键信息基础设施、网络安全等保三级及以上的系统。评测依据&#xff1…

IMO国际奥林匹克数学竞赛推出AI-MO,奖金高达1000万美元; SDXL Turbo: 新一代文本到图像模型

&#x1f989; AI新闻 &#x1f680; IMO国际奥林匹克数学竞赛推出AI-MO&#xff0c;奖金高达1000万美元 摘要&#xff1a;IMO国际奥林匹克数学竞赛推出新的AI竞赛AI-MO&#xff0c;旨在推动大语言模型的数学推理能力&#xff0c;鼓励开发能与人类数学天才相媲美的AI模型。比…

真空工艺腔内潮湿有什么危害?

在半导体制程中&#xff0c;真空工艺腔被广泛使用。薄膜沉积&#xff0c;干法刻蚀&#xff0c;光刻&#xff0c;退火&#xff0c;离子注入等工序均需要在相应的真空腔室中完成相应制程。真空工艺腔在半导体制程中起着至关重要的作用&#xff0c;它能够提供一个高度控制的环境&a…

【ARM CoreLink 系列 8 -- SMMU 详细介绍-上半部】

请阅读【ARM CoreLink 文章专栏导读】 文章目录 SMMU 的基本使用场景SMMU 名词缩写SMMU StreamID 详细介绍SMMU STE 详细介绍SMMU CD 详细介绍SMMU 的基本使用场景 扩大设备DMA寻址范围,一些legacy设备DMA寻址是32bit,无法访问高32bit地址,通过SMMU的转换可以解决这个问题。…

4-docker-compose介绍(部署flask案例、yaml文件、启动)、新建flask项目、编写Dockerfile(用于构建flask项目的镜像)、

1 docker-compose介绍 2 docker-compose部署flask案例 2.1 新建flask项目 app.py 2.2 编写Dockerfile–》用于构建flask项目的镜像 2.3 编写docker-compose的yaml文件 docker-compose.yml 2.4 docker-compose启动 1 docker-compose介绍 1 介绍 """ 使用了docke…

服务器运行train.py报错解决

在服务器配置完虚拟环境以及安装完各种所需库后&#xff0c;发现报错Traceback (most recent call last): File "/root/yolov5-master/yolov5-master/train.py", line 48, in <module> import val as validate # for end-of-epoch mAP File "/root/yolov5…

在Springboot中操作Redis——五大数据类型

在Java中操作Redis Redis的Java客户端 前面我们讲解了Redis的常用命令&#xff0c;这些命令是我们操作Redis的基础&#xff0c;那么我们在java程序中应该如何操作Redis呢&#xff1f;这就需要使用Redis的Java客户端&#xff0c;就如同我们使用JDBC操作MySQL数据库一样。 Red…

电气制图用什么软件?CAD和Eplan哪个更胜一筹?

身为电气工程师&#xff0c;每天打交道最多的可能不是自家对象&#xff0c;而是时时刻刻攥在手里的电气图。目前市面上制作电路图的软件形形色色&#xff0c;但是AutoCAD Electrical和Eplan是目前大家使用率最高的两款电气制图软件。 EPLAN是一款专业的电气设计软件&#xff0…

UTONMOS:元宇宙时代已经来临

当我们站在这个新的人工智能时代的十字路口&#xff0c;不可避免地要面对一个问题&#xff1a;在这个技术革新的大潮中&#xff0c;区块链技术还有没有生存和发展的空间&#xff1f;本文将深入探讨这个问题&#xff0c;分析区块链在人工智能时代的优势、挑战以及未来的可能性。…

项目九 使用gcc和make调试程序

项目九 使用gcc和make调试程序 #职业能力目标和要求 1&#xff0c;理解程序调试。 2&#xff0c;掌握利用gcc进行调试的方法。 3&#xff0c;掌握使用make编译的方法。9.1 了解程序的调试 9.1.1 编译时错误 主要是语法错。 9.1.2 运行时错误 编译器检查不出这类错误&#x…

【算法刷题】Day7

文章目录 283. 移动零1089. 复写零 283. 移动零 原题链接 看到题目&#xff0c;首先看一下题干的要求&#xff0c;是在原数组内进行操作&#xff0c;平切保持非零元素的相对顺序 这个时候我们看到了示例一&#xff1a; [ 0, 1, 0, 3,12 ] 这个时候输出成为了 [ 1, 3, 12, 0, …

ground truth 在深度学习任务中代表的是什么意思?

1、概念 在深度学习领域&#xff0c;ground truth (中文意思是“地面真实值”或“基准真实值”&#xff0c;简单理解就是真实值) 是指用于训练和评估模型的准确标签或数据。它是机器学习算法的参考标准&#xff0c;用于衡量模型的性的和判断模型的准确性&#xff0c;本文将介绍…

泗博Modbus转Profinet网关TS-180对水表流量的监控应用

应用场景&#xff1a; 陕西某工程技术有限公司在一民生工程项目中&#xff0c;需要对公园直饮水进行净化保证其水质。直饮水净化装置需根据用水量不定期的维护&#xff0c;通过统计各个净化装置净化的直饮水的流量&#xff0c;来实现提前维护目的。 应用痛点&#xff1a; 项目…

dsp cmd文件详解

DSP学习&#xff08;8&#xff09;—— linker.cmd文件解析-CSDN博客

4/150:寻找两个正序数组的中位数⭐

题目&#xff1a;寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 题解1&#xff1a;暴力 暴力思路简介&#xff0c;…