1 / 8
文档名称:

linux协议栈之链路层上的数据传输(新建网桥).doc

格式:doc   大小:21KB   页数:8页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

linux协议栈之链路层上的数据传输(新建网桥).doc

上传人:wxc6688 2019/9/8 文件大小:21 KB

下载得到文件列表

linux协议栈之链路层上的数据传输(新建网桥).doc

文档介绍

文档介绍:linux协议栈之链路层上的数据传输(新建网桥)新建网桥:从上面的分析可以知道,在用户空间调用ioctl(br_socket_fd,SIOCBRADDBR,brname).进入到br_ioctl_deviceless_stub,可以看到它的相关处理:intbr_ioctl_deviceless_stub(unsignedintcmd,void__user*uarg){switch(cmd){caseSIOCGIFBR:caseSIOCSIFBR:returnold_deviceless(uarg);//新建网桥caseSIOCBRADDBR://删除网桥caseSIOCBRDELBR:{charbuf[IFNAMSIZ];if(!capable(_ADMIN))return-EPERM;//copy_from_user:把用户空间的数据拷入内核空间if(copy_from_user(buf,uarg,IFNAMSIZ))return-EFAULT;buf[IFNAMSIZ-1]=0;if(cmd==SIOCBRADDBR)returnbr_add_bridge(buf);returnbr_del_bridge(buf);}}return-EOPNOTSUPP;}在这里,(buf)中进行:intbr_add_bridge(constchar*name){_device*dev;intret;//_device//在前面“网络设备的管理”经讲述此结构dev=new_bridge_dev(name);if(!dev)return-ENOMEM;rtnl_lock();//由内核确定接口名字,例如eth0eth1等if(strchr(dev->name,'%')){ret=dev_alloc_name(dev,dev->name);if(retgotoerr1;}//向内核注册此网络设备ret=device(dev);if(ret)gotoerr2;dev_hold(dev);rtnl_unlock();//在sysfs中建立相关信息ret=br_sysfs_addbr(dev);dev_put(dev);if(ret)dev(dev);out:returnret;err2:dev(dev);err1:rtnl_unlock();gotoout;}网桥的注册跟我们以前看到的物理网络设备注册是一样的。_device结构是什么样的,继续跟踪进new_bridge_dev:_device*new_bridge_dev(constchar*name){_bridge*br;_device*dev;//_devicedev=dev(sizeof(_bridge),name,br_dev_setup);if(!dev)returnNULL;dev_priv(dev);//私区结构中的dev字段指向它本身br->dev=dev;br->lock=SPIN_LOCK_UNLOCKED;//队列初始化。在port_list中保存了这个桥上的端口列表INIT_LIST_HEAD(&br->port_list);br->hash_lock=SPIN_LOCK_UNLOCKED;//下面这部份代码跟stp协议相