When I look at errors return by functions, I get error -3 on netlink_broadcast, (maybe *no such process* regarding to kernel source). So the problems should comes from kernel code. I have also tried under Debian, kernel 2.6.26, and what a surprise: now, there is one more argument on netlink_kernel_create function. So in 3 different kernels, 3 differents fonctions netlink_kernel_create... Unfortunatly there are to many changements on kernel 2.6.26, and I must keep working on kernel 2.6.18. Regards, Thierry On Fri, Apr 10, 2009 at 10:12 AM, Thierry <chocapiiic.tiery@xxxxxxxxx> wrote: > Hi, > > I have tried to change groupId, with different value, but there should > be somethings wrong: the userspace prgm doesn't receive message. > I would like to know if there is a plugin for tcpdump or an way of > capture trafic on netlink socket, just like usual network socket in > order to see were is my problem: in kernel space code or userspace > code. > My program code is attached, with english commit (sorry for last mail). > I have also tried my code on differents kernel (redhat 4.4 with kernel > 2.6.9-42.ELsmp, centos52 kernel 2.6.18-92.1.22). > > If there is other ways to send information from kernel space to user space... > My aim is to capture data trafic from infiniband and dump trafic, for > example in a netlink socket. Then I will be able with a userspace code > to translate informations in .cap files. > Thats why I think netlink_broadcast is a good idea. > > I will be always looking at kernelnewbie mailinglsit for several month, > > Regards, > > Thierry > > > > -------------- > kernel-level code > > > #include <linux/config.h> > #include <linux/socket.h> > #include <linux/kernel.h> > #include <linux/module.h> > #include <linux/netlink.h> > #include <net/sock.h> > > #define NETLINK_IB 24 > #define MAX_PAYLOAD 1024 > #define GROUP_IB 59 > > > static struct sock *nl_sk = NULL; > > static void nl_ib_data_ready (struct sock *sk, int len) > { > wake_up_interruptible(sk->sk_sleep); > } > > static void netlink_ib_open() > { > struct sk_buff *skb = NULL; > struct nlmsghdr *nlh = NULL; > int err; > u32 pid; > > //Socket_create > nl_sk = netlink_kernel_create(NETLINK_IB, GROUP_IB, nl_ib_data_ready, > THIS_MODULE); > > skb = alloc_skb(NLMSG_SPACE(MAX_PAYLOAD),GFP_KERNEL); > nlh = (struct nlmsghdr *)skb->data; > > nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); > nlh->nlmsg_pid = 0; //from kernel > nlh->nlmsg_flags = 0; > > strcpy(NLMSG_DATA(nlh), "Message from kernel "); > NETLINK_CB(skb).pid = 0; > NETLINK_CB(skb).dst_pid = 0; //Multicast > NETLINK_CB(skb).dst_group = GROUP_IB; > > //data send > printk( KERN_ALERT "data sent\n"); > netlink_broadcast(nl_sk, skb, 0, GROUP_IB, GFP_KERNEL); > sock_release(nl_sk->sk_socket); > } > > static int __init netlink_ib_module_init(void) > { > printk(KERN_INFO "netlink_ib module: Init\n"); > netlink_ib_open(); > return 0; > } > > static void __exit netlink_ib_module_exit(void) > { > printk(KERN_INFO "Unloading netlink_ib module\n"); > } > > MODULE_LICENSE("GPL"); > MODULE_DESCRIPTION("Kernel/User socket for IB support"); > module_init(netlink_ib_module_init); > module_exit(netlink_ib_module_exit); > > ------------------ > userlevel code: > > #include <sys/socket.h> > #include <linux/netlink.h> > #define NETLINK_IB 24 > #define GROUP_IB 59 > > #define MAX_PAYLOAD 1024 > struct sockaddr_nl src_addr, dst_addr; > struct nlmsghdr *nlh = NULL; > struct msghdr msg; > struct iovec iov; > int sock_fd; > > > int main() > { > /* Socket create*/ > sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_IB); > > memset(&src_addr, 0, sizeof(src_addr)); > src_addr.nl_family = AF_NETLINK; > src_addr.nl_pid = getpid(); > src_addr.nl_groups = GROUP_IB; // Multicast > bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr)); > > memset(&dst_addr, 0, sizeof(dst_addr)); > nlh = (struct nlhmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD)); > memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD)); > > iov.iov_base = (void *)nlh; > iov.iov_len = nlh->nlmsg_len; > msg.msg_name = (void *)&dst_addr; > msg.msg_namelen = sizeof(dst_addr); > msg.msg_iov = &iov; > msg.msg_iovlen = 1; > > printf("Listenning on netlink socket...\n"); > recvmsg(sock_fd, &msg, 0); > printf("Message received in userspace: %s\n", NLMSG_DATA(nlh)); > close(sock_fd); > > return 0; > > } > > > ----------- > > > On Wed, Apr 8, 2009 at 5:51 PM, Sandeep K Sinha <sandeepksinha@xxxxxxxxx> wrote: >> Milind can you help Thierry on this. >> >> >> On Wed, Apr 8, 2009 at 7:14 PM, Thierry <chocapiiic.tiery@xxxxxxxxx> wrote: >>> Hi, >>> >>> I want to use netlink socket between kernel and userspace in order to >>> get some information from kernel code. >>> I use netlink_broadcast function in order to send information to a >>> specific group, and my user-level code connect to this socket with the >>> correct groupId but doesn't receive anythings. >>> Everythings works when I use netlink_unicast. >>> >>> I use centos5.2, kernel 2.6.18-92.1.22 >>> >>> If someone can help me... >>> >>> Thierry >>> >>> >>> >>> >>> >>> --------------------------- >>> >>> kernel-code: >>> >>> #include <linux/config.h> >>> #include <linux/socket.h> >>> #include <linux/kernel.h> >>> #include <linux/module.h> >>> #include <linux/netlink.h> >>> #include <net/sock.h> >>> //#include <net/netlink.h> >>> >>> #define NETLINK_IB 24 >>> #define MAX_PAYLOAD 1024 >>> #define GROUP_IB 59 >>> >>> static struct sock *nl_sk = NULL; >>> >>> static void nl_ib_data_ready (struct sock *sk, int len) >>> { >>> wake_up_interruptible(sk->sk_sleep); >>> } >>> >>> static void netlink_ib_open() >>> { >>> struct sk_buff *skb = NULL; >>> struct nlmsghdr *nlh = NULL; >>> int err; >>> u32 pid; >>> >>> //Creation de la netlink socket <=> socket() >>> nl_sk = netlink_kernel_create(NETLINK_IB, GROUP_IB, nl_ib_data_ready, >>> THIS_MODULE); >>> >>> skb = alloc_skb(NLMSG_SPACE(MAX_PAYLOAD),GFP_KERNEL); >>> nlh = (struct nlmsghdr *)skb->data; >>> >>> nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); >>> nlh->nlmsg_pid = 0; //Depuis le noyau >>> nlh->nlmsg_flags = 0; >>> >>> strcpy(NLMSG_DATA(nlh), "Message du kernel =("); >>> NETLINK_CB(skb).pid = 0; >>> NETLINK_CB(skb).dst_pid = 0; //Multicast >>> NETLINK_CB(skb).dst_group = GROUP_IB; >>> >>> //Envoi des donnees >>> printk( KERN_ALERT "j'envoi els donnees\n"); >>> netlink_broadcast(nl_sk, skb, 0, GROUP_IB, GFP_KERNEL); >>> sock_release(nl_sk->sk_socket); >>> } >>> >>> static int __init netlink_ib_module_init(void) >>> { >>> printk(KERN_INFO "netlink_ib module: Initialisation de la Netlink Socket\n"); >>> netlink_ib_open(); >>> return 0; >>> } >>> >>> static void __exit netlink_ib_module_exit(void) >>> { >>> printk(KERN_INFO "Dechargement de netlink_ib module\n"); >>> } >>> >>> MODULE_DESCRIPTION("Kernel/User socket for IB support"); >>> module_init(netlink_ib_module_init); >>> module_exit(netlink_ib_module_exit); >>> >>> ---------------------------- >>> >>> and the user-level code: >>> >>> #include <sys/socket.h> >>> #include <linux/netlink.h> >>> #define NETLINK_IB 24 >>> #define GROUP_IB 59 >>> >>> #define MAX_PAYLOAD 1024 >>> >>> struct sockaddr_nl src_addr, dst_addr; >>> struct nlmsghdr *nlh = NULL; >>> struct msghdr msg; >>> struct iovec iov; >>> int sock_fd; >>> >>> >>> int main() >>> { >>> /* Ouverture de la socket Netlink*/ >>> sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_IB); >>> >>> memset(&src_addr, 0, sizeof(src_addr)); >>> src_addr.nl_family = AF_NETLINK; >>> src_addr.nl_pid = getpid(); >>> src_addr.nl_groups = GROUP_IB; // Multicast >>> bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr)); >>> >>> memset(&dst_addr, 0, sizeof(dst_addr)); >>> nlh = (struct nlhmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD)); >>> memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD)); >>> >>> iov.iov_base = (void *)nlh; >>> iov.iov_len = nlh->nlmsg_len; >>> msg.msg_name = (void *)&dst_addr; >>> msg.msg_namelen = sizeof(dst_addr); >>> msg.msg_iov = &iov; >>> msg.msg_iovlen = 1; >>> >>> printf("On ecoute...\n"); >>> /* On ecoute ce que le kernel renvoi */ >>> recvmsg(sock_fd, &msg, 0); >>> printf("jai recu"); >>> char * truc = NLMSG_DATA(nlh); >>> printf("Message recu dans lespace utilisateur: %s\n", truc); >>> close(sock_fd); >>> >>> return 0; >>> >>> } >>> >>> -- >>> To unsubscribe from this list: send an email with >>> "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx >>> Please read the FAQ at http://kernelnewbies.org/FAQ >>> >>> >> >> >> >> -- >> Regards, >> Sandeep. >> >> >> >> >> >> >> “To learn is to change. Education is a process that changes the learner.” >> > -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ