Linux核心中流量控制 9

2021-08-31 05:06:10 字數 3580 閱讀 3901

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 ...