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.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:2 errors:0 dropped:0 overruns:0 carrier:0collisions: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.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:119217 errors:0 dropped:38402 overruns:0 frame:0TX packets:14597 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:1102 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:1100 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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.0UP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:1255 errors:0 dropped:0 overruns:0 frame:0TX packets:1255 errors:0 dropped:0 overruns:0 carrier:0collisions: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:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15183.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言程序设计(五)切片

一、切片的定义 在Go语言中,切片(Slice)是数组的一个引用,它会生成一个指向数组的指针,并通过切片长度关联到底层数组部分或者全部元素。切片还提供了一系列对数组的管理功能(append、copy)&#xff0c;可以随时动态扩充存储空间&#xff0c;并且可以被随意传递而不会导致所管理…

C++数据结构笔记(7)——队列的顺序结构实现

1.队列&#xff0c;和现实生活中的规则类似&#xff0c;先进先出 2.队尾只允许元素进入&#xff0c;队头只允许元素退出 3.用数组来实现队列的顺序存储&#xff0c;无论哪一段都可以作为队头或者队尾 SeqQueue.h头文件 #ifndef SEQQUEUE_H #define SEQQUEUE_H #include<…

Linux——进程信号详解

目录 一.进程信号的理解 1.1定义&#xff1a; 1.2举例&#xff1a; 1.3总结&#xff1a; 二.进程信号地使用&#xff1a; 2.1信号种类&#xff1a; 2.2而操作系统向进程发送信号地方式有四种&#xff1a; 2.2.1以键盘的方式向进程发送信号 接下来介绍一个系统调用函数sign…

chrome开发调试小技巧—Replay XHR(重新请求)

一、需求 想要验证一个ajax请求&#xff0c;需要每次都需要在页面点几次才会触发或者刷新页面&#xff0c;着急调试看效果时&#xff0c;可以通过chrome的Replay XHR功能直接同参数重新请求ajax 二、实现 chrome调试工具network下找到要重新发起的ajax请求&#xff0c;右键找…

python读写excel利器:xlwings从入门到精通

python读写excel利器&#xff1a;xlwings 从入门到精通 目录 安装和使用 基础操作 操作工作簿操作工作表读取单元格写入(单元格赋值)range的操作&#xff08;range常用的api&#xff09; 写入一行或一列Excel数据(函数式&#xff09;使用range(\A1\).api.AddComment(\comments…

力扣 332. 重新安排行程

题目来源&#xff1a;https://leetcode.cn/problems/reconstruct-itinerary/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a; 这道题目有几个难点&#xff1a; 一个行程中&#xff0c;如果航班处理不好容易变成一个圈&#xff0c;成为死循环。解决&am…

ue4:Dota总结_BP_CameraPawn篇

设计wasd移动&#xff1a; 鼠标拖动视口&#xff1a; 鼠标滚轮调整远近&#xff1a; Beginplay&#xff1a; qe按键旋转&#xff1a; 变量&#xff1a;

word@制表位和列数据对齐@填空下划线制作

文章目录 refs制表位(tab stop)制表位类型 制作对其的下划线填空表单&#x1f47a;利用前导符代替下划线制作待填空下划线 制表位对其列数据模拟简单表格测试数据设置引线使用标尺设置 FAQ refs Insert or add tab stops - Microsoft SupportUsing the ruler in Word - Micros…

【Django】列表数据Paginatior分页,动态返回页码,显示当前页、总页数、跳转页

问题 1、当返回数据较多,如设置每页展示10条,数据接近200条,返回页码范围1~20,前端每个页码都显示的话,就会出现页码超出当前页面,被遮挡的页码无法操作和显示不美观; 2、列表的所在页码,总分页数,跳转不在动态页面的页数 解决 在使用paginator转化为Page对象后,获…

从零开始 Spring Boot 63:Hibernate 继承映射

从零开始 Spring Boot 63&#xff1a;Hibernate 继承映射 图源&#xff1a;简书 (jianshu.com) 关系型数据库设计中是不存在继承概念的&#xff0c;但实体类可以用继承来组织代码结构&#xff0c;所以需要用一种方式将实体类的继承结构映射到表结构。 本文将介绍几种在 JPA&a…

MySQL逻辑架构

MySQL逻辑架构 1. MySQL逻辑架构1.1 连接层1.2 服务层1.3 引擎层 2. SQL执行流程2.1 SQL执行流程2.2 查看SQL执行流程2.3 SQL语法顺序 1. MySQL逻辑架构 分为Connectors层、MySQL服务器对应架构、存储层&#xff1b;MySQL服务器对应架构分为连接层、服务层、引擎层&#xff0c…

RabbitMQ系列(26)--RabbitMQ实现高可用负载均衡

前言&#xff1a;我们以往只能连接一个指定的队列&#xff0c;不能自由地连接其他的队列&#xff0c;当我们连接的那个指定队列宕机了&#xff0c;生产者和消费者都没办法往队列发送消息和消费消息&#xff0c;而且生产者和消费者也不能自动的连接到其他正常运行的队列&#xf…