Yuhang Zheng
Linux bridge VLAN的配置

linux网桥支持vlan filtering过滤功能后,我们不再需要通过子接口的形式进行vlan划分,简化了vlan配置。

1. bridge vlan说明

man bridge可以了解到,linux通过如下命令进行vlan filtering的配置:

bridge vlan { add | del } dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]

选项说明:

pvid:端口的默认vlan,所有从该端口输入的没有携带vlan的报文,会被打上该vlan标签,该选项只对输入报文有效。

untagged:端口的untag vlan,输出报文携带该vlan时,会被剥离。

一般情况下pvid和untagged是同时使用的,对应于cisco的switchport trunk native vlan

self

master

这两个选项在帮助手册上是这么解释的:

self   the vlan is configured on the specified physical device. Required if the device is the bridge device.
master the vlan is configured on the software bridge (default).
VLAN网桥配置过程中的DefaultPVID和tagged

续接上一篇文章,我们在第二种方法中提到了DefaultPVID参数,那么我们该如何理解DefaultPVID参数呢,它的作用是什么?

DefaultPVID的释意

systemd.netdev (www.freedesktop.org)中可以看到DefaultPVID的解释:

DefaultPVID=
This specifies the default port VLAN ID of a newly attached bridge port. Set this to an integer in the range 1–4094 or "none" to disable the PVID.
这指定了新连接的桥接端口的默认端口 VLAN ID。将其设置为 1–4094 范围内的整数或“无”以禁用 PVID。

以上内容便说明了通过systemd方式配置网桥时,br0.netdev文件中DefaultPVID参数的作用就是给所有加入该网桥的网络端口配置一个PVID,包括网桥自己。

那么这个PVID和普通的VLAN ID有什么区别呢?暂时先保留这个疑问往下看。

pvid和untagged的作用

首先看一下bridge命令的选项说明:

bridge vlan { add | del } dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]

选项说明:

pvid:端口的默认vlan,所有从该端口输入的没有携带vlan的报文,会被打上该vlan标签,该选项只对输入报文有效。
untagged:端口的untag vlan,输出报文携带该vlan时,会被剥离。

一般情况下pvid和untagged是同时使用的。

由上述说明可以看到,在bridge命令中,pvid和untagged参数是高度关联的。那么,这个tag又是什么东西呢?Tagged和Untagged又是什么?

FCU2303配置VLAN和网桥的示例

背景

在FCU2303的开发板上,有八个千兆网,分别是fm1-mac1,fm1-mac2,fm1-mac3,fm1-mac4,fm1-mac5,fm1-mac6,fm1-mac9,fm1-mac10,还有一个5G模块eth0。

客户有一个需求是想在这个板子上划分出两个VLAN(Virtual Local Area Network,中文名为”虚拟局域网”,工作在OSI参考模型的第2层和第3层。),一个是将这八个千兆网口划为一个VLAN,VLANID暂时定为100;另一个是将这八个网口中的任一网口和5G模块划为一个VLAN,VLANID暂时定为200,划分示意图如下图所示:

VLAN

这样的话,VLAN100中的设备就无法直接访问5G模块的流量,只能先将数据转发到fm1-mac1网口上,然后fm1-mac1再将数据转发到5G模块eth0。因为fm1-mac1是既在VLAN100中,又在VLAN200中,所以它充当了连接两个VLAN的桥梁,这时候如果在fm1-mac1中外接一台电脑用于监控流通此网口的流量的话,就实现了监听VLAN100中其他网口通过5G模块上网的数据内容。

wm8960音频工作不正常的问题排查

背景:

之前写过两个文章来记录了wm8960音频播放出现砰砰声的问题的原因和其对应的解决方法。后来为了简单起见就选择了将MCLK时钟改为12MHz的方法,也解决了客户的问题。昨天生产部门又反馈新一批的板子又有大批量出现音频播放声音不正常的现象,不同于上次出现的砰砰声,这次是播放时直接出现嗞啦的声音,而且几秒钟的音频文件要播放几分钟才播放完毕,看来又出现新的问题了。

排查过程:

出现这个现象,可以很确定的判断大概率是音频芯片工作不正常的问题,为了验证想法,我们可以拿示波器量一下wm8960音频芯片的BCLK和LRC的时钟频率。原理图的引脚如下:(PS:芯片的引脚顺序是从芯片上的小圆点开始是第一脚,逆时针方向数)

image-20210511143826708

测量发现BCLK有11MHz之高,LRC时钟也很不正常。结合WM8960的时钟分频图来看,这个时钟很不对。

Linux platform平台总线、平台设备、平台驱动

平台总线(platform_bus)的需求来源?

随着soc的升级,S3C2440->S3C6410->S5PV210->4412,以前的程序就得重新写一遍,做着大量的重复工作,
人们为了提高效率,发现控制器的操作逻辑(方法)是一样的,只有寄存器地址不一样,如果将与硬件有关的
代码(platform_device)和驱动代码(platform_driver)分开,升级soc后,因为驱动方式一样,
只需要修改与硬件有关的代码就可以,实现一个驱动控制多个设备。

平台(platform)总线是一种虚拟的总线,在 /sys/bus/platform 目录可以看到。
平台总线三要素:平台总线、平台设备、平台驱动
平台总线原则:先分离,后合并

从命令行重置USB设备

问题描述

是否可以重置USB设备的连接,而无需从PC断开/连接?

具体来说,我的设备是数码相机。我正在使用gphoto2,但最近我收到“设备读取错误”,所以我想尝试执行连接的software-reset。

从我可以告诉的是,没有为相机加载内核模块。唯一与外表相关的是usbhid

最佳解决办法

将以下内容保存为usbreset.c

工具网站

在线画图工具

首先就是画图工具,我想了一下,程序员经常接触的无非也就是流程图、思维导图、原型图、UML图、网络拓扑图、组织结构图等等这些。

下面这三个在线画图网站我想应该足够了,其中那个processon是我用得最多的,历史文章中几乎所有相关的图形都是用它绘制,然后导出图片的。


在线开发辅助工具

在做开发和写代码的过程中,经常要用到的辅助工具其实还挺多,这段时间我重点就在整理归纳这个。

以我个人的情况为例,日常开发经常会用到一些辅助工具我总结为8大类,包括:编解码工具、转换工具、正则工具、编译工具、网络工具、格式化工具、可视化工具、在线生成器、以及其他工具等等。

OpenWRT源码目录汇总

backports概念

Backport的含义是”向后移植”,就是将软件新版本的某些功能移植到旧版本上来,这就称为backport。
Debian向来以稳定性著称,所以就存在一个问题,官方源分发的软件版本比软件本身的版本总是要慢不少,所以就有了 backports 源。 backports 主要从 testing 源,部分安全更新从unstable源重新编译包,使这些包不依赖于新版本的库就可以在 debian 的 stable 发行版上面运行。所以 backports 是 stable 和 testing 的一个折衷。

backports源码压缩包位置:

dl/backports-5.10.16-1.tar.xz

backport的patch目录:

target/linux/generic/backport-5.4/020-backport_netfilter_rtcache.patch

backport源码目录(已经打完了patch):

build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/backports-5.10.16-1

linux内核源码压缩包位置:

dl/linux-5.4.111.tar.xz

linux内核的patch目录:

target/linux/layerscape/patches-5.4/

linux内核使用的config文件:

target/linux/layerscape/armv8_64b/config-5.4

linux内核的源码目录(已经打完了patch):

build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/linux-5.4.111
OpenWRT编译报错信息汇总

报错信息:

Configuring luci-i18n-s-s-libev-zh-cn.
Configuring luci-i18n-firewall-zh-cn.
Configuring ppp-mod-pppoe.
Collected errors:
* check_data_file_clashes: Package libustream-openssl wants to install file /home/shixiaofeng/source/build_dir/target-mipsel_24kc_musl/root-ramips/lib/libustream-ssl.so
        But that file is already provided by package  * libustream-mbedtls
* opkg_install_cmd: Cannot install package libustream-openssl.
package/Makefile:64: recipe for target 'package/install' failed
make[2]: *** [package/install] Error 255
make[2]: Leaving directory '/home/shixiaofeng/source'
package/Makefile:106: recipe for target '/home/shixiaofeng/source/staging_dir/target-mipsel_24kc_musl/stamp/.package_install' failed
make[1]: *** [/home/shixiaofeng/source/staging_dir/target-mipsel_24kc_musl/stamp/.package_install] Error 2
make[1]: Leaving directory '/home/shixiaofeng/source'
/home/shixiaofeng/source/include/toplevel.mk:199: recipe for target 'world' failed
make: *** [world] Error 2

解决方法:

在make menuconfig进行配置编译选项中,Libraries  --->下面,libustream-openssl和libustream-mbedtls中间去掉一个。
在make menuconfig进行配置编译选项中,LuCI->Collection下的libustream-mbedtls和luci-ssl-openssl两个选项都进行了选择,其实只要进行其中一个选择便可。
OpenWrt从零开发

这篇文章主要记录基于GitHub的OpenWRT19.02源码如何一步步配置,编译,得到适用于OK1046-C2的镜像。

在源码下执行make menuconfig之后的首选配置

首先是平台相关的必要配置:

Target System (NXP Layerscape)
Subtarget (ARMv8 64-bit based boards) 
Target Profile (NXP LS1046A-RDB Default)  

然后是启用LUCI web图形界面

-> LuCI
    -> 1. Collections
        <*> luci................... LuCI interface with Uhttpd as Webserver (default)