AMDVプロトコルにおけるルーティングテーブルrt
約半分のaomdvを読みました.ccコード、rtは何度も出てきて、私が研究しなければaomdvのコードは全然読めません......
ええ、rt:aomdv_を見てみましょう.rt_entry*rtはaomdv_を指すrt_entryクラスのポインタ.
そしてaomdv_rt_entryクラスはaomdv_rtable.hで定義されているので、具体的に見てみましょう.
ルーティングテーブルノードを定義するクラス:aomdv_rt_entry:
ここで定義されるメンバー関数は、主に、隣接テーブルnbに対する操作、パスpathに対する操作、およびパイロットpcに対する操作に分けられる.メンバー関数は、私の理解では、ルーティング・テーブル・アイテムに含まれる具体的な内容であるはずです.
aomdv_によるとrt_entryのprotectedメンバーパラメータは、ルーティング・テーブル・アイテムに含まれるコンテンツを得ることができます.
一般パラメータ:
rt_dst | rt_seqno | rt_hops | rt_advertised_hops | rt_last_hop_count |
パスパスパスに関するパラメータ(class AOMCV_Path):
rt_path_list | rt_highest_seqno_heard | rt_num_paths |
precursorに関するパラメータ(class AOMCV_Precursor):
rt_pclist | rt_expire |
historyに関するパラメータ:
rt_disc_latency[MAX_HISTORY] | hist_index | rt_req_last_ttl |
隣のテーブル:
rt_nblist
3つのチェーンテーブル:パスチェーンテーブル、パイロットチェーンテーブル(これは当分何に使うか分かりません)と隣のテーブル.送信データによって(RREQ/RREP/RERR)異なるRREQテーブルRREPテーブルとかあるはずですが、独立してこのようなテーブルを書くのではなく、これらのテーブルをルーティングテーブルの一部として扱います(aomdv.ccからのコメント)なので、これらのパラメータを選択的に使用して、異なるフォーマットのテーブルを形成する必要があります.
ルーティングテーブルクラスaomdv_rtableには、テーブル・アイテムの追加/削除/クエリーなど、ルーティング・テーブルに対する操作が含まれています.
ええ、rt:aomdv_を見てみましょう.rt_entry*rtはaomdv_を指すrt_entryクラスのポインタ.
そしてaomdv_rt_entryクラスはaomdv_rtable.hで定義されているので、具体的に見てみましょう.
ルーティングテーブルノードを定義するクラス:aomdv_rt_entry:
ここで定義されるメンバー関数は、主に、隣接テーブルnbに対する操作、パスpathに対する操作、およびパイロットpcに対する操作に分けられる.メンバー関数は、私の理解では、ルーティング・テーブル・アイテムに含まれる具体的な内容であるはずです.
class aomdv_rt_entry {
friend class aomdv_rtable;
friend class AOMDV;
friend class LocalRepairTimer;
public:
aomdv_rt_entry();
~aomdv_rt_entry();
void nb_insert(nsaddr_t id);
AOMDV_Neighbor* nb_lookup(nsaddr_t id);
// AOMDV code
AOMDV_Path* path_insert(nsaddr_t nexthop, u_int16_t hopcount, double expire_time, nsaddr_t lasthop=0);
AOMDV_Path* path_lookup(nsaddr_t id); // lookup path by nexthop
AOMDV_Path* disjoint_path_lookup(nsaddr_t nexthop, nsaddr_t lasthop);
bool new_disjoint_path(nsaddr_t nexthop, nsaddr_t lasthop);
AOMDV_Path* path_lookup_lasthop(nsaddr_t id); // lookup path by lasthop
void path_delete(nsaddr_t id); // delete path by nexthop
void path_delete(void); // delete all paths
void path_delete_longest(void); // delete longest path
bool path_empty(void); // is the path list empty?
AOMDV_Path* path_find(void); // find the path that we got first
AOMDV_Path* path_findMinHop(void); // find the shortest path
u_int16_t path_get_max_hopcount(void);
u_int16_t path_get_min_hopcount(void);
double path_get_max_expiration_time(void);
void path_purge(void);
void pc_insert(nsaddr_t id);
AOMDV_Precursor* pc_lookup(nsaddr_t id);
void pc_delete(nsaddr_t id);
void pc_delete(void);
bool pc_empty(void);
double rt_req_timeout; // when I can send another req
u_int8_t rt_req_cnt; // number of route requests
// AOMDV code
u_int8_t rt_flags;
protected:
LIST_ENTRY(aomdv_rt_entry) rt_link;
nsaddr_t rt_dst;
u_int32_t rt_seqno;
/* u_int8_t rt_interface; */
// AOMDV code
u_int16_t rt_hops; // hop count
u_int16_t rt_advertised_hops; // advertised hop count
int rt_last_hop_count; // last valid hop count
// AOMDV code
aomdv_paths rt_path_list; // list of paths
u_int32_t rt_highest_seqno_heard;
int rt_num_paths_;
bool rt_error;
/* list of precursors */
aomdv_precursors rt_pclist;
double rt_expire; // when entry expires
#define RTF_DOWN 0
#define RTF_UP 1
#define RTF_IN_REPAIR 2
/*
* Must receive 4 errors within 3 seconds in order to mark
* the route down.
u_int8_t rt_errors; // error count
double rt_error_time;
#define MAX_RT_ERROR 4 // errors
#define MAX_RT_ERROR_TIME 3 // seconds
*/
#define MAX_HISTORY 3
double rt_disc_latency[MAX_HISTORY];
char hist_indx;
int rt_req_last_ttl; // last ttl value used
// last few route discovery latencies
// double rt_length [MAX_HISTORY];
// last few route lengths
/*
* a list of neighbors that are using this route.
*/
aomdv_ncache rt_nblist;
};
aomdv_によるとrt_entryのprotectedメンバーパラメータは、ルーティング・テーブル・アイテムに含まれるコンテンツを得ることができます.
一般パラメータ:
rt_dst | rt_seqno | rt_hops | rt_advertised_hops | rt_last_hop_count |
パスパスパスに関するパラメータ(class AOMCV_Path):
rt_path_list | rt_highest_seqno_heard | rt_num_paths |
precursorに関するパラメータ(class AOMCV_Precursor):
rt_pclist | rt_expire |
historyに関するパラメータ:
rt_disc_latency[MAX_HISTORY] | hist_index | rt_req_last_ttl |
隣のテーブル:
rt_nblist
3つのチェーンテーブル:パスチェーンテーブル、パイロットチェーンテーブル(これは当分何に使うか分かりません)と隣のテーブル.送信データによって(RREQ/RREP/RERR)異なるRREQテーブルRREPテーブルとかあるはずですが、独立してこのようなテーブルを書くのではなく、これらのテーブルをルーティングテーブルの一部として扱います(aomdv.ccからのコメント)なので、これらのパラメータを選択的に使用して、異なるフォーマットのテーブルを形成する必要があります.
ルーティングテーブルクラスaomdv_rtableには、テーブル・アイテムの追加/削除/クエリーなど、ルーティング・テーブルに対する操作が含まれています.
class aomdv_rtable {
public:
aomdv_rtable() { LIST_INIT(&rthead); }
aomdv_rt_entry* head() { return rthead.lh_first; }
aomdv_rt_entry* rt_add(nsaddr_t id);
void rt_delete(nsaddr_t id);
aomdv_rt_entry* rt_lookup(nsaddr_t id);
// AOMDV code
void rt_dumptable();
bool rt_has_active_route();
private:
LIST_HEAD(aomdv_rthead, aomdv_rt_entry) rthead;
};
ルーティングテーブルrtもチェーンテーブルを構成する.ルーティングテーブルに対する理解はプロトコルに対する理解に直接関係する.プロトコルにrtに関わるところは本当に多すぎるからだ.aomdv.ccの中で手当たり次第にrtを探してまるで私の目がくらくらすることができます......いいでしょう、これらはrtに対する初歩的な理解だけで、私がそれに対してもっと深い認識があったら、ここで補充します.