ethernetPacket::protocol::IsAvailable
方法
语法
long ethernetPacket.<protocol>.IsAvailable();
功能
检查以太网数据包中是否包含指定协议或协议字段。
返回值
1:数据包包含协议0:数据包不包含协议
可用性
- 版本:11.0 SP3
- 适用场景:测量设置、仿真/测试设置
示例
capl
on ethernetPacket *
{
if (this.udp.IsAvailable())
{
write("Packet has UDP protocol with port %d to %d!", this.udp.source, this.udp.destination);
}
}
ethernetPacket::protocol::optional-structure::Clear
方法
语法
long ethernetPacket.<protocol>.<optional-structure>.Clear();
功能
从以太网数据包中移除协议选项。
返回值
0:成功-1:错误
可用性
- 版本:11.0 SP3
- 适用场景:测量设置、仿真/测试设置
示例
capl
on ethernetPacket msgChannel1.*
{
if (this.ipv6.fragment.IsAvailable())
{
ethernetPacket pkt;
pkt = this;
pkt.msgChannel = 2;
pkt.ipv6.fragment.Clear(); // 移除分片选项
pkt.CompletePacket();
output(pkt);
}
}
ethernetPacket::protocol::optional-structure::Init
方法
语法
long ethernetPacket.<protocol>.<optional-structure>.Init();
功能
为特定协议添加协议选项。支持的协议及选项如下:
| 协议 | 选项 |
|---|---|
| IPv4 | 选项列表结束(optionEOL)、无操作(optionNOP)、安全(optionSecurity)等 |
| ICMPv4 | 地址掩码应答(addrMaskReply)、回显请求(echo)、目的不可达(destinationUnreachable)等 |
| IPv6 | 逐跳选项(hopByHopOptions)、路由头(routing)、分片头(fragment)等 |
| ICMPv6 | 回显应答(echoReply)、多播监听报告(multicastListenerReport)等 |
| NDP | 邻居通告(neighborAdvertisement)、路由器请求(routerSolicitation)等 |
| IGMP | 成员查询(membershipQuery)、成员报告(membershipReport) |
| TFTP | 确认(ack)、文件数据(fileData)、读请求(readRequest)等 |
返回值
0:成功-1:错误
可用性
- 版本:11.0 SP3
- 适用场景:测量设置、仿真/测试设置
示例(IPv6分片头)
capl
on key '1'
{
ethernetPacket pkt;
pkt.ipv6.Init();
pkt.udp.Init();
pkt.ipv6.fragment.Init(); // 添加分片选项
pkt.ipv6.fragment.offset = 100;
pkt.ipv6.fragment.flag = 1;
pkt.ipv6.fragment.identification = 0x1234;
pkt.CompletePacket();
output(pkt);
}
ethernetPacket::protocol::ResizeData
方法
语法
long ethernetPacket.<protocol>.ResizeData( word newLength );
功能
调整协议 payload 长度。若新长度大于数据包长度,数据包将扩容。若协议不存在,返回错误。
参数
newLength:新的 payload 长度(字节)。
返回值
0:成功-1:错误-2:协议不在数据包中-3:协议无 payload 可调整
可用性
- 版本:11.0 SP3
- 适用场景:测量设置、仿真/测试设置
示例
capl
word i;
ethernetPacket pkt;
pkt.udp.Init();
pkt.udp.ResizeData(200); // 调整UDP payload为200字节
for (i = 0; i < 200; i++)
{
pkt.udp.Byte(i) = 0; // 填充0
}
pkt.CompletePacket();
output(pkt);
ethernetPacket::protocol::SetData
方法
语法
word
word ethernetPacket.<protocol>.SetData( word offset, byte[]data, word length ); // 形式2
word ethernetPacket.<protocol>.SetData( word offset, struct * data); // 形式3
word ethernetPacket.<protocol>.SetData( word offset, sysvarStruct data); // 形式4
word ethernetPacket.<protocol>.SetData( char[]data, word length ); // 形式5
word ethernetPacket.<protocol>.SetData( byte[]data, word length ); // 形式6
word ethernetPacket.<protocol>.SetData( struct * data); // 形式7
word ethernetPacket.<protocol>.SetData( sysvarStruct data); // 形式8
功能
设置以太网数据包中某协议的负载数据。若数据包中不存在指定协议(<protocol>),则不设置数据并返回0。
- 形式1-4(含offset参数):若数据长度大于以太网数据包长度,数据包将自动扩容;若数据长度小于当前负载长度,负载长度保持不变。
- 形式5-8(不含offset参数):数据长度将调整为新数据的指定长度。
参数
data:待复制数据的缓冲区。length:复制到协议负载的字节数。offset:负载中开始复制数据的字节偏移量。
返回值
复制到以太网数据包的字节数。
可用性
| 版本 | 支持形式 | 适用范围 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|---|
| 11.0 SP3 | 形式1-4 | Ethernet | • | • |
| 12 | 形式5-8 | Ethernet | • | • |
示例
c
on key '1'
{
ethernetPacket pkt;
_align(1) struct MyData
{
long value1;
long value2;
} buffer;
buffer.value1 = 1;
buffer.value2 = 2;
pkt.udp.Init();
pkt.udp.SetData( 0, buffer );
pkt.CompletePacket();
output( pkt );
}
ethernetPacket::RemoveVlan
方法
语法
long
long ethernetPacket.RemoveVlan(dword vlanIndex); // 形式2
功能
从以太网数据包中移除VLAN标签。对于双标签VLAN,可使用形式2移除指定标签。
参数
vlanIndex:双标签VLAN的索引(0=内层VLAN,1=外层VLAN,范围0...2)。
返回值
- 0:成功
- 1:数据包不含VLAN标签
可用性
| 版本 | 适用范围 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 10.0 | Ethernet | • | • |
示例
c
on ethernetPacket *
{
if ((this.hasVlan()) && (this.msgChannel == 1))
{
ethernetPacket forwardPkt;
forwardPkt = this;
forwardPkt.msgChannel = 2;
forwardPkt.RemoveVlan();
output( forwardPkt );
}
}
ethernetPacket::SetData
方法
语法
word
word ethernetPacket.SetData(word offset, byte source [], word length); // 形式2
word ethernetPacket.SetData(word offset, struct * source); // 形式3
word ethernetPacket.SetData(word offset, sysvarStruct source); // 形式4
功能
将字符数组、字节数组、CAPL结构体或系统变量结构体中的字节复制到以太网数据包的数据区。
参数
offset:数据包中数据的字节偏移量(偏移量0为Ethertype后的第一个字节)。source:待复制数据的源。length:复制的字节数。
返回值
复制到以太网数据包的字节数。
可用性
| 版本 | 适用范围 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 10.0 | Ethernet | • | • |
示例
c
on key '1'
{
_align(1) struct MyMsgLayout
{
word valueA;
dword valueB;
};
ethernetPacket pkt;
struct MyMsgLayout myData;
myData.valueA = 1;
myData.valueB = 2;
pkt.source = ethGetMacAddressAsNumber( "20:00:00:00:00:01" );
pkt.destination = ethGetMacAddressAsNumber( "FF:FF:FF:FF:FF:FF" );
pkt.type = 0xF123; // 私有Ethertype
pkt.Length = __size_of(struct MyMsgLayout);
pkt.SetData( 0, myData );
output( pkt );
}
ethernetPacket::SetDestinationIPAddress
方法
语法
long
功能
通过ip_Address变量设置以太网数据包的目的IP地址。
注意
数据包必须包含IPv4或IPv6协议。
参数
address:待设置的IP地址变量。
返回值
- 0:成功
- -1:数据包不含IPv4/IPv6协议
可用性
| 版本 | 适用范围 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 13.0 | Ethernet | • | • |
ethernetPacket::SetDestinationIPEndpoint
方法
语法
long
功能
通过ip_Endpoint设置以太网数据包的目的IP地址和UDP/TCP端口号。
注意
数据包必须包含IPv4/IPv6协议及UDP/TCP协议。
参数
endpoint:包含IP地址和端口的端点。
返回值
- 0:成功
- -1:不含IPv4/IPv6协议
- -2:不含UDP/TCP协议
可用性
| 版本 | 适用范围 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 13.0 | Ethernet | • | • |
ethernetPacket::SetSourceIPAddress
方法
语法
long
功能
通过ip_Address变量设置以太网数据包的源IP地址。
注意
数据包必须包含IPv4或IPv6协议。
参数
address:待设置的IP地址变量。
返回值
- 0:成功
- -1:数据包不含IPv4/IPv6协议
可用性
| 版本 | 适用范围 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 13.0 | Ethernet | • | • |
ethernetPacket::SetSourceIPEndpoint
方法
语法
long
功能
通过ip_Endpoint设置以太网数据包的源IP地址和UDP/TCP端口号。
注意
数据包必须包含IPv4/IPv6协议及UDP/TCP协议。
参数
endpoint:包含IP地址和端口的端点。
返回值
- 0:成功
- -1:不含IPv4/IPv6协议
- -2:不含UDP/TCP协议
可用性
| 版本 | 适用范围 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 13.0 | Ethernet | • | • |
ethernetPacket::SetVlan
方法
语法
long
long ethernetPacket.SetVlan(dword vlanIndex, word tpid, word tci); // 形式2
功能
设置以太网数据包的VLAN标签。若数据包不含VLAN标签,则添加新标签;双标签VLAN需使用形式2。
参数
tpid:VLAN TPID值tci:VLAN TCI值vlanIndex:双标签索引(0=内层,1=外层,范围0...2)
返回值
- 0:成功
- 1:添加VLAN标签失败
可用性
| 版本 | 适用范围 | 测量设置 | 仿真/测试设置 |
|---|---|---|---|
| 10.0 | Ethernet | • | • |
示例
c
// 单标签VLAN
on key '1'
{
ethernetPacket pkt;
pkt.SetVlan( 0x8100, 0x5123 );
output( pkt );
}
// 双标签VLAN
on key '2'
{
ethernetPacket pkt;
pkt.SetVlan( 0, 0x8100, 0x5123 ); // 内层
pkt.SetVlan( 1, 0x88A8, 0x6456 ); // 外层
output( pkt );
}
版本说明:所有功能均基于CANoe/CANalyzer 14 SP2,© Vector Informatik GmbH。
ethernetPacket::SetVlanId
方法
语法
capl
long ethernetPacket.SetVlanId(word vlanId); // 形式1
long ethernetPacket.SetVlanId(dword vlanIndex, word vlanId); // 形式2
功能
设置以太网报文的VLAN ID。若报文不含VLAN标签,则自动添加新标签。对于双标签VLAN,可使用形式2。
参数
- vlanId:需设置的VLAN ID,范围:0...0FFFh(0~4095)。
- vlanIndex:双标签VLAN的标签索引(0表示内层VLAN,1表示外层VLAN),范围:0...2。
返回值
- 0:成功
- 1:添加VLAN标签失败
- 2:VLAN ID超出范围
可用性
- 版本:10.0及以上
- 支持:以太网测量/仿真测试环境
示例
capl
on key '1' {
ethernetPacket pkt;
pkt.SetVlanId(10); // 单标签VLAN(ID=10)
pkt.SetVlanPriority(1); // 设置优先级为1
output(pkt); // 发送报文
}
on key '2' {
ethernetPacket pkt;
// 双标签VLAN配置
pkt.SetVlanId(0, 10); // 内层VLAN ID=10
pkt.SetVlanPriority(0, 1); // 内层优先级=1
pkt.SetVlanId(1, 20); // 外层VLAN ID=20
pkt.SetVlanPriority(1, 2); // 外层优先级=2
output(pkt); // 发送报文
}
ethernetPacket::SetVlanPriority
方法
语法
capl
long ethernetPacket.SetVlanPriority(word vlanPriority); // 形式1
long ethernetPacket.SetVlanPriority(dword vlanIndex, word vlanPriority); // 形式2
功能
设置以太网报文的VLAN优先级。若报文不含VLAN标签,则自动添加新标签。对于双标签VLAN,可使用形式2。
参数
- vlanPriority:需设置的VLAN优先级,范围:0...7(0为最低,7为最高)。
- vlanIndex:双标签VLAN的标签索引(0表示内层VLAN,1表示外层VLAN),范围:0...2。
返回值
- 0:成功
- 1:添加VLAN标签失败
- 2:VLAN优先级超出范围
可用性
- 版本:10.0及以上
- 支持:以太网测量/仿真测试环境
示例
同 ethernetPacket::SetVlanId 示例。
ethernetPacket::source::ParseAddress
方法
语法
capl
long ethernetPacket.source.ParseAddress(char addressAsString[]); // 形式1(源MAC)
long ethernetPacket.destination.ParseAddress(char addressAsString[]); // 形式2(目的MAC)
功能
通过字符串设置以太网报文的源或目的MAC地址,格式需6为16字节)。
参数
- ipAddr[]:存储IP地址的字节数组或字符数组。
返回值
- 0:成功
- 1:数组大小不匹配IP地址长度
- 2:IP地址对象未初始化
可用性
- 版本:12.0及以上
- 支持:以太网测量/仿真测试环境
示例
capl
IP_Address addr;
byte addrData[16]; // IPv6地址需16字节数组
if(addr.SetAddressAsArray(addrData) == 0) {
// 处理addrData数组(如打印或传输)
}