RTL8309M实现VLAN功能-驱动编进内核

 

 

部分硬件实现图 

一、使内核支持802.1Q功能

1、使用内核kernel版本4.19.232

2、make menuconfig 配置内核

3、进入Networking support

4、进入Networking options

 5、把这些都编进内核

6、点击保存退出


 

CONFIG_GARP=y
CONFIG_MRP=y
CONFIG_BRIDGE_VLAN_FILTERING=y
CONFIG_VLAN_8021Q=y
CONFIG_VLAN_8021Q_GVRP=y
CONFIG_VLAN_8021Q_MVRP=y

7、在.config文件中最后会增加这几个宏定义

二、RTL8309M LAN 驱动加入到内核

1、修改文件

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 

在函数

static int stmmac_init_phy(struct net_device *dev)

添加如下程序

if(phydev!=NULL)
{
	dev_err(priv->device, "%s phy_id:%x mii:%p bus_id:%x\n",
	__func__, phydev->phy_id,priv->mii,priv->plat->bus_id);

	if(priv->plat->bus_id == 0 && priv->mii!=NULL)
	{
		rtl8309m_phy_fixup(priv->mii);
	}
}

netdev_err(priv->dev, "%s: trying to attach to %p\n", __func__,phydev);

2、 rtl8309m_phy_fixup函数实现如果

#include "rtk_api.h"
#include "mdcmdio.h"
#include "rtk_api_ext.h"
#include "rtl8309n_asicdrv_ext.h"

static int rtl8309m_phy_fixup(struct mii_bus *mii)
{
	int i;
	static int devinit = 0;
	rtk_portmask_t mbrmsk , untagmsk;

	if(devinit == 0)
	{

		setSwitchDev(mii);
		rtk_switch_init();
		printk("rtk_switch_init\r\n");
		rtk_vlan_init();
		printk("rtk_vlan_ini\r\n");

		for(i=0;i<8;i++)
		{
			mbrmsk.bits[0] = (1<<8)|(1<<i);
			untagmsk.bits[0] = (1<<8)|(1<<i);
			rtk_vlan_set(100+i,mbrmsk,untagmsk,1);
			printk("rtk_vlan_set port %d \r\n",i);
		}
		
		devinit = 1;
	}

	return 0;
}

 3、以下函数接口通过下面文件实现

setSwitchDev(mii);
rtk_switch_init();
rtk_vlan_init();
rtk_vlan_set();
 

下载路径

https://download.csdn.net/download/u011425939/88002036

4、修改文件

drivers/net/ethernet/stmicro/stmmac/Makefile

 mdcmdio.c   rtk_api.c  rtl8309n_asicdrv.c

 把这个三个文件编译进去

5、编译kernel 重启下载到设备

三、vlan配置

1、在控制终端输入如下命令

brctl addbr br0  创建网桥

ifconfig br0 192.168.63.1 配置ip

brctl addif br0 eth1 把lan接口eth1 加入到网桥

vconfig add eth1 100  eth1增加vlan id 为100的端口
vconfig add eth1 101  eth1增加vlan id 为101的端口
vconfig add eth1 102  eth1增加vlan id 为102的端口
vconfig add eth1 103  eth1增加vlan id 为103的端口

ifconfig eth1.100 up 启动 eth1.100
ifconfig eth1.101 up 启动 eth1.101
ifconfig eth1.102 up 启动 eth1.102
ifconfig eth1.103 up 启动 eth1.103

注意这里的100 101 102 103 要跟上面vlan设置函数设置的vid要一致,不然实现不了vlan功能

rtk_vlan_set(100+i,mbrmsk,untagmsk,1);

2、ifconfig 查看配置

~ # 
~ # ifconfig
br0       Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          inet addr:192.168.63.1  Bcast:192.168.63.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:80 (80.0 B)

eth0      Link encap:Ethernet  HWaddr 32:89:B0:83:C6:69  
          inet addr:192.168.9.166  Bcast:192.168.9.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:119217 errors:0 dropped:38402 overruns:0 frame:0
          TX packets:14597 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:38667494 (36.8 MiB)  TX bytes:3143376 (2.9 MiB)
          Interrupt:48 

eth1      Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1102 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:188650 (184.2 KiB)
          Interrupt:48 

eth1.100  Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1.101  Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1100 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:184142 (179.8 KiB)

eth1.102  Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1.103  Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1.104  Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1.105  Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1.106  Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1.107  Link encap:Ethernet  HWaddr 02:FB:88:C0:86:81  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1255 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1255 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:308550 (301.3 KiB)  TX bytes:308550 (301.3 KiB)

ra0       Link encap:Ethernet  HWaddr F0:C8:14:4B:15:FC  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

~ # 

已经实现eth1.100-eth1.104 网络接口

四、通过vlan网络接口实现对单个lan网口进行广播通信

步骤如下

1、创建vlan接收广播信息

2、创建vlan发送广播信息

3、实现对接收数据的处理

以下示例是对接在lan口的网络摄像头进行ip设置的一个运用

对每个lan口使用vlan进行单独的广播,接在对应lan口上的摄像头应答返回ip,然后再发送修改ip的数据报给摄像头,以达到修改ip的目的。

下载路径

https://download.csdn.net/download/u011425939/88002042

五、抓包分析数据

1、向eth1.100端口发送查询摄像头IP数据包

<?xml version="1.0" encoding="UTF-8"?>
<Query>
<Id>e64823ad2a3d-98c56204-525e-46d6-B38A-73C80C478CF9</Id>
<Types>search</Types>
</Query>

 此时在ip层协议下一层加入了802.1Q协议,此时的vlan vid 是100

这些数据包不会在eth1.101 eth1.102 eth1.103 对应的lan口 输出数据,因此可以达到修改对应lan口接的摄像头ip

2、接收到eth1.100端口数据

<?xml version="1.0" encoding="UTF-8"?>
<Answer><ID>5_e6:48:23:ad:2a:3d</ID>
<Operate>Find</Operate>
<MAC>54:D0:C4:C0:02:22</MAC>
<Result>Success</Result>
<IPv4>192.168.63.101</IPv4>
<HttpPort>80</HttpPort>
<IPv4Mask>255.255.255.0</IPv4Mask>
<IPv4Gateway>192.168.63.1</IPv4Gateway>
<DNS>8.8.8.8</DNS>
<Model>F-SC311-21-M51120100001</Model>
<SoftVer>10.1.0.6-r9-onvif</SoftVer>
<HardVer>V1.0</HardVer>
<DeviceName>IP</DeviceName>
<OemModel>F-SC311-21-M51120100001</OemModel>
<RunTime>1248696</RunTime>
</Answer>

 接收到的数据不带802.1q协议,也就是不携带vlan vid,所以不是vlan数据

3、向eth1.100端口发送修改ip摄像头IP数据包

:<?xml version='1.0'encoding='UTF-8'?>
<Quest>
<ID>1_02:1b:bb:24:cc:8b</ID>
<Operate>Modify</Operate>
<CurMAC>54:D0:C4:C0:02:22</CurMAC>
<ModifyMAC>0</ModifyMAC>
<MAC>54:D0:C4:C0:02:22</MAC>
<IPv4>192.168.63.101</IPv4>
<HttpPort>80</HttpPort>
<IPv4Mask>255.255.255.0</IPv4Mask>
<IPv4Gateway>192.168.63.1</IPv4Gateway>
<DNS>8.8.8.8</DNS>
<UserName>admin</UserName>
<Password>c0b3731c7311444835b7c339498a75dc</Password>
</Quest>

4、返回修改后的ip

<?xml version="1.0" encoding="UTF-8"?>
<Answer><ID>1_02:1b:bb:24:cc:8b</ID>
<Operate>Modify</Operate>
<MAC>54:D0:C4:C0:02:22</MAC>
<Result>Success</Result>
<IPv4>192.168.63.101</IPv4>
<HttpPort>80</HttpPort>
<IPv4Mask>255.255.255.0</IPv4Mask>
<IPv4Gateway>192.168.63.1</IPv4Gateway>
<DNS>8.8.8.8</DNS>
<Model>F-SC311-21-M51120100001</Model>
<SoftVer>10.1.0.6-r9-onvif</SoftVer>
<HardVer>V1.0</HardVer>
<DeviceName>IP</DeviceName>
<OemModel>F-SC311-21-M51120100001</OemModel>
<RunTime>631171</RunTime>
</Answer>

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值