#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/init.h>
#include <linux/ip.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <net/sock.h>
#include <linux/netlink.h>
#define MAX_MSGSIZE 1024
struct sock *nl_sk = NULL;
char recv_ip_addr[20] = {0} ;
int pid = 1;
static void uc_send_nlmsg(u32 pid, char *data,int data_len)
{
struct sk_buff *skb;
struct nlmsghdr *nlh;
const char *fn;
char *datab;
u32 skblen;
int err;
if (!nl_sk)
{
err = -ENOENT;
fn = "netlink socket";
goto msg_fail;
}
skblen = NLMSG_SPACE(MAX_MSGSIZE);
skb = alloc_skb(skblen, GFP_KERNEL);
if (!skb)
{
err = -ENOBUFS;
fn = "alloc_skb";
goto msg_fail;
}
nlh = nlmsg_put(skb, pid, 0, 0xF0, MAX_MSGSIZE, 0);
if (!nlh)
{
err = -ENOBUFS;
fn = "nlmsg_put";
goto msg_fail_skb;
}
datab = NLMSG_DATA(nlh);
memcpy(datab, data, data_len);
*(datab+data_len) ='\0';
err = nlmsg_unicast(nl_sk, skb, pid);
if (err < 0)
{
fn = "nlmsg_unicast";
goto msg_fail;
}
return;
msg_fail_skb:
kfree_skb(skb);
msg_fail:
printk("%s: Dropped Message : pid %d msg:%s msglen %d: %s : err %d\n",
__func__, pid, data, data_len, fn, err);
return;
}
void uc_kernel_user_comm_recv (struct sk_buff *__skb)
{
struct sk_buff *skb = skb_get(__skb);
struct nlmsghdr *nlh = nlmsg_hdr(skb);
char buf[50] = {0} ;
pid = nlh->nlmsg_pid;
if (nlh->nlmsg_len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len)
{
return ;
}
memset(recv_ip_addr, 0x00, 20) ;
strcpy(recv_ip_addr, (char*)NLMSG_DATA(nlh)) ;
sprintf(buf, "recv ip.addr = %s", recv_ip_addr) ;
uc_send_nlmsg(pid, buf, strlen(buf)) ;
printk("received netlink message payload: %s pid = %d\n", (char*)NLMSG_DATA(nlh), pid);
return ;
}
void uc_kernel_user_comm_send(char *buf)
{
uc_send_nlmsg(pid, buf, strlen(buf)) ;
}
int uc_kernel_user_comm_get_buf(char *src, int len)
{
int recv_len = strlen(recv_ip_addr) ;
if (src == NULL || (len < recv_len) || (recv_len == 0))
{
return 0;
}
strcpy(src, recv_ip_addr) ;
return 1 ;
}
static int __init uc_kernel_user_comm_init(void)
{
// printk("netlink init 1 \