Files
tzpuFusionX/software/linux/kernel/drivers/sstar/notify/ms_notify.c

114 lines
2.3 KiB
C
Executable File

/*
* ms_notify.c- Sigmastar
*
* Copyright (c) [2019~2020] SigmaStar Technology.
*
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License version 2 for more details.
*
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <net/sock.h>
#include <net/netlink.h>
#include <linux/skbuff.h>
#define MAX_PAYLOAD 256
static struct sock *_st_notify_sock;
static void _notify_reply(struct sk_buff * __skb)
{
struct nlmsghdr *nlh;
struct sk_buff *skb;
unsigned char msg[MAX_PAYLOAD] = {0};
//int res;
do
{
skb = skb_get(__skb);
if (skb->len < NLMSG_SPACE(0))
{
break;
}
nlh = nlmsg_hdr(skb);
#if 0
printk("recv skb from user space uid: %d pid: %d seq: %d\n", NETLINK_CREDS(skb)->uid, NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq);
#endif
memcpy(msg, NLMSG_DATA(nlh), sizeof(msg));
kfree_skb(skb);
if (NULL == (skb = alloc_skb(NLMSG_SPACE(MAX_PAYLOAD), GFP_ATOMIC)))
{
break;
}
if (NULL == (nlh = nlmsg_put(skb, 0, 0, 0, MAX_PAYLOAD, 0)))
{
break;
}
nlh->nlmsg_flags = 0;
memcpy(NLMSG_DATA(nlh), msg, MAX_PAYLOAD);
NETLINK_CB(skb).portid = 0;
NETLINK_CB(skb).dst_group = 1;
netlink_broadcast(_st_notify_sock, skb, 0, 1, GFP_ATOMIC);
//kfree_skb(skb);
return;
} while (0);
//nlmsg_failure: /* Used by NLMSG_PUT */
if (skb)
{
kfree_skb(skb);
}
}
static int __init _notify_init(void)
{
struct netlink_kernel_cfg cfg = {
.groups = 0,
.input = _notify_reply,
};
if (NULL == (_st_notify_sock = netlink_kernel_create(&init_net, NETLINK_USERSOCK, &cfg)))
{
return -1;
}
printk("mstar notify driver install successfully\n");
return 0;
}
static void __exit _notify_exit(void)
{
netlink_kernel_release(_st_notify_sock);
printk("mstar notify driver remove successfully\n");
}
module_init(_notify_init);
module_exit(_notify_exit);
MODULE_DESCRIPTION("notify reply server module");
MODULE_AUTHOR("SSTAR");
MODULE_LICENSE("GPL");