最近在学习linux netlink相关内容,发现这是一个用户空间和内核空间通信的好办法,于是写一个demo体验一下,一下代码基于linux kernel 3.19。
kernel mode的代码netlink_demo_kmode.c如下:
----------------------------------------------------------------------------------------------------------------
#include <linux/kernel.h>
#include <linux/module.h>
#include <net/net_namespace.h>
#include <linux/netlink.h>
#include <net/sock.h>
#define NETLINK_TEST 20
static struct sock *netlink_test_sk;
static void netlink_test_rcv(struct sk_buff *skb)
{
struct sk_buff *skb_in, *skb_out;
struct nlmsghdr *nlh;
char message[32] = {0};
int seq, pid;
unsigned int datalength;
skb_in = skb_get(skb);
if (skb_in->len >= nlmsg_total_size(0)) {
nlh = nlmsg_hdr(skb_in);
pid = nlh->nlmsg_pid;
seq = nlh->nlmsg_seq;
printk("message received from process %d: %s\n", pid, (char*)NLMSG_DATA(nlh));
sprintf(message, "hello, process %d", pid);
datalength = strlen(message) + 1;
skb_out = nlmsg_new(NLMSG_LENGTH(datalength), GFP_KERNEL);
nlh = nlmsg_put(skb_out, pid, seq, 0, NLMSG_ALIGN(datalength), 0);
memcpy(nlmsg_data(nlh), message, datalength);