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);
}
}