Giao thức này sử dụng các nút có biểu hiện hành vi lỗ đen trong mạng không dây sử dụng giao thức AODV. Khi các nút hoạt động nhƣ một lỗ đen, chúng sẽ sử dụng một giao thức định tuyến mới có thể tham gia vào thông báo AODV. Trong bộ mô phỏng NS-2.34, giao thức mới blackholeAODV đƣợc cài đặt nhƣ sau:
- Copy thƣ mục chứa giao thức AODV và đổi tên thành blackholeaodv.
- Điểm lƣu ý là cả giao thức AODV và giao thức blackholeAODV đều gửi các gói tin AODV đến lẫn nhau. Do đó file “aodv_packet.h” sẽ không đƣợc sao chép sang thƣ mục blackholeaodv.
- Đổi tên tất cả các file có tên là aodv trong thƣ mục thành “blackholeaodv”:
blackholeaodv.cc, blackholeaodv.h, blackholeaodv.tcl, blackholeaodv_rqueue.cc, blackholeaodv_rqueue.h (ngoại trừ file “aodv_packet.h”).
- Thay đổi một số nội dung (lớp, hàm, cấu trúc, biến, hằng,…) trong các file trong thƣ mục này ngoại trừ tên cấu trúc mã AODV packet.h. Hai giao thức AODV và blackhole AODV đƣợc thiết kế để có thể gửi các gói dữ liệu cho nhau, do đó cũng gần tƣơng tự nhƣ nhau.
Để các hành vi lỗ đen thực hiện đƣợc trong giao thức mới. Ta thêm hành vi lỗ đen vào giao thức blackholeAODV với một số thay đổi trong file
blackholeaodv/blackholeaodv.cc. Quá trình thay đổi đƣợc mô tả nhƣ sau:
- Khi một gói tin nhận đƣợc bởi hàm “recv” của “aodv/aodv.cc”, nó xử lý các gói tin dựa vào dạng của nó. Nếu dạng gói tin là một trong nhiều gói tin quản lý (điều khiển) tuyến đƣờng, nó gửi gói tin đến hàm “recvAODV”.
- Nếu gói tin nhận đƣợc là gói dữ liệu, thông thƣờng giao thức AODV sẽ gửi nó đến địa chỉ đích, nhƣng nếu là hoạt động lỗ đen, nó sẽ bỏ gói tin dữ liệu miễn là gói tin không
truyền đến chính nó. Câu lệnh dƣới đây mô tả: nếu nút đích là chính nó thì nó sẽ nhận gói tin, ngƣợc lại, nó loại bỏ tất cả các gói tin còn lại.
if ( (u_int32_t)ih->saddr() == index)
forward((blackholeaodv_rt_entry*) 0, p, NO_DELAY); else
drop(p, DROP_RTR_ROUTE_LOOP);
- Nếu gói tin là một gói tin điều khiển AODV, hàm “recv” gửi nó đến hàm
“recvblackholeAODV”. Hàm “recvblackholeAODV” kiểm tra loại của gói tin điều khiển và dựa vào mỗi loại gói tin nó sẽ gửi chúng đến các hàm thích hợp với câu lệnh
“case”. Ví dụ, các gói tin RREQ sẽ đƣợc gửi đến hàm “recvRequest”, các gói tin RREP sẽ đƣợc gửi đến hàm “recvReply”. Câu lệnh “case” nhƣ sau:
case AODVTYPE_RREQ: recvRequest(p); break; case AODVTYPE_RREP: recvReply(p); break; case AODVTYPE_RERR: recvError(p); break; case AODVTYPE_HELLO: recvHello(p); break; default:
fprintf(stderr, "Invalid blackholeAODV type (%x)\n", ah>ah_type);
exit(1);
- Trong trƣờng hợp này ta xét đến hàm recvRequest RREQ vì hành động lỗ đen đƣợc thực hiện khi các nút độc hại nhận đƣợc gói tin RREQ. Khi nút độc hại nhận đƣợc một gói tin RREQ, ngay lập từ nó gửi thông báo RREP nhƣ là nó đã có đƣờng đến đích. Nút độc hại cố gắng đánh lừa nút gửi bằng gói RREP. Số tuần tự lớn nhất của giao thức AODV là 4294967295 với giá trị số nguyên 32 bít. Số tuần tự đƣợc đặt là 4294967295 và số đếm hop đƣợc đặt là 1. Thông báo RREP giả trong tấn công lỗ đen đƣợc thể hiện nhƣ sau:
sendReply(rq->rq_src, // IP Destination
1, // Hop Count
index, // Dest IP Address
4294967295, // Highest Dest Sequence Num
MY_ROUTE_TIMEOUT, // Lifetime rq->rq_timestamp); // timestamp
Sau một số thay đổi nhƣ trên, ta tiến hành tích hợp giao thức blackholeAODV vào bộ mô phỏng và biên dịch lại chƣơng trình NS-2 để tạo ra các file đối tƣợng. Ở một số hƣớng dẫn tích hợp một giao thức mới vào bộ mô phỏng NS-2 cần phải thay đổi nhiều file để sử dụng đƣợc các gói tin của nó. Nhƣng trong giao thức blackholeAODV này không cần thiết phải thêm giao thức mới, do đó chỉ cần thay đổi 2 file (Makefile và ns-lib.tcl) của
NS-2. Quá trình thay đổi nhƣ sau:
- Đầu tiên ta thay đổi file “\tcl\lib\ ns-lib.tcl”, nơi mà các thực thể (agent) đƣợc mã hoá thành các thủ tục. Khi một nút sử dụng giao thức blackholeAODV, agent đƣợc ghi ở phần đầu mô phỏng và đƣợc gán cho các nút sử dụng giao thức backholeAODV. Những dòng sau sẽ đƣợc thêm vào:
blackholeAODV {
set ragent [$self create-blackholeaodv-agent $node] }
…
Simulator instproc create-blackholeaodv-agent { node } { set ragent [new Agent/blackholeAODV [$node node-addr]] $self at 0.0 "$ragent start" # start
BEACON/HELLO Messages
$node set ragent_ $ragent return $ragent
}
- Tiếp theo, ta thay đổi file “\Makefile” trong thƣ mục gốc “ns-2.34”. Thêm những dòng sau:
blackholeaodv/blackholeaodv_logs.o blackholeaodv/blackholeaodv.o \
blackholeaodv/blackholeaodv_rtable.o blackholeaodv/blackholeaodv_rqueue.o \
- Sau khi thực hiện các thay đổi trên, ta dùng các lệnh make clean, make để biên dịch lại NS2.