2 * tu-test: Read a netlink message from the kernel.
4 * This program requires the netlink-tiny-tu kernel module. It sends a
5 * netlink message to user-space.
7 * Luiz Fernando N. Capitulino
8 * <lcapitulino@gmail.com>
14 #include <sys/types.h>
15 #include <sys/socket.h>
16 #include <linux/netlink.h>
18 #define MSG_MAX_SIZE 512
19 #define NETLINK_TINY_TU 20 // from netlink-tiny-tu.c
21 /* create_socket(): Create a netlink socket and bind it.
22 * Return a file-descriptor on success, -1 otherwise. */
23 static int create_socket(void)
26 struct sockaddr_nl sa
;
28 fd
= socket(PF_NETLINK
, SOCK_RAW
, NETLINK_TINY_TU
);
32 memset(&sa
, 0, sizeof(sa
));
33 sa
.nl_family
= AF_NETLINK
;
34 sa
.nl_pid
= getpid(); // self pid
35 sa
.nl_groups
= 1; // group
37 err
= bind(fd
, (struct sockaddr
*) &sa
, sizeof(sa
));
44 /* read_message(): Read a netlink message from 'sock_fd'
46 static struct nlmsghdr
*read_message(int sock_fd
, size_t len
)
51 struct nlmsghdr
*nlhdr
;
52 struct sockaddr_nl nladdr
;
54 len
= NLMSG_SPACE(len
);
59 memset(nlhdr
, 0, len
);
60 iov
.iov_base
= (void *) nlhdr
;
63 memset(&nladdr
, 0, sizeof(nladdr
));
65 memset(&msg
, 0, sizeof(msg
));
66 msg
.msg_name
= (void *) &(nladdr
);
67 msg
.msg_namelen
= sizeof(nladdr
);
71 bytes
= recvmsg(sock_fd
, &msg
, 0);
80 int main(int argc
, char *argv
[])
85 sock_fd
= create_socket();
87 perror("create_socket()");
91 msg
= read_message(sock_fd
, MSG_MAX_SIZE
);
93 perror("read_message()");
97 printf("%s\n", (char *) NLMSG_DATA(msg
));