Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> 近傍のサブシステムのLinuxのスタック(4つの関連プロセス)

近傍のサブシステムのLinuxのスタック(4つの関連プロセス)

  

INT neigh_resolve_output(構造体sk_buffの*のSKB){構造体dst_entry * DST = skb-> DST、構造体の隣接*いななき; INT RC = 0; //有効判断するif(DST!| |  !(いななき= dst->隣人))後藤破棄; __ skb_pull(SKB、skb-> nh.raw - skb->データ);利用可能な状態があるかどうかを判断する//隣人、利用可能な場合、パケットを置きます(!neigh_event_send(いななき、SKB))なら、{int型のERRを送信し、構造体net_device * DEV = neigh-> DEV; IF(DEV-> hard_header_cache&&! dst-> HH){write_lock_bh(& neigh->ロック); IF(dst->! HH)neigh_hh_init(いななき、DST、dst-> ops->プロトコル); ERR = DEV-> hard_header(SKB、DEV、ntohs(skb->プロトコル)、neigh->)LEN; HA、NULL、skb-> write_unlock_bh(& neigh->ロック);}他{read_lock_bh(& neigh->ロック); ERR = DEV->。 hard_header(SKB、DEV、ntohs(skb->プロトコル)、neigh-> HA、NULL、skb-> LEN); read_unlock_bh(& neigh->ロック);}もし(ERR> = 0) RC = neigh-> ops-> queue_xmit(SKB); elsegoto out_kfree_skb;}アウト:戻りRC;破棄:NEIGH_PRINTK1(" neigh_resolve_output:DST =%Pいななき=%P \\ n", DST、DST dst-か? >隣人:NULL); out_kfree_skb:RC = -EINVAL; kfree_skb(SKB);うち後藤;}ステアリングneigh_event_send(); STAT ICインラインint型neigh_event_send(構造体の隣接*いななき、構造体sk_buffの*のSKB){neigh-> = jiffy単位を使用; //ここでは除外NUD_STALE状態、送信情報がある場合に、この状態では、遅延に転送され、ため状態、およびを見ることができるタイマーを設定した場合__neigh_event_send()の((neigh-> nud_state&(NUD_CONNECTED |! NUD_DELAY | NUD_PROBE)))戻り__neigh_event_send(いななき、SKB); 0を返す;}我々は、対応するエントリが新しいエントリ隣人、初期条件が満たされていないがあると仮定進むの__neigh_event_send()のint __neigh_event_send(構造体の隣接*いななき、構造体sk_buffの* SKB) unsigned long型今; {int型のRC write_lock_bh(& neigh->ロック); RC = 0; //エントリパラメータ検出IF(neigh->アンプ&nud_state;(NUD_CONNECTED |  NUD_DELAY |  NUD_PROBE))後藤out_unlock_bh;今= jiffy単位; //状態がNUD_STALEとNUD_INCOMPLETEifされていない場合((neigh-> nud_state&(NUD_STALE |!  いななきプローブ; NUD_INCOMPLETE))){IF(neigh-> parms-> mcast_probes + neigh-> parms-> app_probes){//状態NUD_INCOMPLETEを設定し、タイマatomic_setを設定する(& neigh-> - > parms-> ucast_probes); neigh-> nud_state = NUD_INCOMPLETE;)neigh_hold(いななき; neigh-> timer.expires =今+ 1; add_timer(& neigh->タイマー);}他{//遅延パラメータの端部が設定されている場合、使用不能neigh->ネイバーセット; nud_state = NUD_FAILED; write_unlock_bh(& neigh->ロック);(SKB)kfree_skb(SKB)場合、1を返す;}}そうであれば(いななき - > nud_state& \\いななき%pが遅延される; NUD_STALEが){//ステータスがNUD_STALEである場合、ステータスはNUD_DELAYする、//ゼロを返し、タイマーを設定し、neigh_resolve_outputに、パケットが(" NEIGH_PRINTK2を送りました。 N"、いななき); neigh_hold)(いななき; neigh-> nud_state = NUD_DELAY; neigh-> timer.expires = jiffy単位+ neigh-> parms-> delay_probe_time; add_timer(& neigh->タイマー) } IF(neigh-> nud_state == NUD_INCOMPLETE){//いななき、arp_queueにパケットを追加し、尾をIF(SKB){//キュー長い場合には、SKB {構造体sk_buff *バフ、バフ= neigh-> arp_queue.next; __ skb_unlink((; neigh-> arp_queue)> = neigh-> parms-> queue_len skb_queue_len(&#038)場合最前破棄パケットarp_queueバフ、& neigh-> arp_queue); kfree_skb(バフ);} //パケットがテール__skb_queue_tail(&#038に追加される。neigh-> arp_queue、SKB);} RC = 1;} out_unlock_bh:write_unlock_bh(&アンプ; neigh->ロック);戻りRC;ステータスが利用可能である場合}プロセス上、主に決定されたDST対応する隣接状態エントリ、パケットが直接送信されます。利用できない場合は、状態がNUD_INCOMPLETEに設定され、タイマーが設定されています。タイマハンドラに対応する次のとおりです。zh-CN"],null,[0.86750525],zh-CN"]]]

Copyright © Windowsの知識 All Rights Reserved