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に対する操作に分けられる.メンバー関数は、私の理解では、ルーティング・テーブル・アイテムに含まれる具体的な内容であるはずです.
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に対する初歩的な理解だけで、私がそれに対してもっと深い認識があったら、ここで補充します.