CHƯƠNG 4 CÀI ĐẶT CÁC THUẬT TOÁN VÀ ĐÁNH GIÁ HIỆU NĂNG
4.2 Cài đặt thuật toán trong NS2
4.2.3 Mô tả các thuộc tính, phương thức trong file C++
Như ta đã biết trong C++ NS2 sử dụng để :
Mô phỏng chi tiết cho các giao thức yêu cầu ngôn ngữ lập trình hệ thống.
Thao tác trên byte, xử lý gói, thực thi thuật toán.
Tốc độ thời gian thực (run-time speed) là quan trọng nhất.
Thực hiện bất kỳ việc gì mà cần phải xử lý từng packet của một luồng.
Dưới đây là bảng mô tả thuộc tính cũng như phương thức sử dụng trong file Agent-edba.cc và Agent-edba.h. Agent-Dborn kế thừa trực tiếp từ lớp Agent nên nó có đầy đủ các phương thức cũng như thuộc tính của lớp Agent. Dưới đây tác giả chỉ trình bày về Agent-edba, còn về lớp Agent sẽ được giải thích chi tiết trong phụ lục.
Chúng ta có sơ đồ khối của file Agent-edba.h/Agent-edba.cc như sau (chú ý là sơ đồ này cũng được dùng cho các file cài đặt của các thuật toán Agent-dba.h/Agent- dba.cc và Agent-ipact.h/Agent-ipact.h):
Source update()
local_buff sendlocalmsg()
Insert_local_pkt()
send_buff
send_report()
recv() forward()
take_buff
take_packet()
Rx Tx
send_gate()
Gate_Timer Data_Timer
FDL_handle
send_to()
Hình 32 – Sơ đồ khối của file Agent-edba.h/Agent-edba.cc
60
Trong sơ đồ này, chúng ta thấy một nút mạng (node) được khai báo trong file tcl sẽ hoạt động dựa trên những phương thức mà tôi đã định nghĩa trong file Agent- edba.h/Agent-edba.cc.
Để người đọc nắm rõ hơn file đã cài đặt Thiết kế chi tiết lớp Agent-Dborn, tôi xin liệt kê một số thuộc tính và phương thức quan trọng trong file:
Kiểu dữ liệu(C++) Tên thuộc tính Ý nghĩa
unsigned int buffsize[] Kích thước buffsize
nsaddr_t NextNodeAddr_ Địa chỉ của node tiếp
theo trong mạng
Int DbornPort_ Khai báo cổng Dborn
FDLHandler fdl_handler
Int num_wavelength,useNode,
checkTable[MAXNodes], srctest;
Số lượng bước sóng trong mạng
GATETimer gate_scheduler Lập lịch cho bản tin
Gate
DATATimer data_scheduler Lập lịch cho bản tin data
unsigned int NodeOLT, NodeSPLIT Kiểm tra là node là OLT ,ONU hay coupler double PollingTable[MAXNodes], usePoll;
int ONUNumber_,pollTable_,
win_max_
Số lượng ONU, cửa sổ truyền cực đại,
double guardTime_,delay_,link_bw,timetes t,waitTime;
Khai báo thời gian trễ, thời gian chờ ,thời gian bảo vệ …
int CurrentSizeinBuffer,
getNumberPktBuffer
Kích thước gói tin trong buffer, Số lượng gói tin trong Buffer
Bảng 2: Thuộc tính lớp Agent-Dborn
61 Các phương thức:
Kiểu trả về (C++) Tên phương thức Ý nghĩa
int CurrentSizeinBuffer() Trả về kích thước gói
tin trong buffer
void initial_agent() Khai báo giá trị cho
các biến trong agent
void init_variables() Khởi tạo các biến
void take_packet() Lấy gói tin trong
hàng đợi
virtual void recv(Packet* , Handler *) Kiểm tra xem gói tin nhận được đến từ đâu virtual void sendto (int /*nbytes*/, const char*
nsaddr_t dest_)
Địa chỉ và kích thước gói tin được gửi đến
void sendREPORT() Gửi bản tin Report
void sendGATE(int) Gửi bản tin Gate
void insert_local_pkt();
void update_stat(int, Packet* = NULL) Cập nhật trạng thái gói tin
void update_drop(Packet*)
void output_stat(const char*) Đưa dữ liệu ra file void output_data(const char*) Đưa dữ liệu ra file virtual int command(int argc, const
char*const* argv)
Tạo ra interface, xử lý các lệnh từ tcl . Bảng 3: Các phương thức trong Agent-Dborn
Trong đó các phương thức quan trọng là : command, send, recv. Các phương thức này sẽ quy định cách xử lý đối với một gói tin của giao thức.
Hàm insert_local_pkt() (insert local packet):
62
o Đầu vào nhận các thông tin từ các hàm send_report(), sent_gate() và sendlocalmsg()
o Nhằm mục đích đưa thông tin từ local lên network
o Để truyền thông tin dữ liệu thì khi có yêu cầu từ sendlocalmsg() hàm lấy thông tin cần gửi ở bộ đệm dữ liệu send_buff rồi gửi ( hàm deque() trong chương trình)
Hàm recv() (receive):
o Nhận thông tin truyền vào
o Có bộ xử lý lập lịch (FDL handle) o Tại đây nó sẽ kiểm tra gói tin
Nếu là nodeSPLIT (addr() == NodeSPLIT) thì nó sẽ gọi đến hàm forward() để chuyển gói tin đi. Sau đó gói tìn này được hàm forward() chuyển tiếp trực tiếp đưa lên mạng
Nếu là nodeOLT (addr() == NodeOLT) thì nó sẽ kiểm tra loại thông tin gửi đến thuộc loại thông tin gì.
Nếu là MSG_GATE: thông tin về gate thì sẽ có một thông báo lỗi
Nếu là MSG_REPORT: thì sẽ gọi đến hàm Algorithme()
Nếu là MSG_DATA: thì dữ liệu sẽ được chuyển tới bộ đệm take_buff bằng hàm enque(). Khi nào cần thiết thì hàm take_packet() sẽ lấy dữ liệu từ bộ đệm này ra để xử lý
Nếu không phải hai loại trên ((addr() != NodeOLT)&&(addr()
!= NodeSPLIT)) thì sẽ kiểm tra thông tin một lần nữa
Nếu là MSG_GATE: thì nó sẽ gửi thông tin này cho hàm sendlocalmsg() để sử dụng khi cần
Nếu là các loại khác thì sẽ loại bỏ gói tin vì không phụ hợp bằng hàm drop().
Hàm send_to()và update():
o Nhận thông tin của nguồn local
o Tại đây nó sẽ tạo các electronic packet từ thông tin của nguồn
63
o Sau đó nó sẽ sử dụng hàm update_stat() để cập nhật các thông tin các gói tin (local packet) trước khi đưa nó vào trong bộ đệm local_buff bằng hàm enque().
Hàm sendlocalmsg():
o Có bộ định thời/ lập lịch
o Nhận thông tin MSG_GATE từ hàm recv()
o Khi được sử dụng thì hàm này sẽ lấy thông từ từ local_buff để chuyển những thông tin này ra sent_buff trước khi đưa vào hàm insert_local_pkt() trước khi truyền những thông tin local này đi
o Nếu trong khi xử lý thông tin trong hai bộ đệm buff có lỗi thì hàm này sẽ phát ra một thông báo thông qua hàm send_report()