There should be one node per MFEA instance. There should be one instance per address family.
| MfeaNode (int family, xorp_module_id module_id, EventLoop& eventloop) | MfeaNode | 
Constructor for a given address family, module ID, and event loop.
Parameters:
| family | the address family (AF_INET or AF_INET6 for IPv4 and IPv6 respectively). | 
| module_id | the module ID (xorp_module_id). Should be equal to XORP_MODULE_MFEA. | 
| eventloop | the event loop to use. | 
| ~MfeaNode () | ~MfeaNode | 
[virtual]
| int		 start () | start | 
Start the node operation.
After the startup operations are completed, MfeaNode::final_start() is called internally to complete the job.
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 stop () | stop | 
Stop the node operation.
After the shutdown operations are completed, MfeaNode::final_stop() is called internally to complete the job.
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 final_start () | final_start | 
Completely start the node operation.
This method should be called internally after MfeaNode::start() to complete the job.
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 final_stop () | final_stop | 
Completely stop the node operation.
This method should be called internally after MfeaNode::stop() to complete the job.
Returns: XORP_OK on success, otherwise XORP_ERROR.
| void	 enable () | enable | 
Enable node operation.
If an unit is not enabled, it cannot be start, or pending-start.
| void	 disable () | disable | 
Disable node operation.
If an unit is disabled, it cannot be start or pending-start. If the unit was runnning, it will be stop first.
| bool  have_multicast_routing4 () | have_multicast_routing4 | 
[const]
Test if the underlying system supports IPv4 multicast routing.
Returns: true if the underlying system supports IPv4 multicast routing, otherwise false.
| bool  have_multicast_routing6 () | have_multicast_routing6 | 
[const]
Test if the underlying system supports IPv6 multicast routing.
Returns: true if the underlying system supports IPv6 multicast routing, otherwise false.
| int		 add_vif (const Vif& vif, string& error_msg) | add_vif | 
Install a new MFEA vif.
Parameters:
| vif | vif information about the new MfeaVif to install. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int		 delete_vif (const string& vif_name, string& error_msg) | delete_vif | 
Delete an existing MFEA vif.
Parameters:
| vif_name | the name of the vif to delete. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int  add_config_vif (const Vif& vif, string& error_msg) | add_config_vif | 
Add a configured vif.
Parameters:
| vif | the vif with the information to add. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int		 add_config_vif (const string& vif_name,
			       uint32_t vif_index,
			       string& error_msg) | add_config_vif | 
Add a configured vif.
Parameters:
| vif_name | the name of the vif to add. | 
| vif_index | the vif index of the vif to add. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int		 delete_config_vif (const string& vif_name,
				  string& error_msg) | delete_config_vif | 
Delete a configured vif.
Parameters:
| vif_name | the name of the vif to delete. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int		 add_config_vif_addr (const string& vif_name,
				    const IPvX& addr,
				    const IPvXNet& subnet,
				    const IPvX& broadcast,
				    const IPvX& peer,
				    string& error_msg) | add_config_vif_addr | 
Add an address to a configured vif.
Parameters:
| vif_name | the name of the vif. | 
| addr | the address to add. | 
| subnet | the subnet address to add. | 
| broadcast | the broadcast address to add. | 
| peer | the peer address to add. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int		 delete_config_vif_addr (const string& vif_name,
				       const IPvX& addr,
				       string& error_msg) | delete_config_vif_addr | 
Delete an address from a configured vif.
Parameters:
| vif_name | the name of the vif. | 
| addr | the address to delete. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int		 set_config_pif_index (const string& vif_name,
				     uint32_t pif_index,
				     string& error_msg) | set_config_pif_index | 
Set the pif_index of a configured vif.
Parameters:
| vif_name | the name of the vif. | 
| pif_index | the physical interface index. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int		 set_config_vif_flags (const string& vif_name,
				     bool is_pim_register,
				     bool is_p2p,
				     bool is_loopback,
				     bool is_multicast,
				     bool is_broadcast,
				     bool is_up,
				     string& error_msg) | set_config_vif_flags | 
Set the vif flags of a configured vif.
Parameters:
| vif_name | the name of the vif. | 
| is_pim_register | true if the vif is a PIM Register interface. | 
| is_p2p | true if the vif is point-to-point interface. | 
| is_loopback | true if the vif is a loopback interface. | 
| is_multicast | true if the vif is multicast capable. | 
| is_broadcast | true if the vif is broadcast capable. | 
| is_up | true if the underlying vif is UP. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int		 set_config_all_vifs_done (string& error_msg) | set_config_all_vifs_done | 
Complete the set of vif configuration changes.
Parameters:
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int	 send_add_config_vif (const string& dst_module_instance_name,
				    xorp_module_id dst_module_id,
				    const string& vif_name,
				    uint32_t vif_index) | send_add_config_vif | 
[pure virtual]
Send a message to a client to add a configured vif.
Parameters:
| dst_module_instance_name | the name of the protocol instance-destination of the message. | 
| dst_module_id | the module ID of the protocol-destination of the message. | 
| vif_name | the name of the vif to add. | 
| vif_index | the vif index of the vif to add. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int	 send_delete_config_vif (const string& dst_module_instance_name,
				       xorp_module_id dst_module_id,
				       const string& vif_name) | send_delete_config_vif | 
[pure virtual]
Send a message to a client to delete a configured vif.
Parameters:
| dst_module_instance_name | the name of the protocol instance-destination of the message. | 
| dst_module_id | the module ID of the protocol-destination of the message. | 
| vif_name | the name of the vif to delete. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int	 send_add_config_vif_addr (const string& dst_module_instance_name,
					 xorp_module_id dst_module_id,
					 const string& vif_name,
					 const IPvX& addr,
					 const IPvXNet& subnet,
					 const IPvX& broadcast,
					 const IPvX& peer) | send_add_config_vif_addr | 
[pure virtual]
Send a message to a client to add an address to a configured vif.
Parameters:
| dst_module_instance_name | the name of the protocol instance-destination of the message. | 
| dst_module_id | the module ID of the protocol-destination of the message. | 
| vif_name | the name of the vif. | 
| addr | the address to add. | 
| subnet | the subnet address to add. | 
| broadcast | the broadcast address to add. | 
| peer | the peer address to add. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int	 send_delete_config_vif_addr (const string& dst_module_instance_name,
					    xorp_module_id dst_module_id,
					    const string& vif_name,
					    const IPvX& addr) | send_delete_config_vif_addr | 
[pure virtual]
Send a message to a client to delete an address from a configured vif.
Parameters:
| dst_module_instance_name | the name of the protocol instance-destination of the message. | 
| dst_module_id | the module ID of the protocol-destination of the message. | 
| vif_name | the name of the vif. | 
| addr | the address to delete. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int	 send_set_config_vif_flags (const string& dst_module_instance_name,
					  xorp_module_id dst_module_id,
					  const string& vif_name,
					  bool is_pim_register,
					  bool is_p2p,
					  bool is_loopback,
					  bool is_multicast,
					  bool is_broadcast,
					  bool is_up) | send_set_config_vif_flags | 
[pure virtual]
Send a message to a client to set the vif flags of a configured vif.
Parameters:
| dst_module_instance_name | the name of the protocol instance-destination of the message. | 
| dst_module_id | the module ID of the protocol-destination of the message. | 
| vif_name | the name of the vif. | 
| is_pim_register | true if the vif is a PIM Register interface. | 
| is_p2p | true if the vif is point-to-point interface. | 
| is_loopback | true if the vif is a loopback interface. | 
| is_multicast | true if the vif is multicast capable. | 
| is_broadcast | true if the vif is broadcast capable. | 
| is_up | true if the underlying vif is UP. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int	 send_set_config_all_vifs_done (const string& dst_module_instance_name,
					      xorp_module_id dst_module_id) | send_set_config_all_vifs_done | 
[pure virtual]
Send a message to a client to complete the set of vif configuration changes.
Parameters:
| dst_module_instance_name | the name of the protocol instance-destination of the message. | 
| dst_module_id | the module ID of the protocol-destination of the message. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 enable_vif (const string& vif_name, string& error_msg) | enable_vif | 
Enable an existing MFEA vif.
Parameters:
| vif_name | the name of the vif to enable. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 disable_vif (const string& vif_name, string& error_msg) | disable_vif | 
Disable an existing MFEA vif.
Parameters:
| vif_name | the name of the vif to disable. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 start_vif (const string& vif_name, string& error_msg) | start_vif | 
Start an existing MFEA vif.
Parameters:
| vif_name | the name of the vif to start. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 stop_vif (const string& vif_name, string& error_msg) | stop_vif | 
Stop an existing MFEA vif.
Parameters:
| vif_name | the name of the vif to start. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 start_all_vifs () | start_all_vifs | 
Start MFEA on all enabled interfaces.
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 stop_all_vifs () | stop_all_vifs | 
Stop MFEA on all interfaces it was running on.
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 enable_all_vifs () | enable_all_vifs | 
Enable MFEA on all interfaces.
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 disable_all_vifs () | disable_all_vifs | 
Disable MFEA on all interfaces.
All running interfaces are stopped first.
Returns: XORP_OK on success, otherwise XORP_ERROR.
| void	 delete_all_vifs () | delete_all_vifs | 
| void	 vif_shutdown_completed (const string& vif_name) | vif_shutdown_completed | 
A method called when a vif has completed its shutdown.
Parameters:
| vif_name | the name of the vif that has completed its shutdown. | 
| int		 start_protocol (xorp_module_id module_id) | start_protocol | 
Start operation for a given protocol.
Parameters:
| module_id | the module ID (xorp_module_id) of the protocol to start. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 stop_protocol (xorp_module_id module_id) | stop_protocol | 
Stop operation for a given protocol.
Parameters:
| module_id | the module ID (xorp_module_id) of the protocol to stop. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 add_protocol (const string& module_instance_name,
			     xorp_module_id module_id) | add_protocol | 
A method used by a protocol instance to register with this MfeaNode.
Parameters:
| module_instance_name | the module instance name of the protocol to add. | 
| module_id | the module ID (xorp_module_id) of the protocol to add. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 delete_protocol (const string& module_instance_name,
				xorp_module_id module_id) | delete_protocol | 
A method used by a protocol instance to deregister with this MfeaNode.
Parameters:
| module_instance_name | the module instance name of the protocol to delete. | 
| module_id | the module ID (xorp_module_id) of the protocol to delete. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 start_protocol_vif (const string& module_instance_name,
				   xorp_module_id module_id,
				   uint32_t vif_index) | start_protocol_vif | 
Start a protocol on an interface.
Parameters:
| module_instance_name | the module instance name of the protocol to start on the interface. | 
| module_id | the module ID (xorp_module_id) of the protocol to start on the interface. | 
| vif_index | the vif index of the interface to start the protocol on. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 stop_protocol_vif (const string& module_instance_name,
				  xorp_module_id module_id,
				  uint32_t vif_index) | stop_protocol_vif | 
Stop a protocol on an interface.
Parameters:
| module_instance_name | the module instance name of the protocol to stop on the interface. | 
| module_id | the module ID (xorp_module_id) of the protocol to stop on the interface. | 
| vif_index | the vif index of the interface to stop the protocol on. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 add_allow_kernel_signal_messages (const string& module_instance_name,
						 xorp_module_id module_id) | add_allow_kernel_signal_messages | 
Add a protocol to receive kernel signal messages.
Add a protocol to the set of protocols that are interested in receiving kernel signal messages.
Parameters:
| module_instance_name | the module instance name of the protocol to add. | 
| module_id | the module ID (xorp_module_id) of the protocol to add. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 delete_allow_kernel_signal_messages (const string& module_instance_name,
						    xorp_module_id module_id) | delete_allow_kernel_signal_messages | 
Delete a protocol from receiving kernel signal messages.
Delete a protocol from the set of protocols that are interested in receiving kernel signal messages.
Parameters:
| module_instance_name | the module instance name of the protocol to delete. | 
| module_id | the module ID (xorp_module_id) of the protocol to delete. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 proto_recv (const string& src_module_instance_name,
			   xorp_module_id src_module_id,
			   uint32_t vif_index,
			   const IPvX& src, const IPvX& dst,
			   int ip_ttl, int ip_tos, bool is_router_alert,
			   const uint8_t *rcvbuf, size_t rcvlen,
			   string& error_msg) | proto_recv | 
Receive a protocol message from an user-level protocol.
Parameters:
| src_module_instance_name | the module instance name of the module-origin of the message. | 
| src_module_id | the module ID (xorp_module_id) of the module-origin of the message. | 
| vif_index | the vif index of the interface used to receive this message. | 
| src | the source address of the message. | 
| dst | the destination address of the message. | 
| ip_ttl | the IP TTL of the message. If it has a negative value, the TTL will be set by the lower layers (including the MFEA). | 
| ip_tos | the IP TOS of the message. If it has a negative value, the TOS will be set by the lower layers (including the MFEA). | 
| is_router_alert | if true, set the Router Alert IP option for the IP packet of the outgoung message. | 
| rcvbuf | the data buffer with the received message. | 
| rcvlen | the data length in rcvbuf. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int		 proto_comm_recv (xorp_module_id dst_module_id,
				uint32_t vif_index,
				const IPvX& src, const IPvX& dst,
				int ip_ttl, int ip_tos, bool is_router_alert,
				const uint8_t *rcvbuf, size_t rcvlen) | proto_comm_recv | 
Process an incoming message from the kernel.
This method sends the protocol message to an user-level protocol module. Note: it uses the pure virtual ProtoNode::proto_send() method that is implemented somewhere else (at a class that inherits this one).
Parameters:
| dst_module_id | the module ID (xorp_module_id) of the module-recepient of the message. | 
| vif_index | the vif index of the interface used to receive this message. | 
| src | the source address of the message. | 
| dst | the destination address of the message. | 
| ip_ttl | the IP TTL (Time To Live) of the message. If it has a negative value, it should be ignored. | 
| ip_tos | the IP TOS (Type of Service) of the message. If it has a negative value, it should be ignored. | 
| is_router_alert | if true, the Router Alert IP option for the IP packet of the incoming message was set. | 
| rcvbuf | the data buffer with the received message. | 
| rcvlen | the data length in rcvbuf. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 signal_message_recv (const string& src_module_instance_name,
				    xorp_module_id src_module_id,
				    int message_type,
				    uint32_t vif_index,
				    const IPvX& src,
				    const IPvX& dst,
				    const uint8_t *rcvbuf,
				    size_t rcvlen) | signal_message_recv | 
Process NOCACHE, WRONGVIF/WRONGMIF, WHOLEPKT signals from the kernel.
The signal is sent to all user-level protocols that expect it.
#define IGMPMSG_NOCACHE 1 #define IGMPMSG_WRONGVIF 2 #define IGMPMSG_WHOLEPKT 3 #define MRT6MSG_NOCACHE 1 #define MRT6MSG_WRONGMIF 2 #define MRT6MSG_WHOLEPKT 3
Parameters:
| src_module_instance_name | unused. | 
| src_module_id | the xorp_module_id module ID of the associated ProtoComm entry. Note: in the future it may become irrelevant. | 
| message_type | the message type of the kernel signal (for IPv4 and IPv6 respectively): | 
| vif_index | the vif index of the related interface (message-specific). | 
| src | the source address in the message. | 
| dst | the destination address in the message. | 
| rcvbuf | the data buffer with the additional information in the message. | 
| rcvlen | the data length in rcvbuf. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
| int  signal_dataflow_message_recv (const IPvX& source,
				     const IPvX& group,
				     const TimeVal& threshold_interval,
				     const TimeVal& measured_interval,
				     uint32_t threshold_packets,
				     uint32_t threshold_bytes,
				     uint32_t measured_packets,
				     uint32_t measured_bytes,
				     bool is_threshold_in_packets,
				     bool is_threshold_in_bytes,
				     bool is_geq_upcall,
				     bool is_leq_upcall) | signal_dataflow_message_recv | 
Process a dataflow upcall from the kernel or from the MFEA internal mechanism.
The MFEA internal bandwidth-estimation mechanism is based on periodic reading of the kernel multicast forwarding statistics. The signal is sent to all user-level protocols that expect it.
Note: either is_threshold_in_packets or is_threshold_in_bytes (or both) must be true. Note: either is_geq_upcall or is_leq_upcall (but not both) must be true.
Parameters:
| source | the source address. | 
| group | the group address. | 
| threshold_interval | the dataflow threshold interval. | 
| measured_interval | the dataflow measured interval. | 
| threshold_packets | the threshold (in number of packets) to compare against. | 
| threshold_bytes | the threshold (in number of bytes) to compare against. | 
| measured_packets | the number of packets measured within the measured_interval. | 
| measured_bytes | the number of bytes measured within the measured_interval. | 
| is_threshold_in_packets | if true, threshold_packets is valid. | 
| is_threshold_in_bytes | if true, threshold_bytes is valid. | 
| is_geq_upcall | if true, the operation for comparison is ">=". | 
| is_leq_upcall | if true, the operation for comparison is "<=". | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int  dataflow_signal_send (const string& dst_module_instance_name,
				     xorp_module_id dst_module_id,
				     const IPvX& source_addr,
				     const IPvX& group_addr,
				     uint32_t threshold_interval_sec,
				     uint32_t threshold_interval_usec,
				     uint32_t measured_interval_sec,
				     uint32_t measured_interval_usec,
				     uint32_t threshold_packets,
				     uint32_t threshold_bytes,
				     uint32_t measured_packets,
				     uint32_t measured_bytes,
				     bool is_threshold_in_packets,
				     bool is_threshold_in_bytes,
				     bool is_geq_upcall,
				     bool is_leq_upcall) | dataflow_signal_send | 
[pure virtual]
Send a signal that a dataflow-related pre-condition is true.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
Note: either is_threshold_in_packets or is_threshold_in_bytes (or both) must be true. Note: either is_geq_upcall or is_leq_upcall (but not both) must be true.
Parameters:
| dst_module_instance_name | the module instance name of the module-recepient of the message. | 
| dst_module_id | the module ID (xorp_module_id) of the module-recepient of the message. | 
| source_addr | the source address of the dataflow. | 
| group_addr | the group address of the dataflow. | 
| threshold_interval_sec | the number of seconds in the interval requested for measurement. | 
| threshold_interval_usec | the number of microseconds in the interval requested for measurement. | 
| measured_interval_sec | the number of seconds in the last measured interval that has triggered the signal. | 
| measured_interval_usec | the number of microseconds in the last measured interval that has triggered the signal. | 
| threshold_packets | the threshold value to trigger a signal (in number of packets). | 
| threshold_bytes | the threshold value to trigger a signal (in bytes). | 
| measured_packets | the number of packets measured within the measured_interval. | 
| measured_bytes | the number of bytes measured within the measured_interval. | 
| is_threshold_in_packets | if true, threshold_packets is valid. | 
| is_threshold_in_bytes | if true, threshold_bytes is valid. | 
| is_geq_upcall | if true, the operation for comparison is ">=". | 
| is_leq_upcall | if true, the operation for comparison is "<=". | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 join_multicast_group (const string& module_instance_name,
				     xorp_module_id module_id,
				     uint32_t vif_index,
				     const IPvX& group) | join_multicast_group | 
Join a multicast group.
Parameters:
| module_instance_name | the module instance name of the protocol to join the multicast group. | 
| module_id | the module ID (xorp_module_id) of the protocol to join the multicast group. | 
| vif_index | the vif index of the interface to join. | 
| group | the multicast group to join. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 leave_multicast_group (const string& module_instance_name,
				      xorp_module_id module_id,
				      uint32_t vif_index,
				      const IPvX& group) | leave_multicast_group | 
Leave a multicast group.
Parameters:
| module_instance_name | the module instance name of the protocol to leave the multicast group. | 
| module_id | the module ID (xorp_module_id) of the protocol to leave the multicast group. | 
| vif_index | the vif index of the interface to leave. | 
| group | the multicast group to leave. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 add_mfc (const string& module_instance_name,
			const IPvX& source, const IPvX& group,
			uint32_t iif_vif_index, const Mifset& oiflist,
			const Mifset& oiflist_disable_wrongvif,
			uint32_t max_vifs_oiflist,
			const IPvX& rp_addr) | add_mfc | 
Add Multicast Forwarding Cache (MFC) to the kernel.
Parameters:
| module_instance_name | the module instance name of the protocol that adds the MFC. | 
| source | the source address. | 
| group | the group address. | 
| iif_vif_index | the vif index of the incoming interface. | 
| oiflist | the bitset with the outgoing interfaces. | 
| oiflist_disable_wrongvif | the bitset with the outgoing interfaces to disable the WRONGVIF signal. | 
| max_vifs_oiflist | the number of vifs covered by oiflist or oiflist_disable_wrongvif. | 
| rp_addr | the RP address. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 delete_mfc (const string& module_instance_name,
			   const IPvX& source, const IPvX& group) | delete_mfc | 
Delete Multicast Forwarding Cache (MFC) from the kernel.
Note: all corresponding dataflow entries are also removed.
Parameters:
| module_instance_name | the module instance name of the protocol that deletes the MFC. | 
| source | the source address. | 
| group | the group address. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 add_dataflow_monitor (const string& module_instance_name,
				     const IPvX& source, const IPvX& group,
				     const TimeVal& threshold_interval,
				     uint32_t threshold_packets,
				     uint32_t threshold_bytes,
				     bool is_threshold_in_packets,
				     bool is_threshold_in_bytes,
				     bool is_geq_upcall,
				     bool is_leq_upcall,
				     string& error_msg) | add_dataflow_monitor | 
Add a dataflow monitor entry.
Note: either is_threshold_in_packets or is_threshold_in_bytes (or both) must be true. Note: either is_geq_upcall or is_leq_upcall (but not both) must be true.
Parameters:
| module_instance_name | the module instance name of the protocol that adds the dataflow monitor entry. | 
| source | the source address. | 
| group | the group address. | 
| threshold_interval | the dataflow threshold interval. | 
| threshold_packets | the threshold (in number of packets) to compare against. | 
| threshold_bytes | the threshold (in number of bytes) to compare against. | 
| is_threshold_in_packets | if true, threshold_packets is valid. | 
| is_threshold_in_bytes | if true, threshold_bytes is valid. | 
| is_geq_upcall | if true, the operation for comparison is ">=". | 
| is_leq_upcall | if true, the operation for comparison is "<=". | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 delete_dataflow_monitor (const string& module_instance_name,
					const IPvX& source, const IPvX& group,
					const TimeVal& threshold_interval,
					uint32_t threshold_packets,
					uint32_t threshold_bytes,
					bool is_threshold_in_packets,
					bool is_threshold_in_bytes,
					bool is_geq_upcall,
					bool is_leq_upcall,
					string& error_msg) | delete_dataflow_monitor | 
Delete a dataflow monitor entry.
Note: either is_threshold_in_packets or is_threshold_in_bytes (or both) must be true. Note: either is_geq_upcall or is_leq_upcall (but not both) must be true.
Parameters:
| module_instance_name | the module instance name of the protocol that deletes the dataflow monitor entry. | 
| source | the source address. | 
| group | the group address. | 
| threshold_interval | the dataflow threshold interval. | 
| threshold_packets | the threshold (in number of packets) to compare against. | 
| threshold_bytes | the threshold (in number of bytes) to compare against. | 
| is_threshold_in_packets | if true, threshold_packets is valid. | 
| is_threshold_in_bytes | if true, threshold_bytes is valid. | 
| is_geq_upcall | if true, the operation for comparison is ">=". | 
| is_leq_upcall | if true, the operation for comparison is "<=". | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 delete_all_dataflow_monitor (const string& module_instance_name,
					    const IPvX& source,
					    const IPvX& group,
					    string& error_msg) | delete_all_dataflow_monitor | 
Delete all dataflow monitor entries for a given source and group address.
Parameters:
| module_instance_name | the module instance name of the protocol that deletes the dataflow monitor entry. | 
| source | the source address. | 
| group | the group address. | 
| error_msg | the error message (if error). | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 add_multicast_vif (uint32_t vif_index) | add_multicast_vif | 
Add a multicast vif to the kernel.
Parameters:
| vif_index | the vif index of the interface to add. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 delete_multicast_vif (uint32_t vif_index) | delete_multicast_vif | 
Delete a multicast vif from the kernel.
Parameters:
| vif_index | the vif index of the interface to delete. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 get_sg_count (const IPvX& source, const IPvX& group,
			     SgCount& sg_count) | get_sg_count | 
Get MFC multicast forwarding statistics from the kernel.
Get the number of packets and bytes forwarded by a particular Multicast Forwarding Cache (MFC) entry in the kernel, and the number of packets arrived on wrong interface for that entry.
Parameters:
| source | the MFC source address. | 
| group | the MFC group address. | 
| sg_count | a reference to a SgCount class to place the result: the number of packets and bytes forwarded by the particular MFC entry, and the number of packets arrived on a wrong interface. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| int		 get_vif_count (uint32_t vif_index, VifCount& vif_count) | get_vif_count | 
Get interface multicast forwarding statistics from the kernel.
Get the number of packets and bytes received on, or forwarded on a particular multicast interface.
Parameters:
| vif_index | the vif index of the virtual multicast interface whose statistics we need. | 
| vif_count | a reference to a VifCount class to store the result. | 
Returns: XORP_OK on success, otherwise XORP_ERROR.
| MfeaMrouter&  mfea_mrouter () | mfea_mrouter | 
Get a reference to the mrouter (MfeaMrouter).
Returns: a reference to the mrouter (MfeaMrouter).
| MfeaDft&	 mfea_dft () | mfea_dft | 
Get a reference to the dataflow table (MfeaDft).
Returns: a reference to the dataflow table (MfeaDft).
| vector<ProtoComm *>&  proto_comms () | proto_comms | 
Get a reference to the vector-array of installed ProtoComm entries.
Returns: a reference to the vector-array of installed ProtoComm entries.
| ProtoComm	* proto_comm_find_by_module_id (xorp_module_id module_id) | proto_comm_find_by_module_id | 
[const]
Find an ProtoComm entry for a given module ID (xorp_module_id).
Parameters:
| module_id | the module ID (xorp_module_id) to search for. | 
Returns: the corresponding ProtoComm entry if found, otherwise NULL.
| ProtoComm	* proto_comm_find_by_ipproto (int ipproto) | proto_comm_find_by_ipproto | 
[const]
Find an ProtoComm entry for a given IP protocol number.
Parameters:
| ipproto | the IP protocol number ot search for. | 
Returns: the corresponding ProtoComm entry if found, otherwise NULL.
| bool	 is_log_trace () | is_log_trace | 
[const]
Test if trace log is enabled.
This method is used to test whether to output trace log debug messges.
Returns: true if trace log is enabled, otherwise false.
| void	 set_log_trace (bool is_enabled) | set_log_trace | 
Enable/disable trace log.
This method is used to enable/disable trace log debug messages output.
Parameters:
| is_enabled | if true, trace log is enabled, otherwise is disabled. | 
| void  tree_complete () | tree_complete | 
[protected]
Reimplemented from IfMgrHintObserver.
| void  updates_made () | updates_made | 
[protected]
Reimplemented from IfMgrHintObserver.