14.LPM庫
DPDK LPM庫組件實現了32位Key的最長前綴匹配(LPM)表搜索方法,該方法通常用于在IP轉發應用程序中找到最佳路由。
14.1.LPM API概述
LPM組件實例的主要配置參數是要支持的最大數量的規則。LPM前綴由一對參數(32位Key,深度)表示,深度范圍為1到32。LPM規則由LPM前綴和與前綴相關聯的一些用戶數據表示。該前綴作為LPM規則的唯一標識符。在該實現中,用戶數據為1字節長,被稱為下一跳,與其在路由表條目中存儲下一跳的ID的主要用途相關。
LPM組件導出的主要方法有:
- 添加LPM規則:LPM規則作為輸入參數。如果表中沒有存在相同前綴的規則,則將新規則添加到LPM表中。如果表中已經存在具有相同前綴的規則,則會更新規則的下一跳。當沒有可用的規則空間時,返回錯誤。
- 刪除LPM規則:LPM規則的前綴作為輸入參數。如果具有指定前綴的規則存在于LPM表中,則會被刪除。
- LPM規則查找:32位Key作為輸入參數。該算法用于選擇給定Key的最佳匹配的LPM規則,并返回該規則的下一跳。在LPM表中具有多個相同32位Key的規則的情況下,算法將最高深度的規則選為最佳匹配規則(最長前綴匹配),這意味著該規則Key和輸入的Key之間具有最高有效位的匹配。
14.2.實現細節
目前的實現使用DIR-24-8算法的變體,可以改善內存使用量,以提高LPM查找速度。該算法允許以典型的單個存儲器讀訪問來執行查找操作。在統計上看,即便是不常出現的情況,當即最佳匹配規則的深度大于24時,查找操作也僅需要兩次內存讀取訪問。因此,特定存儲器位置是否存在于處理器高速緩存中將很大程度上影響LPM查找操作的性能。
主要數據結構使用以下元素構建:
- 一個2^24個條目的表。
- 多個表(RTE_LPM_TBL8_NUM_GROUPS),每個表有2 ^ 8個條目。
第一個表,稱為tbl24,使用要查找的IP地址的前24位進行索引;而第二個表,稱為tbl8使用IP地址的最后8位進行索引。這意味著根據輸入數據包的IP地址與存儲在tbl24中的規則進行匹配的結果,我們可能需要在第二級繼續查找過程。
由于tbl24的每個條目都可以指向tbl8,理想情況下,我們將具有2 ^ 24 tbl8,這與具有2 ^ 32個條目的單個表占用空間相同。因為資源限制,這顯然是不可行的。相反,這種組織方法就是利用了超過24位的規則是非常罕見的這一特定。通過將這個過程分為兩個不同的表/級別并限制tbl8的數量,我們可以大大降低內存消耗,同時保持非常好的查找速度(大部分時間僅一個內存訪問)。
tbl24中的條目包含以下字段:
- 下一跳,或者下一級查找表tbl8的索引值。
- 有效標志。
- 外部條目標志。
- 規則深度。
第一個字段可以包含指示查找過程應該繼續的tbl8的數字,或者如果已經找到最長的前綴匹配,則可以包含下一跳本身。兩個標志字段用于確定條目是否有效,以及搜索過程是否分別完成。規則的深度或長度是存儲在特定條目中的規則的位數。
tbl8中的條目包含以下字段:
- 下一跳。
- 有效標志。
- 有效組。
- 深度。
下一跳和深度包含與tbl24中相同的信息。兩個標志字段顯示條目和表分別是否有效。
其他主要數據結構是包含有關規則(IP和下一跳)的主要信息的表。這是一個更高級別的表,用于不同的東西:
- 在添加或刪除之前,檢查規則是否已經存在,而無需實際執行查找。
- 刪除時,檢查是否存在包含要刪除的規則。這很重要,因為主數據結構必須相應更新。
14.2.1.添加
添加規則時,存在不同的可能性。如果規則的深度恰好是24位,那么:
- 使用規則(IP地址)作為tbl24的索引。
- 如果條目無效(即它不包含規則),則將其下一跳設置為其值,將有效標志設置為1(表示此條目正在使用中),并將外部條目標志設置為0(表示查找 此過程結束,因為這是匹配的最長的前綴)。
如果規則的深度正好是32位,那么:
- 使用規則的前24位作為tbl24的索引。
- 如果條目無效(即它不包含規則),則查找一個空閑的tbl8,將該值的tbl8的索引設置為該值,將有效標志設置為1(表示此條目正在使用中),并將外部 條目標志為1(意味著查找過程必須繼續,因為規則尚未被完全探測)。
如果規則的深度是任何其他值,則必須執行前綴擴展。這意味著規則被復制到所有下一級條目(只要它們不被使用),這也將導致匹配。
作為一個簡單的例子,我們假設深度是20位。這意味著有可能導致匹配的IP地址的前24位的2 ^(24 - 20)= 16種不同的組合。因此,在這種情況下,我們將完全相同的條目復制到由這些組合索引的每個位置。
通過這樣做,我們確保在查找過程中,如果存在與IP地址匹配的規則,則可以在一個或兩個內存訪問中找到,具體取決于是否需要移動到下一個表。前綴擴展是該算法的關鍵之一,因為它通過添加冗余來顯著提高速度。
14.2.2.查詢
查找過程要簡單得多,速度更快。在這種情況下:
- 使用IP地址的前24位作為tbl24的索引。如果該條目未被使用,那么這意味著我們沒有匹配此IP的規則。如果它有效并且外部條目標志設置為0,則返回下一跳。
? 如果它是有效的并且外部條目標志被設置為1,那么我們使用tbl8索引來找出要檢查的tbl8,并且將該IP地址的最后8位作為該表的索引。類似地,如果條目未被使用,那么我們沒有與該IP地址匹配的規則。如果它有效,則返回下一跳。
14.2.3.規則數目的限制
規則數量受到諸多不同因素的限制。第一個是規則的最大數量,這是通過API傳遞的參數。一旦達到這個數字,就不可能再添加任何更多的規則到路由表,除非有一個或多個刪除。
第二個因素是算法的內在限制。如前所述,為了避免高內存消耗,tbl8的數量在編譯時間有限(此值默認為256)。如果我們耗盡tbl8,我們將無法再添加任何規則。特定路由表中需要多少路由表是很難提前確定的。
只要我們有一個深度大于24的新規則,并且該規則的前24位與先前添加的規則的前24位不同,就會消耗tbl8。如果相同,那么新規則將與前一個規則共享相同的tbl8,因為兩個規則之間的唯一區別是在最后一個字節內。
默認值為256情況下,我們最多可以有256個規則,長度超過24位,且前三個字節都不同。由于長度超過24位的路由不太可能,因此在大多數設置中不應該是一個問題。即便如此,tbl8的數量也可以通過設置更改。
14.3.用例:IPv4轉發
LPM算法用于實現IPv4轉發的路由器所使用的無類別域間路由(CIDR)策略。
14.4.參考
- RFC1519 Classless Inter-Domain Routing (CIDR): an Address Assignment and Aggregation Strategy,鏈接
- Pankaj Gupta, Algorithms for Routing Lookups and Packet Classification, PhD Thesis, Stanford University, 2000([鏈接](http://klamath.stanford.edu/~pankaj/thesis/ thesis_1sided.pdf))