ERTEC 系列 PROFINET 芯片级硬件过滤器分析文档
版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/
前言
实时控制系统(Real-Time Control Systems)的生命线在于“确定性”。无论是基于裸机(Bare-metal)架构还是实时操作系统(RTOS),这类系统对响应延迟和执行精度有着近乎苛刻的要求,任何非预期的故障都可能导致灾难性后果。然而,当我们需要通过以太网将这些封闭的实时系统接入开放的互联网(包括公网)时,网络环境固有的“不确定性”便成为了系统中最大的风险变量。
广播风暴、TCP SYN泛洪攻击、异常错误帧等网络事件,不仅会严重侵蚀系统的实时性能,更可能直接导致任务调度阻塞甚至系统瘫痪。由于我们无法掌控外部网络的复杂行为,唯一的生存之道便是“向内求索”——在设备自身构建坚不可摧的网络防线。我们需要在数据进入协议栈之前,就在硬件层面拦截并清洗掉所有恶意或无效流量。
业界标杆西门子(Siemens)的PROFINET为何能在复杂的工业现场保持极高的稳定性?其核心秘诀之一,便在于其底层驱动中精妙的芯片级硬件过滤机制。本文将深入剖析 PROFINET IO Runtime Software (EDDP - Ethernet Device Driver for PN-IP) 中的硬件过滤规则配置系统,揭示其如何在网卡硬件层面实现高效的数据包分类与过滤,从而确保实时系统在洪流般的网络攻击中依然稳如磐石。
1. 概述
本文档详细分析了 PROFINET IO Runtime Software (EDDP - Ethernet Device Driver for PN-IP) 中的芯片级硬件过滤规则配置系统。该系统用于在硬件层面快速过滤和分类接收到的以太网帧,实现高效的网络包处理。
1.1 支持的芯片版本
芯片版本宏定义说明ERTEC200P Rev1EDDP_HAL_HW_PNIP_REV1PNIP 修订版 1ERTEC200P Rev2EDDP_HAL_HW_PNIP_REV2PNIP 修订版 2HERA Rev3EDDP_HAL_HW_PNIP_REV3HERA 芯片修订版 3I8/ERTEC Rev4EDDP_HAL_HW_PNIP_REV4I8 芯片修订版 42. 整体架构与运行原理
2.1 系统架构
- ┌─────────────────────────────────────────────────────────────────────────┐
- │ 以太网帧到达 │
- └─────────────────────────────────────────────────────────────────────────┘
- │
- ▼
- ┌─────────────────────────────────────────────────────────────────────────┐
- │ 硬件过滤器 (API Filter Engine) │
- │ ┌───────────────────────────────────────────────────────────────────┐ │
- │ │ 16个过滤器代码片段 (Filter Code Fragments 0-15) │ │
- │ │ ├── Fragment 00: OTHER (丢弃未知类型) │ │
- │ │ ├── Fragment 01: IP (IPv4) │ │
- │ │ ├── Fragment 02: ARP │ │
- │ │ ├── Fragment 03: MRP │ │
- │ │ ├── Fragment 04: LLDP │ │
- │ │ ├── Fragment 05: PN_DCP │ │
- │ │ ├── Fragment 06: ALARM │ │
- │ │ ├── Fragment 07: LEN │ │
- │ │ ├── Fragment 08: PTCP │ │
- │ │ ├── Fragment 09: IP6 (HERA/I8) │ │
- │ │ ├── Fragment 10: HSYNC (HERA/I8) │ │
- │ │ ├── Fragment 14: RT_CT (实时周期) │ │
- │ │ └── Fragment 15: RT_SF (实时非周期) │ │
- │ └───────────────────────────────────────────────────────────────────┘ │
- │ │ │
- │ ▼ │
- │ ┌───────────────────────────────────────────────────────────────────┐ │
- │ │ SDT (String Descriptor Table) - 字符串描述符表 │ │
- │ │ 用于存储需要匹配的字符串模式(如DCP Hello TLV、ARP IP地址等) │ │
- │ └───────────────────────────────────────────────────────────────────┘ │
- │ │ │
- │ ▼ │
- │ ┌───────────────────────────────────────────────────────────────────┐ │
- │ │ Store Memory - 存储器 │ │
- │ │ 临时存储帧中的数据用于后续比较 │ │
- │ └───────────────────────────────────────────────────────────────────┘ │
- └─────────────────────────────────────────────────────────────────────────┘
- │
- ┌───────────────┼───────────────┐
- ▼ ▼ ▼
- ┌─────────┐ ┌─────────┐ ┌─────────┐
- │ DROP │ │ PASS │ │ CYCLIC │
- │ 丢弃帧 │ │ 传递帧 │ │ 周期帧 │
- └─────────┘ └─────────┘ └─────────┘
- │ │ │
- ▼ ▼ ▼
- (丢弃) ┌─────────────────┐ ┌─────────┐
- │ RX Ring 0-31 │ │ ACW列表 │
- │ (NRT处理队列) │ │ (周期) │
- └─────────────────┘ └─────────┘
复制代码 2.2 运行流程
- 帧接收: 以太网帧到达网卡接口
- EtherType提取: 从帧中提取EtherType字段
- 片段选择: 根据EtherType选择对应的过滤器代码片段
- 指令执行: 执行过滤器代码中的指令序列
- 决策输出: 生成FDC (Filter Decision Code) 和RX Ring索引
- 帧分发: 根据决策将帧放入对应的RX Ring或丢弃
3. API-Ctrl 内存布局
3.1 ERTEC200P (Rev1/Rev2) 内存布局
- 地址偏移 大小 内容描述
- ─────────────────────────────────────────────────────────────
- 0x0000 0x600 过滤器代码 (FilterCode)
- 0x0600 0x180 TX/RX DMACW IFA (RX:32×8Byte, TX:16×8Byte)
- 0x0780 0x10 Store_MEM_IFA (最多8个数据字)
- 0x0790 0x140 SDT IFA (80条目 × 4字节)
- 0x08D0 0x180 TX/RX DMACW IFB
- 0x0A50 0x10 Store_MEM_IFB
- 0x0A60 0x140 SDT IFB
- 0x0BE0 变长 Strings IFA/B (比较字符串空间)
复制代码 3.2 HERA (Rev3) 内存布局
- 地址偏移 大小 内容描述
- ─────────────────────────────────────────────────────────────
- 0x0000 0x1000 过滤器代码 (FilterCode)
- 0x1000 0x180 TX/RX DMACW
- 0x1180 0x10 Store Memory
- 0x1190 0x140 SDT (String Descriptor Table)
- 0x12D0 变长 比较字符串空间
复制代码 4. 过滤器指令格式
每条过滤器指令为 8字节,格式如下:- 字节0 字节1 字节2 字节3 字节4 字节5 字节6 字节7
- ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
- │ Opcode │ Label │ MaskH │ MaskL │ Skip │ Jump │ DataH │ DataL │
- │ (操作码)│(标签) │(掩码高)│(掩码低)│(跳过) │(跳转) │(数据高)│(数据低)│
- └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
复制代码 4.1 操作码 (Opcode) 详解
操作码名称说明0x00SKIP跳过指定字节数,移动数据指针0x01PASS通过帧,输出FDC和索引0x02DROP丢弃帧0x03CYCLIC周期帧处理0x00-0x0FSCMP字符串比较 (与SDT表比较)0x80SV_EQU静态值相等比较0x81SV_NEQ静态值不等比较0x83SV_LT静态值小于比较0x84SV_GTE静态值大于等于比较0x87SM_STORE存储数据到Store Memory0x89SM_NEQ存储器值不等比较0x11PASS with index带索引的通过4.2 指令字段解析
- Opcode (字节0):
- - 决定指令类型和基本行为
- Label (字节1):
- - 跳转目标标签或条件跳转目标
- MaskH/MaskL (字节2-3):
- - 16位掩码,用于数据比较
- - 0xFFFF表示比较所有位
- - 0x0000表示不比较(总是匹配)
- Skip (字节4):
- - 执行后跳过的字节数
- - 用于移动数据指针
- Jump (字节5):
- - 条件不满足时的跳转偏移
- - 0表示继续下一条指令
- DataH/DataL (字节6-7):
- - 16位比较值
- - 与帧数据(经过掩码)进行比较
复制代码 5. 过滤器代码片段详解
5.1 Fragment 00: OTHER (丢弃过滤器)
目的: 丢弃所有不匹配已知EtherType的帧
EtherType范围: 0x0000-0x07FF, 0x0806(ARP), 0x8892(PN), 0x88F7(PTP), 0x88CC(LLDP), 0x88E3(MRP) 之外的所有类型
代码示例:- // EDDP_API_TYPE_OTHER - 丢弃过滤器
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11
- // --> PASS | 0 | 1
- // 含义: 通过到RX Ring 0,标记为丢弃
复制代码 FDC: 0x8000 (EDDP_HWF_FDC_OTHER_DROP)
5.2 Fragment 01: IP (IPv4过滤器)
EtherType: 0x0800
功能: 识别并分类IPv4协议帧
处理流程:- 1. 跳过6字节 (DA+SA)
- 2. 循环跳过VLAN标签 (0x8100)
- 3. 检查IP版本和头长度 (Version=4, IHL=5 → 0x45)
- 4. 根据Protocol字段分类:
- - Protocol 1 (0x01): ICMP
- - Protocol 2 (0x02): IGMP
- - Protocol 6 (0x06): TCP
- - Protocol 17 (0x11): UDP
- 5. 对于UDP,进一步检查端口:
- - Port 34964 (0x8894): DCP over UDP
- - Port 50000+ (0xC350+): DCP Hello over UDP
复制代码 代码示例 (部分):- // 跳过DA+SA
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00
- // --> SKIP | 6
- // 检查并跳过VLAN
- 0x00, 0x81, 0xFF, 0xFF, 0x01, 0x02, 0x00, 0x80
- // --> SV_EQU | 0 | 2 | 1 | ffffh | 8100h
- // 检查IP版本/IHL
- 0x00, 0x45, 0x00, 0xFF, 0x04, 0x00, 0x0A, 0x81
- // --> SV_NEQ | Lbl_NO_IP_RT_OVER_UDP=10 | 0 | 4 | ff00h | 4500h
- // 检查Protocol=ICMP(1)
- 0x01, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x05, 0x80
- // --> SV_EQU | Lbl_IPICMP=5 | 0 | 0 | ffh | 1h
复制代码 FDC定义:
FDC值名称说明0x8010IP_UDP_DROPIP UDP丢弃0x10IP_ICMPICMP帧0x11IP_IGMPIGMP帧0x12IP_TCPTCP帧0x13IP_UDPUDP帧0x15UDP_DCPDCP over UDP0x16UDP_DCP_HELLODCP Hello over UDP0x17UDP_ASRTAlarm over UDP5.3 Fragment 02: ARP (地址解析协议过滤器)
EtherType: 0x0806
功能: 过滤ARP请求/应答帧,验证SPA(源协议地址)与TPA(目标协议地址)
处理流程:- 1. 跳过DA+SA (6字节)
- 2. 跳过VLAN标签
- 3. 验证ARP帧格式:
- - Hrd (硬件类型) = 1 (以太网)
- - Prot (协议类型) = 0x0800 (IP)
- - hln (硬件地址长度) = 6
- - pln (协议地址长度) = 4
- 4. 检查opcode:
- - opcode 1: ARP Request
- - opcode 2: ARP Reply
- 5. 比较SPA和TPA (使用SDT表)
- 6. 存储SPA到Store Memory用于后续比较
复制代码 代码示例 (部分):- // 验证Hrd=1
- 0x01, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x0B, 0x81
- // --> SV_NEQ | Lbl_ARP_DROP=11 | 0 | 1 | ffffh | 1h
- // 验证Prot=0x0800
- 0x00, 0x08, 0xFF, 0xFF, 0x01, 0x00, 0x0A, 0x81
- // --> SV_NEQ | Lbl_ARP_DROP=10 | 0 | 1 | ffffh | 800h
- // 验证hln=6, pln=4
- 0x04, 0x06, 0xFF, 0xFF, 0x01, 0x00, 0x09, 0x81
- // --> SV_NEQ | Lbl_ARP_DROP=9 | 0 | 1 | ffffh | 604h
- // 检查SPA字段 (使用SDT索引0x4A)
- 0x4A, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x06, 0x0F
- // --> SCMP | Lbl_ARP_PASS=6 | 0 | 0 | ffffh | 4ah
- // 存储SPA HiWord
- 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x87
- // --> SM_STORE | 1 | 65535 | 0
- // 存储SPA LoWord
- 0x01, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x87
- // --> SM_STORE | 4 | 65535 | 1
复制代码 SDT索引: EDDP_SDT_IDX_ARP_IP = 0x4A
FDC:
FDC值名称说明0x8020ARP_DROPARP丢弃0x20ARPARP通过5.4 Fragment 03: MRP (媒体冗余协议过滤器)
EtherType: 0x88E3 (MRP), 0x80E1 (EIP/DLR)
功能: 识别MRP和DLR协议帧
代码:- // 跳过DA+SA
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00
- // 跳过VLAN
- 0x00, 0x81, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x80
- // 检查EtherType=0x88E3 (MRP)
- 0xE3, 0x88, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x80
- // --> SV_EQU | Lbl_MRP_PASS=3 | 0 | 0 | ffffh | 88e3h
- // 检查EtherType=0x80E1 (EIP/DLR)
- 0xE1, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x80
- // --> SV_EQU | Lbl_MRP_PASS=2 | 0 | 0 | ffffh | 80e1h
- // 丢弃
- 0x00, 0x00, 0x30, 0x80, 0x00, 0x00, 0x00, 0x10
- // --> DROP | 32816 | 0
- // 通过
- 0x09, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x11
- // --> PASS | 48 | 9
复制代码 FDC: 0x30 (MRP通过), 0x8030 (MRP丢弃)
5.5 Fragment 04: LLDP (链路层发现协议过滤器)
EtherType: 0x88CC
功能: 简单识别LLDP帧
代码:- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x11
- // --> PASS | 64 | 8
复制代码 FDC: 0x40 (LLDP)
5.6 Fragment 05: PN_DCP (PROFINET DCP过滤器)
EtherType: 0x8892
功能: 识别DCP (Discovery and Configuration Protocol) 帧,包括DCP-Hello
处理流程:- 1. 跳过DA+SA和VLAN
- 2. 验证EtherType=0x8892
- 3. 检查FrameID:
- - 0xFEFC: DCP-Hello (多播)
- - 0xFEFE: 非DCP多播
- 4. 对于DCP-Hello:
- - 检查TLV结构
- - 使用SDT表匹配32个Hello过滤器
- 5. 对于普通DCP:
- - 检查TLV结构
- - 使用SDT表匹配5个DCP过滤器
复制代码 SDT索引结构:- DCP过滤器 (SDT 0x00-0x09):
- ├── 0x00: DCP_01TYPE (类型快速预扫描)
- ├── 0x01: DCP_01TLV (完整字符串)
- ├── 0x02: DCP_02TYPE
- ├── 0x03: DCP_02TLV
- ├── 0x04: DCP_03TYPE
- ├── 0x05: DCP_03TLV
- ├── 0x06: DCP_04TYPE
- ├── 0x07: DCP_04TLV
- ├── 0x08: DCP_05TYPE
- └── 0x09: DCP_05TLV
- DCP-Hello过滤器 (SDT 0x0A-0x49):
- ├── 0x0A: DCP_HELLO_01_LEN
- ├── 0x0B: DCP_HELLO_01TLV
- ├── ...
- ├── 0x48: DCP_HELLO_32_LEN
- └── 0x49: DCP_HELLO_32TLV
复制代码 FDC定义:
FDC值名称说明0x8050DCP_DROPDCP丢弃0x50DCP普通DCP0x51DCP_HELLOHello过滤器10x451DCP_HELLO2Hello过滤器2.........0x7C51DCP_HELLO32Hello过滤器325.7 Fragment 06: ALARM (报警过滤器)
EtherType: 0x8892
功能: 识别PROFINET报警帧 (FrameID: 0xFC00-0xFCFF 高优先级, 0xFE00-0xFEFC 低优先级)
代码:- 0x05, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x11
- // --> PASS | 96 | 5
复制代码 FDC: 0x60 (ASRT - Alarm Soft Real Time)
5.8 Fragment 07: LEN (长度类型过滤器)
EtherType: < 0x0800 (长度字段)
功能: 处理802.3帧,识别特殊协议
处理流程:- 1. 跳过DA+SA和VLAN
- 2. 检查EtherType < 0x0800
- 3. 检查DSAP/SSAP:
- - 0xFDFD: SINEC-FWL
- - 0xAAAA: SNAP
- 4. 对于SNAP帧,检查OUI:
- - 0x080063: DCP (cd7)
- - 0x080000: TSYNC
- - 0x011000: SINEC-FWL
- - 0x0110FB: STDBY
- 5. 检查HSR (High-availability Seamless Redundancy)
复制代码 FDC定义:
FDC值名称说明0x8070LEN_DROPLEN丢弃0x70LEN_DCPDCP over 802.30x71LEN_TSYNC时间同步0x72LEN_STDBY备用协议0x73LEN_HSRHSR帧0x74LEN_SINEC_FWLSINEC防火墙5.9 Fragment 08: PTCP (精确时间协议过滤器)
EtherType: 0x88F7 (PTP), 0x8892 (PROFINET时间同步)
功能: 识别PTP (Precision Time Protocol) 和PROFINET时间同步帧
处理流程:- 1. 检查EtherType:
- - 0x88F7: PTP
- - 0x8892: PROFINET
- 2. 对于PTP:
- - 检查transportSpecific == 0x1 (gPTP)
- - 检查messageType:
- - 0x2/0x3: DELAY_REQ/DELAY_FURSP
- - 0xA: DELAY_FU
- 3. 对于PROFINET:
- - 检查FrameID:
- - 0xFF00/0xFF01: ANNOUNCE
- - 0xFF40-0xFF43: DELAY
- - 0x0020/0x0021: Sync0/1
- - 0x0080/0x0081: Sync0/1
- - 0xFF20/0xFF21: SyncFU 0/1
- 4. 分发到KRISC RX Ring或NRT
复制代码 RX Ring定义 (KRISC):- #define RING_K32_SYNC_CLOCK 0x1D // PTCP时钟同步
- #define RING_K32_SYNC_TIME 0x1E // gPTP时间同步
- #define RING_K32_SYNC_DELAY 0x1F // PTCP延迟
复制代码 FDC定义:
FDC值名称说明0x8080PTCP_DROPPTCP丢弃0x80PTCP_ANNOUNCEPTCP通告0x81PTCP_K32_SYNC_0K32时钟同步0x82PTCP_K32_SYNC_1K32时间同步0x83PTCP_K32_DELAYK32延迟0x84PTCP_K32_SNC_0_FUSync0 Follow Up0x85PTCP_K32_SNC_1_FUSync1 Follow Up0x86K32_GPTPgPTP帧5.10 Fragment 09: IP6 (IPv6过滤器) - HERA/I8专用
EtherType: 0x86DD
功能: 识别并分类IPv6协议帧
SDT索引:- #define EDDP_HERA_SDT_IDX_BC_MAC 0x50 // 广播MAC地址
复制代码 Store索引:- #define EDDP_HERA_STORE_IDX_IP6_MAC_TYPE 0x2 // MAC类型
- #define EDDP_HERA_STORE_IDX_HEADERLENGTH 0x3 // 头长度
- #define EDDP_HERA_STORE_IDX_NEXT_HEADER 0x4 // 下一个头
- #define EDDP_HERA_STORE_IDX_IP6_POSSIBLE_RTA_OVER_UDP 0x5 // 可能的RTA over UDP
- #define EDDP_HERA_STORE_IDX_IP6_FRAGMENTED 0x6 // 分片标志
复制代码 FDC: 类似IPv4,但处理IPv6协议栈
5.11 Fragment 10: HSYNC (硬件同步过滤器) - HERA/I8专用
EtherType: 0x800A
功能: 识别硬件同步帧
代码:- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12
- // --> CYCLIC | 0 | 0
复制代码 FDC: 0x90 (HSYNC)
5.12 Fragment 14: RT_CT (实时周期帧)
EtherType: 0x8892
FrameID范围: 0x0100-0xBFFF (RT_FRAME), 0xC000-0xFBFF (RT_FRAME_UDP)
功能: 识别实时周期通信帧,直接放入周期缓冲区
代码:- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12
- // --> CYCLIC | 0 | 0
复制代码 FDC: 0x80E0 (RT_CT_DROP)
5.13 Fragment 15: RT_SF (实时非周期帧)
EtherType: 0x8892
FrameID范围: 不匹配RT_CT的帧
功能: 识别实时非周期帧
代码:- 0x00, 0x00, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x10
- // --> DROP | 33008 | 0
复制代码 FDC: 0x80F0 (RT_SF_DROP)
6. FDC (Filter Decision Code) 字段解析
6.1 FDC位域结构
- ┌────────┬────────────────────┬──────────────┬────────────┐
- │ Bit 15 │ Bit 14-10 │ Bit 9-4 │ Bit 3-0 │
- ├────────┼────────────────────┼──────────────┼────────────┤
- │ Drop │ Reserved/TBD │ Group │ Sub-Group │
- │ 标志 │ (保留) │ (组) │ (子组) │
- └────────┴────────────────────┴──────────────┴────────────┘
复制代码 6.2 位域说明
位域掩码说明Bit 150x8000Drop标志: 0=接受, 1=丢弃Bit 14-10-保留/未来使用Bit 9-40x3F0组ID (对应RX Ring索引)Bit 3-00xF子组ID6.3 FDC组映射
组ID组掩码协议类型RX Ring索引0x000x0OTHER0 (DROP)0x100x10IP/UDP2-40x200x20ARP20x300x30MRP90x400x40LLDP80x500x50DCP60x600x60ALARM50x700x70LEN0xA0x800x80PTCP0x1D-0x1F0x900x90HSYNC0xB0xE00xE0RT_CT- (CYCLIC)0xF00xF0RT_SF- (DROP)7. SDT (String Descriptor Table) 机制
7.1 SDT条目格式 (32位)
- ┌─────────────────────────────────────────────────────────────────┐
- │ Bit 31-24 │ Bit 23-16 │ Bit 15-8 │ Bit 7-0 │
- ├────────────┼─────────────┼─────────────┼────────────────────────┤
- │ Enable │ Length │ Offset │ PStringTable Number │
- │ 使能 │ 长度 │ 偏移 │ 并行字符串表编号 │
- └────────────┴─────────────┴─────────────┴────────────────────────┘
复制代码 7.2 SDT条目类型
- // 禁用条目 (通配符不匹配)
- #define PNIP_FILTER_STRING_DESCR_DEF_OFF 0x00000000
- // 启用条目 (通配符匹配)
- #define PNIP_FILTER_STRING_DESCR_DEF_ON 0x01000000
复制代码 7.3 ERTEC200P SDT索引分配
- 索引范围 用途
- ───────────────────────────────────────────────────────────
- 0x00-0x09 DCP过滤器 (5组 TYPE+TLV)
- 0x0A-0x49 DCP-Hello过滤器 (32组 LEN+TLV)
- 0x4A ARP IP地址过滤器
- 0x4B-0x4F 保留
复制代码 7.4 HERA SDT索引分配
- 索引范围 用途
- ───────────────────────────────────────────────────────────
- 0x00-0x03 DCP并行字符串表 (PSTable)
- ├── 0x00 DCP_HELLO_TLV_PSTABLE_1
- ├── 0x01 DCP_HELLO_TLV_PSTABLE_2
- ├── 0x02 DCP_IDENTIFY_TLV_PSTABLE
- └── 0x03 DCP_IDENTIFY_TYPE_PSTABLE
- 0x04-0x06 ARP IP地址过滤器 (3个IP地址)
- ├── 0x04 ARP_IP_0
- ├── 0x05 ARP_IP_1
- └── 0x06 ARP_IP_2
- 0x50 广播MAC地址 (IPv6)
复制代码 8. RX Ring 机制
8.1 Ring索引定义
- // ERTEC200P / HERA 通用
- #define EDDP_HWF_ARD_INDEX_DROP 0x0 // 丢弃
- #define EDDP_HWF_ARD_INDEX_OTHER 0x1 // 其他
- #define EDDP_HWF_ARD_INDEX_IP_MISC 0x2 // IP杂项
- #define EDDP_HWF_ARD_INDEX_IP_TCP 0x3 // TCP
- #define EDDP_HWF_ARD_INDEX_IP_UDP 0x4 // UDP
- #define EDDP_HWF_ARD_INDEX_ALARM 0x5 // 报警
- #define EDDP_HWF_ARD_INDEX_DCP 0x6 // DCP
- #define EDDP_HWF_ARD_INDEX_PTCP_ANN 0x7 // PTCP通告
- #define EDDP_HWF_ARD_INDEX_LLDP 0x8 // LLDP
- #define EDDP_HWF_ARD_INDEX_MRP 0x9 // MRP
- #define EDDP_HWF_ARD_INDEX_MISC 0xA // 杂项(TSYNC/FWL)
- // KRISC专用 (时间同步)
- #define EDDP_HWF_ARD_IDX_K32_SNC_CLOCK 0x1D // 时钟同步
- #define EDDP_HWF_ARD_IDX_K32_SNC_TIME 0x1E // 时间同步
- #define EDDP_HWF_ARD_IDX_K32_SNC_DELAY 0x1F // 延迟
- // HERA专用
- #define EDDP_HERA_HWF_ARD_INDEX_HSYNC 0xB // 硬件同步
复制代码 8.2 Ring使用掩码
- // ERTEC200P
- #define EDDP_HWF_ARD_HWF_USED_RINGS 0xE0000FFF // 所有使用的Ring
- #define EDDP_HWF_ARD_K32_USED_RINGS 0xE0000000 // KRISC处理的Ring
- #define EDDP_HWF_ARD_NRT_USED_RINGS 0x00000FFF // NRT处理的Ring
- // HERA
- #define EDDP_HERA_HWF_ARD_HWF_USED_RINGS 0xE0000FFF
- #define EDDP_HERA_HWF_ARD_NRT_RINGS_HIGH 0x00000B00 // 高优先级NRT Ring
- #define EDDP_HERA_HWF_ARD_NRT_RINGS_LOW 0x000004FF // 低优先级NRT Ring
复制代码 9. 过滤器使能掩码
9.1 ERTEC200P掩码
- #define EDDP_HWF_OTHER_MASK 0x0001 // Fragment 00
- #define EDDP_HWF_IP_MASK 0x0002 // Fragment 01
- #define EDDP_HWF_ARP_MASK 0x0004 // Fragment 02
- #define EDDP_HWF_MRP_MASK 0x0008 // Fragment 03
- #define EDDP_HWF_LLDP_MASK 0x0010 // Fragment 04
- #define EDDP_HWF_PN_DCP_MASK 0x0020 // Fragment 05
- #define EDDP_HWF_ALARM_MASK 0x0040 // Fragment 06
- #define EDDP_HWF_LEN_MASK 0x0080 // Fragment 07
- #define EDDP_HWF_PTCP_MASK 0x0100 // Fragment 08
- #define EDDP_HWF_CT_MASK 0x4000 // Fragment 14
- #define EDDP_HWF_SF_MASK 0x8000 // Fragment 15
- #define EDDP_HWF_ALL_CODE_MASK 0xC1FF // 全部启用
复制代码 9.2 HERA掩码
- #define EDDP_HERA_HWF_OTHER_MASK 0x0001 // Fragment 00
- #define EDDP_HERA_HWF_IP4_MASK 0x0002 // Fragment 01
- #define EDDP_HERA_HWF_ARP_MASK 0x0004 // Fragment 02
- #define EDDP_HERA_HWF_MRP_MASK 0x0008 // Fragment 03
- #define EDDP_HERA_HWF_LLDP_MASK 0x0010 // Fragment 04
- #define EDDP_HERA_HWF_PN_DCP_MASK 0x0020 // Fragment 05
- #define EDDP_HERA_HWF_ALARM_MASK 0x0040 // Fragment 06
- #define EDDP_HERA_HWF_LEN_MASK 0x0080 // Fragment 07
- #define EDDP_HERA_HWF_PTCP_MASK 0x0100 // Fragment 08
- #define EDDP_HERA_HWF_IP6_MASK 0x0200 // Fragment 09
- #define EDDP_HERA_HWF_HSYNC_MASK 0x0400 // Fragment 10
- #define EDDP_HERA_HWF_ALL_CODE_MASK 0x07FF // 全部启用
复制代码 10. 初始化流程
10.1 EDDP_HWCInitFilterCode()
- EDD_RSP EDDP_HWCInitFilterCode(
- EDDP_LOCAL_DDB_PTR_TYPE pDDB,
- LSA_UINTPTR nApiCtrlCodeHostAddr)
复制代码 功能: 将过滤器代码加载到API-CtrlRAM并设置片段寄存器
流程:
- 将物理地址转换为主机地址
- 根据芯片版本选择对应的过滤器代码:
- Rev1/Rev2: eddp_hwfiltercode[]
- Rev3 (HERA): eddp_herahwfiltercode[]
- Rev4 (I8): eddp_I8hwfiltercode[]
- 写入过滤器代码到RAM
- 配置16个FILTERCODEBASE_IFA寄存器
10.2 EDDP_HWCInitDisabledSdtEntries()
- EDD_RSP EDDP_HWCInitDisabledSdtEntries(
- EDDP_LOCAL_DDB_PTR_TYPE pDDB,
- LSA_UINTPTR nApiCtrlSdtBaseHostAddr)
复制代码 功能: 初始化SDT表,设置默认禁用状态
流程:
- 遍历所有SDT条目
- 对于ARP条目,设置为通配符匹配
- 对于DCP条目,配置并行字符串表参数
- 其他条目设置为禁用状态
10.3 EDDP_HWCSetRegisterToDefaults()
- EDD_RSP EDDP_HWCSetRegisterToDefaults(
- EDDP_LOCAL_DDB_PTR_TYPE pDDB)
复制代码 功能: 重置统计和错误寄存器
流程:
- 清除错误状态寄存器
- 清除错误事件寄存器
- 禁用LOG功能
- 清除DROP计数器
- 对于Rev4,清除公共存储寄存器
11. 辅助函数
11.1 数据读写函数
函数名功能EDDP_HWCWriteDataToRAM写数据到API-CtrlRAMEDDP_HWCReadDataFromRAM从API-CtrlRAM读数据EDDP_HWCWriteSdtEntry写SDT条目EDDP_HWCReadSdtEntry读SDT条目EDDP_HWCUpdateSdtString更新SDT字符串11.2 查询函数
函数名功能EDDP_HWCGetHWFilterVersion获取过滤器版本字符串EDDP_HWCGetFilterCtrlStructurePtr获取过滤器控制结构指针12. 过滤器版本信息
12.1 版本字符串位置
芯片偏移大小ERTEC200P0x5D88字节HERA0x7A88字节I8(定义在对应头文件)8字节12.2 版本格式
- 0x56, 0x31, 0x2E, 0x30, 0x30, 0x72, 0x31, 0x00
- // 'V', '1', '.', '0', '0', 'r', '1', '\0'
复制代码 13. 帧类型匹配汇总表
[table][tr]EtherTypeFrameID/特征过滤器片段FDCRX Ring处理方式[/tr][tr][td]其他[/td][td]-[/td][td]00 (OTHER)[/td][td]0x8000[/td][td]0[/td][td]DROP[/td][/tr][tr][td]0x0800[/td][td]IP/ICMP[/td][td]01 (IP)[/td][td]0x10[/td][td]0xA[/td][td]PASS[/td][/tr][tr][td]0x0800[/td][td]IP/IGMP[/td][td]01 (IP)[/td][td]0x11[/td][td]0xA[/td][td]PASS[/td][/tr][tr][td]0x0800[/td][td]IP/TCP[/td][td]01 (IP)[/td][td]0x12[/td][td]0x3[/td][td]PASS[/td][/tr][tr][td]0x0800[/td][td]IP/UDP[/td][td]01 (IP)[/td][td]0x13[/td][td]0x4[/td][td]PASS[/td][/tr][tr][td]0x0800[/td][td]UDP/DCP[/td][td]01 (IP)[/td][td]0x15[/td][td]0x6[/td][td]PASS[/td][/tr][tr][td]0x0806[/td][td]ARP[/td][td]02 (ARP)[/td][td]0x20[/td][td]0x2[/td][td]PASS[/td][/tr][tr][td]0x88E3[/td][td]MRP[/td][td]03 (MRP)[/td][td]0x30[/td][td]0x9[/td][td]PASS[/td][/tr][tr][td]0x80E1[/td][td]DLR[/td][td]03 (MRP)[/td][td]0x30[/td][td]0x9[/td][td]PASS[/td][/tr][tr][td]0x88CC[/td][td]LLDP[/td][td]04 (LLDP)[/td][td]0x40[/td][td]0x8[/td][td]PASS[/td][/tr][tr][td]0x8892[/td][td]DCP[/td][td]05 (PN_DCP)[/td][td]0x50[/td][td]0x6[/td][td]PASS[/td][/tr][tr][td]0x8892[/td][td]DCP-Hello[/td][td]05 (PN_DCP)[/td][td]0x51-0x7C51[/td][td]0x6[/td][td]PASS[/td][/tr][tr][td]0x8892[/td][td]Alarm[/td][td]06 (ALARM)[/td][td]0x60[/td][td]0x5[/td][td]PASS[/td][/tr][tr][td] |