netlink 編程


Linux 系統下內核與應用進行數據交換的各種方式,包括內核啓動參數、模塊參數與 sysfssysctl、系統調用、netlinkprocfsseq_filedebugfs relayfs;

包括:路由 daemonNETLINK_ROUTE),1-wire 子系統(NETLINK_W1),用戶態 socket 協議(NETLINK_USERSOCK),防火牆(NETLINK_FIREWALL),socket 監視(NETLINK_INET_DIAG),netfilter 日誌(NETLINK_NFLOG),ipsec 安全策略(NETLINK_XFRM),SELinux 事件通知(NETLINK_SELINUX),iSCSI 子系統(NETLINK_ISCSI),進程審計(NETLINK_AUDIT),轉發信息表查詢NETLINK_FIB_LOOKUP),netlink connector(NETLINK_CONNECTOR),netfilter 子系統(NETLINK_NETFILTER),IPv6 防火牆(NETLINK_IP6_FW),DECnet 路由信息(NETLINK_DNRTMSG),內核事件向用戶態通知(NETLINK_KOBJECT_UEVENT),通用 netlinkNETLINK_GENERIC

簡單記錄下netlink編程,以後使用時詳細規劃,年齡大,腦子不好使了。

static DEFINE_MUTEX(netlink_user_cfg_mutex);

static struct sock *netlink_user;

struct user_obj {
   int attribute;
   int (*command1)(struct sk_buff *, struct nlmsghdr *, struct nlattr **);
   int (*command2)(struct sk_buff *, struct nlmsghdr *);
}user_ob[] = {
       [0] = { .attribute = 1,.command1 = user_command1,.command2 = user_command2},
       [1} = { .attribute = 2,.command1 = user_command1,.command2 = user_command2},
       [2} = { .attribute = 3,.command1 = user_command1,.command2 = user_command2},
};

int user_command1(struct sk_buff* skb,struct nlmsghdr nlmsg,struct nlattr **nlattr)
{
   return nlmsg_unicast();
}
int user_command2(struct sk_buff* skb,struct nlmsghdr nlmsg)
{
   return 0;
}


int netlink_user_rcv_msg(struct sk_buff *skb,struct nlmsghdr *nlh)
{
   int type;
   struct user_obj *user;
   type = nlh->nlmsg_type;
   user = &user_ob[type];
   return user->command2(skb, nlh);




}
static void netlink_user_input(struct sk_buff *skb)
{
   //多個進程都是訪問,異步,lock
   mutex_lock(&netlink_user_cfg_mutex);
   netlink_rcv_skb(skb, &netlink_user_rcv_msg);
   mutex_unlock(&netlink_user_cfg_mutex);

}
struct netlink_kernel_cfg netlink_user_cfg={
   .input = netlink_user_input;
};

static int __init netlink_user_init(void)
{
   /*create netlink socket*/
   netlink_user = netlink_kernel_create(&init_net,NETLINK_USER,&netlink_user_cfg);
}

module_init(netlink_user_init);
module_exit(netlink_user_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("leefong chen <[email protected]>");
MODULE_DESCRIPTION("netlink userspace configuration API");


#define netlink_command1 1
static int skfd;

int main(int argc,char *argv[])
{
   struct sockaddr_nl local;
   struct nlmsghdr hdr;

   memset(&local, 0, sizeof(local));
   local.nl_family = AF_NETLINK;
   local.nl_pid = getpid();
   local.nl_groups = 0;

   hdr.nlmsg_len = NLMSG_LENGTH(0);
   hdr.nlmsg_flags = 0;
   hdr.nlmsg_type = netlink_command1;
   hdr.nlmsg_pid = local.nl_pid;
   skfd = socket(PF_NETLINK, SOCK_RAW, NETLINK_GENERIC);
   bind(skfd, (struct sockaddr*)&local, sizeof(local));
   sendto(skfd,&hdr,hdr.nlmsg_len,0,NULL,0);
   while(1) {
       
          recvfrom(skfd,)
         
       }
   return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章