Mod aaa-12 aync interface has been debuged finally

RCA:
SOL:
修改人:zhangtao
检视人:zhangtao
This commit is contained in:
zhangtaohz 2019-06-26 16:48:35 +08:00
parent c22ad8f5d9
commit bb0011b4d5
5 changed files with 87 additions and 59 deletions

View File

@ -48,6 +48,9 @@ enum pdelivmsgtype{
NLMSG_PDELIV_DEBUGFS = 0x11, /*用户态发送给内核态的请求消息用于查看pdiliv模块本身的状态及配置与业务无关*/ NLMSG_PDELIV_DEBUGFS = 0x11, /*用户态发送给内核态的请求消息用于查看pdiliv模块本身的状态及配置与业务无关*/
NLMSG_RECV_RAW_PKT = 0x12,/*上送DPI的报文消息*/ NLMSG_RECV_RAW_PKT = 0x12,/*上送DPI的报文消息*/
PDNLGRP_REQUEST, PDNLGRP_REQUEST,
/*for trace*/
TRACE_CFG_POLICY_REQ = 0x20,
TRACE_CFG_POLICY_REPLY,
NLMGS_PDELIVERY_MAX_TYPE, NLMGS_PDELIVERY_MAX_TYPE,
}; };
@ -78,9 +81,7 @@ enum commcfgmsgtype{
COMMMSGNL_BASE = 0x10,/*netlink 保留控制消息*/ COMMMSGNL_BASE = 0x10,/*netlink 保留控制消息*/
COMMNMSG_CFG_DEBUGFS = 0x11,/*keep the same with NLMSG_PDELIV_DEBUGFS */ COMMNMSG_CFG_DEBUGFS = 0x11,/*keep the same with NLMSG_PDELIV_DEBUGFS */
COMMNMSG_POLICYCONF, COMMNMSG_POLICYCONF,
/*for trace*/
TRACE_CFG_POLICY = 0x20,
TRACE_CFG_MAX = 0X25,
/*add your msg type here:*/ /*add your msg type here:*/
/*commcfg nsmsg max type,must :add your msg type before this */ /*commcfg nsmsg max type,must :add your msg type before this */

View File

@ -35,7 +35,7 @@ PLAT_LINUX_SRCS = $(COMMON_SRCS)
PLAT_ARM64_SRCS = $(COMMON_SRCS) PLAT_ARM64_SRCS = $(COMMON_SRCS)
# gcc CFLAGS # gcc CFLAGS
PLAT_ARM64_CFLAGS := -I../modules/netlink_api/ -I../modules/cfgrcv -I../modules/conntrack_api/api/ -I../../Common -I../common/trace PLAT_ARM64_CFLAGS := -I../modules/netlink_api/ -I../modules/pdelivery -I../modules/conntrack_api/api/ -I../../Common -I../common/trace
PLAT_LINUX_CFLAGS := $(PLAT_ARM64_CFLAGS) PLAT_LINUX_CFLAGS := $(PLAT_ARM64_CFLAGS)
# this line must be at below of thus, because of... # this line must be at below of thus, because of...

View File

@ -9,8 +9,9 @@ typedef enum {
} reply_op_t; } reply_op_t;
enum { enum {
TRACE_MSG_POLICY_REQ = 0x0, TRACE_MSG_POLICY_REQ = 0x0/*,
TRACE_MSG_POLICY_REPLY TRACE_MSG_POLICY_REPLY
*/
}; };
typedef struct _trace_hdr { typedef struct _trace_hdr {

View File

@ -3,11 +3,11 @@
#include <net/netlink.h> #include <net/netlink.h>
#include "trace_def.h" #include "trace_def.h"
#include "../netlink_api/libnetlink_k.h" #include "libnetlink_k.h"
#include "trace_msg.h" #include "trace_msg.h"
#include "commuapinl.h" #include "commuapinl.h"
#include "conntrack_api.h" #include "conntrack_api.h"
#include "cfgrcv_kinit.h" #include "pdeliverynl_kinit.h"
@ -37,7 +37,7 @@ static int trace_rcv_policy(struct sk_buff *skb, struct nlmsghdr *nlh, struct ne
printk(KERN_INFO "Trace recv policy, msg_type:%u", nlh->nlmsg_type); printk(KERN_INFO "Trace recv policy, msg_type:%u", nlh->nlmsg_type);
switch (nlh->nlmsg_type) { switch (nlh->nlmsg_type) {
case TRACE_CFG_POLICY: case TRACE_CFG_POLICY_REQ:
buf = nlmsg_data(nlh); buf = nlmsg_data(nlh);
if (buf == NULL) { if (buf == NULL) {
printk(KERN_ERR"Receiving data is null"); printk(KERN_ERR"Receiving data is null");
@ -104,7 +104,7 @@ static int trace_rcv_policy(struct sk_buff *skb, struct nlmsghdr *nlh, struct ne
printk(KERN_ERR"Allocating skb memory is failure"); printk(KERN_ERR"Allocating skb memory is failure");
goto FAIL; goto FAIL;
} }
reply_hdr = nlmsg_put(reply_skb, 0, 0, TRACE_MSG_POLICY_REPLY, TRACE_REPLY_SZ, 0); reply_hdr = nlmsg_put(reply_skb, 0, 0, TRACE_CFG_POLICY_REPLY, TRACE_REPLY_SZ, 0);
if (reply_hdr == NULL) { if (reply_hdr == NULL) {
printk(KERN_ERR"Putting length of reply is failure"); printk(KERN_ERR"Putting length of reply is failure");
goto FAIL; goto FAIL;
@ -118,13 +118,15 @@ static int trace_rcv_policy(struct sk_buff *skb, struct nlmsghdr *nlh, struct ne
memcpy(&reply->hdr, hdr, sizeof(*hdr)); memcpy(&reply->hdr, hdr, sizeof(*hdr));
reply->result = ret; reply->result = ret;
reply_ret = cfgnl_unicast(reply_skb, nlh->nlmsg_pid); reply_ret = pdeliv_unicast(reply_skb, nlh->nlmsg_pid);
if (reply_ret != 0) { if (reply_ret != 0) {
printk(KERN_ERR"Reply message is failure"); printk(KERN_ERR"Reply message is failure");
goto FAIL; goto FAIL;
} }
nlmsg_free(reply_skb); printk(KERN_INFO"Reply message final");
//nlmsg_free(reply_skb);
return 0; return 0;
FAIL: FAIL:
@ -138,14 +140,14 @@ FAIL:
static int __init trace_init(void) static int __init trace_init(void)
{ {
printk(KERN_INFO"Trace is initiating"); printk(KERN_INFO"Trace is initiating");
cfg_msgtype_register(TRACE_CFG_POLICY, trace_rcv_policy, NULL, NULL); pdeliv_msgtype_register(TRACE_CFG_POLICY_REQ, trace_rcv_policy, NULL, NULL);
printk(KERN_INFO"Trace is initiated"); printk(KERN_INFO"Trace is initiated");
return 0; return 0;
} }
static void __exit trace_exit(void) static void __exit trace_exit(void)
{ {
cfg_msgtype_unregister(TRACE_CFG_POLICY); pdeliv_msgtype_unregister(TRACE_CFG_POLICY_REQ);
} }

View File

@ -34,6 +34,8 @@
#define SESS_HASH_INDEX(seq) (seq >> HASH_SESS_TAB_BITS) #define SESS_HASH_INDEX(seq) (seq >> HASH_SESS_TAB_BITS)
#define NETLINK_GROUP_TRACE_ID 0
typedef struct _cb_arg { typedef struct _cb_arg {
struct hlist_node node; struct hlist_node node;
uint32_t seq; uint32_t seq;
@ -97,49 +99,67 @@ END:
return ret; return ret;
} }
static void *cb_thread(void *arg) static trace_ret_t msg_handle(const trace_reply_t *msg)
{ {
ssize_t size;
trace_reply_t msg;
return NULL; // todo
while(1) {
if (g_client_stop) {
SYSLOG_INFO("Callback thread is stopping");
break;
}
// todo 需要考虑长期没收到消息hash怎么清除数据
// size = msgrcv(g_client_msgid, &msg, sizeof(msg.mtext), g_pid, MSG_NOERROR | IPC_NOWAIT);
if ((size == -1)/* || (size != sizeof(msg.mtext))*/) {
if ((errno != ENOMSG)) {
printf("msg queue receive is failure:%d\n", errno);
}
// usleep(SLEEP_THREAD_TIME); //防止CPU占用过高睡眠一会儿让出CPU todo
continue;
}
cb_arg_t *cb_arg = NULL; cb_arg_t *cb_arg = NULL;
if (get_and_del_arg_from_hlist(msg.hdr.seq, &cb_arg) == TRACE_FAILURE) { if (get_and_del_arg_from_hlist(msg->hdr.seq, &cb_arg) == TRACE_FAILURE) {
SYSLOG_ERR("Get arg is failure"); SYSLOG_ERR("Get arg is failure");
break; return TRACE_FAILURE;
} }
if (cb_arg == NULL) { if (cb_arg == NULL) {
SYSLOG_INFO("The seq:[%u] is not found", msg.hdr.seq); SYSLOG_INFO("The seq:[%u] is not found", msg->hdr.seq);
continue; return TRACE_FAILURE;
} }
if (cb_arg->cb != NULL) { if (cb_arg->cb != NULL) {
SYSLOG_DEBUG("Execute callback of seq:[%u]", msg.hdr.seq); SYSLOG_DEBUG("Execute callback of seq:[%u]", msg->hdr.seq);
cb_arg->cb(msg.result, cb_arg->arg); cb_arg->cb(msg->result, cb_arg->arg);
} else { } else {
SYSLOG_DEBUG("The callback of seq:[%u] is not set", msg.hdr.seq); SYSLOG_DEBUG("The callback of seq:[%u] is not set", msg->hdr.seq);
} }
free(cb_arg); free(cb_arg);
return TRACE_SUCCESS;
}
static int trace_recv_handle(struct pdelivnl_ctrl_data *ctrl,
struct nlmsghdr *n, void *arg)
{
trace_reply_t *reply;
trace_ret_t ret;
SYSLOG_INFO("Trace receives reply message, msg_type:%u", n->nlmsg_type);
switch (n->nlmsg_type) {
case TRACE_CFG_POLICY_REPLY:
reply = (trace_reply_t *)NLMSG_DATA(n);
if (sizeof(*reply) < (n->nlmsg_len - NLMSG_HDRLEN)) {
SYSLOG_WARN("The length of the reply message is required to be %u, but fact length is %u",
sizeof(*reply), (n->nlmsg_len - NLMSG_HDRLEN));
break;
} }
ret = msg_handle(reply);
if (ret != TRACE_SUCCESS) {
SYSLOG_ERR("Processing message is fail");
}
break;
default:
SYSLOG_WARN("Unknown type:%u of the message is received from netlink", n->nlmsg_type);
break;
}
SYSLOG_INFO("Reply message of trace finalizes, msg_type:%u", n->nlmsg_type);
return 0;
}
static void *cb_thread(void *arg)
{
SYSLOG_INFO("Callback thread is started");
pdelivnl_listen(NETLINK_GROUP_TRACE_ID, trace_recv_handle, NULL);
SYSLOG_INFO("Callback thread is stopped"); SYSLOG_INFO("Callback thread is stopped");
return NULL; return NULL;
@ -153,12 +173,13 @@ static trace_ret_t cfg_channel_send(const uint32_t seq, const trace_policy_t *p
hdr->nlmsg_len = NLMSG_HDRLEN; hdr->nlmsg_len = NLMSG_HDRLEN;
hdr->nlmsg_flags = NLM_F_REQUEST /* | NLM_F_ACK */; hdr->nlmsg_flags = NLM_F_REQUEST /* | NLM_F_ACK */;
hdr->nlmsg_type = TRACE_CFG_POLICY; hdr->nlmsg_type = TRACE_CFG_POLICY_REQ;
hdr->nlmsg_pid = getpid(); hdr->nlmsg_pid = getpid();
trace_req_t req; trace_req_t req;
req.hdr.ver = 1; req.hdr.ver = 1;
req.hdr.seq = seq; req.hdr.seq = seq;
req.hdr.is_reply = is_reply;
memcpy(&req.policy, policy, sizeof(*policy)); memcpy(&req.policy, policy, sizeof(*policy));
commnl_addattr_l(hdr, sizeof(buf), TRACE_MSG_POLICY_REQ, &req, sizeof(trace_req_t)); commnl_addattr_l(hdr, sizeof(buf), TRACE_MSG_POLICY_REQ, &req, sizeof(trace_req_t));
@ -172,7 +193,8 @@ static trace_ret_t cfg_channel_send(const uint32_t seq, const trace_policy_t *p
SYSLOG_DEBUG(" protocol:%u, app_type:%u", req.policy.protocol, req.policy.app_type); SYSLOG_DEBUG(" protocol:%u, app_type:%u", req.policy.protocol, req.policy.app_type);
/*发送组装好的netlink消息*/ /*发送组装好的netlink消息*/
if (commcfg_send(hdr) < 0) { //if (commcfg_send(hdr) < 0) {
if (pdelivnl_send(NETLINK_GROUP_TRACE_ID, hdr) < 0) {
SYSLOG_ERR("Message(seq:%u) which been sent is failure", seq); SYSLOG_ERR("Message(seq:%u) which been sent is failure", seq);
return TRACE_FAILURE; return TRACE_FAILURE;
} }
@ -185,7 +207,7 @@ static trace_ret_t cfg_channel_send(const uint32_t seq, const trace_policy_t *p
static void cfg_channel_close() static void cfg_channel_close()
{ {
if (g_channel_open >= 0) { if (g_channel_open >= 0) {
commcfgnl_close(); pdelivnl_close(NETLINK_GROUP_TRACE_ID);
} }
} }
@ -207,7 +229,8 @@ trace_ret_t trace_client_init()
} }
} }
g_channel_open = commcfgnl_open(); //g_channel_open = commcfgnl_open();
g_channel_open = pdelivnl_open(NETLINK_GROUP_TRACE_ID);
if(g_channel_open < 0) if(g_channel_open < 0)
{ {
SYSLOG_ERR("pdelivnl_open fail:%d", g_channel_open); SYSLOG_ERR("pdelivnl_open fail:%d", g_channel_open);
@ -347,6 +370,7 @@ static trace_ret_t __trace_async_exec(const trace_policy_t *in,
} }
is_reply = REPLY_OP_NEED; is_reply = REPLY_OP_NEED;
SYSLOG_DEBUG("Need reply:%u from kernel", is_reply);
} }
ret = cfg_channel_send(seq, in, is_reply); ret = cfg_channel_send(seq, in, is_reply);