From 266428d38510b9bb04fa513ee90a0f99aae1558f Mon Sep 17 00:00:00 2001 From: xusaiqun Date: Fri, 21 Jun 2019 02:02:36 -0700 Subject: [PATCH] =?UTF-8?q?Mod=20aaa-12=20=E6=8F=8F=E8=BF=B0=EF=BC=9A?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0netlink=E6=8A=A5=E6=96=87=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=20RCA=EF=BC=9A=20SOL=EF=BC=9A=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BA=BA=EF=BC=9Axusaiqun=20=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E4=BA=BA=EF=BC=9Axusaiqun?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xusaiqun --- Common/commuapinl.h | 25 +- Platform/modules/cfgrcv/cfgrcv_kinit.c | 105 ++++++- Platform/modules/netlink_api/libnetlink_k.c | 258 +++--------------- Platform/modules/netlink_api/libnetlink_k.h | 28 +- .../modules/pdelivery/pdeliverynl_kinit.c | 113 +++++++- Platform/user/cfg2kernel/cfgchannel_sample.c | 1 + Platform/user/netlink_uapi/libnetlinku.c | 30 +- Platform/user/pdeliv_u/dpi_rcv_test.c | 2 +- Platform/user/pdeliv_u/pdelivery_main.c | 6 +- 9 files changed, 285 insertions(+), 283 deletions(-) diff --git a/Common/commuapinl.h b/Common/commuapinl.h index 36e87b261..0c603f94f 100755 --- a/Common/commuapinl.h +++ b/Common/commuapinl.h @@ -46,7 +46,7 @@ enum pdeliverynetlink_groups { enum pdelivmsgtype{ PDNL_BASE = 0x10,/*netlink 保留控制消息*/ NLMSG_PDELIV_DEBUGFS = 0x11, /*用户态发送给内核态的请求消息,用于查看pdiliv模块本身的状态及配置,与业务无关*/ - NLMSG_RECV_RAW_PKT,/*上送DPI的报文消息*/ + NLMSG_RECV_RAW_PKT = 0x12,/*上送DPI的报文消息*/ PDNLGRP_REQUEST, NLMGS_PDELIVERY_MAX_TYPE, }; @@ -87,24 +87,19 @@ enum commcfgmsgtype{ 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 { - unsigned char cfg_rev_succ; - unsigned char cfg_rev_fail; + unsigned int rev_total; + 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 pde_pkt_fail; + unsigned char send_succ; + unsigned char send_fail; + unsigned int send_fail_reason; + }; #endif /* _UAPI__LINUX_COMMNETLINK_H */ diff --git a/Platform/modules/cfgrcv/cfgrcv_kinit.c b/Platform/modules/cfgrcv/cfgrcv_kinit.c index 71d058779..c9b680f7b 100755 --- a/Platform/modules/cfgrcv/cfgrcv_kinit.c +++ b/Platform/modules/cfgrcv/cfgrcv_kinit.c @@ -13,6 +13,7 @@ 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) { @@ -66,6 +67,54 @@ failure: } #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 ret = 0; @@ -75,7 +124,7 @@ int cfgrcv_debugfs(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext_ #ifdef NLDEBUG_ACK_COOKIES ret = debugfs_pkt_num_stati(&g_upmnlcfg, nlh,extack); #else - ret = debugfs_pkt_num_stati_witisend(&g_upmnlcfg, nlh,extack); + ret = debugfs_pkt_num_stati_witisend(&g_upmnlcfg, nlh,cfgnl_msg_handlers); #endif 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; - printk(KERN_CRIT "nl_upm initialed ok!\n"); + printk(KERN_INFO "cfgrcv.ko-initialed!\n"); /*init for pdelivery module*/ 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); if(ret < 0) { - printk (KERN_CRIT "upm_init netlink init fail!.\n"); return ret; } /*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"); libnetlinkk_exit(&g_upmnlcfg); @@ -115,9 +196,13 @@ void __exit upm_exit(void) } 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_DESCRIPTION("a simple example for upm(user policy manage) netlink protocal family"); diff --git a/Platform/modules/netlink_api/libnetlink_k.c b/Platform/modules/netlink_api/libnetlink_k.c index 115e59703..3b9e1c97f 100755 --- a/Platform/modules/netlink_api/libnetlink_k.c +++ b/Platform/modules/netlink_api/libnetlink_k.c @@ -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) { 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_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) - pdelivnl_msg_handlers[msgtype].doit = doit; + if(NULL != doit) + (msg_handlers+msgtype)->doit = doit; - if(NULL != dumpit) - pdelivnl_msg_handlers[msgtype].dumpit = dumpit; + if(NULL != dumpit) + (msg_handlers+msgtype)->dumpit = dumpit; - if(NULL != calcit) - pdelivnl_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); + if(NULL != calcit) + (msg_handlers+msgtype)->calcit = calcit; return 0; } -int commnl_unregister(int protocol, int msgtype) +int commnl_unregister(struct commnl_msgtype_process *msg_handlers, int msgtype) { - switch (protocol) - { - case NETLINK_PDELIVERY: - 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; + (msg_handlers + msgtype)->doit = NULL; + (msg_handlers + msgtype)->dumpit = NULL; + (msg_handlers + msgtype)->calcit = NULL; - 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; } -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) @@ -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) { - printk(KERN_CRIT "libnetlinkk_init:\n"); - - if(g_nlcfg->subscriptions == NETLINK_PDELIVERY) + if(g_nlcfg == NULL) { - g_nlcfg->cfg.input = libpdelivnl_rcv; - } - 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); + printk(KERN_ERR "netlink.ko-libnetlinkk_init():invaliv input params g_nlcfg is NULL.\n"); return -1; } - + g_nlcfg->cfg.flags = NL_CFG_F_NONROOT_RECV; g_nlcfg->user_pid = -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)); if (!g_nlcfg->sk) { - printk(KERN_CRIT "pcapk_nl create init socket faild!\n"); - return 0; + printk(KERN_CRIT "netlink.ko-netlink_kernel create socket faild!\n"); + return -1; } + + printk(KERN_INFO "netlink.ko-netlink sock init sucess:proto %s.\n", + (g_nlcfg->subscriptions == NETLINK_PDELIVERY)?"pdeliv":"comcfg"); return 0; } @@ -343,7 +176,8 @@ int debugfs_pkt_num_stati(struct netlinkk_cfg *g_nlcfg, struct nlmsghdr *nlh,str 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; 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; char* load; unsigned long fk_type; - struct netlink_debugfs netlink_dfs_temp ={0}; pload = nlmsg_data(nlh); 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); - out_skb = nlmsg_new(length, GFP_KERNEL); + out_skb = nlmsg_new(2*length, GFP_KERNEL); if (!out_skb) goto failure; + out_nlh = nlmsg_put(out_skb,nlh->nlmsg_pid, nlh->nlmsg_seq, 0x11, length, 0); if (!out_nlh) goto failure; - netlink_dfs_temp.cfg_rev_succ = cfgnl_msg_handlers[fk_type].cfg_recv_succ; - netlink_dfs_temp.cfg_rev_fail = cfgnl_msg_handlers[fk_type].cfg_recv_fail; - 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; + nla_put_nohdr(out_skb, length, &(g_nlcfg->dfs)); + nla_put_nohdr(out_skb, length, &((msg_process+fk_type)->dfs)); - memcpy(nlmsg_data(out_nlh), &(netlink_dfs_temp), length); - printk("******************************g_nlcfg->pdeliv_dfs.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("******************************g_nlcfg->pdeliv_dfs.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("******************************g_nlcfg->pdeliv_dfs.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); +#if 0 + printk("******************************cfg_rev_succ=%d****************\n",g_nlcfg->netlink_dfs.cfg_rev_succ); + printk("******************************cfg_rev_fail=%d****************\n",g_nlcfg->netlink_dfs.cfg_rev_fail); + printk("******************************pde_rev_succ=%d****************\n",g_nlcfg->netlink_dfs.pde_rev_succ); + printk("******************************pde_rev_fail=%d****************\n",g_nlcfg->netlink_dfs.pde_rev_fail); + printk("******************************pde_pkt_succ=%d****************\n",g_nlcfg->netlink_dfs.pde_pkt_succ); + 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); 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); if (ret < 0) { - (g_nlcfg->netlink_dfs.pde_pkt_fail)++; - printk(KERN_INFO "Error while sending pkt to user, err id: %d\n", ret); + printk(KERN_ERR "Error while sending pkt to user, ret id: %d\n", ret); } - if(ret==0) - { - (g_nlcfg->netlink_dfs.pde_pkt_succ)++; - } return ret; } -EXPORT_SYMBOL_GPL(pdeliv_msgtype_register); -EXPORT_SYMBOL_GPL(cfg_msgtype_register); -EXPORT_SYMBOL_GPL(cfg_msgtype_unregister); -EXPORT_SYMBOL_GPL(pdeliv_msgtype_unregister); +EXPORT_SYMBOL_GPL(commnl_register); +EXPORT_SYMBOL_GPL(commnl_unregister); EXPORT_SYMBOL_GPL(libnetlinkk_init_byproto); EXPORT_SYMBOL_GPL(libnetlinkk_exit); EXPORT_SYMBOL_GPL(commnl_unicast); @@ -433,14 +257,14 @@ EXPORT_SYMBOL_GPL(nf_nlmsg_multicast); int __init libnetlink_k_init(void) { - printk(KERN_INFO "insmod netlink.ko...\n"); + printk(KERN_INFO "insmod netlink.ko\n"); return 0; }; void __exit libnetlink_k_exit(void) { - printk(KERN_INFO "rmmod netlink.ko...\n"); + printk(KERN_INFO "rmmod netlink.ko\n"); return; }; diff --git a/Platform/modules/netlink_api/libnetlink_k.h b/Platform/modules/netlink_api/libnetlink_k.h index bffb1bd2c..bec7e03f6 100755 --- a/Platform/modules/netlink_api/libnetlink_k.h +++ b/Platform/modules/netlink_api/libnetlink_k.h @@ -8,15 +8,6 @@ #include #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 { @@ -26,7 +17,7 @@ struct netlinkk_cfg int user_pid;/*用户态pid*/ unsigned int subscriptions;/*netlink总线,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 *); @@ -39,8 +30,7 @@ struct commnl_msgtype_process commnl_doit_func doit; commnl_dumpit_func dumpit; commnl_calcit_func calcit; - unsigned int cfg_recv_succ; - unsigned int cfg_recv_fail; + struct netlink_debugfs dfs; }; @@ -49,8 +39,6 @@ extern void printk_mem(unsigned char * p,int len); 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 */ /*返回值:0注册成功;< 0,失败 */ /****************************************************************/ -extern int cfg_msgtype_register( int msgtype,commnl_doit_func doit, - commnl_dumpit_func dumpit,commnl_calcit_func calcit); +int commnl_register(struct commnl_msgtype_process *msg_handlers, int msgtype, + commnl_doit_func doit, commnl_dumpit_func dumpit, + commnl_calcit_func calcit); -extern int cfg_msgtype_unregister(int msgtype); -extern int pdeliv_msgtype_unregister(int msgtype); +int commnl_unregister(struct commnl_msgtype_process *msg_handlers, 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, struct nlmsghdr *nlh,struct netlink_ext_ack *extack); + 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); diff --git a/Platform/modules/pdelivery/pdeliverynl_kinit.c b/Platform/modules/pdelivery/pdeliverynl_kinit.c index 56b5d3ade..4c0a05cb9 100644 --- a/Platform/modules/pdelivery/pdeliverynl_kinit.c +++ b/Platform/modules/pdelivery/pdeliverynl_kinit.c @@ -29,6 +29,7 @@ static struct nf_hook_ops upm_nfho = { .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) { @@ -44,7 +45,7 @@ int pdeliv_rcv_stat(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext #ifdef NLDEBUG_ACK_COOKIES ret = debugfs_pkt_num_stati(&g_nlcfg, nlh, ext_ack); #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 printk("*****************biduichengong********%d*******\n", nlh->nlmsg_type); return ret; @@ -59,17 +60,94 @@ int pdeliv_rcv_stat(struct sk_buff *skb, struct nlmsghdr *nlh,struct netlink_ext 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 ret = -1; - printk(KERN_CRIT "nl_upm initialed ok!\n"); + printk(KERN_CRIT "pdeliv initialed!\n"); /*init for pdelivery module*/ g_nlcfg.groups = PDELIVERY_NLGRP_MAX; g_nlcfg.subscriptions = NETLINK_PDELIVERY; - //g_nlcfg.cfg.input = libnetlink_rcv; + g_nlcfg.cfg.input = libpdelivnl_rcv; ret = libnetlinkk_init_byproto(&g_nlcfg); @@ -80,7 +158,7 @@ int __init pdelivery_init(void) } /*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); /*do msg process register*/ @@ -92,11 +170,11 @@ int __init pdelivery_init(void) void __exit pdelivery_exit(void) { - printk(KERN_CRIT "nl_upm existing...\n"); + printk(KERN_CRIT "pdeliv exit\n"); libnetlinkk_exit(&g_nlcfg); /*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); return; @@ -134,10 +212,16 @@ unsigned int pdelivery_hook_func(void *priv, 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); //填充协议头数据 - if (!out_nlh) goto failure; + if (!out_nlh) + { + goto failure; + } out_payload = nlmsg_data(out_nlh); memcpy(out_payload, payload,payload_len);/**/ @@ -147,7 +231,7 @@ unsigned int pdelivery_hook_func(void *priv, /********************************************************************************/ #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+2),*((char*)out_payload+3), *((char*)out_payload+4),*((char*)out_payload+5), @@ -155,17 +239,26 @@ unsigned int pdelivery_hook_func(void *priv, #endif ret = nf_nlmsg_multicast(&g_nlcfg, out_skb); - + if(ret < 0) + { + goto failure; + } + printk(KERN_INFO "pdelivery_hook_func() end.\n"); + g_nlcfg.dfs.send_succ++; + return NF_ACCEPT;/*must return a value*/ failure: printk(KERN_INFO " failed in pdelivery_hook_func!\n"); + g_nlcfg.dfs.send_fail++; return NF_ACCEPT;/*must return a value*/ } +EXPORT_SYMBOL_GPL(pdeliv_msgtype_register); +EXPORT_SYMBOL_GPL(pdeliv_msgtype_unregister); module_init(pdelivery_init); diff --git a/Platform/user/cfg2kernel/cfgchannel_sample.c b/Platform/user/cfg2kernel/cfgchannel_sample.c index 1f99789f3..cbd02c16e 100644 --- a/Platform/user/cfg2kernel/cfgchannel_sample.c +++ b/Platform/user/cfg2kernel/cfgchannel_sample.c @@ -119,6 +119,7 @@ int set_cfg_debug_nowaitack() if (commcfg_send(&req.n) < 0) return -2; + return 0; } diff --git a/Platform/user/netlink_uapi/libnetlinku.c b/Platform/user/netlink_uapi/libnetlinku.c index faa51ef1b..73171eed0 100644 --- a/Platform/user/netlink_uapi/libnetlinku.c +++ b/Platform/user/netlink_uapi/libnetlinku.c @@ -789,18 +789,32 @@ int pdeliv_main(pdelivnl_listen_filter_t process_pkt) 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; - 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*/ - printf("******debugfs_statis->cfg_rev_succ = %d******\n",debugfs_statis->cfg_rev_succ); - 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("******debugfs_statis->pde_rev_fail = %d******\n",debugfs_statis->pde_rev_fail); - printf("******debugfs_statis->pde_pkt_succ = %d******\n",debugfs_statis->pde_pkt_succ); - printf("******debugfs_statis->pde_pkt_fail = %d******\n",debugfs_statis->pde_pkt_fail); + debugfs_msgtype = debugfs_total+1; + + printf("netlink total msg stats:\r\n"); + printf(" rev_total = %d\n",debugfs_total->rev_total); + printf(" rev_cb_sucess = %d\n",debugfs_total->rev_cb_sucess); + 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; } diff --git a/Platform/user/pdeliv_u/dpi_rcv_test.c b/Platform/user/pdeliv_u/dpi_rcv_test.c index 5b94346a6..2fe560e20 100644 --- a/Platform/user/pdeliv_u/dpi_rcv_test.c +++ b/Platform/user/pdeliv_u/dpi_rcv_test.c @@ -8,7 +8,7 @@ #include "libnetlinku.h" #include "commuapinl.h" -#if 1 +#if 0 static int process_pkt(struct pdelivnl_ctrl_data *ctrl, diff --git a/Platform/user/pdeliv_u/pdelivery_main.c b/Platform/user/pdeliv_u/pdelivery_main.c index f2ddb7962..cd87b3e77 100644 --- a/Platform/user/pdeliv_u/pdelivery_main.c +++ b/Platform/user/pdeliv_u/pdelivery_main.c @@ -1,4 +1,4 @@ - +#if 1 #include #include #include @@ -18,7 +18,7 @@ struct upmnl_handle cfgnlh; int set_pdeliv_debug_waitack() { - unsigned char debug[]={"17"};/*需要发送的数据*/ + unsigned char debug[]={"18"};/*需要发送的数据*/ int debug_len = strlen((const char *)debug); struct nlmsghdr *ack = NULL; struct nlmsghdr **answer = &ack; @@ -109,5 +109,5 @@ int main( int argc, char **argv) return 0; } - +#endif