Commit f341de28 authored by seb's avatar seb
Browse files

setExtensionHdrs integrated in all f_sendFns

parent 90287df3
Loading
Loading
Loading
Loading
+9 −53
Original line number Diff line number Diff line
@@ -33,15 +33,19 @@
	function f_sendGeneralIpv6(template GeneralIpv6 p_msg)
	runs on LibIpv6Node
	return FncRetCode {

		//Variables
		var Ipv6Packet v_ipPkt;
		v_ipPkt.generalIpv6 := valueof(p_msg);
		
		//set extensionHeaders
		if(f_setGeneralIpv6ExtensionHeaders(v_ipPkt.generalIpv6) != e_success) {
			log(" **** f_sendIpv6ExtHdrs: Error when calculating length of extension headers ****");
		if (ispresent(v_ipPkt.generalIpv6.extHdrList)) {
			if(f_setExtensionHeaders(	v_ipPkt.generalIpv6.extHdrList,
										v_ipPkt.generalIpv6.ipv6Hdr.sourceAddress,
										v_ipPkt.generalIpv6.ipv6Hdr.destinationAddress,
										v_ipPkt) != e_success) {
				log(" **** f_sendGeneralIpv6: Error when calculating length of extension headers ****");
				return e_error;
			}
		}
		//calc payloadLen
		v_ipPkt.generalIpv6.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//send
@@ -50,57 +54,9 @@
		return e_success;
	}//end f_sendGeneralIpv6

	/*
	 * @desc 	This goes through the extension header list and calculates length, checksum
	 *			and other specific functions of the different extension headers
	 * @param 	p_mipPrefixSol GeneralIpv6	
	 * @return 	execution status 
	*/
	function f_setGeneralIpv6ExtensionHeaders(inout GeneralIpv6 p_generalIpv6)
	runs on LibIpv6Node
	return FncRetCode {
		var UInt8 i;
		var Ipv6Address v_homeAddress := c_16ZeroBytes;
		var UInt8 v_nrOfTunnelHdr := 0;

		//select ext hdrs that need special calculation
		if (ispresent(p_generalIpv6.extHdrList)) {
			for (i:=0; i<sizeof(p_generalIpv6.extHdrList);i:=i+1) {
				if (ischosen(p_generalIpv6.extHdrList[i].mipHeader)) {
					if (f_isPresentHomeAddressOption(p_generalIpv6.extHdrList, v_homeAddress) == e_success) {
						f_setMipHeader(	v_homeAddress,
										p_generalIpv6.ipv6Hdr.destinationAddress,
										p_generalIpv6.extHdrList[i].mipHeader);	
					}
					else {
						f_setMipHeader(	p_generalIpv6.ipv6Hdr.sourceAddress,
										p_generalIpv6.ipv6Hdr.destinationAddress,
										p_generalIpv6.extHdrList[i].mipHeader);
					}
				}
				else if (ischosen(p_generalIpv6.extHdrList[i].tunnelIpv6)) {
					//Cast GeneralIpv6Packet to Ipv6Packet in order to be able to reuse fx_tunnelledPayloadLength
					var Ipv6Packet v_ipv6Packet := {generalIpv6 := p_generalIpv6};
					v_nrOfTunnelHdr := v_nrOfTunnelHdr + 1;
					p_generalIpv6.extHdrList[i].tunnelIpv6.payloadLength := fx_tunnelledPayloadLength(v_ipv6Packet, v_nrOfTunnelHdr);
				}
			/*	else if (ischosen(p_extHdrList[i].)) {
					f_setSecurityHdr();
				}  */
			}
		}
		return e_success;
	}//end f_setGeneralIpv6ExtensionHeaders


    } //end group ipv6Packets

	group extHdrFns {
		
	
		
		

	}//end group extHdrFns
	
} // end module LibIpv6_Rfc2460Root_Functions
+1 −1
Original line number Diff line number Diff line
@@ -389,7 +389,7 @@
				version 		:= c_ipv6Version ,
				trafficClass 	:= c_trafficClassZero ,
				flowLabel 		:= c_flowLabelZero ,
				payloadLength 	:= 16,//c_zeroPayloadLength,  TODO possible to calculate???
				payloadLength 	:= c_zeroPayloadLength, //16
				nextHeader 		:= p_nextHdr,
				hopLimit 		:= c_hopLimit255,
				sourceAddress 	:= p_src,
+63 −4
Original line number Diff line number Diff line
@@ -43,6 +43,16 @@ module LibIpv6_Rfc2461NeighborDiscovery_Functions {
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.redirect := valueof(p_redirect);
			//set extensionHeaders
			if (ispresent(v_ipPkt.generalIpv6.extHdrList)) {
				if(f_setExtensionHeaders(	v_ipPkt.redirect.extHdrList,
											v_ipPkt.redirect.ipv6Hdr.sourceAddress,
											v_ipPkt.redirect.ipv6Hdr.destinationAddress,
											v_ipPkt) != e_success) {
					log(" **** f_sendRedirect: Error when calculating length of extension headers ****");
					return e_error;
				}
			}
			//calc payloadLen
			v_ipPkt.redirect.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
@@ -73,6 +83,16 @@ module LibIpv6_Rfc2461NeighborDiscovery_Functions {
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.routerAdvert := valueof(p_rtAdv);
			//set extensionHeaders
			if (ispresent(v_ipPkt.generalIpv6.extHdrList)) {
				if(f_setExtensionHeaders(	v_ipPkt.routerAdvert.extHdrList,
											v_ipPkt.routerAdvert.ipv6Hdr.sourceAddress,
											v_ipPkt.routerAdvert.ipv6Hdr.destinationAddress,
											v_ipPkt) != e_success) {
					log(" **** f_sendRtAdv: Error when calculating length of extension headers ****");
					return e_error;
				}
			}
			//calc payloadLen
			v_ipPkt.routerAdvert.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
@@ -137,6 +157,16 @@ module LibIpv6_Rfc2461NeighborDiscovery_Functions {
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.nbrAdvert := valueof(p_nbrAdv);
			//set extensionHeaders
			if (ispresent(v_ipPkt.generalIpv6.extHdrList)) {
				if(f_setExtensionHeaders(	v_ipPkt.nbrAdvert.extHdrList,
											v_ipPkt.nbrAdvert.ipv6Hdr.sourceAddress,
											v_ipPkt.nbrAdvert.ipv6Hdr.destinationAddress,
											v_ipPkt) != e_success) {
					log(" **** f_sendNbrAdv: Error when calculating length of extension headers ****");
					return e_error;
				}
			}
			//calc payloadLen
			v_ipPkt.nbrAdvert.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
@@ -163,8 +193,17 @@ module LibIpv6_Rfc2461NeighborDiscovery_Functions {
        runs on LibIpv6Node
        return FncRetCode {
            var Ipv6Packet v_ipPkt;

	        v_ipPkt.routerAdvert := valueof(p_rtAdv);
			//set extensionHeaders
			if (ispresent(v_ipPkt.generalIpv6.extHdrList)) {
				if(f_setExtensionHeaders(	v_ipPkt.routerAdvert.extHdrList,
											v_ipPkt.routerAdvert.ipv6Hdr.sourceAddress,
											v_ipPkt.routerAdvert.ipv6Hdr.destinationAddress,
											v_ipPkt) != e_success) {
					log(" **** f_sendRtAdv: Error when calculating length of extension headers ****");
					return e_error;
				}
			}
	        //calc payloadLen
	        v_ipPkt.routerAdvert.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
	        //set checksum to zero
@@ -193,6 +232,16 @@ module LibIpv6_Rfc2461NeighborDiscovery_Functions {
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.nbrSolicitation := valueof(p_nbrSol);
			//set extensionHeaders
			if (ispresent(v_ipPkt.nbrSolicitation.extHdrList)) {
				if(f_setExtensionHeaders(	v_ipPkt.nbrSolicitation.extHdrList,
											v_ipPkt.nbrSolicitation.ipv6Hdr.sourceAddress,
											v_ipPkt.nbrSolicitation.ipv6Hdr.destinationAddress,
											v_ipPkt) != e_success) {
					log(" **** f_sendNbrSol: Error when calculating length of extension headers ****");
					return e_error;
				}
			}
			//calc payloadLen
			v_ipPkt.nbrSolicitation.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
@@ -219,6 +268,16 @@ module LibIpv6_Rfc2461NeighborDiscovery_Functions {
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.routerSolicitation := valueof(p_rtrSol);
			//set extensionHeaders
			if (ispresent(v_ipPkt.routerSolicitation.extHdrList)) {
				if(f_setExtensionHeaders(	v_ipPkt.routerSolicitation.extHdrList,
											v_ipPkt.routerSolicitation.ipv6Hdr.sourceAddress,
											v_ipPkt.routerSolicitation.ipv6Hdr.destinationAddress,
											v_ipPkt) != e_success) {
					log(" **** f_sendRtSol: Error when calculating length of extension headers ****");
					return e_error;
				}
			}
			//calc payloadLen
			v_ipPkt.routerSolicitation.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
+38 −19
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@
			 routerFlag:=p_rFlag,
			 solicitedFlag:=p_sFlag,
			 overrideFlag:=p_oFlag,
			 reserved:= 0,
			 reserved:= c_uInt16Zero,
			 targetAddr:=p_targetAddr,
			 nbrAdvOptions:=p_opts
		 }
@@ -110,7 +110,7 @@
			 routerFlag:=p_rFlag,
			 solicitedFlag:=p_sFlag,
			 overrideFlag:=p_oFlag,
			 reserved:= 0,
			 reserved:= c_uInt16Zero,
			 targetAddr:=p_targetAddr,
			 nbrAdvOptions:=p_opts
		 }
@@ -218,7 +218,7 @@
			 icmpType:= c_nbrSol,
			 icmpCode:= c_icmpCode0,
			 checksum:= c_2ZeroBytes,
			 reserved:= 0,
			 reserved:= c_uInt16Zero,
			 targetAddr:= p_targetAddr,
			 nbrSolOptions:= p_opts
		 }
@@ -241,7 +241,7 @@
			 icmpType:= c_nbrSol,
			 icmpCode:= p_icmpCode,
			 checksum:= c_2ZeroBytes,
			 reserved:= 0,
			 reserved:= c_uInt16Zero,
			 targetAddr:= p_targetAddr,
			 nbrSolOptions:= p_opts
		 }
@@ -264,7 +264,7 @@
			 icmpType:= c_nbrSol,
			 icmpCode:= c_icmpCode0,
			 checksum:= c_2ZeroBytes,
			 reserved:= 0,
			 reserved:= c_uInt16Zero,
			 targetAddr:= p_targetAddr,
			 nbrSolOptions:= p_opts
		 }
@@ -296,7 +296,7 @@
			icmpType:= c_nbrSol,
			icmpCode:= c_icmpCode0,
			checksum:= ?,
			reserved:= 0,
			reserved:= c_uInt16Zero,
			targetAddr:= ?,
			nbrSolOptions:= *
		}
@@ -317,7 +317,7 @@
			 icmpType:= c_nbrSol,
			 icmpCode:= c_icmpCode0,
			 checksum:= ?,
			 reserved:= 0,
			 reserved:= c_uInt16Zero,
			 targetAddr:= p_targetAddr,
			 nbrSolOptions:= p_opts
		 }
@@ -336,7 +336,7 @@
			 icmpType:= c_nbrSol,
			 icmpCode:= c_icmpCode0,
			 checksum:= ?,
			 reserved:= 0,
			 reserved:= c_uInt16Zero,
			 targetAddr:= p_targetAddr,
			 nbrSolOptions:= *
		 }
@@ -353,7 +353,7 @@
			icmpType:= c_nbrSol,
			icmpCode:= c_icmpCode0,
			checksum:= ?,
			reserved:= 0,
			reserved:= c_uInt16Zero,
			targetAddr:= p_targetAddr,
			nbrSolOptions:= *
		}
@@ -382,7 +382,7 @@
			icmpType := c_redirect,
			icmpCode := c_icmpCode0,
			checksum := c_2ZeroBytes,
			reserved := 0,
			reserved := c_uInt16Zero,
			targetAddr := p_targetAddr,
			destinationAddr := p_destinationAddr,
			redirectOptions := p_redirectOptions
@@ -410,7 +410,7 @@
			icmpType := c_redirect,
			icmpCode := p_code,
			checksum := c_2ZeroBytes,
			reserved := 0,
			reserved := c_uInt16Zero,
			targetAddr := p_targetAddr,
			destinationAddr := p_destinationAddr,
			redirectOptions := p_redirectOptions
@@ -438,7 +438,7 @@
			icmpType := c_redirect,
			icmpCode := c_icmpCode0,
			checksum := c_2ZeroBytes,
			reserved := 0,
			reserved := c_uInt16Zero,
			targetAddr := p_targetAddr,
			destinationAddr := p_destinationAddr,
			redirectOptions := p_redirectOptions
@@ -492,7 +492,7 @@
			icmpType := c_redirect,
			icmpCode := c_icmpCode0,
			checksum := ?,
			reserved := 0,
			reserved := c_uInt16Zero,
			targetAddr := p_targetAddr,
			destinationAddr := p_destinationAddr,
			redirectOptions := p_redirectOptions
@@ -634,7 +634,7 @@
			managedConfigFlag:=p_mFlag,
			otherConfigFlag:=p_oFlag,
			homeAgentFlag := c_haFlag0,
			reserved:= 0,
			reserved:= c_uInt16Zero,
			routerLifetime:=p_lifetime,
			reachableTime:=p_reachTime,
			retransTimer:=p_retransTimer,
@@ -1114,6 +1114,8 @@
			srcLinkLayerAddr := omit,
			mtuOption := omit,
			prefixInfoList := omit,
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := p_otherOpt
		}

@@ -1139,10 +1141,11 @@
												p_validLifetime,
												p_preferredLifetime,
												p_prefix) },
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := omit
		}


		/*
		 *	@param  p_prefixLength Length of the prefix.
		 *	@param  p_lFlag Value for link flag.
@@ -1168,6 +1171,8 @@
												p_preferredLifetime, 
												p_prefix) },
			srcLinkLayerAddr := m_macSlla(p_macSlla),
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := omit
		}

@@ -1179,6 +1184,8 @@
			srcLinkLayerAddr := m_macSlla(p_macSlla),
			mtuOption := omit,
			prefixInfoList := omit,
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := omit
		}

@@ -1207,6 +1214,8 @@
												p_validLifetime,
												p_preferredLifetime,
												p_prefix) },
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := omit
		}

@@ -1234,6 +1243,8 @@
												p_validLifetime,
												p_preferredLifetime,
												p_prefix) },
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := p_otherOption
		}

@@ -1264,6 +1275,8 @@
												p_preferredLifetime, 
												p_prefix) },
			mtuOption:= p_mtu,
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := omit
		}

@@ -1295,6 +1308,8 @@
												p_validLifetime,
												p_preferredLifetime,
												p_prefix) },
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := omit
		}

@@ -1325,6 +1340,8 @@
												p_validLifetime,
												p_preferredLifetime, 
												p_prefix) },
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := p_otherOption
		}

@@ -1353,6 +1370,8 @@
												p_validLifetime,
												p_preferredLifetime, 
												p_prefix) },
			advertisementInterval := omit,
			homeAgentInfo := omit,
			otherOption := omit
		}

+78 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
	import from LibIpv6_Rfc2461NeighborDiscovery_Templates all; //used for mixed procedure
	import from LibIpv6_Rfc2461NeighborDiscovery_Functions all; //used for mixed procedure
	import from LibIpv6_MultiRfcs_TypesAndValues all;
	import from LibIpv6_MultiRfcs_Functions all;

	group sendCalculation {	

@@ -43,6 +44,15 @@
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.echoRequest := valueof(p_echoRequest);
			if (ispresent(v_ipPkt.echoRequest.extHdrList)) {
				if(f_setExtensionHeaders(	v_ipPkt.echoRequest.extHdrList,
											v_ipPkt.echoRequest.ipv6Hdr.sourceAddress,
											v_ipPkt.echoRequest.ipv6Hdr.destinationAddress,
											v_ipPkt) != e_success) {
					log(" **** f_sendEchoRequest: Error when calculating length of extension headers ****");
					return e_error;
				}
			}
			//calc payloadLen
			v_ipPkt.echoRequest.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
@@ -69,6 +79,15 @@
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.echoReply := valueof(p_echoReply);
			if (ispresent(v_ipPkt.echoReply.extHdrList)) {
				if(f_setExtensionHeaders(	v_ipPkt.echoReply.extHdrList,
											v_ipPkt.echoReply.ipv6Hdr.sourceAddress,
											v_ipPkt.echoReply.ipv6Hdr.destinationAddress,
											v_ipPkt) != e_success) {
					log(" **** f_sendEchoReply: Error when calculating length of extension headers ****");
					return e_error;
				}
			}
			//calc payloadLen
			v_ipPkt.echoReply.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
@@ -357,6 +376,15 @@
	return FncRetCode {
		var Ipv6Packet v_ipPkt;
		v_ipPkt.echoRequest := valueof(p_echoRequest);
		if (ispresent(v_ipPkt.echoRequest.extHdrList)) {
			if(f_setExtensionHeaders(	v_ipPkt.echoRequest.extHdrList,
										v_ipPkt.echoRequest.ipv6Hdr.sourceAddress,
										v_ipPkt.echoRequest.ipv6Hdr.destinationAddress,
										v_ipPkt) != e_success) {
				log(" **** f_sendEchoRequest_noCalcPayloadLength: Error when calculating length of extension headers ****");
				return e_error;
			}
		}
		//set payload length
		v_ipPkt.echoRequest.ipv6Hdr.payloadLength := p_payloadLength;
		//set checksum to zero
@@ -483,6 +511,16 @@
	return FncRetCode {
		var Ipv6Packet v_ipPkt;
		v_ipPkt.otherHeader := valueof(p_otherIcmpv6);
		//set Extension Header
		if (ispresent(v_ipPkt.otherHeader.extHdrList)) {
			if(f_setExtensionHeaders(	v_ipPkt.otherHeader.extHdrList,
										v_ipPkt.otherHeader.ipv6Hdr.sourceAddress,
										v_ipPkt.otherHeader.ipv6Hdr.destinationAddress,
										v_ipPkt) != e_success) {
				log(" **** f_sendOtherIcmpv6: Error when calculating length of extension headers ****");
				return e_error;
			}
		}
		//calc payloadLen
		v_ipPkt.otherHeader.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//set checksum to zero
@@ -511,6 +549,16 @@
	return FncRetCode {
		var Ipv6Packet v_ipPkt;
		v_ipPkt.destinationUnreachable := valueof(p_destUnreachable);
		//set Extension Header
		if (ispresent(v_ipPkt.destinationUnreachable.extHdrList)) {
			if(f_setExtensionHeaders(	v_ipPkt.destinationUnreachable.extHdrList,
										v_ipPkt.destinationUnreachable.ipv6Hdr.sourceAddress,
										v_ipPkt.destinationUnreachable.ipv6Hdr.destinationAddress,
										v_ipPkt) != e_success) {
				log(" **** f_sendDestUnreachable: Error when calculating length of extension headers ****");
				return e_error;
			}
		}
		//calc payloadLen
		v_ipPkt.destinationUnreachable.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//set checksum to zero
@@ -539,6 +587,16 @@
	return FncRetCode {
		var Ipv6Packet v_ipPkt;
		v_ipPkt.packetTooBig := valueof(p_packetTooBig);
		//set Extension Header
		if (ispresent(v_ipPkt.packetTooBig.extHdrList)) {
			if(f_setExtensionHeaders(	v_ipPkt.packetTooBig.extHdrList,
										v_ipPkt.packetTooBig.ipv6Hdr.sourceAddress,
										v_ipPkt.packetTooBig.ipv6Hdr.destinationAddress,
										v_ipPkt) != e_success) {
				log(" **** f_sendPacketTooBig: Error when calculating length of extension headers ****");
				return e_error;
			}
		}
		//calc payloadLen
		v_ipPkt.packetTooBig.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//set checksum to zero
@@ -567,6 +625,16 @@
	return FncRetCode {
		var Ipv6Packet v_ipPkt;
		v_ipPkt.timeExceeded := valueof(p_timeExceeded);
		//set Extension Header
		if (ispresent(v_ipPkt.timeExceeded.extHdrList)) {
			if(f_setExtensionHeaders(	v_ipPkt.timeExceeded.extHdrList,
										v_ipPkt.timeExceeded.ipv6Hdr.sourceAddress,
										v_ipPkt.timeExceeded.ipv6Hdr.destinationAddress,
										v_ipPkt) != e_success) {
				log(" **** f_sendTimeExceeded: Error when calculating length of extension headers ****");
				return e_error;
			}
		}
		//calc payloadLen
		v_ipPkt.timeExceeded.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//set checksum to zero
@@ -595,6 +663,16 @@
	return FncRetCode {
		var Ipv6Packet v_ipPkt;
		v_ipPkt.parameterProblem := valueof(p_parameterProblem);
		//set Extension Header
		if (ispresent(v_ipPkt.parameterProblem.extHdrList)) {
			if(f_setExtensionHeaders(	v_ipPkt.parameterProblem.extHdrList,
										v_ipPkt.parameterProblem.ipv6Hdr.sourceAddress,
										v_ipPkt.parameterProblem.ipv6Hdr.destinationAddress,
										v_ipPkt) != e_success) {
				log(" **** f_sendParameterProblem: Error when calculating length of extension headers ****");
				return e_error;
			}
		}
		//calc payloadLen
		v_ipPkt.parameterProblem.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//set checksum to zero
Loading