acpi_bus_generate_netlink_event 这个函数会根据形参来组建一个netlink的message,并发送这个message到user space
其源码分析如下:
int acpi_bus_generate_netlink_event(const char *device_class,
const char *bus_id,
u8 type, int data)
{
struct sk_buff *skb;
struct nlattr *attr;
struct acpi_genl_event *event;
void *msg_header;
int size;
/* allocate memory */
#申请一个用于保存message的内存空间
size = nla_total_size(sizeof(struct acpi_genl_event)) +
nla_total_size(0);
#用申请到的内存生成一个sk_buff
skb = genlmsg_new(size, GFP_ATOMIC);
if (!skb)
return -ENOMEM;
/* add the genetlink message header */
#给sk_buff 天剑header
msg_header = genlmsg_put(skb, 0, acpi_event_seqnum++,
&acpi_event_genl_family, 0,
ACPI_GENL_CMD_EVENT);
if (!msg_header) {
nlmsg_free(skb);
return -ENOMEM;
}
/* fill the data */
attr =
nla_reserve(skb, ACPI_GENL_ATTR_EVENT,
sizeof(struct acpi_genl_event));
if (!attr) {
nlmsg_free(skb);
return -EINVAL;
}
#给要发送的event赋值
event = nla_data(attr);
memset(event, 0, sizeof(struct acpi_genl_event));
strcpy(event->device_class, device_class);
strcpy(event->bus_id, bus_id);
event->type = type;
event->data = data;
#标志skb结束
/* send multicast genetlink message */
genlmsg_end(skb, msg_header);
#发送event
genlmsg_multicast(&acpi_event_genl_family, skb, 0, 0, GFP_ATOMIC);
return 0;
}
内核ACPI函数API之acpi_bus_generate_netlink_event
最新推荐文章于 2023-03-09 15:05:47 发布