Chinaunix首页 | 论坛 | 博客
  • 博客访问: 411485
  • 博文数量: 96
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 415
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-22 09:08
个人简介

最近的研究方向:Nginx

文章分类
文章存档

2017年(2)

2016年(59)

2015年(35)

我的朋友

分类: LINUX

2016-08-21 11:08:25

原文地址:http://blog.csdn.net/sealyao/article/details/4628141

最近用了一下netlink,比较方便。特将netlink编程中的注意事项列下:

    1、选一个没有用到的协议类型,注意要避开netlink.h中已经定义好的类型。注意保证内核层和用户层的协议类类型的一致。也就是说内核层创建netlink函数netlink_kernel_create的第一个参数和用户层创建socket的socket函数的第三个参数要一致。否则是不能建立连接的。

    2、版本问题。如果你在网上搜到一个帖子说netlink代码保证可用,你满心欢喜把代码贴到自己机器上,八成是不能用。因为netlink在linux2.6.XX的版本中变化的太快了。在内核态,大致有这么几个地方会随着版本的变化而变化: a)netlink_kernel_create函数的原型;b)nlmsg_put/NLMSG_PUT的原型。

    贴一下我的代码,估计也不是很全面:

a) netlink_kernel_create函数的原型:

点击(此处)折叠或打开

  1. #if LINUX_VERSION_CODE >= 0x020618
  2. fspwfd = netlink_kernel_create(&init_net,NETLINK_TYPE, 0, yourHandler, NULL,THIS_MODULE); //init_net是一个内核变量
  3. #elif LINUX_VERSION_CODE >= 0x020616
  4. fspwfd = netlink_kernel_create(NETLINK_TYPE, 0, yourHandler, NULL,THIS_MODULE);
  5. #elif LINUX_VERSION_CODE >= 0x020610
  6. fspwfd = netlink_kernel_create(NETLINK_TYPE, 0, yourHandler,THIS_MODULE);
  7. #else
  8. fspwfd = netlink_kernel_create(NETLINK_TYPE, yourHandler);
  9. #endif

b)内核像应用层单播时:

点击(此处)折叠或打开

  1. #if LINUX_VERSION_CODE >=0x020616
  2.  nlhdr = nlmsg_put(skb,0,0,0,(NLMSG_SPACE(1024)-sizeof(struct nlmsghdr)),0);
  3. #else
  4.  nlhdr = NLMSG_PUT(skb,0,0,0,(NLMSG_SPACE(1024)-sizeof(struct nlmsghdr)));
  5. #endif
  6.  
  7. //当内核版本小于0x020616时,还需要做一个出错时的跳转标签
  8. #if LINUX_VERSION_CODE < 0x020616
  9. nlmsg_failure:
  10. #endif


 

C)yourHandler的原型:

点击(此处)折叠或打开

  1. #if LINUX_VERSION_CODE >= 0x02061B:
  2. Handle原型为:
  3. void handler(struct sk_buff *__skb)
  4. 通过skb = skb_get(__skb);得到实际数据
  5. #else:
  6. yourHandler原型为:
  7. void handler (struct sock *sk, int len)
  8. 通过skb = skb_dequeue(&sk->sk_receive_queue)得到实际数据。
  9. #endif


     3、NLMSG_DATA(nlhdr)内存空间是交给socket来处理的。

     4、一个进程中多个线程使用netlink。此时用进程id无法唯一的确定一个netlink通信。需要把表示号设为pthread_self() << 16 | getpid();

     祝你好运~~~

阅读(1737) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~