Newer
Older
//calc payloadLen
v_ipPkt.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
//set extensionHeaders
if(f_setExtensionHeaders( v_ipPkt,
v_ipPkt.ipv6Hdr.sourceAddress,
v_ipPkt.ipv6Hdr.destinationAddress) != e_success) {
log(" **** f_sendCoti: Error when calculating length of extension headers ****");
return e_error;
}
//send
ipPort.send(v_ipPkt);
return e_success;
}//end f_sendCoti
/*
* @desc This sends a IPv6 packet with MipExtHdr - CareOfTest
* from an IPv6 node to any NUT.
*
* @remark
* @param p_msg MIPHeader to be sent
* @return execution status
*/
function f_sendCot(template CareOfTest p_msg)
runs on LibIpv6Node
return FncRetCode {
//Variables
var CareOfTest v_ipPkt;
v_ipPkt := valueof(p_msg);
//calc payloadLen
v_ipPkt.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
//set extensionHeaders
if(f_setExtensionHeaders( v_ipPkt,
v_ipPkt.ipv6Hdr.sourceAddress,
v_ipPkt.ipv6Hdr.destinationAddress) != e_success) {
log(" **** f_sendCoti: Error when calculating length of extension headers ****");
return e_error;
}
//send
ipPort.send(v_ipPkt);
return e_success;
}//end f_sendCot
/*
* @desc This sends a IPv6 packet with MipExtHdr - Fast Nbr Adv
* from an IPv6 node to any NUT.
*
* @remark
* @param p_msg MIPHeader to be sent
* @return execution status
*/
tepelmann
committed
function f_sendFastNbrAdv(template FastNeighborAdvertisement p_msg)
runs on LibIpv6Node
return FncRetCode {
//Variables
tepelmann
committed
var FastNeighborAdvertisement v_ipPkt;
//calc payloadLen
v_ipPkt.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
//set extensionHeaders
if(f_setExtensionHeaders( v_ipPkt,
v_ipPkt.ipv6Hdr.sourceAddress,
v_ipPkt.ipv6Hdr.destinationAddress) != e_success) {
log(" **** f_sendFastNbrAdv: Error when calculating length of extension headers ****");
return e_error;
}
//send
ipPort.send(v_ipPkt);
return e_success;
}//end f_sendFastNbrAdv
}//end group rfc3775Mipv6_ExtHdrFunctions
group rfc4303Esp_ExtHdrFunctions {
* @desc Rebuild original packet from an ESP packet (removes ESP encapsulation)
* @param p_ipv6Packet complete packet containing ESP Header to be processed
* @param p_espHeader ESP Header to be processed
* @param p_originalIpv6Packet retrieved original packet
* @return execution status
*/
function f_getOriginalIpv6Packet( in Ipv6Packet p_ipv6Packet,
in EspHeader p_espHeader,
out Ipv6Packet p_originalIpv6Packet)
runs on LibIpv6Node
return FncRetCode {
var UInt8 i;
var boolean v_loop := true;
if (not(ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList))
and not(ispresent(p_espHeader.espPayload.espIpDatagram.ipv6Payload))) {
log("**** f_getOriginalIpv6Packet: EspHeader.espPayload.espIpDatagram received that does neither contain extHdrList not ipv6Payload => EspHeader is not constructed correctly ****") ;
return e_error;
}
//Build original packet
p_originalIpv6Packet.ipv6Hdr := p_ipv6Packet.ipv6Hdr;
if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) {
p_originalIpv6Packet.extHdrList := p_espHeader.espPayload.espIpDatagram.extHdrList;
}
if (ispresent(p_espHeader.espPayload.espIpDatagram.ipv6Payload)) {
p_originalIpv6Packet.ipv6Payload := p_espHeader.espPayload.espIpDatagram.ipv6Payload;
}
// is a tunneledIpv6Hdr in the extHdrList? If yes, then it becomes the Ipv6Hdr of the original packet
if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) {
for (i:=0; i<sizeof(p_espHeader.espPayload.espIpDatagram.extHdrList) and v_loop ;i:=i+1) {
if (ischosen(p_espHeader.espPayload.espIpDatagram.extHdrList[i].tunneledIpv6)) {
p_originalIpv6Packet.ipv6Hdr := p_espHeader.espPayload.espIpDatagram.extHdrList[i].tunneledIpv6;
v_loop := false;
}
else {
p_originalIpv6Packet.extHdrList[i] := p_espHeader.espPayload.espIpDatagram.extHdrList[i];
}
}
}
p_originalIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (p_originalIpv6Packet);
return e_success;
}//end f_setEspHeader
* This function is used when sending messages.
* @param p_msg ExtensionHeaderList to be treated
* @return execution status
*/
/* function f_setEspHeader( in Ipv6Packet p_ipv6Packet,
inout EspHeader p_espHeader)
runs on LibIpv6Node
return FncRetCode {
var Ipv6Header v_originalIpv6Hdr;
var EchoRequest v_originalEchoRequest;
var EchoReply v_originalEchoReply;
//treat MipHdr and other ext
if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) {
}
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
if (ispresent(p_espHeader.espPayload.espIpDatagram.ipv6Payload)) {
if (ischosen(p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoRequestMsg)) {
if (ischosen(p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6)) {//tunnelMode
v_originalIpv6Hdr := p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6;
}
else { //transportMode
v_originalIpv6Hdr := p_ipv6Packet.ipv6Hdr;
}
//build original packet
v_originalEchoRequest := {
ipv6Hdr := v_originalIpv6Hdr,
extHdrList := omit,
ipv6Payload := p_espHeader.espPayload.espIpDatagram.ipv6Payload
}
//calc checksum
if (v_originalEchoRequest.ipv6Payload.echoRequestMsg.checksum != c_2ZeroBytes) {
//calc checksum
v_originalEchoRequest.ipv6Payload.echoRequestMsg.checksum := fx_icmpv6Checksum(v_originalEchoRequest);
}
//assign checksum
p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoRequestMsg.checksum := v_originalEchoRequest.ipv6Payload.echoRequestMsg.checksum;
}
else if (ischosen(p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoReplyMsg)) {
if (ischosen(p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6)) {//tunnelMode
v_originalIpv6Hdr := p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6;
}
else { //transportMode
v_originalIpv6Hdr := p_ipv6Packet.ipv6Hdr;
}
//build original packet
v_originalEchoReply := {
ipv6Hdr := v_originalIpv6Hdr,
extHdrList := omit,
ipv6Payload := p_espHeader.espPayload.espIpDatagram.ipv6Payload
}
//calc checksum
if (v_originalEchoReply.ipv6Payload.echoReplyMsg.checksum != c_2ZeroBytes) {
//calc checksum
v_originalEchoReply.ipv6Payload.echoReplyMsg.checksum := fx_icmpv6Checksum(v_originalEchoReply);
}
//assign checksum
p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoReplyMsg.checksum := v_originalEchoReply.ipv6Payload.echoReplyMsg.checksum;
}