找回密码
 立即注册
首页 业界区 业界 【原创】ERTEC 系列 PROFINET 芯片级硬件过滤器分析 ...

【原创】ERTEC 系列 PROFINET 芯片级硬件过滤器分析

撵延兵 3 天前
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 系统架构
  1. ┌─────────────────────────────────────────────────────────────────────────┐
  2. │                         以太网帧到达                                      │
  3. └─────────────────────────────────────────────────────────────────────────┘
  4.                                     │
  5.                                     ▼
  6. ┌─────────────────────────────────────────────────────────────────────────┐
  7. │                    硬件过滤器 (API Filter Engine)                         │
  8. │  ┌───────────────────────────────────────────────────────────────────┐  │
  9. │  │  16个过滤器代码片段 (Filter Code Fragments 0-15)                    │  │
  10. │  │  ├── Fragment 00: OTHER (丢弃未知类型)                              │  │
  11. │  │  ├── Fragment 01: IP (IPv4)                                        │  │
  12. │  │  ├── Fragment 02: ARP                                              │  │
  13. │  │  ├── Fragment 03: MRP                                              │  │
  14. │  │  ├── Fragment 04: LLDP                                             │  │
  15. │  │  ├── Fragment 05: PN_DCP                                           │  │
  16. │  │  ├── Fragment 06: ALARM                                            │  │
  17. │  │  ├── Fragment 07: LEN                                              │  │
  18. │  │  ├── Fragment 08: PTCP                                             │  │
  19. │  │  ├── Fragment 09: IP6 (HERA/I8)                                    │  │
  20. │  │  ├── Fragment 10: HSYNC (HERA/I8)                                  │  │
  21. │  │  ├── Fragment 14: RT_CT (实时周期)                                  │  │
  22. │  │  └── Fragment 15: RT_SF (实时非周期)                                │  │
  23. │  └───────────────────────────────────────────────────────────────────┘  │
  24. │                                    │                                     │
  25. │                                    ▼                                     │
  26. │  ┌───────────────────────────────────────────────────────────────────┐  │
  27. │  │  SDT (String Descriptor Table) - 字符串描述符表                      │  │
  28. │  │  用于存储需要匹配的字符串模式(如DCP Hello TLV、ARP IP地址等)           │  │
  29. │  └───────────────────────────────────────────────────────────────────┘  │
  30. │                                    │                                     │
  31. │                                    ▼                                     │
  32. │  ┌───────────────────────────────────────────────────────────────────┐  │
  33. │  │  Store Memory - 存储器                                              │  │
  34. │  │  临时存储帧中的数据用于后续比较                                        │  │
  35. │  └───────────────────────────────────────────────────────────────────┘  │
  36. └─────────────────────────────────────────────────────────────────────────┘
  37.                                     │
  38.                     ┌───────────────┼───────────────┐
  39.                     ▼               ▼               ▼
  40.               ┌─────────┐     ┌─────────┐     ┌─────────┐
  41.               │ DROP    │     │ PASS    │     │ CYCLIC  │
  42.               │ 丢弃帧   │     │ 传递帧   │     │ 周期帧   │
  43.               └─────────┘     └─────────┘     └─────────┘
  44.                     │               │               │
  45.                     ▼               ▼               ▼
  46.               (丢弃)     ┌─────────────────┐   ┌─────────┐
  47.                          │ RX Ring 0-31    │   │ ACW列表 │
  48.                          │ (NRT处理队列)    │   │ (周期)  │
  49.                          └─────────────────┘   └─────────┘
复制代码
2.2 运行流程


  • 帧接收: 以太网帧到达网卡接口
  • EtherType提取: 从帧中提取EtherType字段
  • 片段选择: 根据EtherType选择对应的过滤器代码片段
  • 指令执行: 执行过滤器代码中的指令序列
  • 决策输出: 生成FDC (Filter Decision Code) 和RX Ring索引
  • 帧分发: 根据决策将帧放入对应的RX Ring或丢弃
3. API-Ctrl 内存布局

3.1 ERTEC200P (Rev1/Rev2) 内存布局
  1. 地址偏移      大小          内容描述
  2. ─────────────────────────────────────────────────────────────
  3. 0x0000       0x600        过滤器代码 (FilterCode)
  4. 0x0600       0x180        TX/RX DMACW IFA (RX:32×8Byte, TX:16×8Byte)
  5. 0x0780       0x10         Store_MEM_IFA (最多8个数据字)
  6. 0x0790       0x140        SDT IFA (80条目 × 4字节)
  7. 0x08D0       0x180        TX/RX DMACW IFB
  8. 0x0A50       0x10         Store_MEM_IFB
  9. 0x0A60       0x140        SDT IFB
  10. 0x0BE0       变长         Strings IFA/B (比较字符串空间)
复制代码
3.2 HERA (Rev3) 内存布局
  1. 地址偏移      大小          内容描述
  2. ─────────────────────────────────────────────────────────────
  3. 0x0000       0x1000       过滤器代码 (FilterCode)
  4. 0x1000       0x180        TX/RX DMACW
  5. 0x1180       0x10         Store Memory
  6. 0x1190       0x140        SDT (String Descriptor Table)
  7. 0x12D0       变长         比较字符串空间
复制代码
4. 过滤器指令格式

每条过滤器指令为 8字节,格式如下:
  1. 字节0    字节1    字节2    字节3    字节4    字节5    字节6    字节7
  2. ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
  3. │ Opcode │ Label  │  MaskH │  MaskL │  Skip  │ Jump   │ DataH  │ DataL  │
  4. │ (操作码)│(标签)  │(掩码高)│(掩码低)│(跳过)  │(跳转)  │(数据高)│(数据低)│
  5. └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
复制代码
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 指令字段解析
  1. Opcode (字节0):
  2.   - 决定指令类型和基本行为
  3. Label (字节1):
  4.   - 跳转目标标签或条件跳转目标
  5. MaskH/MaskL (字节2-3):
  6.   - 16位掩码,用于数据比较
  7.   - 0xFFFF表示比较所有位
  8.   - 0x0000表示不比较(总是匹配)
  9. Skip (字节4):
  10.   - 执行后跳过的字节数
  11.   - 用于移动数据指针
  12. Jump (字节5):
  13.   - 条件不满足时的跳转偏移
  14.   - 0表示继续下一条指令
  15. DataH/DataL (字节6-7):
  16.   - 16位比较值
  17.   - 与帧数据(经过掩码)进行比较
复制代码
5. 过滤器代码片段详解

5.1 Fragment 00: OTHER (丢弃过滤器)

目的: 丢弃所有不匹配已知EtherType的帧
EtherType范围: 0x0000-0x07FF, 0x0806(ARP), 0x8892(PN), 0x88F7(PTP), 0x88CC(LLDP), 0x88E3(MRP) 之外的所有类型
代码示例:
  1. // EDDP_API_TYPE_OTHER - 丢弃过滤器
  2. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11
  3. // --> PASS | 0 | 1
  4. // 含义: 通过到RX Ring 0,标记为丢弃
复制代码
FDC: 0x8000 (EDDP_HWF_FDC_OTHER_DROP)
5.2 Fragment 01: IP (IPv4过滤器)

EtherType: 0x0800
功能: 识别并分类IPv4协议帧
处理流程:
  1. 1. 跳过6字节 (DA+SA)
  2. 2. 循环跳过VLAN标签 (0x8100)
  3. 3. 检查IP版本和头长度 (Version=4, IHL=5 → 0x45)
  4. 4. 根据Protocol字段分类:
  5.    - Protocol 1  (0x01): ICMP
  6.    - Protocol 2  (0x02): IGMP
  7.    - Protocol 6  (0x06): TCP
  8.    - Protocol 17 (0x11): UDP
  9. 5. 对于UDP,进一步检查端口:
  10.    - Port 34964 (0x8894): DCP over UDP
  11.    - Port 50000+ (0xC350+): DCP Hello over UDP
复制代码
代码示例 (部分):
  1. // 跳过DA+SA
  2. 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00
  3. // --> SKIP | 6
  4. // 检查并跳过VLAN
  5. 0x00, 0x81, 0xFF, 0xFF, 0x01, 0x02, 0x00, 0x80
  6. // --> SV_EQU | 0 | 2 | 1 | ffffh | 8100h
  7. // 检查IP版本/IHL
  8. 0x00, 0x45, 0x00, 0xFF, 0x04, 0x00, 0x0A, 0x81
  9. // --> SV_NEQ | Lbl_NO_IP_RT_OVER_UDP=10 | 0 | 4 | ff00h | 4500h
  10. // 检查Protocol=ICMP(1)
  11. 0x01, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x05, 0x80
  12. // --> 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. 1. 跳过DA+SA (6字节)
  2. 2. 跳过VLAN标签
  3. 3. 验证ARP帧格式:
  4.    - Hrd (硬件类型) = 1 (以太网)
  5.    - Prot (协议类型) = 0x0800 (IP)
  6.    - hln (硬件地址长度) = 6
  7.    - pln (协议地址长度) = 4
  8. 4. 检查opcode:
  9.    - opcode 1: ARP Request
  10.    - opcode 2: ARP Reply
  11. 5. 比较SPA和TPA (使用SDT表)
  12. 6. 存储SPA到Store Memory用于后续比较
复制代码
代码示例 (部分):
  1. // 验证Hrd=1
  2. 0x01, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x0B, 0x81
  3. // --> SV_NEQ | Lbl_ARP_DROP=11 | 0 | 1 | ffffh | 1h
  4. // 验证Prot=0x0800
  5. 0x00, 0x08, 0xFF, 0xFF, 0x01, 0x00, 0x0A, 0x81
  6. // --> SV_NEQ | Lbl_ARP_DROP=10 | 0 | 1 | ffffh | 800h
  7. // 验证hln=6, pln=4
  8. 0x04, 0x06, 0xFF, 0xFF, 0x01, 0x00, 0x09, 0x81
  9. // --> SV_NEQ | Lbl_ARP_DROP=9 | 0 | 1 | ffffh | 604h
  10. // 检查SPA字段 (使用SDT索引0x4A)
  11. 0x4A, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x06, 0x0F
  12. // --> SCMP | Lbl_ARP_PASS=6 | 0 | 0 | ffffh | 4ah
  13. // 存储SPA HiWord
  14. 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x87
  15. // --> SM_STORE | 1 | 65535 | 0
  16. // 存储SPA LoWord
  17. 0x01, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x87
  18. // --> 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协议帧
代码:
  1. // 跳过DA+SA
  2. 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00
  3. // 跳过VLAN
  4. 0x00, 0x81, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x80
  5. // 检查EtherType=0x88E3 (MRP)
  6. 0xE3, 0x88, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x80
  7. // --> SV_EQU | Lbl_MRP_PASS=3 | 0 | 0 | ffffh | 88e3h
  8. // 检查EtherType=0x80E1 (EIP/DLR)
  9. 0xE1, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x80
  10. // --> SV_EQU | Lbl_MRP_PASS=2 | 0 | 0 | ffffh | 80e1h
  11. // 丢弃
  12. 0x00, 0x00, 0x30, 0x80, 0x00, 0x00, 0x00, 0x10
  13. // --> DROP | 32816 | 0
  14. // 通过
  15. 0x09, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x11
  16. // --> PASS | 48 | 9
复制代码
FDC: 0x30 (MRP通过), 0x8030 (MRP丢弃)
5.5 Fragment 04: LLDP (链路层发现协议过滤器)

EtherType: 0x88CC
功能: 简单识别LLDP帧
代码:
  1. 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x11
  2. // --> PASS | 64 | 8
复制代码
FDC: 0x40 (LLDP)
5.6 Fragment 05: PN_DCP (PROFINET DCP过滤器)

EtherType: 0x8892
功能: 识别DCP (Discovery and Configuration Protocol) 帧,包括DCP-Hello
处理流程:
  1. 1. 跳过DA+SA和VLAN
  2. 2. 验证EtherType=0x8892
  3. 3. 检查FrameID:
  4.    - 0xFEFC: DCP-Hello (多播)
  5.    - 0xFEFE: 非DCP多播
  6. 4. 对于DCP-Hello:
  7.    - 检查TLV结构
  8.    - 使用SDT表匹配32个Hello过滤器
  9. 5. 对于普通DCP:
  10.    - 检查TLV结构
  11.    - 使用SDT表匹配5个DCP过滤器
复制代码
SDT索引结构:
  1. DCP过滤器 (SDT 0x00-0x09):
  2. ├── 0x00: DCP_01TYPE (类型快速预扫描)
  3. ├── 0x01: DCP_01TLV (完整字符串)
  4. ├── 0x02: DCP_02TYPE
  5. ├── 0x03: DCP_02TLV
  6. ├── 0x04: DCP_03TYPE
  7. ├── 0x05: DCP_03TLV
  8. ├── 0x06: DCP_04TYPE
  9. ├── 0x07: DCP_04TLV
  10. ├── 0x08: DCP_05TYPE
  11. └── 0x09: DCP_05TLV
  12. DCP-Hello过滤器 (SDT 0x0A-0x49):
  13. ├── 0x0A: DCP_HELLO_01_LEN
  14. ├── 0x0B: DCP_HELLO_01TLV
  15. ├── ...
  16. ├── 0x48: DCP_HELLO_32_LEN
  17. └── 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 低优先级)
代码:
  1. 0x05, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x11
  2. // --> PASS | 96 | 5
复制代码
FDC: 0x60 (ASRT - Alarm Soft Real Time)
5.8 Fragment 07: LEN (长度类型过滤器)

EtherType: < 0x0800 (长度字段)
功能: 处理802.3帧,识别特殊协议
处理流程:
  1. 1. 跳过DA+SA和VLAN
  2. 2. 检查EtherType < 0x0800
  3. 3. 检查DSAP/SSAP:
  4.    - 0xFDFD: SINEC-FWL
  5.    - 0xAAAA: SNAP
  6. 4. 对于SNAP帧,检查OUI:
  7.    - 0x080063: DCP (cd7)
  8.    - 0x080000: TSYNC
  9.    - 0x011000: SINEC-FWL
  10.    - 0x0110FB: STDBY
  11. 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. 1. 检查EtherType:
  2.    - 0x88F7: PTP
  3.    - 0x8892: PROFINET
  4. 2. 对于PTP:
  5.    - 检查transportSpecific == 0x1 (gPTP)
  6.    - 检查messageType:
  7.      - 0x2/0x3: DELAY_REQ/DELAY_FURSP
  8.      - 0xA: DELAY_FU
  9. 3. 对于PROFINET:
  10.    - 检查FrameID:
  11.      - 0xFF00/0xFF01: ANNOUNCE
  12.      - 0xFF40-0xFF43: DELAY
  13.      - 0x0020/0x0021: Sync0/1
  14.      - 0x0080/0x0081: Sync0/1
  15.      - 0xFF20/0xFF21: SyncFU 0/1
  16. 4. 分发到KRISC RX Ring或NRT
复制代码
RX Ring定义 (KRISC):
  1. #define RING_K32_SYNC_CLOCK  0x1D  // PTCP时钟同步
  2. #define RING_K32_SYNC_TIME   0x1E  // gPTP时间同步
  3. #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索引:
  1. #define EDDP_HERA_SDT_IDX_BC_MAC  0x50  // 广播MAC地址
复制代码
Store索引:
  1. #define EDDP_HERA_STORE_IDX_IP6_MAC_TYPE    0x2  // MAC类型
  2. #define EDDP_HERA_STORE_IDX_HEADERLENGTH    0x3  // 头长度
  3. #define EDDP_HERA_STORE_IDX_NEXT_HEADER     0x4  // 下一个头
  4. #define EDDP_HERA_STORE_IDX_IP6_POSSIBLE_RTA_OVER_UDP  0x5  // 可能的RTA over UDP
  5. #define EDDP_HERA_STORE_IDX_IP6_FRAGMENTED  0x6  // 分片标志
复制代码
FDC: 类似IPv4,但处理IPv6协议栈
5.11 Fragment 10: HSYNC (硬件同步过滤器) - HERA/I8专用

EtherType: 0x800A
功能: 识别硬件同步帧
代码:
  1. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12
  2. // --> CYCLIC | 0 | 0
复制代码
FDC: 0x90 (HSYNC)
5.12 Fragment 14: RT_CT (实时周期帧)

EtherType: 0x8892
FrameID范围: 0x0100-0xBFFF (RT_FRAME), 0xC000-0xFBFF (RT_FRAME_UDP)
功能: 识别实时周期通信帧,直接放入周期缓冲区
代码:
  1. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12
  2. // --> CYCLIC | 0 | 0
复制代码
FDC: 0x80E0 (RT_CT_DROP)
5.13 Fragment 15: RT_SF (实时非周期帧)

EtherType: 0x8892
FrameID范围: 不匹配RT_CT的帧
功能: 识别实时非周期帧
代码:
  1. 0x00, 0x00, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x10
  2. // --> DROP | 33008 | 0
复制代码
FDC: 0x80F0 (RT_SF_DROP)
6. FDC (Filter Decision Code) 字段解析

6.1 FDC位域结构
  1. ┌────────┬────────────────────┬──────────────┬────────────┐
  2. │ Bit 15 │     Bit 14-10      │   Bit 9-4    │   Bit 3-0  │
  3. ├────────┼────────────────────┼──────────────┼────────────┤
  4. │  Drop  │    Reserved/TBD    │    Group     │  Sub-Group │
  5. │  标志  │      (保留)         │    (组)      │   (子组)   │
  6. └────────┴────────────────────┴──────────────┴────────────┘
复制代码
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位)
  1. ┌─────────────────────────────────────────────────────────────────┐
  2. │ Bit 31-24  │  Bit 23-16  │  Bit 15-8   │    Bit 7-0            │
  3. ├────────────┼─────────────┼─────────────┼────────────────────────┤
  4. │   Enable   │   Length    │   Offset    │   PStringTable Number │
  5. │    使能    │   长度      │   偏移       │      并行字符串表编号   │
  6. └────────────┴─────────────┴─────────────┴────────────────────────┘
复制代码
7.2 SDT条目类型
  1. // 禁用条目 (通配符不匹配)
  2. #define PNIP_FILTER_STRING_DESCR_DEF_OFF  0x00000000
  3. // 启用条目 (通配符匹配)
  4. #define PNIP_FILTER_STRING_DESCR_DEF_ON   0x01000000
复制代码
7.3 ERTEC200P SDT索引分配
  1. 索引范围      用途
  2. ───────────────────────────────────────────────────────────
  3. 0x00-0x09    DCP过滤器 (5组 TYPE+TLV)
  4. 0x0A-0x49    DCP-Hello过滤器 (32组 LEN+TLV)
  5. 0x4A         ARP IP地址过滤器
  6. 0x4B-0x4F    保留
复制代码
7.4 HERA SDT索引分配
  1. 索引范围      用途
  2. ───────────────────────────────────────────────────────────
  3. 0x00-0x03    DCP并行字符串表 (PSTable)
  4.   ├── 0x00   DCP_HELLO_TLV_PSTABLE_1
  5.   ├── 0x01   DCP_HELLO_TLV_PSTABLE_2
  6.   ├── 0x02   DCP_IDENTIFY_TLV_PSTABLE
  7.   └── 0x03   DCP_IDENTIFY_TYPE_PSTABLE
  8. 0x04-0x06    ARP IP地址过滤器 (3个IP地址)
  9.   ├── 0x04   ARP_IP_0
  10.   ├── 0x05   ARP_IP_1
  11.   └── 0x06   ARP_IP_2
  12. 0x50         广播MAC地址 (IPv6)
复制代码
8. RX Ring 机制

8.1 Ring索引定义
  1. // ERTEC200P / HERA 通用
  2. #define EDDP_HWF_ARD_INDEX_DROP        0x0   // 丢弃
  3. #define EDDP_HWF_ARD_INDEX_OTHER       0x1   // 其他
  4. #define EDDP_HWF_ARD_INDEX_IP_MISC     0x2   // IP杂项
  5. #define EDDP_HWF_ARD_INDEX_IP_TCP      0x3   // TCP
  6. #define EDDP_HWF_ARD_INDEX_IP_UDP      0x4   // UDP
  7. #define EDDP_HWF_ARD_INDEX_ALARM       0x5   // 报警
  8. #define EDDP_HWF_ARD_INDEX_DCP         0x6   // DCP
  9. #define EDDP_HWF_ARD_INDEX_PTCP_ANN    0x7   // PTCP通告
  10. #define EDDP_HWF_ARD_INDEX_LLDP        0x8   // LLDP
  11. #define EDDP_HWF_ARD_INDEX_MRP         0x9   // MRP
  12. #define EDDP_HWF_ARD_INDEX_MISC        0xA   // 杂项(TSYNC/FWL)
  13. // KRISC专用 (时间同步)
  14. #define EDDP_HWF_ARD_IDX_K32_SNC_CLOCK 0x1D  // 时钟同步
  15. #define EDDP_HWF_ARD_IDX_K32_SNC_TIME  0x1E  // 时间同步
  16. #define EDDP_HWF_ARD_IDX_K32_SNC_DELAY 0x1F  // 延迟
  17. // HERA专用
  18. #define EDDP_HERA_HWF_ARD_INDEX_HSYNC  0xB   // 硬件同步
复制代码
8.2 Ring使用掩码
  1. // ERTEC200P
  2. #define EDDP_HWF_ARD_HWF_USED_RINGS    0xE0000FFF  // 所有使用的Ring
  3. #define EDDP_HWF_ARD_K32_USED_RINGS    0xE0000000  // KRISC处理的Ring
  4. #define EDDP_HWF_ARD_NRT_USED_RINGS    0x00000FFF  // NRT处理的Ring
  5. // HERA
  6. #define EDDP_HERA_HWF_ARD_HWF_USED_RINGS 0xE0000FFF
  7. #define EDDP_HERA_HWF_ARD_NRT_RINGS_HIGH 0x00000B00  // 高优先级NRT Ring
  8. #define EDDP_HERA_HWF_ARD_NRT_RINGS_LOW  0x000004FF  // 低优先级NRT Ring
复制代码
9. 过滤器使能掩码

9.1 ERTEC200P掩码
  1. #define EDDP_HWF_OTHER_MASK    0x0001   // Fragment 00
  2. #define EDDP_HWF_IP_MASK       0x0002   // Fragment 01
  3. #define EDDP_HWF_ARP_MASK      0x0004   // Fragment 02
  4. #define EDDP_HWF_MRP_MASK      0x0008   // Fragment 03
  5. #define EDDP_HWF_LLDP_MASK     0x0010   // Fragment 04
  6. #define EDDP_HWF_PN_DCP_MASK   0x0020   // Fragment 05
  7. #define EDDP_HWF_ALARM_MASK    0x0040   // Fragment 06
  8. #define EDDP_HWF_LEN_MASK      0x0080   // Fragment 07
  9. #define EDDP_HWF_PTCP_MASK     0x0100   // Fragment 08
  10. #define EDDP_HWF_CT_MASK       0x4000   // Fragment 14
  11. #define EDDP_HWF_SF_MASK       0x8000   // Fragment 15
  12. #define EDDP_HWF_ALL_CODE_MASK 0xC1FF   // 全部启用
复制代码
9.2 HERA掩码
  1. #define EDDP_HERA_HWF_OTHER_MASK    0x0001   // Fragment 00
  2. #define EDDP_HERA_HWF_IP4_MASK      0x0002   // Fragment 01
  3. #define EDDP_HERA_HWF_ARP_MASK      0x0004   // Fragment 02
  4. #define EDDP_HERA_HWF_MRP_MASK      0x0008   // Fragment 03
  5. #define EDDP_HERA_HWF_LLDP_MASK     0x0010   // Fragment 04
  6. #define EDDP_HERA_HWF_PN_DCP_MASK   0x0020   // Fragment 05
  7. #define EDDP_HERA_HWF_ALARM_MASK    0x0040   // Fragment 06
  8. #define EDDP_HERA_HWF_LEN_MASK      0x0080   // Fragment 07
  9. #define EDDP_HERA_HWF_PTCP_MASK     0x0100   // Fragment 08
  10. #define EDDP_HERA_HWF_IP6_MASK      0x0200   // Fragment 09
  11. #define EDDP_HERA_HWF_HSYNC_MASK    0x0400   // Fragment 10
  12. #define EDDP_HERA_HWF_ALL_CODE_MASK 0x07FF   // 全部启用
复制代码
10. 初始化流程

10.1 EDDP_HWCInitFilterCode()
  1. EDD_RSP EDDP_HWCInitFilterCode(
  2.     EDDP_LOCAL_DDB_PTR_TYPE pDDB,
  3.     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()
  1. EDD_RSP EDDP_HWCInitDisabledSdtEntries(
  2.     EDDP_LOCAL_DDB_PTR_TYPE pDDB,
  3.     LSA_UINTPTR nApiCtrlSdtBaseHostAddr)
复制代码
功能: 初始化SDT表,设置默认禁用状态
流程:

  • 遍历所有SDT条目
  • 对于ARP条目,设置为通配符匹配
  • 对于DCP条目,配置并行字符串表参数
  • 其他条目设置为禁用状态
10.3 EDDP_HWCSetRegisterToDefaults()
  1. EDD_RSP EDDP_HWCSetRegisterToDefaults(
  2.     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 版本格式
  1. 0x56, 0x31, 0x2E, 0x30, 0x30, 0x72, 0x31, 0x00
  2. // '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]

相关推荐

您需要登录后才可以回帖 登录 | 立即注册