写一个 netlink传递结构体指针的代码
时间: 2024-05-16 08:15:01 浏览: 160
下面是一个简单的 netlink 传递结构体指针的代码示例:
```c
#include <linux/module.h>
#include <net/sock.h>
#include <linux/netlink.h>
#define NETLINK_USER 31
struct my_struct {
int a;
int b;
};
static struct sock *netlink_socket = NULL;
static int pid = -1;
static void netlink_receive(struct sk_buff *skb) {
struct nlmsghdr *nlh;
struct my_struct *data;
int len = 0;
nlh = (struct nlmsghdr *)skb->data;
data = (struct my_struct *)nlmsg_data(nlh);
len = nlmsg_len(nlh);
if (len >= sizeof(struct my_struct)) {
printk(KERN_INFO "received data: a=%d, b=%d\n", data->a, data->b);
}
}
static void netlink_send(struct my_struct *data) {
struct sk_buff *skb;
struct nlmsghdr *nlh;
skb = nlmsg_new(sizeof(struct my_struct), GFP_KERNEL);
if (!skb) {
printk(KERN_ERR "Failed to allocate new skb\n");
return;
}
nlh = nlmsg_put(skb, 0, 0, NLMSG_DONE, sizeof(struct my_struct), 0);
NETLINK_CB(skb).dst_group = 0;
memcpy(nlmsg_data(nlh), data, sizeof(struct my_struct));
netlink_unicast(netlink_socket, skb, pid, MSG_DONTWAIT);
}
static int __init netlink_init(void) {
struct netlink_kernel_cfg cfg = {
.input = netlink_receive,
};
netlink_socket = netlink_kernel_create(&init_net, NETLINK_USER, &cfg);
if (!netlink_socket) {
printk(KERN_ERR "Failed to create netlink socket\n");
return -ENOMEM;
}
return 0;
}
static void __exit netlink_exit(void) {
if (netlink_socket) {
netlink_kernel_release(netlink_socket);
}
}
MODULE_LICENSE("GPL");
module_init(netlink_init);
module_exit(netlink_exit);
```
在上面的代码中,我们定义了一个名为 `my_struct` 的简单的结构体,并使用 `netlink_send` 函数将指向该结构体的指针发送到内核空间。`netlink_receive` 函数将接收到的数据打印到内核日志中。
需要注意的是,由于内核和用户空间的地址空间是分离的,因此必须使用 `nlmsg_data` 和 `memcpy` 等函数来传递指针所指向的实际数据。
阅读全文