免费注册 查看新帖 |

Chinaunix

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

linux network rtnetlink_links[xx] 问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-17 13:59 |只看该作者 |倒序浏览
谁能将inux network  rtnetlink_links[xx]的用途详细阐述一下?

论坛徽章:
0
2 [报告]
发表于 2007-05-17 17:31 |只看该作者
用于每个具体协议注册到netlink中的钩子,用户通过netlink协议通过该钩子和具体协议通讯。例如ip工具就是这么做的。

rtnetlink_links[PF_INET] = inet_rtnetlink_table;

static struct rtnetlink_link inet_rtnetlink_table[RTM_MAX-RTM_BASE+1] =
{
        { NULL,                        NULL,                        },
        { NULL,                        NULL,                        },
        { NULL,                        NULL,                        },
        { NULL,                        NULL,                        },

        { inet_rtm_newaddr,        NULL,                        },
        { inet_rtm_deladdr,        NULL,                        },
        { NULL,                        inet_dump_ifaddr,        },
        { NULL,                        NULL,                        },

        { inet_rtm_newroute,        NULL,                        },
        { inet_rtm_delroute,        NULL,                        },
        { inet_rtm_getroute,        inet_dump_fib,                },
        { NULL,                        NULL,                        },

        { NULL,                        NULL,                        },
        { NULL,                        NULL,                        },
        { NULL,                        NULL,                        },
        { NULL,                        NULL,                        },

#ifdef CONFIG_IP_MULTIPLE_TABLES
        { inet_rtm_newrule,        NULL,                        },
        { inet_rtm_delrule,        NULL,                        },
        { NULL,                        inet_dump_rules,        },
        { NULL,                        NULL,                        },
#else
        { NULL,                        NULL,                        },
        { NULL,                        NULL,                        },
        { NULL,                        NULL,                        },
        { NULL,                        NULL,                        },
#endif
};

论坛徽章:
0
3 [报告]
发表于 2007-05-18 13:30 |只看该作者
原帖由 qtdszws 于 2007-5-17 17:31 发表于 2楼  
用于每个具体协议注册到netlink中的钩子,用户通过netlink协议通过该钩子和具体协议通讯。例如ip工具就是这么做的。

rtnetlink_links = inet_rtnetlink_table;

static struct rtnetlink_link inet_rtnetli ...

rtnetlink_links是如此定义的: rtnetlink_link * rtnetlink_links[NPROTO]; rtnetlink_link 结构为两个int 型函数指针,也就是说对
rtnetlink_links[PF_INET]应是两个int 型函数指针-----假如它是"用于每个具体协议注册到netlink中的钩子",但你列举的初始化inet_rtnetlink_table包含了多组两个函数指针----如此超过了每个具体协议的边界,如何解释?

论坛徽章:
0
4 [报告]
发表于 2007-05-18 13:45 |只看该作者
rtnetlink_link * rtnetlink_links[NPROTO];
rtnetlink_links是一个指向一个rtnetlink_link的二维指针

struct rtnetlink_link
{
int (*doit)(struct sk_buff *, struct nlmsghdr*, void *attr);
int (*dumpit)(struct sk_buff *, struct netlink_callback *cb);
};

指针可以被理解成数组,即rtnetlink_links[PF_INET]指向一个rtnetlink_link数组

>>如此超过了每个具体协议的边界
怎么会呢,一个协议一个指针,每一个指针指向自己的rtnetlink_link数组

纠正一下:
每个具体协议注册自己的处理函数到rtnetlink中,而内核会创建一个netlink监听套接字,
rtnl = netlink_kernel_create(NETLINK_ROUTE, rtnetlink_rcv);
用户使用netlink协议通过该套接字和内核通讯,而该套接字又通过rtnetlink钩子和具体协议通讯,这就可以操作协议相关内容了

该套接字主要是操纵路由,地址和流量等

[ 本帖最后由 qtdszws 于 2007-5-18 13:53 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-05-18 14:46 |只看该作者
感谢! 看来我将结构指针与指针结构搞混了, 你讲的是对的------就说看到这里有问题. 每一个指针初始化时指向定义的rtnetlink_link类型的对象.
但初始化使用inet_rtnetlink_table[RTM_MAX-RTM_BASE+1] 的理由-------既然每种协议使用独立的rtnetlink_link类型的对象,为何要采用如此复杂的形式,除非又将所有的各种协议的指针归并为inet_rtnetlink_table[], 这就要求每种协议初始化自己的inet_rtnetlink_table后修改RTM_MAX与RTM_BASE或指定好它们的偏移量,是否如此?

[ 本帖最后由 AIXHP 于 2007-5-18 14:58 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-05-18 15:42 |只看该作者
协议之间没有任何关系,没有规定数组的长度必须一致

论坛徽章:
0
7 [报告]
发表于 2007-05-21 08:53 |只看该作者
原帖由 qtdszws 于 2007-5-18 15:42 发表于 6楼  
协议之间没有任何关系,没有规定数组的长度必须一致

xxx_rtnetlink_table是不同的.以为是公用的.你讲的很对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP