Chinaunix

标题: linux network rtnetlink_links[xx] 问题? [打印本页]

作者: AIXHP    时间: 2007-05-17 13:59
标题: linux network rtnetlink_links[xx] 问题?
谁能将inux network  rtnetlink_links[xx]的用途详细阐述一下?
作者: qtdszws    时间: 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
};
作者: AIXHP    时间: 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包含了多组两个函数指针----如此超过了每个具体协议的边界,如何解释?
作者: qtdszws    时间: 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 编辑 ]
作者: AIXHP    时间: 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 编辑 ]
作者: qtdszws    时间: 2007-05-18 15:42
协议之间没有任何关系,没有规定数组的长度必须一致
作者: AIXHP    时间: 2007-05-21 08:53
原帖由 qtdszws 于 2007-5-18 15:42 发表于 6楼  
协议之间没有任何关系,没有规定数组的长度必须一致

xxx_rtnetlink_table是不同的.以为是公用的.你讲的很对!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2