Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxの周辺サブシステム(関連プロセス6)

Linuxの周辺サブシステム(関連プロセス6)

  

静的インライン構造体の隣接のスタック* __ neigh_lookup(構造体net_device構造体neigh_table * TBL、CONSTボイド* PKEY、* DEV、レコード生成int型)は{構造体の隣接* N = neigh_lookup(TBL 、PKEY、DEV);(Nの場合| |  !クリート)リターンのn;

//関心を追加するには、ネイバーテーブルに追加されるのn = neigh_create(TBL、PKEY、DEV); IS_ERR(n)はNULL :? Nを返す;} int型neigh_update(構造体隣人*いななき、CONST U8 * lladdr、U8新しい、U32フラグ){U8古い; INT ERR; #ifdefのCONFIG_ARPDint = 0を通知する。#endifstructのnet_device * DEV; INT update_isrouter = 0; write_lock_bh(& neigh->ロック); DEV = neigh-> DEV; nud_state; ERR = -EPERM; = neigh->古いNEIGH_UPDATE_F_ADMIN)&&

(旧&(NUD_NOARP |((フラグ&#038であれば!  NUD_PERMANENT)))後藤アウト; //)((新&! NUD_VALIDた場合、それがアクティブ状態に変更された場合){//タイマーneigh_del_timer(いななき)を削除; //以前の状態がNUD_CONNECTEDある場合//は隣人を調整しますエントリアウト関数ポインタに対応する場合(古い& NUD_CONNECTED)neigh_suspect(いななき); neigh-> nud_state =新規; 0 =誤る; NUD_VALID; #endifgotoアウト; CONFIG_ARPDnotify =古い&アンプ#ifdefの} /*と新しいlladdrを比較* /(!; addr_len DEV->)場合は、1つのキャッシュ{/*最初のケース:.デバイスが全くアドレス* /lladdr = neigh->を必要としない; HA;}もしそうでなければ(lladdr){/*第二の場合:何かがある場合old-それらが異なる場合は、* /((旧&アンペア場合オーバーライドフラグをチェックし;;)NUD_VALID&&

memcmp(lladdr、neigh-新しい&#038を比較 - :すでに新しいアドレスが提案さをcachedand! > HA、DEV-> addr_len))lladdr = neigh-> HA;}他{/*なしアドレスが供給されない;我々は何かを知っていれば、それを使用し、そうでなければ要求を破棄* /ERR = -EINVAL;.場合((旧&アンプ;! NUD_VALID))後藤うち、lladdr = neigh-> HA、リセットが確認され、それが接続状態に変換される場合} //時間である場合(新しい&A融点; NUD_CONNECTED)neigh->は=のjiffy単位を確認し; //リセット更新neigh->更新=のjiffy単位; /*エントリが有効だったとアドレスが新しいものが古い場合は、エントリの状態を変更しない、変更されていない場合。 * /ERR = 0; update_isrouter =フラグ& NEIGH_UPDATE_F_OVERRIDE_ISROUTER; //対応する隣接L2アドレスの隣人を更新する場合(古い& NUD_VALID){IF(lladdr = neigh->! HA&&!(フラグ&アンプ。 NEIGH_UPDATE_F_OVERRIDE)){update_isrouter = 0; NEIGH_UPDATE_F_WEAK_OVERRIDE)&&(旧&((フラグ&アンプならNUD_CONNECTED)){lladdr = neigh-> HA、新しい= NUD_STALE;}アウトelsegoto;}そうでなければ{(lladdr場合== neigh->ヘクタール&&新しい== NUD_STALE&&((フラグ& NEIGH_UPDATE_F_WEAK_OVERRIDE)| | (オールド& NUD_CONNECTED)))=新しい古い;}}もし(古い=新しい){neigh_del_timer(いななき);!場合(新しい& NUD_IN_TIMER){neigh_hold)(いななき; neigh-> timer.expiresの=のjiffy単位+

((新& NUD_REACHABLE)

neigh-> parms-> reachable_time:?0); add_timer(&#038; neigh->タイマー);} neigh-> nud_state =新規;} //設定HA項目(lladdr = neigh->! HA){のmemcpy(&#038; neigh-> HA、lladdr、DEV-> addr_len);場合//HH更新項目neigh_update_hhs(いななき)。場合(!(新&#038; NUD_CONNECTED))neigh->は=のjiffy単位を確認 - (neigh-> parms-> base_reachable_time<< 1); CONFIG_ARPDnotify = 1 IFDEF#; #endifの}(新==旧場合)後藤うち、接続状態が転送されている場合は、//、connect_outpifする新しい&#038(アウト設定されている。NUD_CONNECTED)neigh_connect(いななき);)elseneigh_suspect(いななき; //ネイバーエントリがarp_queueに入れて、非アクティブから有効、外出先であれば対応する送信//SKBzh-CN"],null,[0.9693771],zh-CN"]]]

Copyright © Windowsの知識 All Rights Reserved