#ifndef LIBNETLINKK_K_H #define LIBNETLINKK_K_H #include #include #include #include #include #include #include #include #include "../../../Common/commuapinl.h" #define NETLINK_DEBUG(debugfs_enable, ...) \ if(DEBUGFS_PRK_ONOFF != debugfs_enable) printk(__VA_ARGS__) struct netlinkk_cfg { struct netlink_kernel_cfg cfg; struct sock *sk; //内核端socket int user_pid;/*用户态pid*/ unsigned int subscriptions;/*netlink总线,netlink协议号*/ unsigned int groups;/*netlink 组播组*/ struct netlink_debugfs dfs; struct commnl_msgtype_process* msg_processer; int msg_processer_num; unsigned long debugfs_prk_enable; }; typedef int (*commnl_doit_func)(struct sk_buff *, struct nlmsghdr *,struct netlink_ext_ack *); typedef int (*commnl_dumpit_func)(struct sk_buff *, struct netlink_callback *,struct netlink_ext_ack *); typedef u16 (*commnl_calcit_func)(struct sk_buff *, struct nlmsghdr *,struct netlink_ext_ack *); struct commnl_msgtype_process { int msgtype; commnl_doit_func doit; commnl_dumpit_func dumpit; commnl_calcit_func calcit; struct netlink_debugfs dfs; }; extern void printk_mem(unsigned char * p,int len); extern void printk_ipaddress(unsigned int address); /****************************************************************/ /*函数功能:注册内核态配置接收消息处理函数。 */ /*输入参数: */ /*msgtype:注册的消息类型。*/ /*doit:对应的消息接收处理函数;*/ /*dumpit,calcit:框架预留接口,暂未使用。填NULL.*/ /*输出参数: WU */ /*返回值:0注册成功;< 0,失败 */ /****************************************************************/ int commnl_register(struct commnl_msgtype_process *msg_handlers, int msgtype, commnl_doit_func doit, commnl_dumpit_func dumpit, commnl_calcit_func calcit); int commnl_unregister(struct commnl_msgtype_process *msg_handlers, int msgtype); /****************************************************************/ /*函数功能:在内核态创建报文上送通道,上送的 */ /*报文内容从链路层头开始。一个netlink协议号只能创建一个通道。 */ /*输入参数:g_nlcfg */ /*输出参数: struct upmnl_handle * upmh ,存放创建的通道相关信息。*/ /*返回值:0通道创建成果;< 0,失败 */ /****************************************************************/ extern int libnetlinkk_init_byproto(struct netlinkk_cfg *g_nlcfg); extern void libnetlinkk_exit(struct netlinkk_cfg *g_nlcfg); 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 commnl_msgtype_process* msg_process); extern int nf_nlmsg_multicast(struct netlinkk_cfg *g_nlcfg, struct sk_buff *skb); extern int debugfs_prk_onoff(struct netlinkk_cfg *g_nlcfg, struct nlmsghdr *nlh,struct netlink_ext_ack *extack); #endif