Kỹ thuật tìm kiếm trên Tree Bitmap

Một phần của tài liệu Xây dựng firewall trên nền tảng FPGA (Trang 41)

Giả sử các tiền tố được đưa lên cây nhị phân quyết định như hình vẽ 2.6. Để dễ

dàng hình dung, ta mô tả thuật toán tìm kiếm khi có một dữ liệu về số hiệu cổng vào là:

Học viên: Trần Trường Phan    41 

Hình 2.5: Vắ d v cây quyết định

Việc tìm kiếm bắt đầu bằng việc đọc 4 bit đầu tiên (1 nible) của số hiệu cổng: (1000)2 = 8 với thông tin bitmap của node gốc.

Hình 2.6: Thông tin bitmap ca node gc

Nhìn từ hình vẽ ta thấy, giá trị 8 ứng với đầu ra thứ 8 của node gốc. Vị trắ này có node con, cũng ứng với bit thứ 8 tắnh từ phắa trái trong Extending Paths Bitmap bằng 1. Để chuyển việc tìm kiếm sang mức 2, ta cần lấy dữ liệu của node con này. Vì các node con được lưu trữ liên tiếp nhau nên việc xác định địa chỉ của nó được tắnh bằng

địa chỉ của node con đầu tiên cộng với chỉ số của node con này trong dãy. Căn cứ vào Extending Paths Bitmap, chỉ số của node con được tắnh bằng cách đếm số bit 1 từ phắa trái cho đến vị trắ thứ 8 = (1000)2. Thao tác đếm này được gọi là Count_Ones. Chỉ số

của node con này là 3.

Mức 1

Mức 2

Học viên: Trần Trường Phan    42 

Ở mức 2, Nilbe2 = (0100)2 = 4. Trong Extending Paths Bitmap ở hình 2.7 ta thấy bit thứ 4 tắnh từ phắa trái bằng 0 nên node hiện hành không có node con. Do đó ta sẽ

xét xem cổng này có khớp với một tiền tố nào trong node này không nhờ Internal Prefix Bitmap. Thao tác đó gọi là Prefix_Search. Đồng thời, nếu khớp Prefix_Search còn chỉ ra chỉ số của tiền tố dài nhất trong node khớp với Nible2 này (Prefix_Search và Count_Ones sẽ được mô tả chi tiết sau). Nhìn trên hình ta thấy giá trị cổng này phạm vào tiền tố thứ 2 trong node. Vòng tìm kiếm dừng lại và đưa ra địa chỉ của BitVector ứng với tiền tốđó bằng cách cộng địa chỉ của tiền tốđầu tiên trong node với chỉ số của tiền tố này.

Hình 2.7: Thông tin ca node con tương ng

Count_Ones: Index = Count_Ones(Bmp, pos) - Đầu vào:

9 Bmp: Bitmap.

9 Pos: Vị trắ của bit cần xem xét (cũng chắnh là giá trị thập phân của Nible). - Đầu ra:

9 Index: Số lượng bit 1 từ vị trắ đầu tiên đến vị trắ cần xem xét.

Hình 2.8: Vắ d v Count_Ones

Extending Paths Bitmap: 0101 0100 1001 0000

Nible = (1000)2 = 8 0101 0100 1001 0000 Bit 8

Học viên: Trần Trường Phan    43 

Prefix_Search: (Index, PrefixValid) = Prefix_Search (Bmp, Nible) - Đầu vào:

9 Bmp: Internal Prefix Bitmap.

9 Nible: Nible cần đối chiếu. - Đầu ra:

9 PrefixValid: Bằng 1 nếu tồn tại một tiền tố trong Internal Prefix Bitmap khớp với Nible và bằng 0 nếu ngược lại.

9 Index: Chỉ số của tiền tố dài nhất khớp với Nible. Vắ dụ:

Internal Prefix Bitmap: L0L1L2L3 = 0 01 0100 00000000 Nible = (abcd)2 = (0100)2 Hình 2.9: Vắ d v Prefix_Search 1 L0 0 0 L1 0 1 1 0 L2 0 0 0 0 0 0 0 0 L3

Internal Prefix Bitmap: 1 00 0110 0000000 (adsbygoogle = window.adsbygoogle || []).push({});

Học viên: Trần Trường Phan    44 

Sơđồ giải thuật của hàm Prefix_Search là:

Hình 2.10: Sơđồ gii thut ca Prefix_Search

Chú thắch:

- L3((abc)2) là lấy giá trị của bit thứ n = (abc)2 trong bitmap L3 và tương tự với L2 và L1.

- Count_Ones (L0L1L2L3, (abc)2): Hàm đếm số bit 1 có trong bitmap Bmp = L0L1L2L3 tắnh từ vị trắ đầu tiên đến vị trắ Pos = (abc)2 và tương tự với các tham biến còn lại.

Hình 2.10 là giải thuật Prefix_Search khi viết bằng phần mềm. Khi lập trình bằng phần cứng, cả 3 khối đếm Count_Ones sẽ cùng chạy 1 lúc. Do đó thời gian để đưa ra kết quả chỉ là 1 chu kỳđồng hồ. OneValid4 = 1 Index = Count_Ones (L0L1L2L3, (abc)2) OneValid8 = L3((abc)2) OneValid4 = L2((ab)2) OneValid2 = L1((a)2) Index = Count_Ones (L0L1L2, (ab)2) Index = Count_Ones (L0L1, (a)2) OneValid8 = 1 OneValid2 = 1 PrefixValid = OneValid8 or OneValid4 or OneValid2 or Bmp(14) Sai Đúng Đúng Sai Đúng Kết thúc Bắt đầu Sai Index = 0

Học viên: Trần Trường Phan    45 

2.2 Mô hình thiết kế phần cứng

Hình 2.11: Sơđồ các mô đun phn cng

Hình 2.11 là sơđồ các mô đun trong thiết kế phần cứng với: - Ethernet Control Module: điều khiển các module còn lại.

- Forward Module: lưu trữ dữ liệu gói tin và đưa dữ liệu này ra ngoài mạng khi gói tin không phạm phải bảng lọc.

- TCAM: lưu trữ các trường địa chỉ IP nguồn, địa chỉ IP đắch và giao thức trong bảng lọc. Ethernet Control Module sẽ đưa thông tin về các trường này của gói tin tới TCAM. Đầu ra của TCAM là một BitVector thể hiện thông tin về các trường này của gói tin có phạm phải bảng lọc không.

Ethernet Control Forward Module Src_Port FPL TCAM Src, Des&Protocol Lookup Des_port FPL Src_port NodeRAM Des_port NodeRAM Packet data in Packet data out Src_port BVRAM Des_port BVRAM B I T V E C T O B I T V E C T O B I T V E C T O B I T V E C T O AND OR matched

Học viên: Trần Trường Phan    46 

- Src_port NodeRAM và des_port NodeRAM: lưu trữ dữ liệu về trường cổng nguồn và cổng đắch của bảng lọc dưới dịnh dạng Bitmap theo thuật toán Tree Bitmap của Eatherton và Dittia.

- Src_port BVRAM, des_port BVRAM: lưu trữ BitVector của trường cổng nguồn và cổng đắch trong bảng lọc.

- Src_port FPL và des_port (FPL: Fast Port Lookup): thực hiện chức năng tìm kiếm xem dữ liệu cổng có phạm phải bảng lọc. Hai môđun này đưa địa chỉ của node tới NodeRAM để lấy dữ liệu Bitmap của node. Sau khi tìm kiếm xong, địa chỉ của Bitvector tương ứng với giá trị cổng của gói tin

được đưa tới BVRAM tương ứng.

Dữ liệu của gói tin sẽđược đưa tới mô đun như hình vẽ. Tuy nhiên, các môđun này chỉđược kắch hoạt khi có tắn hiệu từ Ethernet Control Module.

Tắn hiệu Match từ đầu ra của cổng OR được phản hồi lại đầu vào của Forward Module. Nếu Matched = 1 chứng tỏ gói tin đã phạm phải bảng lọc, Forward Module này sẽ không chuyển gói tin này ra ngoài mạng.

Các TCAM và RAM được tạo ra trong FPGA bằng cách sử dụng các IP core của Xinlix.

2.2.1 Ethernet Control Module

Đây là một môđun cơ bản điều khiển tất cả các môđun khác. Nó thực chất là một máy trạng thái hữu hạn (FSM) có diễn tiến trạng thái như trong sơđồ hình 2.12.

Khi có tắn hiệu báo hiệu có một gói tin đến, FSM từ trạng thái rỗi (st_idle) chuyển sang trạng thái Ộst_macỢ đểđọc trường địa chỉ vật lý nguồn và đắch của gói tin. Trạng thái này đơn thuần chỉ là một vòng lặp để đợi 12 byte dữ liệu về địa chỉ MAC được gửi hết. Sau đó nó tiếp tục chuyển sang trạng thái Ộst_protocolỢ kiểm tra giao thức. Nếu giá trị đọc được bằng Ộ0x0800Ợ (giao thức Internet), nó chuyển sang trạng thái Ộst_ver_ihlỢ. Nếu giá trị này không bằng, FSM chuyển về trạng thái rỗi Ộst_idleỢ.

Trong trạng thái Ộst_ver_ihlỢ FSM đọc ra phiên bản của giao thức Internet và lưu chiều dài phần tiêu đề của gói tin Internet vào trong thanh ghi HLReg (HeaderLength Register). Trạng thái kế tiếp Ộst_ver_ihlỢ là Ộst_loop_ipỢ có tác dụng duyệt qua 8 byte dữ liệu trong tiêu đề của gói tin Internet trước khi đến byte dữ liệu thông báo về giao

Học viên: Trần Trường Phan    47 

thức ở tầng kế tiếp. Trạng thái Ộst_ip_protocolỢ lưu giá trị của giao thức này vào trong thanh ghi. Trạng thái Ộst_source_ipỢ và Ộst_des_ipỢ lưu địa chỉ IP nguồn và đắch của gói tin vào trong thanh ghi. Nếu giao thức ở tầng giao vận là ICMP, FSM sẽ chuyển từ

trạng thái Ộst_des_ipỢ về trạng thái rỗi đồng thời gửi tắn hiệu kắch hoạt TCAM và đưa dữ liệu về Ộ địa chỉ IP nguồn, địa chỉ IP đắch và giao thứcỢ đã xác định được tới TCAM để đối chiếu. Nếu giao thức ở tầng trên là TCP hay UDP, nó sẽ kiểm tra xem gói tin IP có phần mở rộng không nhờ HLReg. Nếu có, nó chuyển sang trạng thái Ộst_ip_iptionỢ để duyệt hết dữ liệu mở rộng của gói tin. Nếu không, FSM gửi tắn hiệu src_port_valid kắch hoạt khối src_port FPL và chuyển sang trạng thái Ộst_src_portỢ.

Nếu có trạng thái Ộst_optionỢ, sau khi duyệt hết khối dữ liệu mở rộng, FSM cũng gửi tắn hiệu src_port_valid kắch hoạt khối: src_port FPL để đối chiếu dữ liệu về cổng nguồn và chuyển sang Ộst_src_portỢ. Trong trạng thái tiếp theo Ộst_src_portỢ, sau khi duyệt qua hết 2 byte dữ liệu cổng nguồn, nó sẽ kắch hoạt khối Des_port FPL nhờ tắn hiệu des_port_valid rồi chuyển sang trạng thái Ộst_des_portỢ. (adsbygoogle = window.adsbygoogle || []).push({});

Hình 2.12: Sơđồ din tiến các trng thái ca Ethernet Control Module

st_idle st_mac st_protocol st_source_ip st_des_ip st_ip_protocol st_src_port st_des_port nCount != 11 st_ver_ihl st_loop_ip st_checksum st_ip_option nCount != 7 ARP = true ICMP = true option = false

Học viên: Trần Trường Phan    48 

Hết trạng thái Ộst_des_portỢ, FSM trở về trạng thái rỗi Ộst_idleỢ và đợi gói tin tiếp theo tới.

2.2.2 FPL Module

Môđun này được gọi là FPL (Fast Port Lookup) dùng để đối chiếu dữ liệu cổng (cổng nguồn hoặc cổng đắch) với trường tương ứng trong bảng lọc. Nó được xây dựng dựa trên giải thuật Tree Bitmap của Eatherton và Dittia.

Hình 2.13: Sơđồ nguyên lý ca FPL

NODE DATA IN REG PORT REG

+

PORT NIBLE INDEX REG

PORT_DATA MUX

COUNT_ONES PREFIX_SEARCH

[15..0]

NODE ADDR REG

Child_node_index[3..0]

BEST PREV BV ADDR REG

[31..16] Prefix valid Child valid + Prefix_index[3..0] [46..32] [63..47] + 1 BV ADDR REG DNode_in[63..0] Port_in[7..0] NodeAddr_out[Max1-1..0] BVAddr_out[Max2-1..0] Port_nible[3..0] Prefix_adder Child_adder Port_valid [15..0] [1..0] [Max2-1..0] [15..0] [Max1-1..0] [Max2-1..0] [Max1-1..0] [Max2-1..0] [Max1-1..0]

Học viên: Trần Trường Phan    49 

Hình 2.13 là sơđồ nguyên lý của FPL. Các thành phần của nó được điều khiển bởi một máy trạng thái hữu hạn như trong hình 2.14.

Khi có tắn hiệu kắch hoạt FPL: port_valid, dữ liệu về giá trị cổng của gói tin sẽđược chốt vào trong thanh ghi 16 bit PORT_REG nhờđường tắn hiệu vào Port_in[7..0].

PORT_REG có 16 bit tức là 4 nible. Các nible này sẽ lần lượt được đưa ra nhờ một bộ chọn kênh, vị trắ của nible cần đưa ra được xác định bằng thanh ghi 2 bit PORT_NIBLE_INDEX_REG. Giá trị của thanh ghi này được tăng lên nhờ FSM sau mỗi lần lặp tìm kiếm.

Sau khi đưa địa chỉđến bộ nhớ RAM theo đường NodeAddr_out, dữ liệu của node từ bộ nhớ NodeRAM sẽđược lưu vào trong thanh ghi 64 bit NODE_DATA_IN_REG sau 2 chu kỳ (Vì ở trong thiết kế, ta sử dụng RAM nội của FPGA nên thời gian để truy cập dữ liệu chỉ là 1 chu kỳ, cộng với 1 chu kỳđể chốt dữ liệu vào thanh ghi). Cấu trúc dữ liệu trong NODE_DATA_IN_REG như sau:

BVArr_Ptr[15..0] InternalBmp[14..0] Child_node_Arr_Ptr[15..0] ExternalBmp[15..0]

[63..47] [46..32] [31..16] [15..0]

Internal Bitmap External Bitmap

Từng thành phần dữ liệu này sẽ được đưa đến các bộ đếm COUNT_ONES, PREFIX_SEARCH và 2 bộ cộng child_adder và prefix_adder.

- COUNT_ONES: Đầu vào là ExternalBmp[15..0] và nible[3..0], đầu ra là tắn hiệu Child_valid báo sự tồn tại của node con của node hiện tại tương

ứng với nible đưa vào và chỉ số của node con này: Child_node_index[3..0]. - PREFIX_SEARCH: Tạo ra tắn hiệu Prefix_valid báo hiệu tồn tại Prefix dài nhất tương ứng với Nible[3..0] và InternalBmp[14..0] đưa vào, cùng với chỉ số của tiền tố này trong node: Prefix_index[3..0].

Học viên: Trần Trường Phan    50 

- Child_adder: Xác định địa chỉ của node con bằng cách cộng giá trị (adsbygoogle = window.adsbygoogle || []).push({});

Chile_node_index[3..0] với Child_node_Arr_Ptr[Max1Ờ1..0]. Nó được lưu trong thanh ghi ADDR_OUT_REG.

- Prefix_adder: Xác định địa chỉ của tiền tố trong BVRAM nhờ cộng giá trị

của Prefix_index[3...0] với BVArr_Ptr[Max2Ờ1..0] và lưu trong thanh ghi BEST_PREV_BV_ADDR_REG.

Trong sơđồ hình 2.13, độ rộng của các thanh ghi ADDR_OUT_REG là Max1 (Tối

đa là 16 bit) và độ rộng của thanh ghi BEST_PREV_BV_ADDR_REG là Max2 (tối

đa là 17 bit). Các giá trị Max1 và Max2 cũng chắnh là độ rộng bus địa chỉ của NodeRAM và BVRAM. Như vậy thực chất thanh ghi dữ liệu node Bitmap chỉ cần có

độ rộng là Max1 + 16 + Max2 + 15 (16 ứng với kắch thước của Extending Paths Bitmap, 15 ứng với kắch thước của Internal Prefix Bitmap). Tuy các RAM nội của FPGA có thể có độ rộng bus dữ liệu là bất kỳ (≤ 256) và không cần là bội của 8. nhưng độ rộng 64 vẫn được chọn để hướng tương lai. Sau này khi nâng cấp dung lượng RAM thì khối này vẫn không thay đổi.

Để tăng tốc độ tìm kiếm, các bộđếm COUNT_ONES và PREFIX_SEARCH là các bộ cộng nhanh, không đếm theo nhịp xung đồng hồ và cho kết quả chỉ sau 1 chu kỳ.

Học viên: Trần Trường Phan    51 

Hình 2.14: Sơđồ din tiến các trng thái ca FPL

Trạng thái Ộst_save_portỢ lưu dữ liệu cổng của gói tin vào thanh ghi PORT_REG,

đồng thời đưa địa chỉ của node gốc đến NodeRAM (Địa chỉ này là địa chỉ cố định do người thiết kế đặt trước). Dữ liệu của node gốc sẽ được lưu lại trong thanh ghi NODE_DATA_IN_REG trong trạng thái Ộst_latch_rootỢ. Sau đó FSM chuyển sang trạng thái Ộst_wait_searchỢ. Trong trạng thái Ộst_wait_searchỢ, các bộ đếm COUNT_ONES và PREFIX_SEARCH sẽ đồng thời được kắch hoạt. Kết quả từ 2 bộ đếm này sẽ được đưa ra sau 1 chu kỳ và được xử lý trong trạng thái Ộst_process_resultỢ.

- Nếu tắn hiệu Child_valid = 1 thì FSM sẽ kắch hoạt bộ cộng Child_adder để

xác định địa chỉ của node con và lưu vào thanh ghi NODE_ADDR_REG và chuyển trạng thái sang Ộst_latch_next_nodeỢ. Trong tình huống này, nếu Prefix_valid = 1 thì FSM cũng kắch hoạt bộ cộng Prefix_adder để xác định

địa chỉ của tiền tố dài nhất khớp (trong node này) với giá trị cổng của gói tin

và lưu vào thanh ghi BEST_PREV_BV_ADDR_REG.

- Nếu tắn hiệu Child_valid = 0 nhưng Prefix_valid = 1 chứng tỏ có một tiền tố trong node này khớp với giá trị cổng của gói tin, FSM xác định địa chỉ

st_save_port st_latch_root st_wait_search st_process_result st_latch_next_node st_write_out_bv_addr st_idle Child_valid = 1 Child_valid = 0 Port_valid != 1 3 chu kỳ 3 chu kỳ st_wait Finish != 1

Học viên: Trần Trường Phan    52 

của tiền tố này, lưu vào trong thanh ghi BEST_PREV_BV_ADDR_REG và chuyển sang trạng thái Ộst_write_out_bv_addrỢ.

- Trường hợp còn lại Child_valid = 0 và Prefix_valid = 0 thì FSM chuyển sang trạng thái Ộst_write_out_bv_addrỢ.

Trạng thái Ộst_latch_next_nodeỢ, dữ liệu Bitmap của node lại được lưu vào thanh ghi NODE_DATA_IN_REG. Sau đó FSM chuyển sang trạng thái Ộst_wait_searchỢ tiếp tục vòng lặp tìm kiếm.

Trạng thái Ộst_write_out_bv_addrỢ, dữ liệu từ thanh ghi

BEST_PREV_BV_ADDR_REG sẽđược chuyển sang thanh ghi BV_ADDR_REG để

đưa ra ngoài theo đường BVAddr_out[Max2Ờ1..0]. Sau đó, FSM chuyển tới trạng thái Ộst_waitỢ đợi cho tới khi cả 2 khối FPL của cổng nguồn và cổng đắch đều hoàn thành công việc tìm kiếm (Finish = 1) để chuyển sang trạng thái rỗi và đợi Ethernet Control Module kắch hoạt lại.

Trong trường hợp giá trị cổng của gói tin không phạm vào các giá trị trong bảng lọc, giá trị của BV_ADDR_REG sẽ là một giá trị mặc định trỏ tới dữ liệu Bitvector có giá trị 0 trong Bitvector RAM.

Vì dữ liệu cổng là 16 bit = 4 nible, nên số vòng lặp tối đa là 4. Thời gian để tìm kiếm tối đa nhìn từ sơđồ là 3 + 3 x 4 +1 = 16 chu kỳ.

2.2.3 Forward Module

Vì khi có một gói tin mới đi vào thì ta cần phải có thời gian để duyệt qua các thông tin của nó, đối chiếu với bảng lọc trước khi cho phép gói tin này ra ngoài mạng nên Forward Module cần có bộ nhớ FIFO để lưu dữ liệu.

Để tránh trường hợp hủy gói tin có trong FIFO trong khi gói tin trước chưa ra hết khỏi FIFO, ta cần sử dụng 2 FIFO. Các gói tin liên tiếp sẽ được lần lượt ghi vào 2 FIFO bằng cách sử dụng 2 đường tắn hiệu điều khiển ghi và đọc: ctr_wr và ctr_rd. (adsbygoogle = window.adsbygoogle || []).push({});

Ở trạng thái bình thường, dữ liệu gói tin sẽ tuần tựđi vào trong FIFO và được đẩy ra ra ngoài theo đầu ra của FIFO. Nhưng trong khi đối chiếu các trường của gói tin với bảng lọc, nếu có tắn hiệu báo gói tin đã phạm phải bảng lọc matched = 1, nhờ trạng thái của tắn hiệu điều khiển ctr_wr ta có thể xác định được FIFO tương ứng đang được ghi dữ liệu và gửi tới nó tắn hiệu reset để hủy bỏ gói tin, đồng thời dừng việc ghi dữ

Học viên: Trần Trường Phan    53 

liệu vào nó. Nhờ có 2 FIFO nên dữ liệu gói tin đến trước được lưu trong FIFO kia sẽ

không bịảnh hưởng.

Hình 2.15: Sơđồ khi ca Forward module

Tắn hiệu ctr_wr sẽđược đảo giá trị mỗi khi có gói tin mới đi vào.

Tắn hiệu ctr_rd thay đổi khi hết gói tin hoặc khi dữ liệu trong FIFO đầy.

Một phần của tài liệu Xây dựng firewall trên nền tảng FPGA (Trang 41)