ACPI Netlink多播数据结构中event_type与event_data字段对应什么?
ACPI Netlink事件中event_type和event_data字段语义查询
我在Linux环境下测试ACPI Netlink,通过libnl库并借助acpid2定义的数据结构订阅acpi_mc_group以获取ACPI事件通知。其中device_class和bus_id字段含义明确,但找不到任何资料说明event_type和event_data字段对应的语义(即整数值对应的枚举映射实际含义)。仅通过测试发现,当device_class为ac_adapter时,event_type为128对应充电器插拔事件,event_data为0表示拔出,1表示插入,除此之外一无所知。
最小可复现示例(MWE)
#include <netlink/netlink.h> #include <netlink/genl/ctrl.h> #include <netlink/genl/genl.h> #include "acpi_genetlink.h" #include <stdio.h> #include <stdlib.h> #include <string.h> static int acpi_handler(struct nl_msg* msg, void *data) { struct nlmsghdr *msghdr = nlmsg_hdr(msg); struct nlattr *attrs[ACPI_GENL_ATTR_MAX + 1]; genlmsg_parse(msghdr, 0, attrs, ACPI_GENL_ATTR_MAX, NULL); struct acpi_genl_event *event = nla_data(attrs[ACPI_GENL_ATTR_MAX]); printf("NOTIFICATION:\n"); printf(" device class: %s\n" " bus id: %s\n" " event type: %u\n" " event data: %u\n" , event->device_class, event->bus_id, event->type, event->data); return NL_OK; } int main (void) { struct nl_sock *sock = nl_socket_alloc(); genl_connect(sock); nl_socket_disable_seq_check(sock); int acpi_mc_group = genl_ctrl_resolve_grp(sock, ACPI_EVENT_FAMILY_NAME, ACPI_EVENT_MCAST_GROUP_NAME); nl_socket_add_membership(sock, acpi_mc_group); nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, acpi_handler, NULL); while (1) { nl_recvmsgs_default(sock); } nl_close(sock); nl_socket_free(sock); }
acpi_genetlink.h文件(复制自acpid2)
#ifndef __ACPI_GENETLINK_H__ #define __ACPI_GENETLINK_H__ 1 #include <linux/types.h> struct acpi_genl_event { char device_class[20]; char bus_id[15]; __u32 type; __u32 data; }; /* attributes of acpi_genl_family */ enum { ACPI_GENL_ATTR_UNSPEC, ACPI_GENL_ATTR_EVENT, /* ACPI event info needed by user space */ __ACPI_GENL_ATTR_MAX, }; #define ACPI_GENL_ATTR_MAX (__ACPI_GENL_ATTR_MAX - 1) /* commands supported by the acpi_genl_family */ enum { ACPI_GENL_CMD_UNSPEC, ACPI_GENL_CMD_EVENT, /* kernel->user notifications for ACPI events */ __ACPI_GENL_CMD_MAX, }; #define ACPI_GENL_CMD_MAX (__ACPI_GENL_CMD_MAX - 1) #define GENL_MAX_FAM_OPS 256 #define GENL_MAX_FAM_GRPS 256 #define ACPI_EVENT_FAMILY_NAME "acpi_event" #define ACPI_EVENT_MCAST_GROUP_NAME "acpi_mc_group" #endif
内容的提问来源于stack exchange,提问作者TheyCallMeHacked
相关产品推荐
相关产品推荐

