netlink编程注意事项

    最近用了一下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函数的原型:

 //init_net是一个内核变量

#if LINUX_VERSION_CODE >= 0x020618

 

fspwfd = netlink_kernel_create(&init_net,NETLINK_TYPE, 0, yourHandler, NULL,THIS_MODULE);

 

 

#elif LINUX_VERSION_CODE >= 0x020616
fspwfd = netlink_kernel_create(NETLINK_TYPE, 0, yourHandler, NULL,THIS_MODULE);

#elif LINUX_VERSION_CODE >= 0x020610
fspwfd = netlink_kernel_create(NETLINK_TYPE, 0, yourHandler,THIS_MODULE);

#else
fspwfd = netlink_kernel_create(NETLINK_TYPE, yourHandler);

 

#endif

 

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

#if LINUX_VERSION_CODE >=0x020616
 nlhdr = nlmsg_put(skb,0,0,0,(NLMSG_SPACE(1024)-sizeof(struct nlmsghdr)),0);
#else
 nlhdr = NLMSG_PUT(skb,0,0,0,(NLMSG_SPACE(1024)-sizeof(struct nlmsghdr)));
#endif

 

//当内核版本小于0x020616时,还需要做一个出错时的跳转标签

#if LINUX_VERSION_CODE < 0x020616

nlmsg_failure:

#endif

 

C)yourHandler的原型:

 

#if LINUX_VERSION_CODE >= 0x02061B

Handle原型为:

void handler(struct sk_buff *__skb)

通过skb = skb_get(__skb);得到实际数据

#else

yourHandler原型为:

void handler (struct sock *sk, int len)

通过skb = skb_dequeue(&sk->sk_receive_queue)得到实际数据。

#endif

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

     

 

 

 

 

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

 

 

     祝你好运~~~

 

 

       

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值