3、 什么时候调用qdisc_create函数
在函数tc_modify_qdisc中,会调用qdisc_create函数,而tc_modify_qdisc这个函数在pktsched_init(void)中,被注册到系统中
CODE
static int __init pktsched_init(void) { int err;
err = register_pernet_subsys(&psched_net_ops); if (err) { printk(KERN_ERR "pktsched_init: " "cannot initialize per netns operations/n"); return err; } /* *在系统默认的情况下, 系统内只注册了pfif0,bfifo,mq_qdisc,pfifl_head_drop *这几种qdisc */ register_qdisc(&pfifo_qdisc_ops); register_qdisc(&bfifo_qdisc_ops); register_qdisc(&pfifo_head_drop_qdisc_ops); register_qdisc(&mq_qdisc_ops);
rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL); rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL); rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc); rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL); rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL); rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass);
return 0; } |
下面看看rtnl_register函数具体做了哪些事情.