91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vpp的feature

發布時間:2020-05-24 00:52:50 來源:網絡 閱讀:2011 作者:騎個龍凍墻 欄目:編程語言


初始化

初始化有兩步,先使用宏初始化內存然后再使用函數添加

  • 1.使用宏

1.1 先初始化arc

arc就是一串有序的feature的集合

VNET_FEATURE_ARC_INIT (device_input, static) =
{
  .arc_name  = "device-input",
  .start_nodes = VNET_FEATURES ("device-input"),
  .arc_index_ptr = &feature_main.device_input_feature_arc_index,
};

1.2 再初始化這個arc下的feature,通過.runs_before來控制feature的先后關系,當然也有runs_after

VNET_FEATURE_INIT (worker_handoff, static) = {
  .arc_name = "device-input",
  .node_name = "worker-handoff",
  .runs_before = VNET_FEATURES ("ethernet-input"),
};

VNET_FEATURE_INIT (span_input, static) = {
  .arc_name = "device-input",
  .node_name = "span-input",
  .runs_before = VNET_FEATURES ("ethernet-input"),
};

VNET_FEATURE_INIT (ethernet_input, static) = {
  .arc_name = "device-input",
  .node_name = "ethernet-input",
  .runs_before = 0, /* not before any other features */};

把這些node都掛在對應的構造函數上,在初始化的時候就會調用。然后初始化相應的配置,也就是vnet_feature_arc_init 這個函數,會根據之前的配置,將各feature的先后關系排列好。此時只是排列好順序,并未插入feature_arc中,也就是不會被調用到。

  • 2.使用函數add/del

調用vnet_feature_enable_disable即可,此時才是將要用到的feature真正的插入feature_arc中。

具體的實現是 vnet_config_add_feature() vnet_config_del_feature() 這兩個個函數跟之前版本的feature沒有什么區別了。

使用

按照老版本的思想,feature至少分為兩種,接口的feature和其他的feature

  • 節點feature的使用

    在node的處理函數里調用vnet_feature_arc_start就好了。
    通過命令show features可以看到成功加載的feature。

  • 接口feature的使用

    接口的feature與之前的版本不一樣,是移至ip4-rewrite中進行接口feature的跳轉。
    通過命令show interface features xxx,可以看到接口的feature。

    初始化會有一點變化,說一下區別

    1.初始化

    代碼里并沒有ip4-output這個節點,它只是一個arc_name。它的起始結點是使用.start_nodes掛上的兩個。也就是ip4-rewrite與ip4-midchain。 在ip4-rewrite里跳轉的feature

    此處多說一句,"ip4-rewrite", "ip4-midchain"兩個節點(最終調用的一個函數ip4_rewrite_inline),都有name為ip4-output的feature arc。具體在vnet_feature_init中實現的。

    VNET_FEATURE_ARC_INIT (ip4_output, static) =
    {
      .arc_name = "ip4-output",
      .start_nodes = VNET_FEATURES ("ip4-rewrite", "ip4-midchain"),
      .arc_index_ptr = &ip4_main.lookup_main.output_feature_arc_index,
    };
    2.使用

    在函數ip4_rewrite_inline中

    ip4_rewrite_inline()
      {
          
      ......  
      
       if (PREDICT_TRUE (error0 == IP4_ERROR_NONE))
      {      p0->current_data -= rw_len0;
          p0->current_length += rw_len0;
          
          "從adj的rewrite取得sw_if_index"
          tx_sw_if_index0 = adj0[0].rewrite_header.sw_if_index;
      
          vnet_buffer (p0)->sw_if_index[VLIB_TX] = tx_sw_if_index0;
          next0 = adj0[0].rewrite_header.next_index;
      
          if (is_midchain)
          {
              adj0->sub_type.midchain.fixup_func (vm, adj0, p0);
          }  
          "若adj的VNET_REWRITE_HAS_FEATURES被置位,則跳轉到feature節點"
          if (PREDICT_FALSE
              (adj0[0].rewrite_header.flags & VNET_REWRITE_HAS_FEATURES))
      		vnet_feature_arc_start (lm->output_feature_arc_index,
      					tx_sw_if_index0, &next0, p0);
      
          }
          
      ......
      
      }


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

抚州市| 邻水| 时尚| 淳安县| 凌云县| 揭东县| 兰溪市| 陵川县| 库尔勒市| 内黄县| 张家川| 太仆寺旗| 伊通| 太仓市| 简阳市| 广西| 湘西| 鲁甸县| 吐鲁番市| SHOW| 隆德县| 浦县| 清丰县| 成都市| 宁远县| 枣庄市| 普兰店市| 阜新| 湘乡市| 五原县| 白朗县| 新郑市| 敦煌市| 东平县| 湟源县| 大埔县| 西乌| 新巴尔虎左旗| 大英县| 台东市| 崇明县|