CAPL学习-ETH功能函数-方法类1

1 Methods

1. ethernetPacket::Clear

方法
语法
void ethernetPacket.Clear();

功能

清除数据并重置长度。

参数 ---

返回值 ---

可用性

版本 适用范围 测量设置 仿真/测试设置
11.0 SP3 Ethernet

示例

capl 复制代码
ethernetPacket pkt;  
// 准备第一个输出报文  
pkt.ipv6.Init();  
pkt.udp.Init();  
pkt.udp.SetData(0, "Hello", 5);  
pkt.CompletePacket();  
output(pkt);  
// 清除报文  
pkt.Clear();  
// 准备第二个输出报文(使用与第一个不同的协议和数据)  
pkt.tcp.Init();  
pkt.CompletePacket();  
output(pkt);  

2. ethernetPacket::CompletePacket

方法
语法
word ethernetPacket.CompletePacket();

功能

计算报文中所有协议的校验和与长度字段。调用此方法后,协议将变为有效状态,报文可发送。

参数 ---

返回值

  • 0:成功
  • -1:错误

可用性

版本 适用范围 测量设置 仿真/测试设置
11.0 SP3 Ethernet

示例

capl 复制代码
ethernetPacket pkt;  
// 初始化为 IPv4 和 UDP 协议  
pkt.udp.Init();  
// 重新计算 IPv4 和 UDP 的校验和与长度字段  
pkt.CompletePacket();  
// 发送报文  
output(pkt);  

版本 14 SP2

© Vector Informatik GmbH

3. ethernetPacket::FaultInjectDisableLengthPadding

方法
语法
dword ethernetPacket.FaultInjectDisableLengthPadding();

功能

禁用以太网数据自动填充至最小长度。用于发送小于 64 字节(含 FCS)的以太网报文,最小可发送长度为 24 字节(含 FCS 的以太网头部)。

注意

仅支持 Vector 以太网网络接口。

参数 ---

返回值
0:成功

可用性

版本 适用范围 测量设置 仿真/测试设置
13.0 Ethernet

示例


4. ethernetPacket::FaultInjectFCS

方法
语法
dword ethernetPacket.FaultInjectFCS(word fcs);

功能

将报文的帧校验和设置为无效值,发送时不会重新计算。

注意

仅支持 Vector 以太网网络接口。行为与 output(ethernetpacket, word fcs) 相同。

参数

  • fcs:以太网帧校验序列

返回值
0:成功

可用性

版本 适用范围 测量设置 仿真/测试设置
13.0 Ethernet

示例


5. ethernetPacket::GetBitLength

方法
语法
dword ethernetPacket.GetBitLength(char protocol[], char field[]);

功能

返回指定字段的位数(dword 类型)。若协议或字段未包含在报文中,测量将因运行时错误停止。可使用 ethernetPacket::IsAvailable 检查字段是否可用。

参数

  • protocol:协议名称
  • field:字段名称

返回值

字段的位数

可用性

版本 适用范围 测量设置 仿真/测试设置
13.0 SP2 Ethernet

示例

capl 复制代码
on ethernetPacket *  
{  
  if(this.IsAvailable("icmpv4", "echo.identifier"))  
  {  
    Write("icmpv4.echo.identifier 位长度: %ld",  
          this.GetBitLength("icmpv4", "echo.identifier"));  
  }  
}  

6. ethernetPacket::GetData

方法
语法

capl 复制代码
word ethernetPacket.GetData(word offset, char dest[], word length);  // 形式 1  
word ethernetPacket.GetData(word offset, byte dest[], word length);  // 形式 2  
word ethernetPacket.GetData(word offset, struct * dest);             // 形式 3  
word ethernetPacket.GetData(word offset, sysvarStruct dest);         // 形式 4  
word ethernetPacket.GetData(char protocol[], char field[], byte dest[]);  // 形式 5  

功能

将以太网报文数据复制到字节数组、字符数组、CAPL 结构体或系统变量结构体。

参数

  • offset:报文数据的字节偏移量(偏移量 0 为 Ethertype 后的第一个字节)
  • dest:目标缓冲区(数据复制位置)
  • length:复制的字节数
  • protocol:协议名称(形式 5)
  • field:字段名称(形式 5)

返回值

复制到目标缓冲区的字节数

可用性

版本 适用范围 测量设置 仿真/测试设置
10.0 Ethernet
13.0 SP2(形式 5) Ethernet

示例

capl 复制代码
on ethernetPacket *  
{  
  dword ipHeaderLength;  
  byte ipProtocol;  
  switch(this.type)  
  {  
    case 0x0800:  // IPv4  
      ipHeaderLength = (this.Byte(0) & 0x0F) * 4;  
      ipProtocol = this.Byte(9);  
      switch(ipProtocol)  
      {  
        case 17:  // UDP  
          HandleUDP(this, ipHeaderLength+8,  
                    swapWord(this.Word(ipHeaderLength)),  
                    swapWord(this.Word(ipHeaderLength+2)));  
          break;  
      }  
      break;  
  }  

  if(this.IsAvailable("tcp", "data"))  
  {  
    byte buffer[1500];  
    word payloadLength;  
    payloadLength = this.GetData("tcp", "data", buffer);  
    write("tcp  payload 长度: %d", payloadLength);  
  }  
}  

void HandleUDP(ethernetPacket * pkt, word udpDataOffset, word srcPort, word dstPort)  
{  
  char buffer[100];  
  word length;  
  length = pkt.GetData(udpDataOffset, buffer, elcount(buffer)-1);  
  buffer[length] = 0;  // 字符串终止符  
  write("UDP (端口 0x%X 至 0x%X): %s", srcPort, dstPort, buffer);  
}  

7. ethernetPacket::GetInt

方法
语法
int ethernetPacket.GetInt(char protocol[], char field[]);

功能

返回指定字段的值(int 类型)。若协议或字段未包含在报文中,测量将因运行时错误停止。可使用 ethernetPacket::IsAvailable 检查字段是否可用。

参数

  • protocol:协议名称
  • field:字段名称

返回值

字段的值

可用性

版本 适用范围 测量设置 仿真/测试设置
13.0 SP2 Ethernet

示例

capl 复制代码
on ethernetPacket *  
{  
  if(this.IsAvailable("icmpv4", "echo.identifier"))  
  {  
    Write("icmpv4.echo.identifier 值为 %d", this.GetInt("icmpv4", "echo.identifier"));  
  }  
}  

8. ethernetPacket::GetInt64

方法
语法
int ethernetPacket.GetInt64(char protocol[], char field[]);

功能

返回指定字段的值(int64 类型)。若协议或字段未包含在报文中,测量将因运行时错误停止。可使用 ethernetPacket::IsAvailable 检查字段是否可用。

参数

  • protocol:协议名称
  • field:字段名称

返回值

字段的值

可用性

版本 适用范围 测量设置 仿真/测试设置
13.0 SP2 Ethernet

示例

capl 复制代码
on ethernetPacket *  
{  
  if(this.IsAvailable("ipv4", "source"))  
  {  
    Write("ipv4.source 值为 0x%lX", this.GetInt64("ipv4", "source"));  
  }  
}  

9. ethernetPacket::GetDestinationIPAddress

方法
语法
long ethernetPacket.GetDestinationIPAddress(ip_Address address);

功能

将目的IP地址分配给ip_Address变量。

注意

以太网包必须包含IPv4或IPv6协议。调用此方法前,需使用ethernetPacket::<protocol>.IsAvailable()检查协议是否存在。

参数

  • address:用于存储IP地址的变量。

返回值

  • 0:成功
  • -1:数据包中不包含IPv4或IPv6协议

可用性

  • 版本:13.0起
  • 适用场景:以太网测量配置、仿真/测试配置

10. ethernetPacket::GetDestinationIPEndpoint

方法
语法
long ethernetPacket.GetDestinationIPEndpoint(ip_Endpoint endpoint);

功能

将目的IP地址和UDP/TCP端口号分配给ip_Endpoint变量。

注意

以太网包必须包含IPv4/IPv6协议以及UDP/TCP协议。调用前需使用ethernetPacket::<protocol>.IsAvailable()检查协议是否存在。

参数

  • endpoint:用于存储IP地址和端口的变量。

返回值

  • 0:成功
  • -1:数据包中不包含IPv4或IPv6协议
  • -2:数据包中不包含UDP或TCP协议

可用性

  • 版本:13.0起
  • 适用场景:以太网测量配置、仿真/测试配置

11. ethernetPacket::GetPDU

方法
语法
long ethernetPacket.GetPDU(long n, PDU * P);

功能

检索数据包中索引为n的PDU(协议数据单元)。

参数

  • n:PDU索引(首个PDU索引为0,最后一个为PDUCount()-1
  • P:指向PDU类型变量的指针,用于存储结果。

返回值

  • 0:数据访问成功
  • -1:总线类型错误
  • -2:帧不支持PDU访问
  • -3:PDU对象无效
  • -4:PDU非接收(RX)类型
  • -5:参数过小(如数组字节数不足)
  • -6:消息或PDU不可用
  • -7:PDU索引越界(使用PDUCount()获取PDU总数)

可用性

  • 版本:9.0起
  • 适用场景:以太网测量配置、仿真/测试配置

12. ethernetPacket::GetProtocolErrorText

方法
语法
word ethernetPacket.GetProtocolErrorText(char buffer[]);

功能

将无效以太网包的错误文本复制到缓冲区;有效数据包返回空字符串。

参数

  • buffer:用于存储错误字符串的字符缓冲区。

返回值

复制到缓冲区的字符数。

可用性

  • 版本:11.0 SP3起
  • 适用场景:以太网测量配置、仿真/测试配置

示例

capl 复制代码
on ethernetPacket *
{
  if (this.HasProtocolError())
  {
    char text[100];
    this.GetProtocolErrorText(text);  // 注:原文示例中函数名应为GetProtocolErrorText
    write("Eth %d 协议错误: %s", this.msgChannel, text);
  }
}

13. ethernetPacket::GetSourceEndpoint

方法
语法
long ethernetPacket6协议以及UDP/TCP协议。调用前需使用ethernetPacket::.IsAvailable()`检查协议是否存在。

参数

  • endpoint:用于存储IP地址和端口的变量。

返回值

  • 0:成功
  • -1:数据包中不包含IPv4或IPv6协议
  • -2:数据包中不包含UDP或TCP协议

可用性

  • 版本:13.0起
  • 适用场景:以太网测量配置、仿真/测试配置

14. ethernetPacket::GetSourceIPAddress

方法
语法
long ethernetPacket.GetSourceIPAddress(ip_Address address);

功能

将源IP地址分配给ip_Address变量。

注意

以太网包必须包含IPv4或IPv6协议。调用前需使用ethernetPacket::<protocol>.IsAvailable()检查协议是否存在。

参数

  • address:用于存储IP地址的变量。

返回值

  • 0:成功
  • -1:数据包中不包含IPv4或IPv6协议

可用性

  • 版本:13.0起
  • 适用场景:以太网测量配置、仿真/测试配置

15. ethernetPacket::GetVlan

方法
语法

capl 复制代码
long ethernetPacket.GetVlan(word &tpid, word &tci);  // 形式1(单标签)
long ethernetPacket.GetVlan(dword vlanIndex, word &tpid, word &tci);  // 形式2(多标签)

功能

返回以太网包中的VLAN标签。形式2用于双标签VLAN,可指定标签索引。

参数

  • vlanIndex:VLAN标签索引(0=内层,1=外层;范围0~2)
  • tpid:返回VLAN的TPID(标签协议标识符)值
  • tci:返回VLAN的TCI(标签控制信息)值

返回值

  • 0:成功
  • 1:数据包不包含VLAN
  • <0:内部错误

可用性

  • 版本:10.0起
  • 适用场景:以太网测量配置、仿真/测试配置

示例

capl 复制代码
on ethernetPacket *
{
  if (this.hasVlan())
  {
    word tpid, tci;
    if (this.GetVlan(tpid, tci) == 0)
    {
      write("收到带VLAN的以太网包: TPID=0x%X, TCI=0x%X", tpid, tci);
    }
  }
}

16. ethernetPacket::IsAvailable

方法
语法
byte ethernetPacket.IsAvailable(char protocol[], char field[]);

功能

检查以太网包中是否存在指定协议及协议字段。

参数

  • protocol:协议名称
  • field:协议字段名称

返回值

  • 1:协议和字段可用
  • 0:协议或字段不可用

可用性

  • 版本:13.0 SP2起
  • 适用场景:以太网测量配置、仿真/测试配置

示例

capl 复制代码
on ethernetPacket *
{
  if (this.IsAvailable("icmpv4", "echo.identifier"))  // 注:原文示例中if条件缺少函数调用
  {
    Write("协议字段icmpv4.echo.identifier可用");
  }
}

17. ethernetPacket::GetVlanId

方法
语法

capl 复制代码
dword ethernetPacket.GetVlanId(); // 形式1  
dword ethernetPacket.GetVlanId(dword vlanIndex); // 形式2  

功能

若以太网报文包含VLAN标签,返回VLAN ID。对于双标签VLAN,可使用形式2访问特定VLAN ID。

参数

  • vlanIndex:双标签VLAN的标签索引。索引0表示内层VLAN,索引1表示外层VLAN。范围:0...2

返回值

VLAN的ID;若无VLAN,则返回0xFFFF。

可用性

  • 版本:10.0
  • 适用对象:Ethernet
  • 支持场景:测量设置 ✓,仿真/测试设置 ✓

示例

capl 复制代码
on ethernetPacket *  
{  
  if (this.hasVlan())  
  {  
    word vlanId;  
    vlanId = this.GetVlanId();  
    write("Received Ethernet packet with VLAN ID %d", vlanId);  
  }  
}  

18. ethernetPacket::GetVlanPriority

方法
语法

capl 复制代码
dword ethernetPacket.GetVlanPriority(); // 形式1  
dword ethernetPacket.GetVlanPriority(dword vlanIndex); // 形式2  

功能

若以太网报文包含VLAN标签,返回VLAN优先级。对于双标签VLAN,可使用形式2访问特定VLAN优先级。

参数

  • vlanIndex:双标签VLAN的标签索引。索引0表示内层VLAN,索引1表示外层VLAN。范围:0...2

返回值

VLAN的优先级;若无VLAN,则返回0xFFFF。

可用性

  • 版本:10.0
  • 适用对象:Ethernet
  • 支持场景:测量设置 ✓,仿真/测试设置 ✓

示例

capl 复制代码
on ethernetPacket *  
{  
  if (this.hasVlan())  
  {  
    word vlanPrio;  
    vlanPrio = this.GetVlanPriority();  
    write("Received Ethernet packet with VLAN priority %d", vlanPrio);  
  }  
}  
相关推荐
不羁的木木1 小时前
【开源鸿蒙跨平台开发学习笔记】Day09:React Native 开发 OpenHarmony —— 仓库列表组件封装
笔记·学习·react native
YJlio1 小时前
SDelete 学习笔记(9.15):安全擦除、不可恢复与合规清退实践
笔记·学习·安全
讨厌下雨的天空1 小时前
传输层TCP协议
服务器·网络协议·tcp/ip
●VON1 小时前
《不止于“开箱即用”:DevUI 表格与表单组件的高阶用法与避坑手册》
学习·华为·openharmony·表单·devui
石像鬼₧魂石1 小时前
flag 是什么?
学习·安全
2501_916008891 小时前
HTTPS 双向认证抓包指南,TLS 握手分析、mTLS 排查方法与多工具协同方案
android·网络协议·http·小程序·https·uni-app·iphone
大江东去浪淘尽千古风流人物1 小时前
【MSCKF】StateHelper 学习备注
vscode·学习·性能优化·编辑器·dsp开发
计算机小手1 小时前
内网穿透系列十五:Docker 部署,集成 Web UI,实现一键式异地组网
经验分享·网络协议·docker·开源软件
0和1的舞者1 小时前
Postman接口测试全攻略:传参技巧与实战解析
学习·测试工具·spring·springmvc·postman·web·开发