Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> ネットワークデバイス管理のような大規模なLinuxネットワーク・プロトコル・スタックの構造

ネットワークデバイス管理のような大規模なLinuxネットワーク・プロトコル・スタックの構造

  

、メンバーが呼ぶ存在に気づい(続き):構造体net_device *次の、ハァッ、ハァッ、それに非常に精通し、それはネットワークデバイスのリストを作成し、それを使用することです。各ネットワーク機器活性化されると、(ドライバー/ネット/net_init.c)トラッキング機能)(register_netdevを呼び出します:int型register_netdev(構造体net_device * DEV){int型ERR; rtnl_lock(); /**名の場合{ERR = dev_alloc_name(DEV、DEV->名);書式文字列発信者が*名割り当て* /IF(名前、 '%')strchr(DEV->)を行うために私たちを希望する場合(ERR< 0) 。ジャンプアウト;}

/**戻る互換フックは2.5でこれを殺す* /

IF(DEV->名[0] == 0 | |  DEV->名[0] == ''){ERR = dev_alloc_name(DEV、" ETH%D");(ERR<場合; 0)後藤出;} ERR = register_netdevice(DEV);アウト:rtnl_unlock( );戻りERR;}トレースする:register_netdevice(構造体net_device * DEV)(ネット/コア/dev.c)のint register_netdevice(構造体net_device * DEV){構造体hlist_head *ヘッドと、構造体hlist_node * P; INT RET; BUG_ON(dev_boot_phase ASSERT_RTNL(); /* net_deviceが永続的な場合、これは致命的になります。* /BUG_ON(dev-> reg_state!= NETREG_UNINITIALIZED); spin_lock_init(& dev-> queue_lock); spin_lock_init(& dev->); xmit_lock); dev-> xmit_lock_owner = -1; #ifdef CONFIG_NET_CLS_ACTspin_lock_init(& dev-> ingress_lock);#endifret = alloc_divert_blk(dev); if(ret)gout out; dev-> iflink = -1; /*初期化は、この機能が利用可能である場合* ///DEV場合 - > initが割り当てられ、この関数は次の場合に呼び出される(DEV-> INIT){RET = DEV-> INIT(DEV); IF(RET) {(RET> 0)であればRET = -EIO;後藤out_err;}} //(dev_valid_name(DEV->!名)){RET = -EINVAL場合名が有効と判定された場合、ジャンプout_err;} //であります場合(DEV-> iflink == -1)のifIndex = dev_new_index();デバイスは、> indexdev-割り当てられDEV-> iflink = DEV->のifIndex; /*名前の存在をチェック* ///すべてのネットワークハッシュdev_name_headとして主キーの名前を提示する装置であって、変数名に対応するハッシュアレイでは、リストがすでにこのネットワークデバイス名、エラー終了ヘッド= dev_name_hash(DEV->のカーネルが含まれている場合//見出されます。 Name); hlist_for_each(p、head){struct net_device * d = hlist_entry(p、struct net_device、name_hlist); if(!strncmp(d-> name、dev-> name、IFNAMSIZ)){ret = -EEXIST; goto文out_err;}} /*違法SG + CSUMの組み合わせを修正* /IF((DEV->機能&#038; NETIF_F_SG)&#038;&#038;(DEV->機能&#038;(NETIF_F_IP_CSUM |。! NETIF_F_NO_CSUM | NETIF_F_HW_CSUM))){printk("%s:チェックサム機能がないため、NETIF_F_SGを削除します。\\ n"、dev-> name); dev-> features& =〜NETIF_F_SG;} /** nil rebuild_headerルーチン* *それは呼び出されず、場合* ///デフォルトはrebuild_headerが割り当てられているだけでバグトラップとして使用する決してべきである(DEV->! rebuild_header)DEV->。rebuild_header = default_rebuild_header; /**レジストリでデフォルトの初期状態であること* * /set_bit(__ LINK_STATE_PRESENT、& dev-> state); dev-> next = NULL; dev_init_scheduler(dev); write_lock_bh(& dev_base_lock); //初期化、struct net_device ** dev_tail =&#038; dev_base; //これは、実際のコード手段です:devがノードリストの尾* dev_tail = DEVを率いdev_baseチームを追加しました。dev_tail =&#038; DEV->次; //このノードがに追加されます主キーhlist_add_headの名前リストアレイdev_name_headハッシュで(&#038; DEV-> name_hlist、ヘッド)アレイはdev_index_head //の主キーに加え、このノードのシリアル番号をリスト

Copyright © Windowsの知識 All Rights Reserved