当前位置: 首页 > news >正文

USB插拔检测机制-uevent事件监测


USB插拔检测机制-uevent事件监测

ls system/extras/tests/uevents/
Android.mk  uevents.c


130|console:/ # ps -A |grep uevent                                             
root           398     1    8844   2620 poll_schedule_timeout 0 S ueventd
console:/ #

console:/ # which ueventd                                                      
/sbin/ueventd


sa6155 uevent处理代码:
-rw-rw-r-- 1 xcz xcz 10852 9月  15 20:11 ../system/core/init/ueventd.cpp
-rw-rw-r-- 1 xcz xcz   805 9月  15 20:11 ../system/core/init/ueventd.h
-rw-rw-r-- 1 xcz xcz  6680 9月  15 20:11 ../system/core/init/ueventd_parser.cpp
-rw-rw-r-- 1 xcz xcz  1133 9月  15 20:11 ../system/core/init/ueventd_parser.h
-rw-rw-r-- 1 xcz xcz  6765 9月  15 20:11 ../system/core/init/ueventd_test.cpp
-rw-rw-r-- 1 xcz xcz  1011 9月  15 20:11 ../system/core/init/uevent.h
-rw-rw-r-- 1 xcz xcz  7065 9月  15 20:11 ../system/core/init/uevent_listener.cpp
-rw-rw-r-- 1 xcz xcz  1854 9月  15 20:11 ../system/core/init/uevent_listener.h


[100% 9/9] Install: out/target/product/sm6150_au/system/bin/uevents

#### build completed successfully (01:37 (mm:ss)) ####

xcz@xcz-OptiPlex-7070:~/HD_1T_20210708/HTB23/sa6155p-la-1-0-1_hlos/LINUX/android/system/extras/tests/uevents$


接收所有的事件然后打印出来:

console:/ # /system/bin/uevents                                                
[ 2974.617410] msm-dwc3 a600000.ssusb: Could not get usb psy
[ 2974.623096] usb0_vbus_change_low_interrupt: irq=[382], gpio_value=[0]
[ 2974.623205] usb0_vbus_change_low_thread_interrupt: irq=[382], gpio_value=[0]
[ 2974.623763] usb0_vbus_change_low_thread_interrupt: sent uevent {SUBSYSTEM=usb-vbusdev,ACTION=change,USB_STATE=DISCONNECTED}
[ 2977.419943] msm-dwc3 a600000.ssusb: Could not get usb psy
[ 2977.526252] msm-dwc3 a600000.ssusb: Could not get usb psy
[ 2977.631122] msm-dwc3 a600000.ssusb: Could not get usb psy


拔出事件:
change@/devices/platform/soc/soc:usb0_vbus_input_gpio ACTION=change DEVPATH=/devices/platform/soc/soc:usb0_vbus_input_gpio SUBSYSTEM=platform SUBSYSTEM=usb-vbusdev ACTION=change USB_STATE=DISCONNECTED DE

插入事件:
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=DISCONNECTED SEQNUM=5428
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=CONNECTED SEQNUM=5429
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=DISCONNECTED SEQNUM=5430
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=CONNECTED SEQNUM=5431
change@/devices/virtual/android_usb/android0 ACTION=change DEVPATH=/devices/virtual/android_usb/android0 SUBSYSTEM=android_usb USB_STATE=CONFIGURED SEQNUM=5432


使用的是netlink技术:

kernel/msm-4.14/lib/kobject_uevent.c:602:    ue_sk->sk = netlink_kernel_create(net, NETLINK_KOBJECT_UEVENT, &cfg);


最大数量
系统已经定义的
kernel/msm-4.14/include/uapi/linux/netlink.h

#define NETLINK_ROUTE        0    /* Routing/device hook                */
#define NETLINK_UNUSED        1    /* Unused number                */
#define NETLINK_USERSOCK    2    /* Reserved for user mode socket protocols     */
#define NETLINK_FIREWALL    3    /* Unused number, formerly ip_queue        */
#define NETLINK_SOCK_DIAG    4    /* socket monitoring                */
#define NETLINK_NFLOG        5    /* netfilter/iptables ULOG */
#define NETLINK_XFRM        6    /* ipsec */
#define NETLINK_SELINUX        7    /* SELinux event notifications */
#define NETLINK_ISCSI        8    /* Open-iSCSI */
#define NETLINK_AUDIT        9    /* auditing */
#define NETLINK_FIB_LOOKUP    10    
#define NETLINK_CONNECTOR    11
#define NETLINK_NETFILTER    12    /* netfilter subsystem */
#define NETLINK_IP6_FW        13
#define NETLINK_DNRTMSG        14    /* DECnet routing messages */
#define NETLINK_KOBJECT_UEVENT    15    /* Kernel messages to userspace */
#define NETLINK_GENERIC        16
/* leave room for NETLINK_DM (DM Events) */
#define NETLINK_SCSITRANSPORT    18    /* SCSI Transports */
#define NETLINK_ECRYPTFS    19
#define NETLINK_RDMA        20
#define NETLINK_CRYPTO        21    /* Crypto layer */
#define NETLINK_SMC        22    /* SMC monitoring */
#define NETLINK_SOCKEV        23    /* Socket Administrative Events */
#define NETLINK_INET_DIAG    NETLINK_SOCK_DIAG

#define MAX_LINKS 32


函数定义
static inline struct sock *
netlink_kernel_create(struct net *net, int unit, struct netlink_kernel_cfg *cfg)
{
    return __netlink_kernel_create(net, unit, THIS_MODULE, cfg);
}


LINUX/android/system$ grep -rn NETLINK_KOBJECT_UEVENT  ./
./netd/server/NetlinkManager.cpp:133:    if ((mUeventHandler = setupSocket(&mUeventSock, NETLINK_KOBJECT_UEVENT,
./vold/NetlinkManager.cpp:60:            NETLINK_KOBJECT_UEVENT)) < 0) {
./core/libsysutils/src/NetlinkEvent.cpp:599: * Parse an ASCII-formatted message from a NETLINK_KOBJECT_UEVENT
./core/libcutils/uevent.cpp:105:    s = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT);


文件 ./core/libcutils/uevent.cpp

int uevent_open_socket(int buf_sz, bool passcred) {
    struct sockaddr_nl addr;
    int on = passcred;
    int s;

    memset(&addr, 0, sizeof(addr));
    addr.nl_family = AF_NETLINK;
    addr.nl_pid = getpid();
    addr.nl_groups = 0xffffffff;

    s = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT);
    if (s < 0) return -1;

    /* buf_sz should be less than net.core.rmem_max for this to succeed */
    if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buf_sz, sizeof(buf_sz)) < 0) {
        close(s);
        return -1;
    }

    setsockopt(s, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));

    if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        close(s);
        return -1;
    }

    return s;
}

相关文章:

  • WZOI-362简易五子棋游戏
  • 两台win10电脑搭建scrapy_redis实现分布式爬虫最详细版
  • 朴素贝叶斯算法代码实现(垃圾邮件检测)
  • U3D对话任务插件 Dialogue System for Unity 研究(一)
  • ArchLinux 的vm-tools无法正常使用的解决办法
  • idea安装scala
  • Vue2.0 双向绑定的缺陷
  • FDA药品分类目录清单查询
  • 总结——0923
  • 北鲲云“药物发现”轻装上阵,从“上云”到“用好云”
  • 微服务项目:尚融宝(55)(核心业务流程:放款(2))
  • 第七:Fiddler抓包教程(7)-Fiddler状态面板-QuickExec命令行
  • C++标准语言day02
  • 1456. 定长子串中元音的最大数目-前缀和算法应用
  • Spartan Labs研报:基础SBT以及隐私性SBT的实现
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Angular4 模板式表单用法以及验证
  • Cookie 在前端中的实践
  • Docker入门(二) - Dockerfile
  • golang 发送GET和POST示例
  • js学习笔记
  • MySQL QA
  • Python - 闭包Closure
  • 浮动相关
  • 简单基于spring的redis配置(单机和集群模式)
  • 入门到放弃node系列之Hello Word篇
  • 线上 python http server profile 实践
  • 新版博客前端前瞻
  • 智能网联汽车信息安全
  • puppet连载22:define用法
  • # 安徽锐锋科技IDMS系统简介
  • #Z0458. 树的中心2
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matlab)使用竞争神经网络实现数据聚类
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十二)springboot实战——SSE服务推送事件案例实现
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 中创建支持集合初始化器的类型
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET是什么
  • [ACTF2020 新生赛]Upload 1
  • [bzoj 3534][Sdoi2014] 重建
  • [LeetCode] 626. 换座位
  • [Lucas定理]【学习笔记】
  • [NSSCTF]-Web:[SWPUCTF 2021 新生赛]easyrce解析
  • [Python] 字典操作及方法总结