Mod aaa-12 描述:添加netlink报文统计命令
RCA: SOL: 修改人:xusaiqun 检视人:xusaiqun Signed-off-by: xusaiqun <xusaiqun@cmhi.chinamobile.com>
This commit is contained in:
parent
6b3017fbc6
commit
266428d385
|
@ -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 */
|
||||||
|
|
|
@ -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,
|
||||||
int __init upm_init(void)
|
commnl_dumpit_func dumpit,commnl_calcit_func calcit)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
if(msgtype >= COMMCFG_NLMSG_MAX_TYPE )
|
||||||
|
|
||||||
printk(KERN_CRIT "nl_upm initialed ok!\n");
|
|
||||||
|
|
||||||
/*init for pdelivery module*/
|
|
||||||
g_upmnlcfg.groups = 0;
|
|
||||||
g_upmnlcfg.subscriptions = NETLINK_COMMCFG;/*创建配置处理通道*/
|
|
||||||
ret = libnetlinkk_init_byproto(&g_upmnlcfg);
|
|
||||||
if(ret < 0)
|
|
||||||
{
|
{
|
||||||
printk (KERN_CRIT "upm_init netlink init fail!.\n");
|
printk(KERN_ERR"netlink.ko-msgtype register invalid msgtype %d,protocl comcfg.\r\n",msgtype);
|
||||||
return ret;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*do msg process register*/
|
commnl_register(cfgnl_msg_handlers, msgtype,doit, dumpit,calcit);
|
||||||
cfg_msgtype_register(COMMNMSG_CFG_DEBUGFS,cfgrcv_debugfs,NULL,NULL);
|
|
||||||
|
printk(KERN_INFO"netlink.ko-msgtype register sucess msgtype %d,protocl comcfg.\r\n",msgtype);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __exit upm_exit(void)
|
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;
|
||||||
|
|
||||||
|
printk(KERN_INFO "cfgrcv.ko-initialed!\n");
|
||||||
|
|
||||||
|
/*init for pdelivery module*/
|
||||||
|
g_upmnlcfg.groups = 0;
|
||||||
|
g_upmnlcfg.subscriptions = NETLINK_COMMCFG;/*创建配置处理通道*/
|
||||||
|
g_upmnlcfg.cfg.input = libcfgnl_rcv;
|
||||||
|
|
||||||
|
ret = libnetlinkk_init_byproto(&g_upmnlcfg);
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*do msg process register*/
|
||||||
|
ret = cfg_msgtype_register(COMMNMSG_CFG_DEBUGFS,cfgrcv_debugfs,NULL,NULL);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
|
|
@ -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)
|
|
||||||
{
|
|
||||||
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)
|
if(NULL != doit)
|
||||||
pdelivnl_msg_handlers[msgtype].doit = doit;
|
(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,104 +93,29 @@ 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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue