免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3505 | 回复: 12
打印 上一主题 下一主题

linux kernelspace route 操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-21 11:58 |只看该作者 |正序浏览
做过linux userspace程序的的朋友对路由的操作基本有很多种方式,如:rtnetlink,ioctl,等控制,可以读出所有或部分指定路由表信息,删除或增加路由表信息。

但,在linux kernelspace中,内核中要实现对路由表读取,删除或增加等操作。哪些方式的api接口提供调用呀?
请 大虾 指点

难道 ,只能手动对struct fib_table 结构操作才可以吗?

论坛徽章:
0
13 [报告]
发表于 2009-10-29 14:25 |只看该作者
一般,我们在用户态对路由操作无外乎就是使用到ioctl,netlink,/proc的相关操作。
但在内核态实现对内核路由的操作,ioctl可以实现对路由的删除和增加功能,但没有实现对路由表的查询功能,现在着手研究内核态netlink的路由查询功能,但涉及到netlink_kernel_create()接口的使用,不太好入手。

一般,用户态使用netlink访问内核态路由查询时调用了netlink_kernel_create()接口函数,但,现在我想实现,直接在内核态调用netlink_kernel_create()接口查询路由,是否可以实现??

高手请帮忙给点思路!

论坛徽章:
0
12 [报告]
发表于 2009-10-26 17:32 |只看该作者
现在 分析了大半天 ,最终还是要理解:

struct fib_table * __init fib_hash_init(int id)
{
        struct fib_table *tb;

        if (fn_hash_kmem == NULL)
                fn_hash_kmem = kmem_cache_create("ip_fib_hash",
                                                 sizeof(struct fib_node),
                                                 0, SLAB_HWCACHE_ALIGN,
                                                 NULL, NULL);

        if (fn_alias_kmem == NULL)
                fn_alias_kmem = kmem_cache_create("ip_fib_alias",
                                                  sizeof(struct fib_alias),
                                                  0, SLAB_HWCACHE_ALIGN,
                                                  NULL, NULL);

        tb = kmalloc(sizeof(struct fib_table) + sizeof(struct fn_hash),
                     GFP_KERNEL);
        if (tb == NULL)
                return NULL;

        tb->tb_id = id;
        tb->tb_lookup = fn_hash_lookup;
        tb->tb_insert = fn_hash_insert;
        tb->tb_delete = fn_hash_delete;
        tb->tb_flush = fn_hash_flush;
        tb->tb_select_default = fn_hash_select_default;
        tb->tb_dump = fn_hash_dump;
        memset(tb->tb_data, 0, sizeof(struct fn_hash));
        return tb;
}
这个kernel 的api一些回调函数的使用。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
11 [报告]
发表于 2009-10-26 11:02 |只看该作者
原帖由 meijusan123 于 2009-10-26 10:19 发表
或是,有没内核中,还有直接可以使用的内核api直接调用,去操作路由表信息,但达到删除,添加,查询的效果。

呵呵,路由方面的开发做的不多。。

看看其他朋友有什么好的方法

论坛徽章:
0
10 [报告]
发表于 2009-10-26 10:19 |只看该作者
或是,有没内核中,还有直接可以使用的内核api直接调用,去操作路由表信息,但达到删除,添加,查询的效果。

论坛徽章:
0
9 [报告]
发表于 2009-10-26 10:18 |只看该作者
原帖由 Godbach 于 2009-10-26 10:02 发表

你指的是原有内核版本中没有导出吧,可以自己导出啊


自己手动导出,就需修改本来的内核文件,重新编译kernel了。
目前,我这功能是在linux的pc上运行的。不能给用户的客户机上重编译kernel的。

有没别的办法整!!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2009-10-26 10:02 |只看该作者
2.6.15版本kernel还是可以使用ip_rt_ioctl()操作路由表的,但现在2.6.18版本kernel就无法符号导出了。咋整???

你指的是原有内核版本中没有导出吧,可以自己导出啊

论坛徽章:
0
7 [报告]
发表于 2009-10-26 09:29 |只看该作者
原帖由 godbach 于 2009-10-23 14:25 发表
内核代码ipt_REJECT.c中有一个send_reset函数,里面涉及到路由的修改,LZ可以参考一下


版主的意思,我知道。
你所说的这段代码是用于内核协议栈的重新路由,以前我用过。

但,我现在要实现的东西部室重新路由那么复杂的过程,只要对路由表的删除,增加,查询操作。只是想让在用户层实现的东西,放到内核中实现。现在是找到了接口,但是出现了符号导出问题,内核资源被限制,无法使用。

2.6.15版本kernel还是可以使用ip_rt_ioctl()操作路由表的,但现在2.6.18版本kernel就无法符号导出了。咋整???

论坛徽章:
0
6 [报告]
发表于 2009-10-26 09:25 |只看该作者

回复 #4 zdwxck 的帖子

头文件,或extern都用了。但没用。

现在的问题是,内核编程时,内核是一个完整的镜像文件,相当于一个大的模块体结合,如果要把自身的方法或变量让外面使用,必须符号导出才可以,一般的加头文件,extern没用。毕竟,这不是用户层程序开发。

就相当于内核模块与模块之间的资源共享一样,只有符号导出才可调用,不然,没办法!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2009-10-23 14:25 |只看该作者
内核代码ipt_REJECT.c中有一个send_reset函数,里面涉及到路由的修改,LZ可以参考一下
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP