Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> プロトコルスタックのLinuxのリンク層上でのデータ送信(追加インターフェース(IV)ブリッジ)

プロトコルスタックのLinuxのリンク層上でのデータ送信(追加インターフェース(IV)ブリッジ)

  

既に解析された、ブリッジインタフェース、発呼IOCTL(br_socket_fd、SIOCBRADDIF、&#038の使用者空間に添加される場合、IFR DEV-> do_ioctl = br_dev_ioctlにアクセスするIOCTL、br_dev_ioctlに進む:(NET /brige /br_ioctl do_ioctl割り当てられている値、即ち;)は>ボイドbr_dev_setup(構造体net_deviceの*のDEV-のDEVが)で指摘されています.C)のint br_dev_ioctl(構造体net_device * DEV、構造体いるifreq * RQ、int型のCMD){構造体net_bridge * BR = netdev_priv(DEV)、スイッチ(CMD){ケースSIOCDEVPRIVATE:(DEV、RQ、CMD)old_dev_ioctl返す; //(CMD;ブリッジIOCTL 0X%X \\ n"サポートしていない"(); ifr_ifindex、CMD​​ == SIOCBRADDIF BR、RQ->)} pr_debug戻りadd_del_if://インタフェースケースSIOCBRDELIFを削除:インタフェースケースSIOCBRADDIFを追加; -EOPNOTSUPPを返す;}我々はユーザ空間での使用の兆候をSIOCBRADDIFです。したがって、フローはadd_del_if()静的INT add_del_if進む(構造体net_bridgeは* BR、INTのifIndex、INT isadd)

{構造体net_device * DEV; int型のRET;もし戻り-EPERM(可能な(CAP_NET_ADMIN)!); DEV = dev_get_by_index(のifIndex);(isadd)RET = br_add_if(BR、DEV)場合;(DEV == NULL)が-EINVALを返す場合elseret = br_del_if(BR、DEV); dev_put(DEV);戻りRET;} CMDため= = SIOCBRADDIFコールbr_add_if()、真である:INT br_add_if(構造体net_bridge *のBR、構造体net_device * DEV)(ネット/brige /br_if.c)){構造体net_bridge_portは* P; INT ERR = 0; //ループ。または非ネットワークインターフェース、及び(DEV->場合、フラグ& IFF_LOOPBACK | |  DEV-> TYPE = ARPHRD_ETHER)ブリッジパケットタイプとして-EINVAL;! //コンストラクタ関数を返す場合(DEV-> hard_start_xmit == br_dev_xmit)戻り-ELOOP; //このインターフェースは、ブリッジする場合に既に存在している(DEV - > br_port = NULL)-EBUSYを返す; //はDEV .dev->のブリッジインターフェイスを作成する。br_port!ポイントは、ブリッジポート//DEV->属し、br_port-> BR://ブリッジインタフェースはnet_bridge_portifを作成するためにそれが属するポイント(IS_ERRた(p = new_nbp(BR、DEV、br_initial_port_cost(DEV))))PTR_ERRを返します(P); //更新ポート - > MAC対応テーブルIF((ERR = br_fdb_insert(BR、P、DEV-> dev_addr、1)))destroy_nbp(P);他の場合((ERR = br_sysfs_addif(P) ))del_nbp(P);他{//無差別モードdev_set_promiscuity(DEV、1)のインターフェイスを設定する。BR-するアップデート>リスト;; //P-> list_add_rcu中にPort_list(& P->リスト、&アンプ; BR->にPort_list); spin_lock_bh(& BR->ロック); br_stp_recalculate_bridge_id(BR)、IF((BR-> DEV->フラグ& IFF_UP);&#038&#038

。 (DEV->フラグ& IFF_UP)&& netif_carrier_ok(DEV))br_stp_enable_port(P); spin_unlock_bh(& BR->ロック); dev_set_mtu(BR-> DEV、br_min_mtu(BR));} ERRを返す;}関数はnet_bridge_port new_nbpインターフェイスのために作成されます。この機能は、比較的単純である:静的構造体net_bridge_port * new_nbp(構造体net_bridgeの*のBR、

構造体net_device * DEV、符号なしのロングコスト){int型のインデックス、構造体net_bridge_port * P;

インデックス= find_portno( BR)、GFP_KERNEL)(; 0)ERR_PTR(インデックス)を返し、P = kmallocの(はsizeof(* Pインデックス<);場合(p == NULL)がERR_PTR(-ENOMEM)を返した場合、のmemset(P、0、はsizeof (* P)); P-> BR = BR; dev_hold(DEV); P-> DEV = DEV; P-> path_cost =コスト; P->優先= 0x8000の>> BR_PORT_BITS; DEV- > br_port = P、P-> PORT_NO =指数; br_init_port(P); P->状態= BR_STATE_DISABLED; kobject_init(&#038; P-> KOBJ); Pを戻し、後}、インタフェースに対応する追加しますネイティブPROT&mdashに静的エントリとしてMACインターフェース、MAC対応テーブル。 (RET = fdb_insert; spin_lock_bh(&#038; BR-> hash_lock)これは、(構造体net_bridgeの*のBR、構造体net_bridge_port *、INTただし、is_local源、CONST unsigned char型の*のADDR){int型のRETのint br_fdb_insertでbr_fdb_insert()で達成されますBR、ソース)、ADDR、ただし、is_local; spin_unlock_bh(&#038;&BR-GT; hash_lock);戻りRET。

Copyright © Windowsの知識 All Rights Reserved