Commit 82a8dfbf authored by mullers's avatar mullers
Browse files

Introduced ARP.

parent 846d41e5
Loading
Loading
Loading
Loading
+61 −0
Original line number Diff line number Diff line
/*
 *	@author 	STF 276
 *  @version 	$Id$
 *	@desc		This module specifies common IPv4 ICMP messages 
 *              interchanges (= operations) for an Ipv6 test component
 *              Functions do not set a test component verdict but instead
 *              use the function return value instead to notify the function
 *              caller about the success of the operation.
 *  
 */
 module LibIpv6_Rfc826Arp_Functions {

	//LibCommon
	import from LibCommon_BasicTypesAndValues all;
	import from LibCommon_DataStrings all;
	import from LibCommon_VerdictControl { type FncRetCode };
	//LibIpv6
	import from LibIpv6_Interface_TypesAndValues all ;
	import from LibIpv6_CommonRfcs_TypesAndValues all;
	import from LibIpv6_Rfc826Arp_TypesAndValues all;
	
	/*
	 * @desc  	This sends an ARP request.
	 * @remark  The template passed in must NOT contain any matching expressions!
	 * @param 	p_ArpRequest ARP packet value or template with ARP request to be sent
	 * @return 	execution status
	*/
	function f_sendArpRequest (in ArpEthRequest p_ArpRequest) 
	runs on LibIpv6Node
	return FncRetCode {
		var ArpEthRequest v_ipPkt;
		v_ipPkt := valueof(p_ArpRequest);

		//send
		arpPort.send(v_ipPkt);
	
		return e_success;
	
	}//end f_sendArpRequest

	/*
	 * @desc  	This sends an ARP request.
	 * @remark  The template passed in must NOT contain any matching expressions!
	 * @param 	p_ArpRequest ARP packet value or template with ARP request to be sent
	 * @return 	execution status
	*/
	function f_sendArpReply (in ArpEthReply p_ArpReply) 
	runs on LibIpv6Node
	return FncRetCode {
		var ArpEthReply v_ipPkt;
		v_ipPkt := valueof(p_ArpReply);

		//send
		arpPort.send(v_ipPkt);
	
		return e_success;
	
	}//end f_sendArpReply


} // end module LibIpv6_Rfc826Arp_Functions
+155 −0
Original line number Diff line number Diff line
/*
 *	@author 	STF 276
 *  @version 	$Id$
 *	@desc		This module specifies common template definitions
 *              to specify ARP packets
 *
 */
module LibIpv6_Rfc826Arp_Templates {
	//LibCommon
	import from LibCommon_BasicTypesAndValues all;
	//LibIpv6
	import from LibIpv6_Rfc826Arp_TypesAndValues all;
	
	group ArpRequest {
		
		/*
		 *	@param  p_hwAddrSpace    Binary Hardware address space (e.g., Ethernet,
         *                           Packet Radio Net.).
		 *	@param  p_protAddrSpace  Protocol address space.  For Ethernet
         *                           hardware, this is from the set of type
         *                           fields ether_typ$<protocol>.
		 *	@param  p_senderHwAddr   Hardware address of sender of this
         *                           packet, n from the ar$hln field.
		 *	@param  p_senderProtAddr Protocol address of sender of this
         *                           packet, m from the ar$pln field.
		 *	@param  p_targetHwAddr   Hardware address of target of this
         *                           packet (if known).
		 *	@param  p_targetProtAddr Protocol address of target.
		*/
		template ArpEthRequest m_arpRequest(
			UInt16 p_hwAddrSpace,
			UInt16 p_protAddrSpace,
			octetstring p_senderHwAddr,
			octetstring p_senderProtAddr,
			octetstring p_targetHwAddr,
			octetstring p_targetProtAddr
		) := {
			hwAddrSpace := p_hwAddrSpace,
			protAddrSpace := p_protAddrSpace,
			hwAddrLength := lengthof(p_senderHwAddr),
			protAddrLength := lengthof(p_senderProtAddr),
			opcode := c_opRequest,
			senderHwAddr := p_senderHwAddr,
			senderProtAddr := p_senderProtAddr,
			targetHwAddr := p_targetHwAddr,
			targetProtAddr := p_targetProtAddr
		}

		/*
		 *	@param  p_hwAddrSpace    Binary Hardware address space (e.g., Ethernet,
		 *                           Packet Radio Net.).
		 *	@param  p_protAddrSpace  Protocol address space.  For Ethernet
		 *                           hardware, this is from the set of type
		 *                           fields ether_typ$<protocol>.
		 *	@param  p_senderHwAddr   Hardware address of sender of this
		 *                           packet, n from the ar$hln field.
		 *	@param  p_senderProtAddr Protocol address of sender of this
		 *                           packet, m from the ar$pln field.
		 *	@param  p_targetHwAddr   Hardware address of target of this
		 *                           packet (if known).
		 *	@param  p_targetProtAddr Protocol address of target.
		*/
		template ArpEthRequest mw_arpRequest(
			template UInt16 p_hwAddrSpace,
			template UInt16 p_protAddrSpace,
			template octetstring p_senderHwAddr,
			template octetstring p_senderProtAddr,
			template octetstring p_targetHwAddr,
			template octetstring p_targetProtAddr
		) := {
			hwAddrSpace := p_hwAddrSpace,
			protAddrSpace := p_protAddrSpace,
			hwAddrLength := ?,
			protAddrLength := ?,
			opcode := c_opRequest,
			senderHwAddr := p_senderHwAddr,
			senderProtAddr := p_senderProtAddr,
			targetHwAddr := p_targetHwAddr,
			targetProtAddr := p_targetProtAddr
		}

	}// end ArpRequest

	group ArpReply {
		
		/*
		 *	@param  p_hwAddrSpace    Binary Hardware address space (e.g., Ethernet,
		 *                           Packet Radio Net.).
		 *	@param  p_protAddrSpace  Protocol address space.  For Ethernet
		 *                           hardware, this is from the set of type
		 *                           fields ether_typ$<protocol>.
		 *	@param  p_senderHwAddr   Hardware address of sender of this
		 *                           packet, n from the ar$hln field.
		 *	@param  p_senderProtAddr Protocol address of sender of this
		 *                           packet, m from the ar$pln field.
		 *	@param  p_targetHwAddr   Hardware address of target of this
		 *                           packet (if known).
		 *	@param  p_targetProtAddr Protocol address of target.
		*/
		template ArpEthReply m_arpReply(
			UInt16 p_hwAddrSpace,
			UInt16 p_protAddrSpace,
			octetstring p_senderHwAddr,
			octetstring p_senderProtAddr,
			octetstring p_targetHwAddr,
			octetstring p_targetProtAddr
		) := {
			hwAddrSpace := p_hwAddrSpace,
			protAddrSpace := p_protAddrSpace,
			hwAddrLength := lengthof(p_senderHwAddr),
			protAddrLength := lengthof(p_senderProtAddr),
			opcode := c_opReply,
			senderHwAddr := p_senderHwAddr,
			senderProtAddr := p_senderProtAddr,
			targetHwAddr := p_targetHwAddr,
			targetProtAddr := p_targetProtAddr
		}

		/*
		 *	@param  p_hwAddrSpace    Binary Hardware address space (e.g., Ethernet,
		 *                           Packet Radio Net.).
		 *	@param  p_protAddrSpace  Protocol address space.  For Ethernet
		 *                           hardware, this is from the set of type
		 *                           fields ether_typ$<protocol>.
		 *	@param  p_senderHwAddr   Hardware address of sender of this
		 *                           packet, n from the ar$hln field.
		 *	@param  p_senderProtAddr Protocol address of sender of this
		 *                           packet, m from the ar$pln field.
		 *	@param  p_targetHwAddr   Hardware address of target of this
		 *                           packet (if known).
		 *	@param  p_targetProtAddr Protocol address of target.
		*/
		template ArpEthReply mw_arpReply(
			template UInt16 p_hwAddrSpace,
			template UInt16 p_protAddrSpace,
			template octetstring p_senderHwAddr,
			template octetstring p_senderProtAddr,
			template octetstring p_targetHwAddr,
			template octetstring p_targetProtAddr
		) := {
			hwAddrSpace := p_hwAddrSpace,
			protAddrSpace := p_protAddrSpace,
			hwAddrLength := ?,
			protAddrLength := ?,
			opcode := c_opReply,
			senderHwAddr := p_senderHwAddr,
			senderProtAddr := p_senderProtAddr,
			targetHwAddr := p_targetHwAddr,
			targetProtAddr := p_targetProtAddr
		}

	}// end ArpReply

	
} // end module LibIpv6_Rfc826Arp_Templates
+99 −0
Original line number Diff line number Diff line
/*
 *	@author 	STF 276
 *  @version 	$Id$
 *	@desc		This module defines the ARP message types and 
 *              their information elements using types from the 
 *              Common and Ipv6 library. Also it provides some useful  
 *              constant definitions.
 *              All types have been defined on the basis of RFC 826
 *  @url        http://www.ietf.org/rfc/rfc826.txt
 *  
 */
 module LibIpv6_Rfc826Arp_TypesAndValues {
	
	//LibCommon
	import from LibCommon_BasicTypesAndValues all;

	group constants {
		const UInt16 	c_opRequest := 1;
		const UInt16 	c_opReply := 2;
		const UInt16 	c_hrdEthernet := 1;
	}

 	group ArpPackets {
		
		/*
		 * @desc PDU type derived from RFC 826
		*/
		type record ArpEthPacket {
			UInt16 hwAddrSpace,
			UInt16 protAddrSpace,
			UInt8 hwAddrLength,
			UInt8 protAddrLength,
			UInt16 opcode (c_opRequest, c_opReply),
			octetstring senderHwAddr,
			octetstring senderProtAddr,
			octetstring targetHwAddr,
			octetstring targetProtAddr
		}
		with {
			variant "isPDU;present=!bits(4,4) && !bits(4,6)";
			variant (hwAddrLength) "intTag='hwAddrLength'";
			variant (protAddrLength) "intTag='protAddrLength'";
			variant (senderHwAddr) "length=getIntTag('hwAddrLength')";
			variant (senderProtAddr) "length=getIntTag('protAddrLength')";
			variant (targetHwAddr) "length=getIntTag('hwAddrLength')";
			variant (targetProtAddr) "length=getIntTag('protAddrLength')";
		}
	
		/*
		 * @desc PDU type derived from RFC 826
		*/
		type record ArpEthRequest {
			UInt16 hwAddrSpace,
			UInt16 protAddrSpace,
			UInt8 hwAddrLength,
			UInt8 protAddrLength,
			UInt16 opcode (c_opRequest),
			octetstring senderHwAddr,
			octetstring senderProtAddr,
			octetstring targetHwAddr,
			octetstring targetProtAddr
		}
		with {
			variant "isPDU;present=!bits(4,4) && !bits(4,6) && bytes(6, 2, 0x0001)";
			variant (hwAddrLength) "intTag='hwAddrLength'";
			variant (protAddrLength) "intTag='protAddrLength'";
			variant (senderHwAddr) "length=getIntTag('hwAddrLength')";
			variant (senderProtAddr) "length=getIntTag('protAddrLength')";
			variant (targetHwAddr) "length=getIntTag('hwAddrLength')";
			variant (targetProtAddr) "length=getIntTag('protAddrLength')";
		}
	
		/*
		 * @desc PDU type derived from RFC 826
		*/
		type record ArpEthReply {
			UInt16 hwAddrSpace,
			UInt16 protAddrSpace,
			UInt8 hwAddrLength,
			UInt8 protAddrLength,
			UInt16 opcode (c_opReply),
			octetstring senderHwAddr,
			octetstring senderProtAddr,
			octetstring targetHwAddr,
			octetstring targetProtAddr
		}
		with {
			variant "isPDU;present=!bits(4,4) && !bits(4,6) && bytes(6, 2, 0x0001)";
			variant (hwAddrLength) "intTag='hwAddrLength'";
			variant (protAddrLength) "intTag='protAddrLength'";
			variant (senderHwAddr) "length=getIntTag('hwAddrLength')";
			variant (senderProtAddr) "length=getIntTag('protAddrLength')";
			variant (targetHwAddr) "length=getIntTag('hwAddrLength')";
			variant (targetProtAddr) "length=getIntTag('protAddrLength')";
		}
	
	} // end ArpPackets
	
} // end module LibIpv6_Rfc826Arp_TypesAndValues
 No newline at end of file