#if 1 #include #include #include #include #include #include #include "libnetlinku.h" #include "policyconf.h" #include "commuapinl.h" struct upmnl_handle cfgnlh; #ifdef NLDEBUG_ACK_COOKIES #define PDELIV_DEBUG_ACK_COOKIES #endif int set_pdeliv_debug_waitack(unsigned char * msgtype) { int debug_len = 0; struct nlmsghdr *ack = NULL; struct nlmsghdr **answer = &ack; struct { struct nlmsghdr n; char buf[1024]; } req = { .n.nlmsg_len = NLMSG_LENGTH(0), #ifdef PDELIV_DEBUG_ACK_COOKIES .n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK, #else .n.nlmsg_flags = NLM_F_REQUEST, #endif .n.nlmsg_type = NLMSG_PDELIV_DEBUGFS, .n.nlmsg_pid = getpid(), }; if( msgtype == NULL ) { printf("set_pdeliv_debug_waitack err:input msgtype is NULL.\r\n"); return -1; }else { printf("set_pdeliv_debug msgtype %s\r\n",msgtype); } debug_len = strlen((const char *)msgtype); /*可选属性*/ commnl_addattr_l(&req.n, sizeof(req), NLDEBUG_MSG_TYPE, msgtype, debug_len); /*发送组装好的netlink消息*/ if (pdeliv_talk(0, &req.n, answer) < 0) { printf("set_user_policy_waitack rcv ack msg faild.\r\n"); return -2; } else{ printf("set_user_policy_waitack rcv ack msg sucess.\r\n"); } if(*answer != NULL) { printf("set_user_policy_waitack rcv answer.\r\n"); } else{ printf("set_user_policy_waitack rcv answer error.\r\n"); return -3; } #ifdef PDELIV_DEBUG_ACK_COOKIES /*recv answer*/ if((*answer)->nlmsg_type == NLMSG_ERROR){ nl_debugfs_extack(*answer); } #else /*recv answer*/ if((*answer)->nlmsg_type == NLMSG_PDELIV_DEBUGFS) { nl_debugfs(*answer); } #endif return 0; } int main( int argc, char **argv) { int ret = -1; unsigned char* msgtype = NULL; printf("pdeliv_debug main begin:\r\n"); if(argc == 1) { msgtype = (unsigned char*)"18"; } else if(argc == 2) { msgtype = (unsigned char*)argv[1]; } else { printf("invalid input msgtype\r\n"); } /*创建通道*/ ret = pdelivnl_open(0); if(ret < 0) { printf("pdelivnl_open fail,exit.\r\n"); return -1; } /*下发配置到内核态*/ ret = set_pdeliv_debug_waitack(msgtype); if(ret < 0) { printf("set_pdeliv_debug_waitack failed.\r\n"); return -1; } /*关闭netlink通道*/ pdelivnl_close(0); printf("cfgchannel main exit!\r\n"); return 0; } #endif