RTL8367S自制网管交换机

RTL8367S 芯片官网介绍

RTL8367S-CG

二层管理 5+2 端口 10/100/1000M 交换机控制器

概述

RTL8367S-CG 是一款 LQFP-128 封装的高性能 5+2 端口 10/100/1000M 以太网交换机,具有低功耗集成 5 端口 Giga-PHY,支持 1000Base-T、100Base-TX 和 10Base-T传输标准。

对于特定应用,RTL8367S 支持一个额外的接口,可配置为 RGMII/MII 接口。 RTL8367S 还支持一个可配置为 SGMII/HSGMII 接口的 Ser-Des 接口。 RTL8367S集成了高速交换机系统的所有功能;包括用于数据包缓冲的 SRAM、无阻塞交换结构以及单个 CMOS 器件中的内部寄存器管理。

特点

单芯片 5+2 端口 10/100/1000M 无阻塞交换架构

嵌入式 5 端口 10/100/1000Base-T PHY

每个端口支持全双工 10/100/1000M 连接(半双工仅在 10/100M 模式下支持)

额外接口(扩展 GMAC1)支持

SGMII (1.25GHz) 接口

HSGMII (3.125GHz) 接口

额外接口(扩展GMAC2)支持

媒体独立接口 (MII)

简化的 10/100/1000M 媒体独立接口 (RGMII)

通过 IEEE 802.3x 流量控制和背压进行全双工和半双工操作

应用

5 端口 1000Base-T 路由器,带 SGMII/HSGMII 和/或 MII/RGMII

芯片官网介绍:https://www.realtek.com/Product/Index?id=3699

RTL8367S-CG_Datasheet.pdf1

原理图

外围电路

  1. 使用 USB-C 输出5V电源
  2. 使用 SY8088IAAC 实现 5V 降压 3.3V,使用RTL8367S自带电压转换输出1.1V
  3. 使用 W25Q32JVSSIQ 4MB spi norflash 存储固件
  4. 使用 5个 HR911130A 自带变压器和 LED 的单端口RJ45连接器
  5. 转出 TX/RX 串口
  6. 带 3.3V 供电拉低按钮 + 芯片重置按钮
  7. 25M 晶振时钟

3D效果图

固件

借用网件GE105Ev2的固件

https://www.netgear.com/cn/business/wired/switches/plus/gs105ev2/

网件固件.bin,大小2M。

使用烧录器(例如CH341)烧写到 spi norflash中。

修改mac地址

固件MAC地址固定为00:00:00:00:00:01,编辑固件中偏移地址 0x1FC000指定MAC地址,可以随机生成MAC

web管理截图

  1. RTL8367S-CG_Datasheet.pdf↩︎

C语言零长数组使用技巧

在标准C语言(ANSI C)中规定不能定义长度为0的数组。标准可见 ISO 9899:2011 章节 6.7.6.2

数组长度的声明表达式中,如果表达式是一个常量表达式,它的值应该大于零。

但是,有些编译器就把0长度的数组成员作为自己的非标准扩展,例如GNU C —— Arrays of Length Zero

什么是零长数组

1
2
3
4
5
6
7
8
#include <stdio.h>

int main() {
int buf[0];
printf("sizeof(int[0]) = %lu", sizeof(buf));
// sizeof(int[0]) = 0
return 0;
}

在程序中定义一个零长度数组,sizeof() 计算出大小为0,也就是说,零长数组是不占用内存空间的

怎么使用零长数组

零长度数组一般不单独使用,它常常作为结构体的最后一个成员,构成一个变长结构体。

我们定义一个结构体用于接受对端发送的所有传感器数据:

1
2
3
4
5
typedef struct {
uint8_t sensor_num; // 传感器数量
uint8_t single_info_size; // 单个传感器数据size
SENSOR_INFO_S info[0]; // 定义一个零长结构体数组,表示具体数据,数据大小 = sensor_num * sensor_info_size
} SENSOR_RSP_S;

当然我们也可以申请一个指针,指向紧挨SENSOR_RSP_S 结构体的下一个地址,比起指针,用零长数组有这样的优势:

  1. 不需要初始化,数组名直接就是所在的偏移;
  2. 不占任何空间,指针需要占用空间,空数组不占任何空间。意味着无需初始化,数组名就是后面元素的地址,直接就能当指针使用。

使用以上定义的结构体实现以下功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 对rsp地址赋值
const SENSOR_RSP_S *rsp = get_sensor_data();
size_t rsp_len = get_sensor_data_length();

// 判断长度合法性,直接使用sizeof(SENSOR_RSP_S)
if (rsp_len != sizeof(SENSOR_RSP_S) + rsp->sensor_num * rsp->single_info_size) {
...
}

// 遍历访问数据,数据描述和数据内容均来自rsp,理解清晰
for (size_t i = 0; i < rsp->sensor_num; i++) {
show_sensor(rsp->info[i]);
}

正则表达式

常用表达式语法

语法 描述 用例
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个进制转义符。 n匹配字符n\n匹配一个换行符。连续\\匹配\,而\(匹配(
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
* 匹配前面的子表达式零次或多次*等价于{0,} zo*能匹配z以及zoo
+ 匹配前面的子表达式一次或多次+等价于{1,} zo+能匹配zo以及zoo,但不能匹配z
? 匹配前面的子表达式零次或一次?等价于{0,1} password(s)?可以匹配pawwsordpasswords
{n} n是一个非负整数。必须匹配n次 fo{2}d不能匹配fo,但是能匹配foo
{n,} n是一个非负整数。至少匹配n次 go{2,}d不能匹配god,但是能匹配goodgooood
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次,请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 *,+,?, {n}, {n,}, {n,m} 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串 对于字符串ooooo+?将匹配单个o,而o+将匹配所有o
. 匹配除\n之外的任何单个字符。要匹配包括\n在内的任何字符,请使用像(.\|\n)的模式。
(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,要匹配圆括号字符,请使用\(\)
x\|y 匹配x或y,也可以多个一起使用x\|y\|z (b\|f)oo能匹配boofoob\|foo则匹配bfoo
[xyz] 匹配所包含的任意一个字符 [abc]{2}可以匹配aaacbb
[^xyz] 匹配未包含的任意一个字符
[a-z] 字符范围。匹配指定范围内的任意字符 [a-z]+可以匹配任意长度的小写字母字符串
\d 匹配一个数字字符。等价于[0-9]
\D 匹配一个非数字字符。等价于[^0-9]
\n 匹配一个换行符。等价于\x0a
\r 匹配一个回车符。等价于\x0d
\s 匹配一个任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]
\S 匹配一个任何非空白字符,等价于[^\f\n\r\t\v]
\t 匹配一个制表符。等价于\x09
\w 匹配一个包括下划线的任何单词字符。等价于[A-Za-z0-9_]
\W 匹配任何非单词字符。等价于[^A-Za-z0-9_]
\un 匹配Unicode字符,其中n是一个用四个十六进制数字表示的Unicode字符 \u00A9匹配版权符号©[\u4e00-\u9fa5]匹配中文字符

家庭网络拓扑及IPTV单线复用方案

搬新家快接近一年了,家里网络布局经过多轮设备更替和演进,总算稳定下来。主要介绍下当前网络的拓扑结构,以及如何利用弱电箱到客厅的一根网线,实现既可以上网,又可以看 IPTV。

家庭网络拓扑介绍

需求分析

  1. 网络套餐为千兆,为保证 WIFI 信号质量不成为带宽的约束,且确保智能家居的接入稳定,需每个房间放置无线接入点
  2. 家庭接入设备量大,存在更多网络需求,需软路由进行拨号、DHCP、DNS等功能;
  3. 弱点箱到客厅仅预埋一根网线,需支持上网和IPTV两个功能;
  4. 尽可能利用当前预埋线,不另走明线破坏装修。

实现方案

整体网络拓扑大致由 光猫 —— 路由 —— 二层交换机 —— AP —— 接入设备 组成,呈现 树状结构,避免网络环路导致的网络风暴。

特点如下:

  1. 光猫 Internet 网口修改为桥接,仅作光电调制解调(modem)功能;
  2. 软路由和光猫同放弱电箱,软路由作为家庭网络中枢,实现以下功能:
    • 拨号上网,且多播实现宽带叠加;
    • 网关,同时存在一般网关和科学上网网关;
    • DNS 服务,实现去广告和加速功能;
    • DHCP 服务,根据设备 mac 分配分配上述功能,且带IPv6;
  3. 增配网管型交换机实现 VLAN 划分,分离 IPTV 线路,同时增加网口供更多设备使用;
  4. 多台无线路由器组Mesh,保证全屋 WIFI 覆盖,取消 DHCP 服务,当作 AP(Access Point) 使用;
  5. 搭建服务器,提供 NAS 存储服务供家庭数据存储,提供虚拟机服务供开发。

利用 VLAN 实现单线复用接入 IPTV

因为 IPTV 的特殊性,最佳是光猫 IPTV 接口走单独网线直达机顶盒,避免和家庭网络的 Internet 存在冲突。 实际上因为弱电箱到客厅预埋线仅一根,必须实现单线复用,且做好区分,才能保证两者独立工作正常,解决方案就是 划分 VLAN

VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。 每个VLAN是一个广播域,VLAN内的主机间可以直接通信,而VLAN间则不能直接互通。这样,广播报文就被限制在一个VLAN内。

具体流程如下:

1. 光猫 IPTV 端口带上 VLAN 标签(tag)

我的目标是让 IPTV 端口出来的数据全部带上 VLAN 标签接入局域网,进而也因为 tag 标签避免对其他设备影响。 光猫一般用户是无权配置 VLAN 的,因此找宽带供应商工程师拿到光猫超级管理员账号(telecomadmin)和密码。在 网络 —— 网络设置 —— VLAN绑定 中新增配置,指定 iTV 端口的 3_OTHER_B_VID_43( WAN 侧服务名)绑定用户侧 VLAN,VLAN ID 我改为43。

配置过后,光猫 IPTV 出来的原始数据都会带上 VLAN 43 tag 的标签,也会接受相同 tag 的数据帧,并在内部去除 tag。 将光猫 IPTV 端口接入到软路由中,这样弱电箱到客厅单根网线上,就同时有 正常Internet + IPTV(tag) 两种数据。

2. 网管交换机指定端口解 VLAN 标签(untag)

接下来目标是客厅的交换机指定端口解 VLAN 标签,让 IPTV 数据走该端口,其他数据摒弃。

交换机物理上1口是接入单线复用,4口上连接机顶盒。进入交换机后台,创建一个名为 IPTV 的 VLAN 配置,VLAN ID 为43:

  • 4口选择“不带标签”,这样4口发出的数据帧是具有标签的将会去除标签,进来的数据将会在交换机内部加上标签;
  • 1口选择“带标签”,交换机中属于该 VLAN 的数据发出1口时会带上标签,其他正常数据也会流转;
  • 其他端口选择“非成员”,相当于不敢感知 VLAN 数据。

同时配置 VLAN PVID,让4口仅接受来自机顶盒未打标签的数据帧,当未打标签的数据进入交换机时,将会以 PVID(43) 打上标签,避免机顶盒可能发出 VLAN 数据对链路的影响。

如上两步配置,实现基于 VLAN 的单线复用。

0%