Linux认证辅导:Linux内核中流量控制(2)Linux认证考试
文章作者 100test 发表时间 2009:11:11 16:18:35
来源 100Test.Com百考试题网
2.1.3 输入流控输入流控好象不是必须的,目前内核需要配置CONFIG_NET_CLS_ACT选项才起作用:/* net/core/dev.c */
int netif_receive_skb(struct sk_buff *skb)
{
......
#ifdef CONFIG_NET_CLS_ACT
if (pt_prev) {
ret = deliver_skb(skb, pt_prev, orig_dev).
pt_prev = NULL. /* noone else should process this after*/
} else {
skb->.tc_verd = SET_TC_OK2MUNGE(skb->.tc_verd).
}
ret = ing_filter(skb).
if (ret == TC_ACT_SHOT || (ret == TC_ACT_STOLEN)) {
kfree_skb(skb).
goto out.
}
skb->.tc_verd = 0.
ncls:
#endif
......
}
static int ing_filter(struct sk_buff *skb)
{
struct Qdisc *q.
struct net_device *dev = skb->.dev.
int result = TC_ACT_OK.
//如果网卡设备有输入流控处理
if (dev->.qdisc_ingress) {
__u32 ttl = (__u32) G_TC_RTTL(skb->.tc_verd).
if (MAX_RED_LOOP %
s)\n", skb->.input_dev->.name, skb->.dev->.name).
return TC_ACT_SHOT.
}
//设置数据包的TC参数
skb->.tc_verd = SET_TC_RTTL(skb->.tc_verd,ttl).
skb->.tc_verd = SET_TC_AT(skb->.tc_verd,AT_INGRESS).
spin_lock(&.dev->.ingress_lock).
if ((q = dev->.qdisc_ingress) != NULL)