Mod aaa-12 描述:添加netlink报文统计命令

RCA:
SOL:
修改人:xusaiqun
检视人:xusaiqun

Signed-off-by: xusaiqun <xusaiqun@cmhi.chinamobile.com>
This commit is contained in:
xusaiqun 2019-06-21 02:02:36 -07:00
parent 6b3017fbc6
commit 266428d385
9 changed files with 285 additions and 283 deletions

View File

@ -46,7 +46,7 @@ enum pdeliverynetlink_groups {
enum pdelivmsgtype{ enum pdelivmsgtype{
PDNL_BASE = 0x10,/*netlink 保留控制消息*/ PDNL_BASE = 0x10,/*netlink 保留控制消息*/
NLMSG_PDELIV_DEBUGFS = 0x11, /*用户态发送给内核态的请求消息用于查看pdiliv模块本身的状态及配置与业务无关*/ NLMSG_PDELIV_DEBUGFS = 0x11, /*用户态发送给内核态的请求消息用于查看pdiliv模块本身的状态及配置与业务无关*/
NLMSG_RECV_RAW_PKT,/*上送DPI的报文消息*/ NLMSG_RECV_RAW_PKT = 0x12,/*上送DPI的报文消息*/
PDNLGRP_REQUEST, PDNLGRP_REQUEST,
NLMGS_PDELIVERY_MAX_TYPE, NLMGS_PDELIVERY_MAX_TYPE,
}; };
@ -87,24 +87,19 @@ enum commcfgmsgtype{
COMMCFG_NLMSG_MAX_TYPE, COMMCFG_NLMSG_MAX_TYPE,
}; };
#if 0
struct pdeliv_debugfs {
unsigned int rev_succ;
unsigned int rev_fail;
unsigned int pde_succ;
unsigned int pde_fail;
};
#endif
struct netlink_debugfs { struct netlink_debugfs {
unsigned char cfg_rev_succ; unsigned int rev_total;
unsigned char cfg_rev_fail; unsigned int rev_cb_sucess;
unsigned int rev_cb_fail;
unsigned int rev_drop_total;
unsigned int rev_drop_nodoit;
unsigned char pde_rev_succ;
unsigned char pde_rev_fail;
unsigned char pde_pkt_succ; unsigned char send_succ;
unsigned char pde_pkt_fail; unsigned char send_fail;
unsigned int send_fail_reason;
}; };
#endif /* _UAPI__LINUX_COMMNETLINK_H */ #endif /* _UAPI__LINUX_COMMNETLINK_H */

View File

@ -13,6 +13,7 @@
struct netlinkk_cfg g_upmnlcfg; struct netlinkk_cfg g_upmnlcfg;
struct commnl_msgtype_process cfgnl_msg_handlers[COMMCFG_NLMSG_MAX_TYPE];
int cfgnl_unicast(struct sk_buff *skb, u32 portid) int cfgnl_unicast(struct sk_buff *skb, u32 portid)
{ {
@ -66,6 +67,54 @@ failure:
} }
#endif #endif
int nl_cfg_data_ready(struct sk_buff *skb, struct nlmsghdr *nlh, struct netlink_ext_ack *extack)
{
int ret = 0;
printk(KERN_DEBUG "nl_cfg_data_ready() nlmsg_type = %d begin.\n",nlh->nlmsg_type);
g_upmnlcfg.dfs.rev_total++;
if(NULL != cfgnl_msg_handlers[nlh->nlmsg_type].doit)
{
cfgnl_msg_handlers[nlh->nlmsg_type].dfs.rev_total++;
ret = cfgnl_msg_handlers[nlh->nlmsg_type].doit(skb, nlh,extack);
if(ret >= 0)
{
g_upmnlcfg.dfs.rev_cb_sucess++;
cfgnl_msg_handlers[nlh->nlmsg_type].dfs.rev_cb_sucess++;
}
else
{
g_upmnlcfg.dfs.rev_cb_fail++;
cfgnl_msg_handlers[nlh->nlmsg_type].dfs.rev_cb_fail++;
}
}
else
{
cfgnl_msg_handlers[nlh->nlmsg_type].dfs.rev_drop_total++;
cfgnl_msg_handlers[nlh->nlmsg_type].dfs.rev_drop_nodoit++;
g_upmnlcfg.dfs.rev_drop_total++;
g_upmnlcfg.dfs.rev_drop_nodoit++;
printk(KERN_WARNING "no doit fun register with nlmsg_type = %d .\n",nlh->nlmsg_type);
}
printk(KERN_DEBUG "nl_cfg_data_ready() nlmsg_type = %d end.\n",nlh->nlmsg_type);
return ret;
}
static void libcfgnl_rcv(struct sk_buff *skb)
{
printk(KERN_DEBUG "libcfgnl_rcv:\n");
netlink_rcv_skb(skb, &nl_cfg_data_ready);
}
int cfgrcv_debugfs(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext_ack *extack) int cfgrcv_debugfs(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext_ack *extack)
{ {
int ret = 0; int ret = 0;
@ -75,7 +124,7 @@ int cfgrcv_debugfs(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext_
#ifdef NLDEBUG_ACK_COOKIES #ifdef NLDEBUG_ACK_COOKIES
ret = debugfs_pkt_num_stati(&g_upmnlcfg, nlh,extack); ret = debugfs_pkt_num_stati(&g_upmnlcfg, nlh,extack);
#else #else
ret = debugfs_pkt_num_stati_witisend(&g_upmnlcfg, nlh,extack); ret = debugfs_pkt_num_stati_witisend(&g_upmnlcfg, nlh,cfgnl_msg_handlers);
#endif #endif
printk("*****************biduichengong***************\n"); printk("*****************biduichengong***************\n");
@ -83,30 +132,62 @@ int cfgrcv_debugfs(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext_
} }
int cfg_msgtype_register( int msgtype,commnl_doit_func doit,
commnl_dumpit_func dumpit,commnl_calcit_func calcit)
{
if(msgtype >= COMMCFG_NLMSG_MAX_TYPE )
{
printk(KERN_ERR"netlink.ko-msgtype register invalid msgtype %d,protocl comcfg.\r\n",msgtype);
return -1;
}
int __init upm_init(void) commnl_register(cfgnl_msg_handlers, msgtype,doit, dumpit,calcit);
printk(KERN_INFO"netlink.ko-msgtype register sucess msgtype %d,protocl comcfg.\r\n",msgtype);
return 0;
}
int cfg_msgtype_unregister(int msgtype)
{
if(msgtype >= COMMCFG_NLMSG_MAX_TYPE )
{
printk(KERN_ERR"commnl_unregister invalid msgtype %d,protocl conncfg.\r\n",msgtype);
return -1;
}
commnl_unregister(cfgnl_msg_handlers,msgtype);
printk(KERN_DEBUG"commnl_unregister sucess msgtype %d,protocl comcfg.\r\n",msgtype);
return 0;
}
int __init cfgrcv_init(void)
{ {
int ret = -1; int ret = -1;
printk(KERN_CRIT "nl_upm initialed ok!\n"); printk(KERN_INFO "cfgrcv.ko-initialed!\n");
/*init for pdelivery module*/ /*init for pdelivery module*/
g_upmnlcfg.groups = 0; g_upmnlcfg.groups = 0;
g_upmnlcfg.subscriptions = NETLINK_COMMCFG;/*创建配置处理通道*/ g_upmnlcfg.subscriptions = NETLINK_COMMCFG;/*创建配置处理通道*/
g_upmnlcfg.cfg.input = libcfgnl_rcv;
ret = libnetlinkk_init_byproto(&g_upmnlcfg); ret = libnetlinkk_init_byproto(&g_upmnlcfg);
if(ret < 0) if(ret < 0)
{ {
printk (KERN_CRIT "upm_init netlink init fail!.\n");
return ret; return ret;
} }
/*do msg process register*/ /*do msg process register*/
cfg_msgtype_register(COMMNMSG_CFG_DEBUGFS,cfgrcv_debugfs,NULL,NULL); ret = cfg_msgtype_register(COMMNMSG_CFG_DEBUGFS,cfgrcv_debugfs,NULL,NULL);
return 0; return ret;
} }
void __exit upm_exit(void) void __exit cfgrcv_exit(void)
{ {
printk(KERN_CRIT "nl_upm existing...\n"); printk(KERN_CRIT "nl_upm existing...\n");
libnetlinkk_exit(&g_upmnlcfg); libnetlinkk_exit(&g_upmnlcfg);
@ -115,9 +196,13 @@ void __exit upm_exit(void)
} }
EXPORT_SYMBOL_GPL(cfgnl_unicast); EXPORT_SYMBOL_GPL(cfgnl_unicast);
EXPORT_SYMBOL_GPL(cfg_msgtype_register);
EXPORT_SYMBOL_GPL(cfg_msgtype_unregister);
module_init(upm_init);
module_exit(upm_exit);
module_init(cfgrcv_init);
module_exit(cfgrcv_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("a simple example for upm(user policy manage) netlink protocal family"); MODULE_DESCRIPTION("a simple example for upm(user policy manage) netlink protocal family");

View File

@ -23,13 +23,6 @@
/**************************************************************************************************************/ /**************************************************************************************************************/
struct commnl_msgtype_process pdelivnl_msg_handlers[NLMGS_PDELIVERY_MAX_TYPE];
struct commnl_msgtype_process cfgnl_msg_handlers[COMMCFG_NLMSG_MAX_TYPE];
struct recv_debugfs recv_dfs;
void printk_mem(unsigned char * p,int len) void printk_mem(unsigned char * p,int len)
{ {
int num = 0; int num = 0;
@ -47,127 +40,42 @@ void printk_mem(unsigned char * p,int len)
} }
int commnl_register(int protocol, int msgtype, int commnl_register(struct commnl_msgtype_process *msg_handlers, int msgtype,
commnl_doit_func doit, commnl_dumpit_func dumpit, commnl_doit_func doit, commnl_dumpit_func dumpit,
commnl_calcit_func calcit) commnl_calcit_func calcit)
{ {
switch (protocol) if(NULL != doit)
{ (msg_handlers+msgtype)->doit = doit;
case NETLINK_PDELIVERY:
if(msgtype >= NLMGS_PDELIVERY_MAX_TYPE )
{
printk(KERN_ERR"commnl_register invalid msgtype %d,protocl pdeliv.\r\n",msgtype);
return -1;
}
if(NULL != doit)
pdelivnl_msg_handlers[msgtype].doit = doit;
if(NULL != dumpit) if(NULL != dumpit)
pdelivnl_msg_handlers[msgtype].dumpit = dumpit; (msg_handlers+msgtype)->dumpit = dumpit;
if(NULL != calcit) if(NULL != calcit)
pdelivnl_msg_handlers[msgtype].calcit = calcit; (msg_handlers+msgtype)->calcit = calcit;
break;
case NETLINK_COMMCFG:
if(msgtype >= COMMCFG_NLMSG_MAX_TYPE )
{
printk(KERN_ERR"commnl_register invalid msgtype %d,protocl conncfg.\r\n",msgtype);
return -1;
}
if(NULL != doit)
cfgnl_msg_handlers[msgtype].doit = doit;
if(NULL != dumpit)
cfgnl_msg_handlers[msgtype].dumpit = dumpit;
if(NULL != calcit)
cfgnl_msg_handlers[msgtype].calcit = calcit;
break;
default:
printk(KERN_ERR"commnl_register invalid protocl %d",protocol);
return -1;
break;
}
printk(KERN_DEBUG"commnl_register sucess msgtype %d,protocl %d.\r\n",msgtype,protocol);
return 0; return 0;
} }
int commnl_unregister(int protocol, int msgtype) int commnl_unregister(struct commnl_msgtype_process *msg_handlers, int msgtype)
{ {
switch (protocol) (msg_handlers + msgtype)->doit = NULL;
{ (msg_handlers + msgtype)->dumpit = NULL;
case NETLINK_PDELIVERY: (msg_handlers + msgtype)->calcit = NULL;
if(msgtype >= NLMGS_PDELIVERY_MAX_TYPE )
{
printk(KERN_ERR"commnl_unregister invalid msgtype %d,protocl pdeliv.\r\n",msgtype);
return -1;
}
pdelivnl_msg_handlers[msgtype].doit = NULL;
pdelivnl_msg_handlers[msgtype].dumpit = NULL;
pdelivnl_msg_handlers[msgtype].calcit = NULL;
break;
case NETLINK_COMMCFG:
if(msgtype >= COMMCFG_NLMSG_MAX_TYPE )
{
printk(KERN_ERR"commnl_unregister invalid msgtype %d,protocl conncfg.\r\n",msgtype);
return -1;
}
cfgnl_msg_handlers[msgtype].doit = NULL;
cfgnl_msg_handlers[msgtype].dumpit = NULL;
cfgnl_msg_handlers[msgtype].calcit = NULL;
break;
default:
printk(KERN_ERR"commnl_unregister failed,invalid protocl %d\r\n",protocol);
return -1;
break;
}
printk(KERN_DEBUG"commnl_unregister sucess msgtype %d,protocl %d.\r\n",msgtype,protocol);
return 0; return 0;
} }
int cfg_msgtype_register( int msgtype,commnl_doit_func doit,
commnl_dumpit_func dumpit,commnl_calcit_func calcit)
{
return(commnl_register(NETLINK_COMMCFG, msgtype,
doit, dumpit,calcit));
}
int pdeliv_msgtype_register( int msgtype,commnl_doit_func doit,
commnl_dumpit_func dumpit,commnl_calcit_func calcit)
{
return(commnl_register(NETLINK_PDELIVERY, msgtype,
doit, dumpit,calcit));
}
int cfg_msgtype_unregister(int msgtype)
{
return(commnl_unregister(NETLINK_COMMCFG,msgtype));
}
int pdeliv_msgtype_unregister(int msgtype)
{
return(commnl_unregister(NETLINK_PDELIVERY,msgtype));
}
void printk_ipaddress(unsigned int address) void printk_ipaddress(unsigned int address)
@ -185,103 +93,28 @@ void printk_ipaddress(unsigned int address)
int nl_cfg_data_ready(struct sk_buff *skb, struct nlmsghdr *nlh, struct netlink_ext_ack *extack)
{
int ret = 0;
printk(KERN_DEBUG "nl_cfg_data_ready() nlmsg_type = %d begin.\n",nlh->nlmsg_type);
if(NULL != cfgnl_msg_handlers[nlh->nlmsg_type].doit)
{
cfgnl_msg_handlers[nlh->nlmsg_type].cfg_recv_succ++;
ret = cfgnl_msg_handlers[nlh->nlmsg_type].doit(skb, nlh,extack);
recv_dfs.cfg_recv_succ++;
}
else
{
cfgnl_msg_handlers[nlh->nlmsg_type].cfg_recv_fail++;
recv_dfs.cfg_recv_fail++;
printk(KERN_WARNING "no doit fun register with nlmsg_type = %d .\n",nlh->nlmsg_type);
}
printk(KERN_DEBUG "nl_cfg_data_ready() nlmsg_type = %d end.\n",nlh->nlmsg_type);
return ret;
}
int nl_pdeliv_data_ready(struct sk_buff *skb, struct nlmsghdr *nlh, struct netlink_ext_ack *extack)
{
int ret = 0;
printk(KERN_DEBUG "nl_pdeliv_data_ready() nlmsg_type = %d begin.\n",nlh->nlmsg_type);
if(NULL != pdelivnl_msg_handlers[nlh->nlmsg_type].doit)
{
pdelivnl_msg_handlers[nlh->nlmsg_type].cfg_recv_succ++;
ret = pdelivnl_msg_handlers[nlh->nlmsg_type].doit(skb, nlh,extack);
recv_dfs.pde_recv_succ++;
}
else
{
recv_dfs.pde_recv_fail++;
pdelivnl_msg_handlers[nlh->nlmsg_type].cfg_recv_fail++;
printk(KERN_WARNING "no doit fun register with nlmsg_type = %d .\n",nlh->nlmsg_type);
}
printk(KERN_DEBUG "nl_pdeliv_data_ready() nlmsg_type = %d end.\n",nlh->nlmsg_type);
return ret;
}
static void libcfgnl_rcv(struct sk_buff *skb)
{
printk(KERN_DEBUG "libcfgnl_rcv:\n");
netlink_rcv_skb(skb, &nl_cfg_data_ready);
}
static void libpdelivnl_rcv(struct sk_buff *skb)
{
printk(KERN_DEBUG "libpdelivnl_rcv:\n");
netlink_rcv_skb(skb, &nl_pdeliv_data_ready);
}
int libnetlinkk_init_byproto(struct netlinkk_cfg *g_nlcfg) int libnetlinkk_init_byproto(struct netlinkk_cfg *g_nlcfg)
{ {
printk(KERN_CRIT "libnetlinkk_init:\n"); if(g_nlcfg == NULL)
if(g_nlcfg->subscriptions == NETLINK_PDELIVERY)
{ {
g_nlcfg->cfg.input = libpdelivnl_rcv; printk(KERN_ERR "netlink.ko-libnetlinkk_init():invaliv input params g_nlcfg is NULL.\n");
}
else if(g_nlcfg->subscriptions == NETLINK_COMMCFG )
{
g_nlcfg->cfg.input = libcfgnl_rcv;
}
else
{
printk(KERN_INFO"libnetlinkk_init_byproto invalid subscriptions %d",g_nlcfg->subscriptions);
return -1; return -1;
} }
g_nlcfg->cfg.flags = NL_CFG_F_NONROOT_RECV; g_nlcfg->cfg.flags = NL_CFG_F_NONROOT_RECV;
g_nlcfg->user_pid = -1; g_nlcfg->user_pid = -1;
//g_nlcfg->sk = -1; //g_nlcfg->sk = -1;
//g_nlcfg->pkt_delev_num = 0;
g_nlcfg->sk = netlink_kernel_create(&init_net, g_nlcfg->subscriptions, &(g_nlcfg->cfg)); g_nlcfg->sk = netlink_kernel_create(&init_net, g_nlcfg->subscriptions, &(g_nlcfg->cfg));
if (!g_nlcfg->sk) if (!g_nlcfg->sk)
{ {
printk(KERN_CRIT "pcapk_nl create init socket faild!\n"); printk(KERN_CRIT "netlink.ko-netlink_kernel create socket faild!\n");
return 0; return -1;
} }
printk(KERN_INFO "netlink.ko-netlink sock init sucess:proto %s.\n",
(g_nlcfg->subscriptions == NETLINK_PDELIVERY)?"pdeliv":"comcfg");
return 0; return 0;
} }
@ -343,7 +176,8 @@ int debugfs_pkt_num_stati(struct netlinkk_cfg *g_nlcfg, struct nlmsghdr *nlh,str
return 0; return 0;
} }
int debugfs_pkt_num_stati_witisend(struct netlinkk_cfg *g_nlcfg, struct nlmsghdr *nlh,struct netlink_ext_ack *extack) int debugfs_pkt_num_stati_witisend(struct netlinkk_cfg *g_nlcfg,
struct nlmsghdr *nlh,struct commnl_msgtype_process* msg_process)
{ {
int err; int err;
struct sk_buff *out_skb; struct sk_buff *out_skb;
@ -353,7 +187,6 @@ int debugfs_pkt_num_stati_witisend(struct netlinkk_cfg *g_nlcfg, struct nlmsghdr
struct nlattr *rta; struct nlattr *rta;
char* load; char* load;
unsigned long fk_type; unsigned long fk_type;
struct netlink_debugfs netlink_dfs_temp ={0};
pload = nlmsg_data(nlh); pload = nlmsg_data(nlh);
rta = (struct nlattr *)pload; rta = (struct nlattr *)pload;
@ -365,26 +198,24 @@ int debugfs_pkt_num_stati_witisend(struct netlinkk_cfg *g_nlcfg, struct nlmsghdr
printk("***************************fk_type%lu********************\n", fk_type); printk("***************************fk_type%lu********************\n", fk_type);
out_skb = nlmsg_new(length, GFP_KERNEL); out_skb = nlmsg_new(2*length, GFP_KERNEL);
if (!out_skb) goto failure; if (!out_skb) goto failure;
out_nlh = nlmsg_put(out_skb,nlh->nlmsg_pid, nlh->nlmsg_seq, 0x11, length, 0); out_nlh = nlmsg_put(out_skb,nlh->nlmsg_pid, nlh->nlmsg_seq, 0x11, length, 0);
if (!out_nlh) goto failure; if (!out_nlh) goto failure;
netlink_dfs_temp.cfg_rev_succ = cfgnl_msg_handlers[fk_type].cfg_recv_succ; nla_put_nohdr(out_skb, length, &(g_nlcfg->dfs));
netlink_dfs_temp.cfg_rev_fail = cfgnl_msg_handlers[fk_type].cfg_recv_fail; nla_put_nohdr(out_skb, length, &((msg_process+fk_type)->dfs));
netlink_dfs_temp.pde_rev_succ = pdelivnl_msg_handlers[fk_type].cfg_recv_succ;
netlink_dfs_temp.pde_rev_fail = pdelivnl_msg_handlers[fk_type].cfg_recv_fail;
netlink_dfs_temp.pde_pkt_fail = g_nlcfg->netlink_dfs.pde_pkt_fail;
netlink_dfs_temp.pde_pkt_succ = g_nlcfg->netlink_dfs.pde_pkt_succ;
memcpy(nlmsg_data(out_nlh), &(netlink_dfs_temp), length); #if 0
printk("******************************g_nlcfg->pdeliv_dfs.cfg_rev_succ=%d****************\n",g_nlcfg->netlink_dfs.cfg_rev_succ); printk("******************************cfg_rev_succ=%d****************\n",g_nlcfg->netlink_dfs.cfg_rev_succ);
printk("******************************g_nlcfg->pdeliv_dfs.cfg_rev_fail=%d****************\n",g_nlcfg->netlink_dfs.cfg_rev_fail); printk("******************************cfg_rev_fail=%d****************\n",g_nlcfg->netlink_dfs.cfg_rev_fail);
printk("******************************g_nlcfg->pdeliv_dfs.pde_rev_succ=%d****************\n",g_nlcfg->netlink_dfs.pde_rev_succ); printk("******************************pde_rev_succ=%d****************\n",g_nlcfg->netlink_dfs.pde_rev_succ);
printk("******************************g_nlcfg->pdeliv_dfs.pde_rev_fail=%d****************\n",g_nlcfg->netlink_dfs.pde_rev_fail); printk("******************************pde_rev_fail=%d****************\n",g_nlcfg->netlink_dfs.pde_rev_fail);
printk("******************************g_nlcfg->pdeliv_dfs.pde_pkt_succ=%d****************\n",g_nlcfg->netlink_dfs.pde_pkt_succ); printk("******************************pde_pkt_succ=%d****************\n",g_nlcfg->netlink_dfs.pde_pkt_succ);
printk("******************************g_nlcfg->pdeliv_dfs.pde_pkt_fail=%d****************\n",g_nlcfg->netlink_dfs.pde_pkt_fail); printk("******************************pde_pkt_fail=%d****************\n",g_nlcfg->netlink_dfs.pde_pkt_fail);
#endif
printk("------------------debugfs_pkt_num_stati ack msg_type %d,seq=%d!\n",out_nlh->nlmsg_type,nlh->nlmsg_seq); printk("------------------debugfs_pkt_num_stati ack msg_type %d,seq=%d!\n",out_nlh->nlmsg_type,nlh->nlmsg_seq);
err = commnl_unicast(g_nlcfg->sk, out_skb, nlh->nlmsg_pid); err = commnl_unicast(g_nlcfg->sk, out_skb, nlh->nlmsg_pid);
@ -404,21 +235,14 @@ int nf_nlmsg_multicast(struct netlinkk_cfg *g_nlcfg, struct sk_buff *skb)
ret = nlmsg_multicast(g_nlcfg->sk,skb,0,PDNLGRP_ALLRAW,0); ret = nlmsg_multicast(g_nlcfg->sk,skb,0,PDNLGRP_ALLRAW,0);
if (ret < 0) if (ret < 0)
{ {
(g_nlcfg->netlink_dfs.pde_pkt_fail)++; printk(KERN_ERR "Error while sending pkt to user, ret id: %d\n", ret);
printk(KERN_INFO "Error while sending pkt to user, err id: %d\n", ret);
} }
if(ret==0)
{
(g_nlcfg->netlink_dfs.pde_pkt_succ)++;
}
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(pdeliv_msgtype_register); EXPORT_SYMBOL_GPL(commnl_register);
EXPORT_SYMBOL_GPL(cfg_msgtype_register); EXPORT_SYMBOL_GPL(commnl_unregister);
EXPORT_SYMBOL_GPL(cfg_msgtype_unregister);
EXPORT_SYMBOL_GPL(pdeliv_msgtype_unregister);
EXPORT_SYMBOL_GPL(libnetlinkk_init_byproto); EXPORT_SYMBOL_GPL(libnetlinkk_init_byproto);
EXPORT_SYMBOL_GPL(libnetlinkk_exit); EXPORT_SYMBOL_GPL(libnetlinkk_exit);
EXPORT_SYMBOL_GPL(commnl_unicast); EXPORT_SYMBOL_GPL(commnl_unicast);
@ -433,14 +257,14 @@ EXPORT_SYMBOL_GPL(nf_nlmsg_multicast);
int __init libnetlink_k_init(void) int __init libnetlink_k_init(void)
{ {
printk(KERN_INFO "insmod netlink.ko...\n"); printk(KERN_INFO "insmod netlink.ko\n");
return 0; return 0;
}; };
void __exit libnetlink_k_exit(void) void __exit libnetlink_k_exit(void)
{ {
printk(KERN_INFO "rmmod netlink.ko...\n"); printk(KERN_INFO "rmmod netlink.ko\n");
return; return;
}; };

View File

@ -8,15 +8,6 @@
#include <net/net_namespace.h> #include <net/net_namespace.h>
#include "../../../Common/commuapinl.h" #include "../../../Common/commuapinl.h"
struct recv_debugfs {
unsigned int cfg_recv_succ;
unsigned int cfg_recv_fail;
unsigned int pde_recv_succ;
unsigned int pde_recv_fail;
};
struct netlinkk_cfg struct netlinkk_cfg
{ {
@ -26,7 +17,7 @@ struct netlinkk_cfg
int user_pid;/*用户态pid*/ int user_pid;/*用户态pid*/
unsigned int subscriptions;/*netlink总线netlink协议号*/ unsigned int subscriptions;/*netlink总线netlink协议号*/
unsigned int groups;/*netlink 组播组*/ unsigned int groups;/*netlink 组播组*/
struct netlink_debugfs netlink_dfs; struct netlink_debugfs dfs;
}; };
typedef int (*commnl_doit_func)(struct sk_buff *, struct nlmsghdr *,struct netlink_ext_ack *); typedef int (*commnl_doit_func)(struct sk_buff *, struct nlmsghdr *,struct netlink_ext_ack *);
@ -39,8 +30,7 @@ struct commnl_msgtype_process
commnl_doit_func doit; commnl_doit_func doit;
commnl_dumpit_func dumpit; commnl_dumpit_func dumpit;
commnl_calcit_func calcit; commnl_calcit_func calcit;
unsigned int cfg_recv_succ; struct netlink_debugfs dfs;
unsigned int cfg_recv_fail;
}; };
@ -49,8 +39,6 @@ extern void printk_mem(unsigned char * p,int len);
extern void printk_ipaddress(unsigned int address); extern void printk_ipaddress(unsigned int address);
extern int pdeliv_msgtype_register( int msgtype,commnl_doit_func doit,
commnl_dumpit_func dumpit,commnl_calcit_func calcit);
/****************************************************************/ /****************************************************************/
/*函数功能:注册内核态配置接收消息处理函数。 */ /*函数功能:注册内核态配置接收消息处理函数。 */
@ -61,11 +49,11 @@ extern int pdeliv_msgtype_register( int msgtype,commnl_doit_func doit,
/*输出参数: WU */ /*输出参数: WU */
/*返回值0注册成功< 0,失败 */ /*返回值0注册成功< 0,失败 */
/****************************************************************/ /****************************************************************/
extern int cfg_msgtype_register( int msgtype,commnl_doit_func doit, int commnl_register(struct commnl_msgtype_process *msg_handlers, int msgtype,
commnl_dumpit_func dumpit,commnl_calcit_func calcit); commnl_doit_func doit, commnl_dumpit_func dumpit,
commnl_calcit_func calcit);
extern int cfg_msgtype_unregister(int msgtype); int commnl_unregister(struct commnl_msgtype_process *msg_handlers, int msgtype);
extern int pdeliv_msgtype_unregister(int msgtype);
/****************************************************************/ /****************************************************************/
@ -83,8 +71,10 @@ extern int commnl_unicast(struct sock *sk, struct sk_buff *skb, u32 portid);
extern int debugfs_pkt_num_stati(struct netlinkk_cfg *g_nlcfg, extern int debugfs_pkt_num_stati(struct netlinkk_cfg *g_nlcfg,
struct nlmsghdr *nlh,struct netlink_ext_ack *extack); struct nlmsghdr *nlh,struct netlink_ext_ack *extack);
extern int debugfs_pkt_num_stati_witisend(struct netlinkk_cfg *g_nlcfg, extern int debugfs_pkt_num_stati_witisend(struct netlinkk_cfg *g_nlcfg,
struct nlmsghdr *nlh,struct netlink_ext_ack *extack); struct nlmsghdr *nlh,struct commnl_msgtype_process* msg_process);
extern int nf_nlmsg_multicast(struct netlinkk_cfg *g_nlcfg, struct sk_buff *skb); extern int nf_nlmsg_multicast(struct netlinkk_cfg *g_nlcfg, struct sk_buff *skb);

View File

@ -29,6 +29,7 @@ static struct nf_hook_ops upm_nfho = {
.priority = NF_IP_PRI_FILTER, .priority = NF_IP_PRI_FILTER,
}; };
struct commnl_msgtype_process pdelivnl_msg_handlers[NLMGS_PDELIVERY_MAX_TYPE];
int pdeliv_rcv_stat(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext_ack * ext_ack) int pdeliv_rcv_stat(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext_ack * ext_ack)
{ {
@ -44,7 +45,7 @@ int pdeliv_rcv_stat(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext
#ifdef NLDEBUG_ACK_COOKIES #ifdef NLDEBUG_ACK_COOKIES
ret = debugfs_pkt_num_stati(&g_nlcfg, nlh, ext_ack); ret = debugfs_pkt_num_stati(&g_nlcfg, nlh, ext_ack);
#else #else
ret = debugfs_pkt_num_stati_witisend(&g_nlcfg, nlh,ext_ack); ret = debugfs_pkt_num_stati_witisend(&g_nlcfg, nlh,pdelivnl_msg_handlers);
#endif #endif
printk("*****************biduichengong********%d*******\n", nlh->nlmsg_type); printk("*****************biduichengong********%d*******\n", nlh->nlmsg_type);
return ret; return ret;
@ -59,17 +60,94 @@ int pdeliv_rcv_stat(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext
return 0; return 0;
} }
int nl_pdeliv_data_ready(struct sk_buff *skb, struct nlmsghdr *nlh, struct netlink_ext_ack *extack)
{
int ret = 0;
printk(KERN_DEBUG "nl_pdeliv_data_ready() nlmsg_type = %d begin.\n",nlh->nlmsg_type);
g_nlcfg.dfs.rev_total++;
if(NULL != pdelivnl_msg_handlers[nlh->nlmsg_type].doit)
{
pdelivnl_msg_handlers[nlh->nlmsg_type].dfs.rev_total++;
ret = pdelivnl_msg_handlers[nlh->nlmsg_type].doit(skb, nlh,extack);
if(ret >= 0)
{
g_nlcfg.dfs.rev_cb_sucess++;
pdelivnl_msg_handlers[nlh->nlmsg_type].dfs.rev_cb_sucess++;
}
else
{
g_nlcfg.dfs.rev_cb_fail++;
pdelivnl_msg_handlers[nlh->nlmsg_type].dfs.rev_cb_fail++;
}
}
else
{
pdelivnl_msg_handlers[nlh->nlmsg_type].dfs.rev_drop_total++;
pdelivnl_msg_handlers[nlh->nlmsg_type].dfs.rev_drop_nodoit++;
g_nlcfg.dfs.rev_drop_total++;
g_nlcfg.dfs.rev_drop_nodoit++;
printk(KERN_WARNING "no doit fun register with nlmsg_type = %d .\n",nlh->nlmsg_type);
}
printk(KERN_DEBUG "nl_pdeliv_data_ready() nlmsg_type = %d end.\n",nlh->nlmsg_type);
return ret;
}
static void libpdelivnl_rcv(struct sk_buff *skb)
{
printk(KERN_DEBUG "libpdelivnl_rcv:\n");
netlink_rcv_skb(skb, &nl_pdeliv_data_ready);
}
int pdeliv_msgtype_register( int msgtype,commnl_doit_func doit,
commnl_dumpit_func dumpit,commnl_calcit_func calcit)
{
if(msgtype >= NLMGS_PDELIVERY_MAX_TYPE )
{
printk(KERN_ERR"netlink.ko-msgtype register invalid msgtype %d,protocl pdeliv.\r\n",msgtype);
return -1;
}
commnl_register(pdelivnl_msg_handlers, msgtype,doit, dumpit,calcit);
printk(KERN_INFO"netlink.ko-msgtype register sucess msgtype %d,protocl comcfg.\r\n",msgtype);
return 0;
}
int pdeliv_msgtype_unregister(int msgtype)
{
if(msgtype >= NETLINK_PDELIVERY )
{
printk(KERN_ERR"commnl_unregister invalid msgtype %d,protocl conncfg.\r\n",msgtype);
return -1;
}
commnl_unregister(pdelivnl_msg_handlers,msgtype);
printk(KERN_DEBUG"commnl_unregister sucess msgtype %d,protocl pdeliv.\r\n",msgtype);
return 0;
}
int __init pdelivery_init(void) int __init pdelivery_init(void)
{ {
int ret = -1; int ret = -1;
printk(KERN_CRIT "nl_upm initialed ok!\n"); printk(KERN_CRIT "pdeliv initialed!\n");
/*init for pdelivery module*/ /*init for pdelivery module*/
g_nlcfg.groups = PDELIVERY_NLGRP_MAX; g_nlcfg.groups = PDELIVERY_NLGRP_MAX;
g_nlcfg.subscriptions = NETLINK_PDELIVERY; g_nlcfg.subscriptions = NETLINK_PDELIVERY;
//g_nlcfg.cfg.input = libnetlink_rcv; g_nlcfg.cfg.input = libpdelivnl_rcv;
ret = libnetlinkk_init_byproto(&g_nlcfg); ret = libnetlinkk_init_byproto(&g_nlcfg);
@ -80,7 +158,7 @@ int __init pdelivery_init(void)
} }
/*init the netfilter hook for upm*/ /*init the netfilter hook for upm*/
printk (KERN_INFO "upm register netfilter module.\n"); printk (KERN_INFO "pdeliv register netfilter module.\n");
nf_register_net_hook (&init_net,&upm_nfho); nf_register_net_hook (&init_net,&upm_nfho);
/*do msg process register*/ /*do msg process register*/
@ -92,11 +170,11 @@ int __init pdelivery_init(void)
void __exit pdelivery_exit(void) void __exit pdelivery_exit(void)
{ {
printk(KERN_CRIT "nl_upm existing...\n"); printk(KERN_CRIT "pdeliv exit\n");
libnetlinkk_exit(&g_nlcfg); libnetlinkk_exit(&g_nlcfg);
/*init the netfilter hook for upm*/ /*init the netfilter hook for upm*/
printk (KERN_INFO "upm unregister netfilter module.\n"); printk (KERN_INFO "pdeliv unregister netfilter module.\n");
nf_unregister_net_hook (&init_net,&upm_nfho); nf_unregister_net_hook (&init_net,&upm_nfho);
return; return;
@ -134,10 +212,16 @@ unsigned int pdelivery_hook_func(void *priv,
out_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); //分配足以存放默认大小的sk_buff out_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); //分配足以存放默认大小的sk_buff
if (!out_skb) goto failure; if (!out_skb)
{
goto failure;
}
out_nlh = nlmsg_put(out_skb, 0, 0, NLMSG_RECV_RAW_PKT, payload_len, 0); //填充协议头数据 out_nlh = nlmsg_put(out_skb, 0, 0, NLMSG_RECV_RAW_PKT, payload_len, 0); //填充协议头数据
if (!out_nlh) goto failure; if (!out_nlh)
{
goto failure;
}
out_payload = nlmsg_data(out_nlh); out_payload = nlmsg_data(out_nlh);
memcpy(out_payload, payload,payload_len);/**/ memcpy(out_payload, payload,payload_len);/**/
@ -147,7 +231,7 @@ unsigned int pdelivery_hook_func(void *priv,
/********************************************************************************/ /********************************************************************************/
#if 1 #if 1
printk(KERN_INFO "%02x %02x %02x %02x %02x %02x %02x %02x\r\n", printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\r\n",
*((char*)out_payload),*((char*)out_payload+1), *((char*)out_payload),*((char*)out_payload+1),
*((char*)out_payload+2),*((char*)out_payload+3), *((char*)out_payload+2),*((char*)out_payload+3),
*((char*)out_payload+4),*((char*)out_payload+5), *((char*)out_payload+4),*((char*)out_payload+5),
@ -155,17 +239,26 @@ unsigned int pdelivery_hook_func(void *priv,
#endif #endif
ret = nf_nlmsg_multicast(&g_nlcfg, out_skb); ret = nf_nlmsg_multicast(&g_nlcfg, out_skb);
if(ret < 0)
{
goto failure;
}
printk(KERN_INFO "pdelivery_hook_func() end.\n"); printk(KERN_INFO "pdelivery_hook_func() end.\n");
g_nlcfg.dfs.send_succ++;
return NF_ACCEPT;/*must return a value*/ return NF_ACCEPT;/*must return a value*/
failure: failure:
printk(KERN_INFO " failed in pdelivery_hook_func!\n"); printk(KERN_INFO " failed in pdelivery_hook_func!\n");
g_nlcfg.dfs.send_fail++;
return NF_ACCEPT;/*must return a value*/ return NF_ACCEPT;/*must return a value*/
} }
EXPORT_SYMBOL_GPL(pdeliv_msgtype_register);
EXPORT_SYMBOL_GPL(pdeliv_msgtype_unregister);
module_init(pdelivery_init); module_init(pdelivery_init);

View File

@ -119,6 +119,7 @@ int set_cfg_debug_nowaitack()
if (commcfg_send(&req.n) < 0) if (commcfg_send(&req.n) < 0)
return -2; return -2;
return 0; return 0;
} }

View File

@ -789,18 +789,32 @@ int pdeliv_main(pdelivnl_listen_filter_t process_pkt)
void nl_debugfs(struct nlmsghdr *n) void nl_debugfs(struct nlmsghdr *n)
{ {
struct netlink_debugfs *debugfs_statis =NULL; struct netlink_debugfs *debugfs_total =NULL;
struct netlink_debugfs *debugfs_msgtype =NULL;
int msg_len = 0; int msg_len = 0;
debugfs_statis = (struct netlink_debugfs *)NLMSG_DATA(n);/*msg data*/ debugfs_total = (struct netlink_debugfs *)NLMSG_DATA(n);/*msg data*/
msg_len = (n)->nlmsg_len - NLMSG_HDRLEN; /*msg_len*/ msg_len = (n)->nlmsg_len - NLMSG_HDRLEN; /*msg_len*/
printf("******debugfs_statis->cfg_rev_succ = %d******\n",debugfs_statis->cfg_rev_succ); debugfs_msgtype = debugfs_total+1;
printf("******debugfs_statis->cfg_rev_fail = %d******\n",debugfs_statis->cfg_rev_fail);
printf("******debugfs_statis->pde_rev_succ = %d******\n",debugfs_statis->pde_rev_succ); printf("netlink total msg stats:\r\n");
printf("******debugfs_statis->pde_rev_fail = %d******\n",debugfs_statis->pde_rev_fail); printf(" rev_total = %d\n",debugfs_total->rev_total);
printf("******debugfs_statis->pde_pkt_succ = %d******\n",debugfs_statis->pde_pkt_succ); printf(" rev_cb_sucess = %d\n",debugfs_total->rev_cb_sucess);
printf("******debugfs_statis->pde_pkt_fail = %d******\n",debugfs_statis->pde_pkt_fail); printf(" rev_cb_fail = %d\n",debugfs_total->rev_cb_fail);
printf(" rev_drop_total = %d\n",debugfs_total->rev_drop_total);
printf(" rev_drop_nodoit = %d\n",debugfs_total->rev_drop_nodoit);
printf(" send_succ = %d\n",debugfs_total->send_succ);
printf(" send_fail = %d\n",debugfs_total->send_fail);
printf("netlink msg stats:\r\n");
printf(" rev_total = %d\n",debugfs_msgtype->rev_total);
printf(" rev_cb_sucess = %d\n",debugfs_msgtype->rev_cb_sucess);
printf(" rev_cb_fail = %d\n",debugfs_msgtype->rev_cb_fail);
printf(" rev_drop_total = %d\n",debugfs_msgtype->rev_drop_total);
printf(" rev_drop_nodoit = %d\n",debugfs_msgtype->rev_drop_nodoit);
printf(" send_succ = %d\n",debugfs_msgtype->send_succ);
printf(" send_fail = %d\n",debugfs_msgtype->send_fail);
return; return;
} }

View File

@ -8,7 +8,7 @@
#include "libnetlinku.h" #include "libnetlinku.h"
#include "commuapinl.h" #include "commuapinl.h"
#if 1 #if 0
static int process_pkt(struct pdelivnl_ctrl_data *ctrl, static int process_pkt(struct pdelivnl_ctrl_data *ctrl,

View File

@ -1,4 +1,4 @@
#if 1
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
@ -18,7 +18,7 @@ struct upmnl_handle cfgnlh;
int set_pdeliv_debug_waitack() int set_pdeliv_debug_waitack()
{ {
unsigned char debug[]={"17"};/*需要发送的数据*/ unsigned char debug[]={"18"};/*需要发送的数据*/
int debug_len = strlen((const char *)debug); int debug_len = strlen((const char *)debug);
struct nlmsghdr *ack = NULL; struct nlmsghdr *ack = NULL;
struct nlmsghdr **answer = &ack; struct nlmsghdr **answer = &ack;
@ -109,5 +109,5 @@ int main( int argc, char **argv)
return 0; return 0;
} }
#endif