Linux认证辅导:Linux内核中流量控制(5)Linux认证考试
文章作者 100test 发表时间 2009:11:11 16:18:32
来源 100Test.Com百考试题网
//返回指定类别的Qdisc叶节点
static struct Qdisc *qdisc_leaf(struct Qdisc *p, u32 classid)
{
unsigned long cl.
struct Qdisc *leaf.
// Qdisc类别操作
struct Qdisc_class_ops *cops = p->.ops->.cl_ops.
if (cops == NULL)
return NULL.
//获取指定classid类型的类别句柄
cl = cops->.get(p, classid).
if (cl == 0)
return NULL.
//调用类别操作结构的left成员函数获取叶Qdisc节点
leaf = cops->.leaf(p, cl).
cops->.put(p, cl).
return leaf.
}
/* Graft qdisc "new" to class "classid" of qdisc "parent" or
to device "dev". Old qdisc is not destroyed but returned in *old.
*/
// "嫁接"Qdisc, 将新的Qdisc节点添加到父节点作为叶节点static int qdisc_graft(struct net_device *dev, struct Qdisc *parent, u32 classid, struct Qdisc *new, struct Qdisc **old)
{
int err = 0.
struct Qdisc *q = *old.
if (parent == NULL) {
// 父qdisc节点为空, 将新节点作为dev的基本qdisc, 返回dev原来的老的qdisc
if (q &.&. q->.flags&.TCQ_F_INGRESS) {
*old = dev_graft_qdisc(dev, q).
} else {
*old = dev_graft_qdisc(dev, new).
}
} else {
//父qdisc非空情况
//将使用Qdisc类操作结构中的相关成员函数来完成操作
struct Qdisc_class_ops *cops = parent->.ops->.cl_ops.
err = -EINVAL.
if (cops) {
//获取类别句柄值
unsigned long cl = cops->.get(parent, classid).
if (cl) {
// 类别有效, 调用graft成员函数将新节点插入qdisc树中err = cops->.graft(parent, cl, new, old).
if (new)
new->.parent = classid.
cops->.put(parent, cl).
}
}
}
return err.
}