Newer
Older
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
* 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);
//set extensionHeaders
if(f_setExtensionHeaders( v_ipPkt ) != 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
*/
function f_sendFastNbrAdv(template FastNeighborAdvertisement p_msg)
runs on LibIpv6Node
return FncRetCode {
//Variables
var FastNeighborAdvertisement v_ipPkt;
v_ipPkt := valueof(p_msg);
//set extensionHeaders
if(f_setExtensionHeaders( v_ipPkt ) != 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;
p_originalIpv6Packet.ipv6Hdr.nextHeader := p_espHeader.nextHeader;
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_getOriginalIpv6Packet
/*
* @desc
* This function is used to retrieve the index
* within the SecurityAssociationList corresponding
* to the given SPI.
*
* @param p_sad SecurityAssociationList to be treated
* @param p_spi SPI used to search for the list index
* @param p_idx Index of the SA corresponding to p_spi
* @return execution status
*/
function f_getSaBySpi(in Sad p_sad, in integer p_spi, out integer p_idx)
return FncRetCode {
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
var integer i := 0;
for (i:=0; i<sizeof(p_sad); i:=i+1) {
if (p_sad[i].spi == p_spi) {
p_idx := i;
return e_success;
}
}
log("**** f_getSaBySpi: Could not find SPI! ****") ;
return e_error;
}
}//end group rfc4303Esp_ExtHdrFunctions
group rfc791RootFns {
/*
* @desc This sends an ICMPv4 packet from an dual stack IPv4/IPv6 node to
* any NUT. Prior it modifies
* IPv6 packet payload length and ICMPv6 checksum
* IPv4 packet payload length (totalLength field in IPv4 header) and ICMPv4 checksum
* to their correct values using external functions.
* @remark The template passed in must NOT contain any matching expressions!
* @param p_ipv4Packet Ipv4 packet value or template with echo request to be sent
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
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
* @return execution status
*/
function f_sendIpv4Packet (in template Ipv4Packet p_ipv4Packet)
runs on LibIpv6Node
return FncRetCode {
var Ipv4Packet v_ipPkt;
v_ipPkt := valueof(p_ipv4Packet);
if (ispresent(v_ipPkt.ipv4Payload)) {
//Build IPv6 Packet
if(ischosen(v_ipPkt.ipv4Payload.ipv6Packet)) {
if(f_setExtensionHeaders(v_ipPkt.ipv4Payload.ipv6Packet) != e_success) {
log(" **** f_sendIpv4Packet: Error when building IPv6Packet ****");
return e_error;
}
}
else if(ischosen(v_ipPkt.ipv4Payload.ipv4EchoRequestMsg)) {
v_ipPkt.ipv4Payload.ipv4EchoRequestMsg.checksum := fx_calcIpv4PayloadChecksum (
v_ipPkt.ipv4Payload
);
}
else if(ischosen(v_ipPkt.ipv4Payload.ipv4EchoReplyMsg)) {
v_ipPkt.ipv4Payload.ipv4EchoReplyMsg.checksum := fx_calcIpv4PayloadChecksum (
v_ipPkt.ipv4Payload
);
}
}
//Build IPv4 Packet
//IHL is set in templates
// Update the total length
v_ipPkt.ipv4Hdr.totalLength := fx_ipv4PacketTotalLength (v_ipPkt);
// Compute header checksum (HCS)
v_ipPkt.ipv4Hdr.hcs := fx_calcIpv4Hcs (
v_ipPkt.ipv4Hdr
);
//send
ipv4Port.send(v_ipPkt);
return e_success;
}//end f_sendIpv4Packet
}//end rfc791RootFns
} // end module LibIpv6_Interface_Functions