#if 1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <linux/types.h>
#include <errno.h>

#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