Zebra命令模式分析 一 分析

2022-05-18 07:25:47 字數 1906 閱讀 9843

zebra分析版本:zebra-0.95a

命令儲存結構

對於上圖中略去的cmd_elemnt,它代表了一條命令,具體展開如下:

每條命令按上圖儲存,命令被分拆為tokens,儲存在vector中

如此,形成了zebra命令模式的基本框架:所有命令被分類到不同模式下。這裡的模式即上面圖中的

節點cmd_node,而命令則相當於cmd_element,可見,命令被放到了不同的node下。注意,上圖中的虛

箭頭並不代表鍊錶,只是代表元素的先後順序,實際上它們是以陣列儲存的。

zebra中命令的總結點(或根結點)是cmdvec,它包含了所有的cmd_node,而cmd_node包含了所有

的cmd_element。

初始化時首先載入所有的命令,形成上圖中的整體層次結構,然後對每個cmd_node下的命令執

行qsort,按命令的字元序重排,主要是為了查詢加速。

命令分析

命令的執行只要查詢cmdvec就可以了,下面著重於zebra命令的tab自動補齊,及列印所有可用命令

接收tab鍵,自動補齊命令,執行函式: vty_complete_command()

zebra的呼叫結構:

整個流程的主體是cmd_complete_command(),它呼叫了cmd_filter_by_completion()匹配已輸入字元     串,返回匹配結果,結果分為   了10種

no_match

extend_match

ipv4_prefix_match

ipv4_match

ipv6_prefix_match

ipv6_match

range_match

vararg_match

partly_match

exact_match

大部分是zebra支援的變數的匹配型別,partly_match表示只是部分匹配,exact_match表示乙個 

token的完全匹配,no_match表示不   匹配,這三個狀態是我們所關心的。

例子:      輸入』configure』,輸入tab補齊,返回』configure(空格)』

輸入』configure(空格)』,輸入tab補齊,返回』configure(空格)terminal』

輸入』c』,輸入tab補齊,返回』co』

輸入』terminal(空格)』,輸入tab補齊,返回』terminal(空格)』 『length         monitor    no』

上面就是補齊的基本情況了(為了標註空格,上面的空格都以中文寫出)

1. 對於輸入的命令字串分拆成token後儲存為vector,程式中則是(以』configure ter』為例):

2. 假設vline有n個token,則對於vline的前n-1個token與每個命令的對應token比較,如果不是        exact_match,則返回

3. 對於vline的第n個token,匹配每個命令的第n個token前幾位是否為』ter』,並記錄下

所有匹配的token,生成匹配向量matchvec:

4. 結果回送給終端,在輸出完匹配結果後,再輸出乙個空格,即上例的實際輸出結果為:

『configure terminal 』(注意:最後多了個空格)

空格的作用:補上空格的意義在於,如果檢測輸入命令的最後乙個字元是空格,則在命令向

量vline最後補上』/0』,如輸入』configure 』,則生成vline如下圖:

在匹配vline的第二個token時,由於是空字元,所以它與所有的字元都相匹配,達到自動補齊下                   乙個可選token的作用 

接收?,顯示所有命令,執行函式: vty_describe_command()

不分析就得不到字段列表。一分析有感覺陷入分析的細節

一般般 276 855 11 09 52 我現在有個疑惑,就是字段列表中的資訊 屬性怎麼來,感覺不分析,就得不到字段列表。一分析有感覺陷入分析的細節,和介面混在一起了。潘加宇 3504847 11 15 18 乙個用例,該輸入什麼,輸出什麼,這是首先要和涉眾調研清楚的。例如 取款,輸入的是賬號,密碼...

需求分析 5 分析流程

1 小型流程 需求工作項 提交的文件 所處需求層次 業務目標 目標列表 業務需求 繪製用例圖 需求規約 或 用例模型 使用者需求 編寫用例規約 行為需求 2 中型流程 需求工作項 提交的文件 所處需求層次 業務目標 願景文件 業務需求 範圍 feature 上下文圖 繪製用例圖 需求規約 或 用例模...

1042 字元統計 20分 測試點一分析

測試點一分析 只有乙個字母,所以maxen初始要設定成最大的字母即是 z 不要設成第乙個字元,因為很有可能第乙個字元不是字母 測試點一 只有乙個字母,所以maxen初始要設定成最大的字母即是 z 不要設成第乙個字元,因為很有可能第乙個字元不是字母 include intmain gets str i...