Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> プロトコルスタックのLinux(新しい橋(III))のリンク層上のデータ伝送

プロトコルスタックのLinux(新しい橋(III))のリンク層上のデータ伝送

  
 

新しい橋:上記の分析から、br_ioctl_deviceless_stubにユーザ空間で(br_socket_fd、SIOCBRADDBR、brname)のioctlを呼び出し、知っているかもしれません、あなたはそれに関連する処理:.のInt br_ioctl_deviceless_stub(unsigned int型CMD、無効__user * uarg見ることができます){スイッチ(CMD){ケースSIOCGIFBR:ケースSIOCSIFBR:(uarg)をold_deviceless返す; //新しいブリッジケースSIOCBRADDBR://ブリッジケースSIOCBRDELBRを削除します!{チャーBUF [IFNAMSIZ]; IF(可能な(CAP_NET_ADMIN))戻り-EPERM; //copy_from_user:もしユーザ空間にカーネル空間へデータ(copy_from_user(BUF、uarg、IFNAMSIZ))戻り-EFAULT; BUF [IFNAMSIZ-1] = 0; IF(CMD == SIOCBRADDBR)戻りbr_add_bridge 。(BUF); br_del_bridge(BUF)を返す;}} -EOPNOTSUPPを返す;}ここでは、CMDをSIOCBRADDBR br_add_bridge(BUF)に渡されるが行われます。int br_add_bridge(定数文字*名){構造体net_device * DEV; int型RET; //フロントnet_device //&'で仮想ブリッジを作成し、ネットワーク管理装置&'を、この構造で約DEV = new_bridge_dev(名前を);(!DEV)

リターン-ENOMEM場合。 rtnl_lock(); //内部によってインターフェースの名前を決定すること、例えばeth0のeth1のような場合(strchr(DEV->名、 '%')){RET = dev_alloc_name(DEV、DEV->名);場合(RET< 0)後藤ERR1;} //(RET)後藤ERR2場合;カーネルに、このネットワークデバイスRET = register_netdevice(DEV)を登録dev_hold(DEV); rtnl_unlock(); //SYSFSに関連する情報の確立RET = br_sysfs_addbr(DEV); dev_put(DEV);場合(RET)

unregister_netdev(DEV);アウト:リターンRET; ERR2:登録された物理ネットワークデバイスを参照するためにブリッジする前に米国で登録};:; rtnl_unlock();後藤うちfree_netdev(DEV)ERR1それは同じです。我々は、ブリッジ構造はnew_bridge_devに追従し続けるもの、net_device対応することを懸念している;構造体net_device * DEV、静的構造体net_device * new_bridge_dev(CONST文字*名){構造体net_bridgeの*のBRを//割り当てnet_devicedev = alloc_netdev(はsizeof (構造体net_bridge)、名前、br_dev_setup); IF(DEV)戻りNULL;!ブリッジ構造net_bridgebr = netdev_priv(DEV)のプライベート領域; //プライベートエリア構造DEVフィールドポイント自体にBR-> DEV = DEV; BR->ロック= SPIN_LOCK_UNLOCKED; //キューを初期化します。ブリッジINIT_LIST_HEADのポートのリストに保存さにPort_list(&#038; BR->にPort_list); BR-> hash_lock = SPIN_LOCK_UNLOCKED;この部分の下の契約に関連付けられている//STPコード、我々はBR->を気にしないだろう。 bridge_id.prio [0] = 0x80を、BR-> bridge_id.prio [1] = 0x00の;のmemset(BR-> bridge_id.addr、0、ETH_ALEN); BR-> stp_enabled = 0; BR-> designated_root = BR-> bridge_id; BR-> root_path_cost = 0; BR-> root_port = 0; BR-> bridge_max_age = BR-> max_ageの= 20 * HZ; BR-> bridge_hello_time = BR-> hello_time = 2 * HZ; BR-> bridge_forward_delay = BR-> forward_delay = 15 * HZ; BR-> topology_change = 0; BR-> topology_change_detected = 0; BR-> ageing_time = 300 * HZ; INIT_LIST_HEAD(&アンプ; BR-> age_list); br_stp_timer_init(BR);戻りDEV;}また、いくつかの他の関数ポインタの初期化で行わbr_dev_setup:ボイドbr_dev_setup(構造体net_device * DEV){//ゼロのmemsetへのブリッジのMACアドレス(DEV-> dev_addr、0、ETH_ALEN); //イーサネット構成ether_setup(DEV)を初期化; //関数ポインタ系列を初期化DEV-> do_ioctl = Br_dev_ioctl; DEV-> get_statsの=のbr_dev_get_stats; DEV-> hard_start_xmit = br_dev_xmit; DEV-> =オープンbr_dev_open; DEV-> set_multicast_list = br_dev_set_multicast_list; DEV-> change_mtu = br_change_mtu; DEV->デストラクタ= free_netdev; SET_MODULE_OWNER(DEV); DEV->停止= br_dev_stop; DEV-> accept_fastpath = br_dev_accept_fastpath; DEV-> tx_queue_len = 0; DEV-> set_mac_address = NULL; DEV-> priv_flags = IFF_EBRIDGE;}この部分プライベート空間エリアブリッジデバイスのコピーが初期化されます。ここでは、プライベートドメイン構造を対応net_device橋渡しする必要があります。

Copyright © Windowsの知識 All Rights Reserved