找回密码
 注册

QQ登录

只需一步,快速开始

查看: 213134|回复: 251

H618C 刷 OpenWrt 并支持 IPTV VLAN 硬件处理的方法

    [复制链接]
发表于 2011-4-8 22:31:35 | 显示全部楼层 |阅读模式
这个帖子的内容会很多,写下来仅给和我一样追求完美的朋友参考。如果有人要说,我就用电信送的网关来看IPTV, 再用一个自己的无线路由器,两个一起用交换机连 ONU 就行了,为毛要折腾 VLAN ? 那我请你要么耐着性子看下去,我会解释为什么这个方法不好;要么就不要往下看了,也不要回帖了,节省大家的时间。

经过好几个晚上的折腾,终于让家里的网络架构完美了。现在我的 H618C 上面跑着 OpenWrt, 接两路 IPTV, 再当路由器,跑 BT 下载能稳定在 2.0MB/s, 同时两路 IPTV 也完全不卡,H618C 的 CPU 还空闲 40%.

先介绍一点背景知识:

电信现在的 FTTH 能同时提供 PPPoE 上网,IPTV 和 VoIP 业务。这是靠 VLAN 来实现的。ONU, 或者俗称的 光猫 上的以太口,是一个 VLAN TRUNK 的端口,也就是说上面同时跑了多路 VLAN 数据。那么理想情况下,如果用分离的设备要怎么来用这些业务呢?

有人说,直接把普通的无线路由器接到 ONU 上面,就可以 PPPoE 拨号了。这没错。但是如果直接把 IPTV 机顶盒接到 ONU 上,能工作吗?不能。这是为什么呢?

因为 FTTH 过来的 PPPoE 数据走的是所谓的 native VLAN, 意思就是,这个 VLAN 上的以太帧,是没有 VLAN 标签的,事实上也就是普通的以太帧。一般来说,用户的终端网络设备只能处理这种以太帧。而 IPTV 的数据就不一样了,上面的以太帧是打上了 VLAN 标签的,这样一来,IPTV 机顶盒就没法直接用了,必须有设备把这些 VLAN 标签去掉再转发给 IPTV 机顶盒,然后才能用。这是下行方向的,上行方向是倒过来的,必须要有设备把 IPTV 发出来的普通数据包打上 VLAN 标签再传到 ONU 上,这样才能,顺利地把 IPTV 机顶盒的请求数据发到局端正确的 VLAN 上去。

所以这里需要的是一个支持 VLAN 功能的交换机。需要配置三个端口:一个是 VLAN TRUNK, 直接和 ONU 上的端口相连;另两个分别是连 PPPoE 设备和 IPTV 机顶盒的端口,它们都需要配置成 untag 模式,也就是说,从它们出去的端口必须要不带 VLAN 标签。

这里说的能处理 VLAN 标签的交换机不是那种几十块钱就能买到的傻瓜交换机,而是一般用在企业里的支持网管功能的那种。当然了,这样的东西大多数人家里是不会有的,电信也不会免费送给你。那么这个处理 VLAN 标签的功能就必须在电信送给你的网关里来实现。他们是怎么样来实现的呢?答案是:靠 CPU 和软件来实现的。具体到 H618C 上,就是依赖于 Linux 内核里的 802.1q 功能来实现的。CPU 会检查 WAN 上收到的所有数据包,并根据 VLAN 标签再把这些数据包转发到不同的端口上。这时候,交换机的功能实际上也被 CPU 接管了,H618C 后面四个 LAN 口不再是一个交换机里的了,而是变成了四个独立的网络设备,它们之间的数据转发依赖的是 Linux 内核里的 bridge 功能。

说得再明白一点,这个方法等效于一台装了五张网卡的 Linux 机器(无线网卡没算进去),然后依赖 Linux 内核实现 VLAN 标签和交换机的功能。这种实现方法和用硬件 VLAN 交换机的方法差别太大了,前者效率非常低下,基本上是让 CPU 去干它最不擅长的活。这就有点类似于 H264 视频的软解和硬解的区别。

看到这里如果你还没晕的话请继续看下去哈~~

我们现在来回答一开始的问题:为什么直接用傻瓜交换机把电信网关和自己的无线路由器与 ONU 一起接起来不好?首先这个方法在处理 IPTV VLAN 标签上一点改进也没有,靠的就是 CPU 和软件来处理。其次,用这个方法的时候,你在看 IPTV 直播的时候,你所有的 IPTV 数据包都会被一并广播到你自己的 PPPoE 无线路由器上,凭空增加它的负担。虽然理论上讲,IPTV 直播依赖的是 IPv4 组播技术,在合适的设备上,只有 IPTV 机顶盒才会收到直播数据包。但不幸的是,这里 ONU 后面接的是一个不支持 IGMP snooping 的傻瓜交换机,它会把组播数据当成广播数据来处理,于是你的 PPPoE 设备也就会不停地收到视频包,网卡不停地通知 CPU 有数据来了,CPU 忙着让网卡丢弃不属于它的数据。

接下来是本文的重点了:H618C 和广大其它型号的电信赠送的网关一样,采用的是标准的 BCM6359(8) + BCM5325E 的方案,这里 BCM5325E 是一个交换机芯片。如果你查一下它的功能简介,就会发现它是支持 802.1Q VLAN 的。这是什么意思呢?意思就是,理论上讲,它也能实现前面提到的企业级网管交换机才有的硬件处理 VLAN 标签的功能。也就是说我们有希望可以摆脱 CPU + 软件 这种低效的方式。

第一部分先写到这里吧,让我休息一下再继续。。


补充内容 (2011-7-5 14:31):
应网友要求,补充一下具体的接法。在13页 #123 那里有张图还有一些解释。

补充内容 (2011-8-31 11:59):
最后买了一个 RT-N16, 里面用的是 BCM53115, 一个机器可以搞定全部的事情。下面这个链接的27楼有方法:
https://www.chinadsl.net/forum.php?mo ... &fromuid=266817

补充内容 (2011-10-8 19:13):
Atheros 系的 Buffalo WZR HP G300NH 也可以用交换机硬件直接处理 VLAN, 请看
https://www.chinadsl.net/forum.php?mo ... &fromuid=266817

补充内容 (2011-11-26 08:36):
还有一个用软件处理VLAN看IPTV的帖子:https://www.chinadsl.net/forum.ph ... &fromuid=266817

评分

参与人数 2威望 +6 收起 理由
hotqj + 3 支持纯技术帖子。
MINE + 3 关于VLAN的解释,可以深入浅出些。

查看全部评分

 楼主| 发表于 2011-4-8 23:06:07 | 显示全部楼层
回复 spicahan 的帖子

第二部分

前面说了,电信送的网关里用的 BCM5325E 有可能可以取代企业级网管交换机来处理 IPTV VLAN 标记。那到底是可能还是不可能呢?答案是,视情况而定。经过我的的反复尝试,还修改了 OpenWrt 里 BCM5325 对应的内核驱动代码,得出的结论是:

5325E 只能划分 16 组 VLAN, 但 VLAN ID 可以设 0 到4094 任意数字。同时,只有当 VLAN ID 被 16 除的商是一样的 VLAN 组才能同时工作。这句话很绕。我们举几个具体的例子:假设我们在 5325E 上划分了 4 个 vlan, 对应的 vid 是 0, 1, 3, 5, 这没问题,可以工作,因为 vid 除以 16 都等于 0;假设 4 个 vid 是 80, 81, 83, 85, 也没问题,因为它们除以16的商都是5; 但如果 4 个 vid 分别是 51, 80, 81, 85 会怎么样呢?那会是:要么只有 vlan 51 能工作;那么只有 vlan 80, 81, 85 能工作。写到这里我要告诉你最大的不幸了:IPTV 对应两个 VLAN ID: 51用来传直播的视频数据;85用来传请求和点播的数据。也就是说,在 5325E 上,你是做不到让一个端口上既有 VLAN 51 又有 VLAN 85 的数据的,其中 VLAN 85 是必须有的,没有 VLAN 51 的后果是看不了直播,但不影响点播、回看之类的功能。

第一个结论来了:只用基于 BCM5325E 的网关,靠硬件处理 VLAN, 直播功能是不可能实现的。但点播的支持会完美。如果你的 IPTV 只是用来回看、点播的话,这也是可以接受的了。

下面说说怎么配置。首先你需要把它刷成 OpenWrt. 然后你需要修改 switch-robo.c 这个源文件,把里面的 .vlans = 16 修改成 .vlans = 96, 重新编译出一个 switch-robo.ko.

接下来要配三个 VLAN:
VLAN 80: 对应需要上网的LAN口,也就是背面的 1, 3 两个端口:
echo '0u 2u 5t' > /proc/switch/eth1/vlan/80/ports

VLAN 81: 对应 PPPoE, 注意,这里 WAN 用到的是背面的 4 号口,不能用标着 WAN 的那个端口。
echo '3u* 5t' > /proc/switch/eth1/vlan/81/ports

VLAN 85: 对应 IPTV, 用到背面标着 iTV 的 2 号口
echo '1u* 3t' > /proc/switch/eth1/vlan/85/ports

这时候,需要把 OpenWrt 里的 LAN 设成 eth1.80, WAN 设成 eth1.81, 然后就可以了。ONU 和 H618C 背面的 4 号口相连就行了。

第二部分就写到这里。接下来我会写怎么样用最小的成本,让直播也能正常工作。
 楼主| 发表于 2011-4-8 23:29:01 | 显示全部楼层
回复 spicahan 的帖子

第三部分

前面提到了 BCM5325E 这个被广泛应用于百兆家庭路由器里的芯片,在 802.1Q 的支持上是有致命缺陷的,当然这也只是我自己试验下来的结果。如果能找到它的 data sheet, 还有可能能解决,但我是不抱希望了。国外的 FTTH 用户已经开始用支持 802.11n 和千兆端口的无线路由器了,比如现在的当红产品 Linksys E3000. 千兆产品用的交换机芯片当然不再是 5325E 了,而是 BCM53115, 它支持完整的 802.11Q, IPTV 的 VLAN 51 和 VLAN 85 可以同时出现在一个端口上,于是直播就解决了。如果你想升级到高端的 2.4G/5G 双频无线路由器的话,可以直接上 Linksys E3000.

不过我已经有一个 Apple Extreme Base Station 了,这个方案对我来说就不现实了。我的做法是,买了一个市面上最便宜的支持 802.1Q 功能的交换机。我找到的是 TP-Link 的 TL-SF1008L,这是一个8口 的 交换机,200多元,相比于二手的 CISCO 2940还是便宜不少的。我家需要插网线上网的设备比较多,再买一个交换机也不算很过分,所以我就上了。不过确实便宜没好货,这个交换机在 VLAN TAG 的处理上也有致命缺陷,参见我之前发的问 PPPoE VLAN ID 的帖子。这里不详细讲了。最后的结论就是,SF1008L 和 5325E 两者的 VLAN 功能结合起来用,刚好可以满足所有的需求。细节不想写了,不是很难,就是需要一点点想像力。。而且我不信真的会有人和我干一样的事情。。。

补充内容 (2011-7-5 13:44):
看来已经有人和我干一样的事情了。。那我补充一下吧,首先,光猫要重启一下,不然会看不了直播的。

补充内容 (2011-7-5 13:46):
H618C和1008L这样互补:1008L上IPTV那个端口转发的时候去掉VLAN TAG, 这样IPTV的两个VLAN就变成一个了,H618C就能处理了。然后反方向的设置,H618C往1008L转发IPTV的时候,端口上加上85这VLAN TAG就行了。
 楼主| 发表于 2011-4-10 10:31:12 | 显示全部楼层
回复 chmjiong 的帖子


请看附件里的图。

右边六个端口就是 5325E 提供的,其中 Port 5 在 H618C 里没用到,而最右边那个端口是固定接 CPU 的。
假设你是在端口1上桥接自己的路由器的,那么如果用电信自己的 firmware 的时候,下行的数据的流向是这样的:
WAN -> CPU, 这一步靠 CPU 来分析 VLAN 标签
然后 CPU -> CPU Port, CPU 加上自己的内部 VLAN 标签
然后 CPU Port -> Port 1, 5325E 去掉内部的 VLAN 标签

这个过程中,数据的接收,处理、发送都有 CPU 的参与。电信的 firmware 如果不稳定,那这个桥接就是不稳定的,哪怕你自己后面接的路由器是骨干网上用的,照样会断线。

如果按我的方法,图里的 WAN 口是不需要用到的,ONU 过来是接 Port 4 的,这时候是一个真正的二层链路的桥接,
数据的流向就是直接的

Port 4 -> Port 1

这个过程完全没有 CPU 的参与,纯粹是硬件完成的,你把 CPU 拆掉,一样能工作。

同理,如果是 IPTV 的话,其实也是桥接,这应该是一个二层链路的桥接,但如果用电信自己的 firmware, 下行的数据流向是这样的:
WAN -> CPU, 去掉 VLAN 的标签,
CPU -> CPU Port, 加上内部 VLAN 标签
CPU Port -> Port 2, 5325E 去掉 VLAN 标签
而如果按我的方法来,这个过程就是
Port 4 -> Port 2, 5325E 去掉 IPTV VLAN 标签,同样,纯粹是硬件完成的,把 CPU 拆掉照样工作。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2011-4-10 21:57:31 | 显示全部楼层
回复 dogb 的帖子

我用的 OpenWrt 固件倒是没有什么特别的,就是从 openwrt.org.cn 上下载的。
不过 BCM5325E 用的交换机驱动作了小的修改,我把它放在这里

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2011-4-11 12:46:24 | 显示全部楼层
回复 johngoo 的帖子

BCM5325FKQMG, 也就是 5325F 了,这也是 5325E 家族的一种,按道理是支持 VLAN 的,既支持基于端口的 VLAN, 也部分支持 802.1Q VLAN. Google 一下 bcm5325f filetype:pdf
 楼主| 发表于 2011-4-11 15:19:11 | 显示全部楼层
回复 johngoo 的帖子

交换机 vlan 的配置倒不是靠 ifconfig 来做的。
不过 BCM4704 本身是比较特殊的,你要是有兴趣的话,可以去 dd-wrt 上看看,有专门的一页讲 4704 怎么打开 VLAN. 我就不贴 URL 了,省得管理员说我发广告。。。
用 Google 搜 dd-wrt 4704 vlan, 第一个结果就是。
 楼主| 发表于 2011-4-11 15:29:03 | 显示全部楼层
回复 johngoo 的帖子

搜 Enabling VLAN Support for BCM4704
不知道你说的高人说的是哪个硬件不支持 VLAN
 楼主| 发表于 2011-4-11 23:10:37 | 显示全部楼层
回复 victor2002 的帖子

如果让CPU介入的话,就很简单了。假设ONU接在WAN那个口上,它对应的就是 eth0.

eth1对应的是接交换机的那块网卡,它接的就是交换机的 port 5。交换机的 port 1 就是背后写着 iTV 的那个 LAN 2. 剩下 port 0, 2, 3 就是 LAN  1, 3, 4,作用和原来的一样。
然后执行下面的命令:
echo '1u* 5t' > /proc/switch/eth1/vlan/1/ports
echo '0u 2u 3u 5t' > /proc/switch/eth1/vlan/0/ports
vconfig add eth0 51
vconfig add eth0 85
vconfig add eth1 0
vconfig add eth1 1
ifconfig eth0 up
ifconfig eth0.51 up
ifconfig eth0.85 up
ifconfig eth1.0 up
ifconfig eth1.1 up
brctl addbr iptv
brctl addif iptv eth0.51
brctl addif iptv eth0.85
brctl addif iptv eth1.1
ifconfig iptv up
这样 IPTV 就可以了。然后 PPPoE 的 WAN 要设成 eth0, LAN 要设成 eth1.0
当然这是手动设置的方法,
也可以修改 /etc/config/network, 让系统启动的时候自动设好。
 楼主| 发表于 2011-4-12 22:39:48 | 显示全部楼层
回复 victor2002 的帖子

这就有点困难了,因为这样的话要求交换机在硬件上能同时支持51/85两个VLAN并能转发给 cpu 端口,而从目前情况来看,在 5325E 上是做不到的。一定要实现的话只能和我一样去另外买一个支持 VLAN 的交换机了。我觉得奇怪的是,RG100A 应该是 ADSL 用的吧,用的 CPU 是 BCM6358. 如果你用的是 FTTH, 电信肯定会另外给你一个双网卡的猫的,不然用不了啊。。如果你用的是 ADSL 的话就不用考虑 51 这个 VLAN 了, 因为在 ADSL 下面 IPTV 只用到了 85 这个 VLAN.
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|宽带技术网 |网站地图

粤公网安备 44152102000001号

GMT+8, 2024-4-17 06:42 , Processed in 0.031049 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表