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

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数组(如打印或传输)  
}  
相关推荐
im_AMBER1 小时前
Leetcode 69 正整数和负整数的最大计数
数据结构·笔记·学习·算法·leetcode
richxu202510011 小时前
嵌入式学习之路>单片机核心原理篇>(5)串口通信核心原理
单片机·嵌入式硬件·学习
sponge'1 小时前
opencv学习笔记12:GAN网络
笔记·opencv·学习
会飞的小蛮猪1 小时前
Rockylinux急速安装K8s学习环境
学习·容器·kubernetes
代码游侠1 小时前
数据结构--队列
数据结构·笔记·学习·算法·链表
科技块儿1 小时前
【IP】IP精准检测【IP数据云ipdatacloud.com】
网络·网络协议·tcp/ip
车载测试工程师1 小时前
CAPL学习-ETH功能函数-方法类2
网络·网络协议·学习·c#·以太网·capl·canoe
xian_wwq1 小时前
【学习笔记】数据要素市场新基石:可信数据空间技术架构详解
笔记·学习
苏小瀚1 小时前
[JavaSE] 网络原理(TCP_IP)
服务器·网络·tcp/ip