Newer
Older
ipSecProtocolMode := PX_IP_SEC_PROTOCOL_MODE
}
//TODO chose in function of PX_SPI the SAD to be used for testing
v_ret := fx_setSecurityParameters(vc_sad[0]);
if (v_ret != e_success) {log("fx_setSecurityParameters: Error when settign security parameters");}
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
/*
* @desc This generates Security Parameters Index
* @return Security Parameters Index
*/
function f_createSpi()
runs on LibIpv6Node
return UInt32 {
var Oct4 v_spi := int2oct(float2int(int2float(20000-5000)*rnd())+5000, 4);
return oct2int(v_spi);
}//end f_createSpi
/*
* @desc This generates a secret key
* @return Secret key
*/
function f_createSecretKey()
runs on LibIpv6Node
return octetstring {
var Oct20 v_key := int2oct(float2int(int2float(20000-5000)*rnd())+5000, 20);
return v_key;
}//end f_createSecretKey
/*
* @desc
* This function is used when sending messages.
* @param p_msg ExtensionHeaderList to be treated
* @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_setEspHeader: EspHeader.espPayload.espIpDatagram received that does neither contain extHdrList not ipv6Payload => EspHeader is not constructed correctly ****") ;
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
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)) {
}
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
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;
}