/* $XORP: xorp/xrl/interfaces/fea_rawpkt4.xif,v 1.5 2007/07/12 21:35:27 pavlin Exp $ */

/*
 * Interface for sending IPv4 packets on a raw socket.
 * Typically implemented by the fea.
 */

interface raw_packet4/0.1 {
	/**
	 * Send an IPv4 packet on a raw socket.
	 *
         * @param if_name the interface to send the packet on. It is essential
	 * for multicast. In the unicast case this field may be empty.
         * @param vif_name the vif to send the packet on. It is essential for
	 * multicast. In the unicast case this field may be empty.
	 * @param src_address the IP source address.
	 * @param dst_address the IP destination address.
	 * @param ip_protocol the IP protocol number. It must be between
	 * 1 and 255.
	 * @param ip_ttl the IP TTL (hop-limit). If it has a negative value,
	 * the TTL will be set internally before transmission.
	 * @param ip_tos the Type Of Service (Diffserv/ECN bits for IPv4). If
	 * it has a negative value, the TOS will be set internally before
	 * transmission.
	 * @param ip_router_alert if true, then add the IP Router Alert option
	 * to the IP packet.
	 * @param ip_internet_control if true, then this is IP control traffic.
	 * @param payload the payload, everything after the IP header and
	 * options.
	 */
	send	? if_name:txt  						\
		& vif_name:txt 						\
		& src_address:ipv4					\
		& dst_address:ipv4  					\
		& ip_protocol:u32  					\
		& ip_ttl:i32						\
		& ip_tos:i32 						\
		& ip_router_alert:bool 					\
		& ip_internet_control:bool				\
		& payload:binary;

	/**
	 * Register to receive IPv4 packets.  The receiver is expected to
	 * support raw_packet4_client/0.1 interface.
	 *
	 * @param xrl_target_instance_name the receiver's XRL target instance
	 * name.
         * @param if_name the interface through which packets should be
	 * accepted.
         * @param vif_name the vif through which packets should be accepted.
	 * @param ip_protocol the IP protocol number that the receiver is
	 * interested in. It must be between 0 and 255. A protocol number
	 * of 0 is used to specify all protocols.
	 * @param enable_multicast_loopback if true then enable delivering
	 * of multicast datagrams back to this host (assuming the host is
	 * a member of the same multicast group.
	 */
	register_receiver	? xrl_target_instance_name:txt		\
				& if_name:txt				\
				& vif_name:txt				\
				& ip_protocol:u32			\
				& enable_multicast_loopback:bool;

	/**
	 * Unregister to receive IPv4 packets.
	 *
	 * @param xrl_target_instance_name the receiver's XRL target instance
	 * name.
         * @param if_name the interface through which packets should not be
	 * accepted.
         * @param vif_name the vif through which packets should not be
	 * accepted.
	 * @param ip_protocol the IP Protocol number that the receiver is not
	 * interested in anymore. It must be between 0 and 255. A protocol
	 * number of 0 is used to specify all protocols.
	 */
	unregister_receiver	? xrl_target_instance_name:txt		\
				& if_name:txt				\
				& vif_name:txt				\
				& ip_protocol:u32;

	/**
	 * Join an IPv4 multicast group.
	 *
	 * @param xrl_target_instance_name the receiver's XRL target instance
	 * name.
         * @param if_name the interface through which packets should be
	 * accepted.
         * @param vif_name the vif through which packets should be accepted.
	 * @param ip_protocol the IP protocol number that the receiver is
	 * interested in. It must be between 0 and 255. A protocol number
	 * of 0 is used to specify all protocols.
	 * @param group_address the multicast group address to join.
	 */
	join_multicast_group	? xrl_target_instance_name:txt		\
				& if_name:txt				\
				& vif_name:txt				\
				& ip_protocol:u32			\
				& group_address:ipv4;

	/**
	 * Leave an IPv4 multicast group.
	 *
	 * @param xrl_target_instance_name the receiver's XRL target instance
	 * name.
         * @param if_name the interface through which packets should not be
	 * accepted.
         * @param vif_name the vif through which packets should not be
	 * accepted.
	 * @param ip_protocol the IP protocol number that the receiver is not
	 * interested in anymore. It must be between 0 and 255. A protocol
	 * number of 0 is used to specify all protocols.
	 * @param group_address the multicast group address to leave.
	 */
	leave_multicast_group	? xrl_target_instance_name:txt		\
				& if_name:txt				\
				& vif_name:txt				\
				& ip_protocol:u32			\
				& group_address:ipv4;
}
