版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、linux 协议栈之网桥实现之一简单网卡驱动最个函数 netif_receive_skb. 就从说起。 起见,去掉里面预编译代码 int netif_receive_skb(struct sk_buff *skb)( net/core/dev.c )struct packet_type *ptype, *pt_prev;int ret = NET_RX_DROP;unsigned short type;/打接收时间戳if (!skb->stamp.tv_sec)net_timestamp(&skb->stamp);/ 如果存 dev->master 。则更新相应指针
2、skb_bond(skb);/ 更新 CPU 接收统计数据_get_cpu_var(netdev_rx_stat).total+; skb->h.raw = skb->nh.raw = skb->data; skb->mac_len = skb->nh.raw - skb->mac.raw;pt_prev = NULL;rcu_read_lock();/处理所有协议模块 list_for_each_entry_rcu(ptype, &ptype_all, list) if (!ptype->dev | ptype->dev = skb-&
3、gt;dev) if (pt_prev) ret = deliver_skb(skb, pt_prev);pt_prev = ptype;/分片处理 handle_diverter(skb);/网桥处理if (handle_bridge(&skb, &pt_prev, &ret)goto out;type = skb->protocol; /协议调相应模块处理。 list_for_each_entry_rcu(ptype, &ptype_basentohs(type)&15, list) if (ptype->type = type&
4、&(!ptype->dev | ptype->dev= skb->dev) if (pt_prev) ret = deliver_skb(skb, pt_prev);pt_prev = ptype; if (pt_prev) ret = pt_prev->func(skb, skb->dev, pt_prev); else kfree_skb(skb);/* Jamal, now you will not able to escape explaining* me how you were going to use this. :-)*/ret = NET
5、_RX_DROP;out:rcu_read_unlock();return ret;此函数主完成分片重组, 网桥处理, 根据不同协议调不同传 输层处理模块。本节重点概述 linux 网桥实现处理。传输层 协议分层续章节陆续给出。进入网桥处理代码: #if defined(CONFIG_BRIDGE) | defined (CONFIG_BRIDGE_MODULE)( net/core/dev.c )int (*br_handle_frame_hook)(struct net_bridge_port *p, struct sk_buff *pskb);static _inline_ int ha
6、ndle_bridge(struct sk_buff *pskb,struct packet_type *pt_prev, int *ret)struct net_bridge_port *port; /回环接口?非以太网接口? if (*pskb)->pkt_type =PACKET_LOOPBACK |(port = rcu_dereference(*pskb)->dev->br_port) = NULL) return 0;if (*pt_prev) *ret = deliver_skb(*pskb, *pt_prev); *pt_prev = NULL;/ br_ha
7、ndle_frame_hook 个全局函数指针 return br_handle_frame_hook(port, pskb);#else#define handle_bridge(skb, pt_prev, ret) (0)#endif 从此以看出。如果编译时候选择网桥模式,则进入网桥 处理模块,否则,只个空函数,直接返回。 br_handle_frame_hook 代表函数什么呢?网桥数据处理框 架又什么样呢?关于网桥: 网桥个二层设备,深入以当成个二层交换机。二层协议 转发数据。网桥转发数据,维持个端口 MAC 应表,通常通 CAM 表。根据这张表以数据送往相应端口进行发送.网桥转发过程
8、: 1:接收个包。 判断自己 CAM 表否含包此包源地址 如果没有,则源地址端口更新至于CAM 表 .2:判断包否送给本机,如果,则送往本机层协议栈处理。如果不,则查寻 CAM 表。找相应出口。 3:如果找出口,则此包送至出口。如果不存,各端口发送。 4 :如果 CAM 表应表项规定时间没 有得更新,则除此项。网桥配置: Brctl 个比较好配置网桥工 具。源代码配置极其简单。 们从网桥配置流程说起,看 linux 核怎样步步管理。首先,创建个网桥 : brctl addbr br0 (建立个 br0 网桥 ) 然,接口添加进网桥: brctl addif br0 eth0 (eth0eth1
9、 添加进网桥 br0)brctl addif bro eth1OK, 网桥现就配置好。这台 linux 主机 以当作交换机使,从 eth0 包都以转发 eth1 。现,们看代码 进行处理首先 brctl addbr 。查看 brctl 代码调: ioctl(br_socket_fd, SIOCBRADDBR, brname); 然 brctl addif brctl 代码调: ioctl(br_socket_fd, SIOCBRADDIF, &ifr); 呵呵。 Brctl 代码简单吧,只调户空间配置工具 ioctl.Linux 网 桥分析:好,现就以进入核分析网桥模式:static
10、int _initbr_init(void)( net/brige/br.c )/ 分配 slab 缓冲区br_fdb_init();/网桥 netfiter 处理,以章节分析#ifdef CONFIG_BRIDGE_NETFILTERif (br_netfilter_init()return 1;#endif/ 户空间 ioctl 调函数 brioctl_set(br_ioctl_deviceless_stub);/ 接收数据包处理, 就们面 netif_receive_skb 函数看 br_handle_frame_hookbr_handle_frame_hook = br_handle_
11、frame;#if defined(CONFIG_ATM_LANE) | defined(CONFIG_ATM_LANE_MODULE)#endifbr_fdb_get_hook = br_fdb_get;br_fdb_put_hook = br_fdb_put;/netdev_chain 通知链表注册。 关于通知链表, 面已经介绍过,这里不再讨论register_netdevice_notifier(&br_device_notifier);return 0;新建网桥:从面分析以知道,户空间调ioctl(br_socket_fd,SIOCBRADDBR, brname). 进入 br
12、_ioctl_deviceless_stub, 以看相关处理: int br_ioctl_deviceless_stub(unsigned int cmd, void _user *uarg)switch (cmd) case SIOCGIFBR:case SIOCSIFBR:return old_deviceless(uarg);/新建网桥case SIOCBRADDBR:/除网桥case SIOCBRDELBR:char bufIFNAMSIZ;if (!capable(CAP_NET_ADMIN) return -EPERM;/copy_from_user: 户空间数据拷入核 空间if
13、(copy_from_user(buf, uarg,IFNAMSIZ)return -EFAULT;bufIFNAMSIZ-1 = 0;if (cmd = SIOCBRADDBR)return br_add_bridge(buf);return br_del_bridge(buf);return -EOPNOTSUPP;这里,们传入 cmdSIOCBRADDBR. 转入 br_add_bridge(buf) 进行: int br_add_bridge(const char *name)struct net_device *dev;int ret;/ 虚拟桥新建个 net_device/面“网络
14、设备管理”经讲述此结构dev = new_bridge_dev(name);if (!dev)return -ENOMEM;/sysfs 建立相关信息ret = br_sysfs_addbr(dev); dev_put(dev);if (ret)unregister_netdev(dev);out:return ret;err2:free_netdev(dev);err1:rtnl_unlock();goto out;网桥注册跟们以看物理网络设备注册样。们关心网桥应 net_device 结构什么样, 继续跟踪进 new_bridge_dev :static struct net_device
15、 *new_bridge_dev(const char *name) struct net_bridge *br;struct net_device *dev;/ 分配 net_devicedev = alloc_netdev(sizeof(struct net_bridge),name,br_dev_setup);if (!dev)return NULL; 网桥私区结构 net_bridgebr = netdev_priv(dev);/ 私区结构 dev 字段指向本身br->dev = dev; br->lock = SPIN_LOCK_UNLOCKED;/ 队列始化。 port
16、_list 保存这个桥端口列表 INIT_LIST_HEAD(&br->port_list); br->hash_lock = SPIN_LOCK_UNLOCKED;/ 面这部份代码跟 stp 协议相关 ,们暂不关心br->bridge_id.prio0 = 0x80;br->bridge_id.prio1 = 0x00;memset(br->bridge_id.addr, 0, ETH_ALEN); dev->open = br_dev_open; dev->set_multicast_list = br_dev_set_multicast_
17、list;dev->change_mtu = br_change_mtu; dev->destructor = free_netdev; SET_MODULE_OWNER(dev);dev->stop = 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 应
18、私区结构: struct net_bridge /读锁spinlock_t lock;/端口列表port_list;struct list_head*dev;/网桥应虚拟设备 struct net_device /网桥应虚拟网卡统计数据struct net_device_statsstatistics;/hash 表锁spinlock_thash_lock;/MAC PORT 应表,即CAMstruct hlist_headhashBR_HASH_SIZE;struct list_headage_list;/* STP */u16root_port;rtnl_lock();br->stp
19、_enabled = 0;br_stp_timer_init(br);return dev;/stp 协议应数据stp_enabled;unsigned char /由核确定接口名字,例如 eth0 eth1 等br->designated_root = br->bridge_id;designated_root;bridge_id unsigned char topology_change; if (strchr(dev->name, %) br->root_path_cost = 0;br_dev_setup 还做些另函数指针始化:bridge_id bridge_
20、id;ret = dev_alloc_name(dev, dev->name);br->root_port = 0;void br_dev_setup(struct net_device *dev)u32 root_path_cost; if (ret < 0)br->bridge_max_age = br->max_age = 20 * HZ;unsigned long max_age;goto err1;br->bridge_hello_time = br->hello_time = 2 * HZ;/桥 MAC 地址设零unsigned long
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年秦皇岛辅警招聘考试真题含答案详解(培优b卷)
- 2023年运城辅警招聘考试题库附答案详解(考试直接用)
- 2024年大兴安岭辅警协警招聘考试真题含答案详解(研优卷)
- 2023年酉阳土家族苗族自治县辅警协警招聘考试备考题库含答案详解(完整版)
- 2023年许昌辅警招聘考试真题附答案详解(培优b卷)
- 2023年赤峰辅警招聘考试题库附答案详解(b卷)
- 2024年吉安辅警招聘考试题库附答案详解(研优卷)
- 2024年北海辅警招聘考试题库及答案详解(历年真题)
- 2024年唐山辅警招聘考试题库及答案详解(基础+提升)
- 2024年吉安辅警招聘考试题库及参考答案详解一套
- 《高危新生儿分类分级管理专家共识(2023)》解读
- 高考语文复习:补全句子 课件
- 正常分娩(妇产科学课件)
- 飞检体系建筑项目评分表
- 工业产品数字孪生赛项理论题库
- 第2课 古代希腊罗马(新教材课件)-【中职专用】《世界历史》(高教版2023•基础模块)
- 2023年注册土木工程师(道路工程)考试:公共基础历年真题汇编(共657题)
- 多重耐药菌手术患者护理
- 文化服务小分队工作总结
- 工艺工程师年度述职报告模板
- 【众安保险SWOT探析及发展策略11000字(论文)】
评论
0/150
提交评论