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)