msn: [email protected]
5.9 ingress
ingress流控方法是針對輸入資料進行流控處理的,在net/sched/sch_ingress.c中定義, 使用時要求在核心配置中定義config_net_cls_act或config_netfilter,不過從**實現看起來好象沒什麼意義。
5.9.1 ingress操作結構定義
// ingress私有資料結構
struct ingress_qdisc_data ;
// ingress流控操作結構
static struct qdisc_ops ingress_qdisc_ops = ;
// ingress類別操作結構
static struct qdisc_class_ops ingress_class_ops = ;
5.9.1 ingress的netfilter節點
// 沒定義net_cls_act, 而定義了netfilter的情況下才有效, 在netfilter節點中進行
// 資料報是否接收的判斷
// 但如果定義了net_cls_act後, 該段**無效
#ifndef config_net_cls_act
#ifdef config_netfilter
/* after ipt_filter */
static struct nf_hook_ops ing_ops = ;
static struct nf_hook_ops ing6_ops = ;
static unsigned int
ing_hook(unsigned int hook, struct sk_buff **pskb,
const struct net_device *indev,
const struct net_device *outdev,
int (*okfn)(struct sk_buff *))
// 如果沒定義, 就直接返回預設動作: 通過
return fwres;
}#endif
#endif
5.9.3 初始化
static int ingress_init(struct qdisc *sch,struct rtattr *opt)
// 非0表示已經登記了
nf_registered++;
// 登記ipv4鉤子節點
if (nf_register_hook(&ing6_ops) < 0) else
nf_registered++;
}#endif
#endif
dprintk("ingress_init(sch %p,[qdisc %p],opt %p)\n",sch,p,opt);
// 初始內部流控初始化為noop, 丟包的
p->q = &noop_qdisc;
return 0;
}5.9.5 入隊
sstatic int ingress_enqueue(struct sk_buff *skb,struct qdisc *sch)
;/* backward compat */
#else
// 在沒有定義了net_cls_act的情況, 這時存在netfilter節點, 返回nf_*結果
#ifdef config_net_cls_police
// 在定義了net_cls_police的情況
switch (result) ;
#else
// 那兩個net_cls選項都沒定義的話直接accept
d2printk("overriding result to accept\n");
result = nf_accept;
sch->bstats.packets++;
sch->bstats.bytes += skb->len;
#endif
#endif
return result;
}5.9.6 重入隊
空函式static int ingress_requeue(struct sk_buff *skb,struct qdisc *sch)
5.9.7 出隊
// 空函式,因為不會有真正的dequeue操作
static struct sk_buff *ingress_dequeue(struct qdisc *sch)
5.9.8 丟包
// 基本也是空函式
static unsigned int ingress_drop(struct qdisc *sch)
5.9.9 復位
sstatic void ingress_reset(struct qdisc *sch)
5.9.10 釋放
static void ingress_destroy(struct qdisc *sch)
#if 0
/* for future use */
qdisc_destroy(p->q);
#endif
}5.9.11 輸出引數
static int ingress_dump(struct qdisc *sch, struct sk_buff *skb)
5.9.13 ingress類別操作
// 嫁接, 增加葉子節點
// 基本是空函式, 恆返回1
static int ingress_graft(struct qdisc *sch,unsigned long arg,
struct qdisc *new,struct qdisc **old)
// 葉子, 空函式
static struct qdisc *ingress_leaf(struct qdisc *sch, unsigned long arg)
// 計數增加, 使用類別id計算
static unsigned long ingress_get(struct qdisc *sch,u32 classid)
// 繫結tc過濾規則表
static unsigned long ingress_bind_filter(struct qdisc *sch,
unsigned long parent, u32 classid)
// 計數減少, 空函式
static void ingress_put(struct qdisc *sch, unsigned long cl)
// 空函式
static int ingress_change(struct qdisc *sch, u32 classid, u32 parent,
struct rtattr **tca, unsigned long *arg)
// 遍歷, 空函式
static void ingress_walk(struct qdisc *sch,struct qdisc_walker *walker)
// 獲取tc過濾規則表
static struct tcf_proto **ingress_find_tcf(struct qdisc *sch,unsigned long cl)
...... 待續 ......
Linux核心中流量控制 5
嚴禁用於任何商業用途。msn yfydz no1 hotmail.com 5.5 sfq stochastic fairness queueing discipline sfq演算法是個比較簡單的演算法,速度也比較快,演算法維護一定數量的資料報佇列,入隊是將資料報進 行雜湊後插入某佇列,出隊則是輪詢...
Linux核心中流量控制 15
msn yfydz no1 hotmail.com 5.15.qdisc的netlink控制 各網絡卡的qdisc的使用者層操作控制是通過rtnetlink介面實現使用者空間和核心之間的通訊的 rtnetlink link,rtnetlink是專門針對路由控制的netlink介面.include l...
置頂 Linux 流量控制
在如今的網路界,也許tc知道的人並不多了,這篇文章做留戀吧。以前研究tc時記錄下的講解與配置檔案。tc filter add dev eth0 parent 1 0 protocol ip prio 4 handle 4 fw classid 1 14 tc filter add dev eth0 ...