Commit 185ae8ac authored by berge's avatar berge
Browse files

Replaced specific icmpv6 checksum calculation function by generic payload...

Replaced specific icmpv6 checksum calculation function by generic payload checksum calculation function
parent 90b25c22
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -51,7 +51,16 @@
	 * @param  p_packet ICMPv6 packet 
	 * @return checksum value 
	*/
	external function fx_icmpv6Checksum( in template Ipv6Packet p_packet) 
	//external function fx_icmpv6Checksum( in template Ipv6Packet p_packet) 
	//return Oct2;
	
	/* @desc	TODO
	 * @param  TODO 
	 * @return checksum value 
	*/
	external function fx_calcPayloadChecksum(in template Ipv6Address p_srcAddress,	
											 in template Ipv6Address p_dstAddress, 
											 in template Ipv6Payload p_payload) 
	return Oct2;
	
	external function fx_encodeMessage (in template Ipv6Packet p_msg)
+202 −99
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ group rfc2460Root_Functions {
		var Ipv6Address v_pseudoSrcAddr := c_16ZeroBytes;
		var Ipv6Address v_pseudoDstAddr := c_16ZeroBytes;
		var boolean v_loop := true;
		var Ipv6Packet v_originalIpv6Packet;
		var Ipv6Packet v_pseudoIpv6Packet;
		var Ipv6Packet v_activeIpv6Packet := p_ipv6Packet;

		v_pseudoDstAddr := v_activeIpv6Packet.ipv6Hdr.destinationAddress;
@@ -122,88 +122,69 @@ group rfc2460Root_Functions {
					v_nrOfTunnelHdr := v_nrOfTunnelHdr + 1;
		
					//Build original packet
					v_originalIpv6Packet.ipv6Hdr := v_activeIpv6Packet.extHdrList[i].tunneledIpv6;
					v_pseudoIpv6Packet.ipv6Hdr := v_activeIpv6Packet.extHdrList[i].tunneledIpv6;
					for (j:=0; (i+j+1)<sizeof(v_activeIpv6Packet.extHdrList) ;j:=j+1) {
						v_originalIpv6Packet.extHdrList[j] := v_activeIpv6Packet.extHdrList[i+1];	
						v_pseudoIpv6Packet.extHdrList[j] := v_activeIpv6Packet.extHdrList[i+1];	
					}
					if (ispresent(v_activeIpv6Packet.ipv6Payload)) {
						v_originalIpv6Packet.ipv6Payload := v_activeIpv6Packet.ipv6Payload;	
						v_pseudoIpv6Packet.ipv6Payload := v_activeIpv6Packet.ipv6Payload;	
					}
					v_originalIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_originalIpv6Packet);
					v_pseudoIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_pseudoIpv6Packet);

					// recursive call, original packet can still contain other headers
					f_setExtensionHeaders(	v_originalIpv6Packet,
											v_originalIpv6Packet.ipv6Hdr.sourceAddress,
											v_originalIpv6Packet.ipv6Hdr.destinationAddress);
					f_setExtensionHeaders(	v_pseudoIpv6Packet,
											v_pseudoIpv6Packet.ipv6Hdr.sourceAddress,
											v_pseudoIpv6Packet.ipv6Hdr.destinationAddress);
					//Update the original packet						
					v_originalIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_originalIpv6Packet);											
					v_pseudoIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_pseudoIpv6Packet);											
			
					// include recursion results
					v_activeIpv6Packet.extHdrList[i].tunneledIpv6.payloadLength := v_originalIpv6Packet.ipv6Hdr.payloadLength;
					if (ispresent(v_originalIpv6Packet.extHdrList)) {
						for (j:=0; j<sizeof(v_originalIpv6Packet.extHdrList) ;j:=j+1) {
							v_activeIpv6Packet.extHdrList[i+1] := v_originalIpv6Packet.extHdrList[j];	
					v_activeIpv6Packet.extHdrList[i].tunneledIpv6.payloadLength := v_pseudoIpv6Packet.ipv6Hdr.payloadLength;
					if (ispresent(v_pseudoIpv6Packet.extHdrList)) {
						for (j:=0; j<sizeof(v_pseudoIpv6Packet.extHdrList) ;j:=j+1) {
							v_activeIpv6Packet.extHdrList[i+1] := v_pseudoIpv6Packet.extHdrList[j];	
						}			
					}
					if (ispresent(v_originalIpv6Packet.ipv6Payload)) {
						v_activeIpv6Packet.ipv6Payload := v_originalIpv6Packet.ipv6Payload;	
					if (ispresent(v_pseudoIpv6Packet.ipv6Payload)) {
						v_activeIpv6Packet.ipv6Payload := v_pseudoIpv6Packet.ipv6Payload;	
					}
					
					v_loop := false;				
				}
				//Process ESP Header
				//Process ESP Header, recursive
				else if (ischosen(v_activeIpv6Packet.extHdrList[i].espHeader)) {
	
					v_ret := f_getOriginalIpv6Packet(
									v_activeIpv6Packet,
									v_activeIpv6Packet.extHdrList[i].espHeader,
									v_originalIpv6Packet);
									v_pseudoIpv6Packet);
					if (v_ret == e_success) {
						f_setExtensionHeaders(	v_originalIpv6Packet,
												v_originalIpv6Packet.ipv6Hdr.sourceAddress,
												v_originalIpv6Packet.ipv6Hdr.destinationAddress);
						f_setExtensionHeaders(	v_pseudoIpv6Packet,
												v_pseudoIpv6Packet.ipv6Hdr.sourceAddress,
												v_pseudoIpv6Packet.ipv6Hdr.destinationAddress);
												
						// include recursion results
						if (ispresent(v_originalIpv6Packet.extHdrList)) {
							for (j:=0; j<sizeof(v_originalIpv6Packet.extHdrList) ;j:=j+1) {
								v_activeIpv6Packet.extHdrList[i+1] := v_originalIpv6Packet.extHdrList[j];	
						if (ispresent(v_pseudoIpv6Packet.extHdrList)) {
							for (j:=0; j<sizeof(v_pseudoIpv6Packet.extHdrList) ;j:=j+1) {
								v_activeIpv6Packet.extHdrList[i+1] := v_pseudoIpv6Packet.extHdrList[j];	
							}			
						}
						if (ispresent(v_originalIpv6Packet.ipv6Payload)) {
							v_activeIpv6Packet.ipv6Payload := v_originalIpv6Packet.ipv6Payload;	
						if (ispresent(v_pseudoIpv6Packet.ipv6Payload)) {
							v_activeIpv6Packet.ipv6Payload := v_pseudoIpv6Packet.ipv6Payload;	
						}												
	
						v_loop := false;
					}
				}
				//Process Auth Header
				else if (ischosen(v_activeIpv6Packet.extHdrList[i].authHeader)) {
					v_ret := f_setExtensionHeaders(		v_activeIpv6Packet,
														v_activeIpv6Packet.ipv6Hdr.sourceAddress,
														v_activeIpv6Packet.ipv6Hdr.destinationAddress);
					//Update AuthHeader payloadLen
					p_ipv6Packet.extHdrList[i].authHeader.payloadLen := fx_authHeaderPayloadLength(valueof(p_ipv6Packet.extHdrList[i].authHeader));
					
					//	update packet payloadLen
					p_ipv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (p_ipv6Packet);
				}
 
			}//end for
		}

		// all extension headers have been processed
		// Is there still a payload to be processed and which has not been already processed in a recursive call?
		if (v_loop==true and ispresent(v_activeIpv6Packet.ipv6Payload)) {
			v_originalIpv6Packet := v_activeIpv6Packet;
			v_originalIpv6Packet.ipv6Hdr.sourceAddress := v_pseudoSrcAddr;
			v_originalIpv6Packet.ipv6Hdr.destinationAddress := v_pseudoDstAddr;
			
			v_ret := f_calcIpv6PayloadChecksum(v_originalIpv6Packet);
			
			v_originalIpv6Packet.ipv6Hdr.sourceAddress := v_activeIpv6Packet.ipv6Hdr.sourceAddress;
			v_originalIpv6Packet.ipv6Hdr.destinationAddress := v_activeIpv6Packet.ipv6Hdr.destinationAddress;
			v_activeIpv6Packet := v_originalIpv6Packet;
			v_ret := f_calcIpv6PayloadChecksum(v_pseudoSrcAddr, v_pseudoDstAddr, v_activeIpv6Packet.ipv6Payload);
		}
		v_ret := f_setAuthHeader (v_activeIpv6Packet);

		p_ipv6Packet := v_activeIpv6Packet;

@@ -211,111 +192,205 @@ group rfc2460Root_Functions {

	}//end f_setExtensionHeaders

	/*
	 * @desc 	This goes through the extension header list and looks for 
	 *          Authentication Header to compute ICV.
	 *			Only 1 Authentication Header is processed
	 * @param 	p_srcAddr Source Address of IPv6 packet
	 * @param 	p_dstAddr Dst Address of IPv6 packet
	 * @param 	p_extHdrList Extension Header List
	 * @return 	execution status 
	*/
	function f_setAuthHeader(	inout Ipv6Packet p_ipv6Packet)
	runs on LibIpv6Node
	return FncRetCode {
		var FncRetCode v_ret := e_success;
		var UInt8 i, j;

		var boolean v_loop := true;
		var Ipv6Packet v_pseudoIpv6Packet;
		var Ipv6Packet v_activeIpv6Packet := p_ipv6Packet;

		if (ispresent(v_activeIpv6Packet.extHdrList)) {
			for (i:=0; i<sizeof(v_activeIpv6Packet.extHdrList) and v_loop ;i:=i+1) {
				
				// Process Home Address Destination Option, predictable field
				if (ischosen(v_activeIpv6Packet.extHdrList[i].destinationOptionHeader)) {
					for (j:=0; j<sizeof(v_activeIpv6Packet.extHdrList[i].destinationOptionHeader.destOptionList);j:=j+1) {
						if (ischosen(v_activeIpv6Packet.extHdrList[i].destinationOptionHeader.destOptionList[j].homeAddressOption)) {
							//TODO
						}
					}
				}
				// Proccess Routing Header Type 2, predictable field
				else if (ischosen(v_activeIpv6Packet.extHdrList[i].routingHeader) and (v_activeIpv6Packet.extHdrList[i].routingHeader.routingType == c_routeHdrType2)) {
					if (ischosen(v_activeIpv6Packet.extHdrList[i].routingHeader.routingHeaderData.rtHdrDataHomeAddress)) {
						//TODO
					}
				}
				// Process Tunneled Header, recursive
				else if (ischosen(v_activeIpv6Packet.extHdrList[i].tunneledIpv6)) {
		
					//Build original packet
					v_pseudoIpv6Packet.ipv6Hdr := v_activeIpv6Packet.extHdrList[i].tunneledIpv6;
					for (j:=0; (i+j+1)<sizeof(v_activeIpv6Packet.extHdrList) ;j:=j+1) {
						v_pseudoIpv6Packet.extHdrList[j] := v_activeIpv6Packet.extHdrList[i+1];	
					}
					if (ispresent(v_activeIpv6Packet.ipv6Payload)) {
						v_pseudoIpv6Packet.ipv6Payload := v_activeIpv6Packet.ipv6Payload;	
					}

					// recursive call, original packet can still contain Auth header
					f_setAuthHeader( v_pseudoIpv6Packet );
					
					v_loop := false;				
				}
				// Process Authentication Header Header
				else if (ischosen(v_activeIpv6Packet.extHdrList[i].authHeader)) {
					
					if (lengthof(p_ipv6Packet.extHdrList[i].authHeader.icv) != vc_sad[0].icvLen) {
						log("**** f_setAuthHeader: Error: icv length delivered by fx_max does not match icv length defined in vc_sad ****");
						return e_error;
					}
					
					if (vc_sad[0].icvPadLen != 0) {
						p_ipv6Packet.extHdrList[i].authHeader.icvPadding := int2oct(0,vc_sad[0].icvPadLen);
					}
					else {
						p_ipv6Packet.extHdrList[i].authHeader.icvPadding := omit;
					}

					//	Update AuthHeader payloadLen
					p_ipv6Packet.extHdrList[i].authHeader.payloadLen := (12 + vc_sad[0].icvLen + vc_sad[0].icvPadLen) / 4 - 2;
					//Update IPv6 payload based on the calculated ICV + padding
					p_ipv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (p_ipv6Packet);


					v_activeIpv6Packet := p_ipv6Packet;
					//zero mutable fields
					v_activeIpv6Packet.ipv6Hdr.flowLabel := 0;
					v_activeIpv6Packet.ipv6Hdr.hopLimit := 0;

					//compute icv					
					p_ipv6Packet.extHdrList[i].authHeader.icv := fx_mac( vc_sad[0].ahIntegrityAlgo , vc_sad[0].ahIntegrityKey, fx_encodeMessage(v_activeIpv6Packet));
					
					v_loop := false;				
				}				
			}//end for
		}

		return v_ret;

	}//end f_setAuthHeader

		
	}//end group extHdrFns

	function f_calcIpv6PayloadChecksum( inout Ipv6Packet p_ipv6Packet)
	function f_calcIpv6PayloadChecksum( in template Ipv6Address p_srcAddr,	
										in template Ipv6Address p_dstAddr, 
										inout template Ipv6Payload p_ipv6Payload)
	return FncRetCode {
		
		if(ischosen(p_ipv6Packet.ipv6Payload.echoReplyMsg)) {
			if(p_ipv6Packet.ipv6Payload.echoReplyMsg.checksum == c_2ZeroBytes) {
		if(ischosen(p_ipv6Payload.echoReplyMsg)) {
			if(p_ipv6Payload.echoReplyMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.echoReplyMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.echoReplyMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.echoRequestMsg)) {
			if(p_ipv6Packet.ipv6Payload.echoRequestMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.echoRequestMsg)) {
			if(p_ipv6Payload.echoRequestMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.echoRequestMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.echoRequestMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.nbrAdvMsg)) {
			if(p_ipv6Packet.ipv6Payload.nbrAdvMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.nbrAdvMsg)) {
			if(p_ipv6Payload.nbrAdvMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.nbrAdvMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.nbrAdvMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.nbrSolMsg)) {
			if(p_ipv6Packet.ipv6Payload.nbrSolMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.nbrSolMsg)) {
			if(p_ipv6Payload.nbrSolMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.nbrSolMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.nbrSolMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.routerAdvMsg)) {
			if(p_ipv6Packet.ipv6Payload.routerAdvMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.routerAdvMsg)) {
			if(p_ipv6Payload.routerAdvMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.routerAdvMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.routerAdvMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.routerSolMsg)) {
			if(p_ipv6Packet.ipv6Payload.routerSolMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.routerSolMsg)) {
			if(p_ipv6Payload.routerSolMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.routerSolMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.routerSolMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.redirectMsg)) {
			if(p_ipv6Packet.ipv6Payload.redirectMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.redirectMsg)) {
			if(p_ipv6Payload.redirectMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.redirectMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.redirectMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.parameterProblemMsg)) {
			if(p_ipv6Packet.ipv6Payload.parameterProblemMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.parameterProblemMsg)) {
			if(p_ipv6Payload.parameterProblemMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.parameterProblemMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.parameterProblemMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.timeExceededMsg)) {
			if(p_ipv6Packet.ipv6Payload.timeExceededMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.timeExceededMsg)) {
			if(p_ipv6Payload.timeExceededMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.timeExceededMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.timeExceededMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.packetTooBigMsg)) {
			if(p_ipv6Packet.ipv6Payload.packetTooBigMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.packetTooBigMsg)) {
			if(p_ipv6Payload.packetTooBigMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.packetTooBigMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.packetTooBigMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.destinationUnreachableMsg)) {
			if(p_ipv6Packet.ipv6Payload.destinationUnreachableMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.destinationUnreachableMsg)) {
			if(p_ipv6Payload.destinationUnreachableMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.destinationUnreachableMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.destinationUnreachableMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.mobileRouterAdvMsg)) {
			if(p_ipv6Packet.ipv6Payload.mobileRouterAdvMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.mobileRouterAdvMsg)) {
			if(p_ipv6Payload.mobileRouterAdvMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.mobileRouterAdvMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.mobileRouterAdvMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.homeAgentAddrDiscRequestMsg)) {
			if(p_ipv6Packet.ipv6Payload.homeAgentAddrDiscRequestMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.homeAgentAddrDiscRequestMsg)) {
			if(p_ipv6Payload.homeAgentAddrDiscRequestMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.homeAgentAddrDiscRequestMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.homeAgentAddrDiscRequestMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.homeAgentAddrDiscReplyMsg)) {
			if(p_ipv6Packet.ipv6Payload.homeAgentAddrDiscReplyMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.homeAgentAddrDiscReplyMsg)) {
			if(p_ipv6Payload.homeAgentAddrDiscReplyMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.homeAgentAddrDiscReplyMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.homeAgentAddrDiscReplyMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.mobilePrefixSolMsg)) {
			if(p_ipv6Packet.ipv6Payload.mobilePrefixSolMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.mobilePrefixSolMsg)) {
			if(p_ipv6Payload.mobilePrefixSolMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.mobilePrefixSolMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.mobilePrefixSolMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.mobilePrefixAdvMsg)) {
			if(p_ipv6Packet.ipv6Payload.mobilePrefixAdvMsg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.mobilePrefixAdvMsg)) {
			if(p_ipv6Payload.mobilePrefixAdvMsg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.mobilePrefixAdvMsg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.mobilePrefixAdvMsg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		else if(ischosen(p_ipv6Packet.ipv6Payload.otherIcmpv6Msg)) {
			if(p_ipv6Packet.ipv6Payload.otherIcmpv6Msg.checksum == c_2ZeroBytes) {
		else if(ischosen(p_ipv6Payload.otherIcmpv6Msg)) {
			if(p_ipv6Payload.otherIcmpv6Msg.checksum == c_2ZeroBytes) {
				//calc checksum
				p_ipv6Packet.ipv6Payload.otherIcmpv6Msg.checksum := fx_icmpv6Checksum(p_ipv6Packet);
				p_ipv6Payload.otherIcmpv6Msg.checksum := fx_calcPayloadChecksum (p_srcAddr, p_dstAddr, p_ipv6Payload);
			}
		}
		
@@ -983,11 +1058,13 @@ group rfc4303Esp_ExtHdrFunctions {
		var FncRetCode v_ret := e_error;

		vc_sad[0] := {
			spi := 0/*f_createSpi()*/,
			spi := PX_SPI/*f_createSpi()*/,
			seqNr := c_uInt32Zero,
			// AH Integrity
			ahIntegrityAlgo := PX_INTEGRITY_ALGO,
			ahIntegrityKey := PX_INTEGRITY_KEY/*f_createSecretKey()*/,
			icvLen := f_getIcvLen(PX_INTEGRITY_ALGO),
			icvPadLen := f_getIcvPadLen(PX_INTEGRITY_ALGO),
			// ESP encryption
			espEncryptionAlgo := PX_ENCRYPTION_ALGO,
			espEncryptionKey := PX_ESP_ENCR_KEY/*f_createSecretKey()*/,
@@ -1007,6 +1084,32 @@ group rfc4303Esp_ExtHdrFunctions {
		
	}//end f_init_ipSecParams
	
	function f_getIcvLen(IntegrityAlgo p_integrityAlgo)
	runs on LibIpv6Node
	return UInt8 {
		if(p_integrityAlgo == e_sha1) {
			return 20;
		}
		else if (p_integrityAlgo == e_hmac_sha1_64){
			return 8;
		}
		
		return 12;
	}
	
	function f_getIcvPadLen(IntegrityAlgo p_integrityAlgo)
	runs on LibIpv6Node
	return UInt8 {
		if(p_integrityAlgo == e_sha1) {
			return 0;
		}
		else if (p_integrityAlgo == e_hmac_sha1_64){
			return 4;
		}
	
		return 0;
	}


	/*
	 * @desc 	This generates Security Parameters Index
+6 −3
Original line number Diff line number Diff line
@@ -1052,7 +1052,8 @@ module LibIpv6_Interface_TypesAndValues {
			UInt16		reserved,
			UInt32		securityParametersIndex,
			UInt32		sequenceNumber,
			octetstring	icv			
			octetstring	icv length (8, 12, 20),
			octetstring icvPadding optional		
		}
		with {
			variant "present=(valueOf(getTag('nextHeader')) == 51);";
@@ -1169,6 +1170,8 @@ module LibIpv6_Interface_TypesAndValues {
			UInt32 seqNr,
			IntegrityAlgo ahIntegrityAlgo,
			octetstring	ahIntegrityKey,
			UInt8 icvLen,
			UInt icvPadLen,
			EncryptionAlgo espEncryptionAlgo,
			octetstring	espEncryptionKey,
			IntegrityAlgo espIntegrityAlgo,
@@ -1281,7 +1284,7 @@ module LibIpv6_Interface_TypesAndValues {
			e_group1ModP768Bit(1),
			e_group2ModP1024Bit(2),
			e_group5ModP1536Bit(5),
			e_group14ModP2044Bit(14),
			e_group14ModP2048Bit(14),
			e_group15ModP3072Bit(15),
			e_group16ModP4096Bit(16),
			e_group17ModP6144Bit(17),
+4 −4
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ module LibIpv6_Rfc4068FastHandovers_Functions {
		//set checksum to zero
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := c_2ZeroBytes;
		//calc checksum
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := fx_icmpv6Checksum(v_ipPkt);
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := fx_calcPayloadChecksum(v_ipPkt.ipv6Hdr.sourceAddress, v_ipPkt.ipv6Hdr.destinationAddress, v_ipPkt.ipv6Payload);
		//send
		ipPort.send(v_ipPkt);

@@ -100,7 +100,7 @@ module LibIpv6_Rfc4068FastHandovers_Functions {
		//set checksum to zero
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := c_2ZeroBytes;
		//calc checksum
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := fx_icmpv6Checksum(v_ipPkt);
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := fx_calcPayloadChecksum(v_ipPkt.ipv6Hdr.sourceAddress, v_ipPkt.ipv6Hdr.destinationAddress, v_ipPkt.ipv6Payload);
		//send
		ipPort.send(v_ipPkt);

@@ -135,7 +135,7 @@ module LibIpv6_Rfc4068FastHandovers_Functions {
		//set checksum to zero
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := c_2ZeroBytes;
		//calc checksum
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := fx_icmpv6Checksum(v_ipPkt);
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := fx_calcPayloadChecksum(v_ipPkt.ipv6Hdr.sourceAddress, v_ipPkt.ipv6Hdr.destinationAddress, v_ipPkt.ipv6Payload);
		//send
		ipPort.send(v_ipPkt);

@@ -170,7 +170,7 @@ module LibIpv6_Rfc4068FastHandovers_Functions {
		//set checksum to zero
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := c_2ZeroBytes;
		//calc checksum
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := fx_icmpv6Checksum(v_ipPkt);
		v_ipPkt.ipv6Payload.routerAdvMsg.checksum := fx_calcPayloadChecksum(v_ipPkt.ipv6Hdr.sourceAddress, v_ipPkt.ipv6Hdr.destinationAddress, v_ipPkt.ipv6Payload);
		//send
		ipPort.send(v_ipPkt);

+1 −1
Original line number Diff line number Diff line
@@ -430,7 +430,7 @@ module LibIpv6_Rfc4306Ikev2_Functions {
		//set checksum to zero
	//	v_ipPkt.ipv6Payload.homeAgentAddrDiscRequestMsg.checksum := c_2ZeroBytes;
		//calc checksum
	//	v_ipPkt.ipv6Payload.homeAgentAddrDiscRequestMsg.checksum := fx_icmpv6Checksum(v_ipPkt);
	//	v_ipPkt.ipv6Payload.homeAgentAddrDiscRequestMsg.checksum := fx_calcPayloadChecksum(v_ipPkt.ipv6Hdr.sourceAddress, v_ipPkt.ipv6Hdr.destinationAddress, v_ipPkt.ipv6Payload);
		//send
		ipPort.send(v_ipPkt);