アウトライン
隣接項目ルックアップはneigh_lookup相関関数によって実行されます。
___neigh_lookup_noref、関数(ネクストホップIPのIPv4アドレス)と出力装置、アイテムが返される検索ハッシュテーブルの隣の主キー値を見つけるために応じ。
neigh_lookup、関数は___neigh_lookup_noref関数を呼び出し、そして隣人がアイテムを見つけた後、参照カウントがインクリメントされ、その後、アイテムを返します。
ソースコード解析
1 構造体の隣接* neigh_lookup(構造体 neigh_table * TBL、CONST ボイド * PKEY、 2 構造体 net_device * DEV) 3。 { 4。 構造体の隣接* N-; 5 。6 NEIGH_CACHE_STAT_INC(TBL、ルックアップ); 7 。8 rcu_read_lock_bh(); 9 10 / * 非基準ルックアップネイバーエントリ* / 11。 N- = __neigh_lookup_noref(TBL、PKEY、DEV) 12は 13である * / 参照カウント増分* / 14 IF {(N) 15 IF(atomic_inc_not_zero(N-&>!REFCNT)) 16 N- = NULL; 17 NEIGH_CACHE_STAT_INC(TBL、ヒット); 18である } 。19 20である )(rcu_read_unlock_bh; 21である 22ことである * / ネイバ項目戻す* / 23である 返すN-を、 24 }
1つの 静的インライン構造体の隣接* __ neigh_lookup_noref(構造体 neigh_table * TBL、 2 CONSTの ボイド * PKEY、 3 構造体 net_device * DEV) 4 { 5 リターン ___ neigh_lookup_noref(TBL、tbl-> key_eq、tbl-> ハッシュ、PKEY、DEV)。 6 }
1 静的インライン構造体の隣接* ___ neigh_lookup_noref( 2 構造体 neigh_table * TBL、 3 BOOL(* key_eq)(constの 構造体 N隣接*、CONST ボイド * PKEY)、 4 __u32(*ハッシュ)(CONST ボイド * PKEY、 5 CONSTの 構造体 net_device * DEV、 6 __u32 * hash_rnd)、 7 のconst 無効 * PKEY、 8 構造体 net_device * DEV) 9 { 10 / * 获取ハッシュ* / 11 構造体 neigh_hash_table * NHT = rcu_dereference_bh(tbl-> NHT)。 12 構造体の隣人* n個。 13の U32 hash_val。 14 15 / * 计算ハッシュ值* / 16 hash_val =ハッシュ(PKEY、DEV、nht-> hash_rnd)>>(32 - nht-> hash_shift)。 17 18 / * 遍历ハッシュ表项* / 19 のための(N = rcu_dereference_bh(nht-> hash_buckets [hash_val]); 20 !N = NULL; 21 rcu_dereference_bh = N-(N-> 次に)){ 22は、 / * アイテムが返され見つける* / 23である IF(N-> DEV DEV && == (N、PKEY key_eq)) 24 リターンN-; 25 } 26である 27 / * ていませんリターンがNULLた* / 28 リターン、NULLを 29 }