There should be one node per PIM instance. There should be one instance per address family.
PimNode (int family, xorp_module_id module_id, EventLoop& eventloop)
| PimNode |
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 XORP_MODULE_PIMSM Note: if/after PIM-DM is implemented, XORP_MODULE_PIMDM would be allowed as well. |
eventloop | the event loop to use. |
~PimNode ()
| ~PimNode |
[virtual]
int start ()
| start |
Start the node operation.
Start the PIM protocol. After the startup operations are completed, PimNode::final_start() is called internally to complete the job.
Returns: XORP_OK on success, otherwise XORP_ERROR.
int stop ()
| stop |
Stop the node operation.
Gracefully stop the PIM protocol. The graceful stop will attempt to send Join/Prune, Assert, etc. messages for all multicast routing entries to gracefully clean-up state with neighbors. After the multicast routing entries cleanup is completed, PimNode::final_stop() is called internally to complete the job. If this method is called one-after-another, the second one will force calling immediately PimNode::final_stop() to quickly finish the job. This method, unlike start(), will stop the protocol operation on all interfaces.
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 PimNode::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 PimNode::stop() to complete the job.
Returns: XORP_OK on success, otherwise XORP_ERROR.
bool has_pending_down_units (string& reason_msg)
| has_pending_down_units |
Test if there is an unit that is in PENDING_DOWN state.
Parameters:
reason_msg | return-by-reference string that contains human-readable information about the unit that is in PENDING_DOWN state (if any). |
Returns: true if there is an unit that is in PENDING_DOWN state, otherwise false.
int add_vif (const Vif& vif, string& error_msg)
| add_vif |
Install a new PIM vif.
Parameters:
vif | vif information about the new PimVif to install. |
error_msg | the error message (if error). |
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
int add_vif (const string& vif_name, uint16_t vif_index,
string& error_msg)
| add_vif |
Install a new PIM vif.
Parameters:
vif_name | the name of the new vif. |
vif_index | the vif index of the new vif. |
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 PIM 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 set_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_vif_flags |
Set flags to a vif.
Parameters:
vif_name | the name of the vif. |
is_pim_register | true if this is a PIM Register vif. |
is_p2p | true if this is a point-to-point vif. |
is_loopback | true if this is a loopback interface. |
is_multicast | rue if the vif is multicast-capable. |
is_broadcast | true if the vif is broadcast-capable. |
is_up | true if the vif is UP and running. |
error_msg | the error message (if error). |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int add_vif_addr (const string& vif_name,
const IPvX& addr,
const IPvXNet& subnet_addr,
const IPvX& broadcast_addr,
const IPvX& peer_addr,
string& error_msg)
| add_vif_addr |
Add a new address to a vif, or update an existing address.
Parameters:
vif_name | the name of the vif. |
addr | the unicast address to add. |
subnet_addr | the subnet address to add. |
broadcast_addr | the broadcast address (when applicable). |
peer_addr | the peer address (when applicable). |
error_msg | the error message (if error). |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int delete_vif_addr (const string& vif_name,
const IPvX& addr,
string& error_msg)
| delete_vif_addr |
Delete an address from a vif.
Parameters:
vif_name | the name of the vif. |
addr | the unicast address to delete. |
error_msg | the error message (if error). |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int enable_vif (const string& vif_name, string& error_msg)
| enable_vif |
Enable an existing PIM 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 PIM 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 PIM 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 PIM 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 PIM on all enabled interfaces.
Returns: the number of virtual interfaces PIM was started on, or XORP_ERROR if error occured.
int stop_all_vifs ()
| stop_all_vifs |
Stop PIM on all interfaces it was running on.
Returns: he number of virtual interfaces PIM was stopped on, or XORP_ERROR if error occured.
int enable_all_vifs ()
| enable_all_vifs |
Enable PIM on all interfaces.
Returns: XORP_OK on success, otherwise XORP_ERROR.
int disable_all_vifs ()
| disable_all_vifs |
Disable PIM on all interfaces.
Returns: XORP_OK on success, otherwise XORP_ERROR.
void delete_all_vifs ()
| delete_all_vifs |
int proto_recv (const string& src_module_instance_name,
xorp_module_id src_module_id,
uint16_t vif_index,
const IPvX& src, const IPvX& dst,
int ip_ttl, int ip_tos, bool router_alert_bool,
const uint8_t *rcvbuf, size_t rcvlen)
| proto_recv |
Receive a protocol message.
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, it should be ignored. |
ip_tos | the IP TOS of the message. If it has a negative value, it should be ignored. |
router_alert_bool | if true, the IP Router Alert option in the IP packet was set (when applicable). |
rcvbuf | the data buffer with the received message. |
rcvlen | the data length in rcvbuf. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
Reimplemented from ProtoNode.
int pim_send (uint16_t vif_index,
const IPvX& src, const IPvX& dst,
int ip_ttl, int ip_tos, bool router_alert_bool,
buffer_t *buffer)
| pim_send |
Send a protocol message.
Note: this method uses the pure virtual ProtoNode::proto_send() method that is implemented somewhere else (in a class that inherits this one).
Parameters:
vif_index | the vif index of the vif to send the message. |
src | the source address of the message. |
dst | the destination address of the message. |
ip_ttl | the TTL of the IP packet to send. If it has a negative value, the TTL will be set by the lower layers. |
ip_tos | the TOS of the IP packet to send. If it has a negative value, the TOS will be set by the lower layers. |
router_alert_bool | if true, set the IP Router Alert option in the IP packet to send (when applicable). |
buffer | the data buffer with the message to send. |
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,
uint16_t vif_index,
const IPvX& src,
const IPvX& dst,
const uint8_t *rcvbuf,
size_t rcvlen)
| signal_message_recv |
Receive a signal message from the kernel.
#define MFEA_KERNEL_MESSAGE_NOCACHE 1 #define MFEA_KERNEL_MESSAGE_WRONGVIF 2 #define MFEA_KERNEL_MESSAGE_WHOLEPKT 3
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. |
message_type | the message type. Currently, the type of messages received from the kernel are: |
vif_index | the vif index of the related interface (message-specific relation). |
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_message_send (const string&,
xorp_module_id,
int ,
uint16_t ,
const IPvX& ,
const IPvX& ,
const uint8_t * ,
size_t
)
| signal_message_send |
Send signal message: not used by PIM.
Reimplemented from ProtoNode.
int start_protocol_kernel_vif (uint16_t vif_index)
| start_protocol_kernel_vif |
[pure virtual]
Start a protocol vif with the kernel.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
Parameters:
vif_index | the vif index of the interface to start. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int stop_protocol_kernel_vif (uint16_t vif_index)
| stop_protocol_kernel_vif |
[pure virtual]
Stop a protocol vif with the kernel.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
Parameters:
vif_index | the vif index of the interface to stop. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int join_multicast_group (uint16_t vif_index,
const IPvX& multicast_group)
| join_multicast_group |
[pure virtual]
Join a multicast group on an interface.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
TODO: add a source address as well!!
Parameters:
vif_index | the vif index of the interface to join. |
multicast_group | the multicast group address. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int leave_multicast_group (uint16_t vif_index,
const IPvX& multicast_group)
| leave_multicast_group |
[pure virtual]
Leave a multicast group on an interface.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
TODO: add a source address as well!!
Parameters:
vif_index | the vif index of the interface to leave. |
multicast_group | the multicast group address. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int add_mfc_to_kernel (const PimMfc& pim_mfc)
| add_mfc_to_kernel |
[pure virtual]
Add a Multicast Forwarding Cache to the kernel.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
Parameters:
pim_mfc | the PimMfc entry to add. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int delete_mfc_from_kernel (const PimMfc& pim_mfc)
| delete_mfc_from_kernel |
[pure virtual]
Delete a Multicast Forwarding Cache to the kernel.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
Parameters:
pim_mfc | the PimMfc entry to delete. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int add_dataflow_monitor (const IPvX& source_addr,
const IPvX& group_addr,
uint32_t threshold_interval_sec,
uint32_t threshold_interval_usec,
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)
| add_dataflow_monitor |
[pure virtual]
Add a dataflow monitor to the MFEA.
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:
source | the source address. |
group | the group address. |
threshold_interval_sec | the dataflow threshold interval (seconds). |
threshold_interval_usec | the dataflow threshold interval (microseconds). |
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 "<=". |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int delete_dataflow_monitor (const IPvX& source_addr,
const IPvX& group_addr,
uint32_t threshold_interval_sec,
uint32_t threshold_interval_usec,
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)
| delete_dataflow_monitor |
[pure virtual]
Delete a dataflow monitor from the MFEA.
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:
source | the source address. |
group | the group address. |
threshold_interval_sec | the dataflow threshold interval (seconds). |
threshold_interval_usec | the dataflow threshold interval (microseconds). |
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 "<=". |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int delete_all_dataflow_monitor (const IPvX& source_addr,
const IPvX& group_addr)
| delete_all_dataflow_monitor |
[pure virtual]
Delete all dataflow monitors for a given source and group address from the MFEA.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
Parameters:
source_addr | the source address. |
group_addr | the group address. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int add_protocol_mld6igmp (uint16_t vif_index)
| add_protocol_mld6igmp |
[pure virtual]
Register this protocol with the MLD/IGMP module.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
By registering this protocol with the MLD/IGMP module, it will be notified about multicast group membership events.
Parameters:
vif_index | the vif index of the interface to register with the MLD/IGMP module. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int delete_protocol_mld6igmp (uint16_t vif_index)
| delete_protocol_mld6igmp |
[pure virtual]
Deregister this protocol with the MLD/IGMP module.
This is a pure virtual function, and it must be implemented by the communication-wrapper class that inherits this base class.
Parameters:
vif_index | the vif index of the interface to deregister with the MLD/IGMP module. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int add_membership (uint16_t vif_index, const IPvX& source,
const IPvX& group)
| add_membership |
Receive "add membership" from the MLD/IGMP module.
Parameters:
vif_index | the vif index of the interface with membership change. |
source | the source address of the (S,G) or (*,G) entry that has changed membership. In case of Any-Source Multicast, it is IPvX::ZERO(). |
group | the group address. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
int delete_membership (uint16_t vif_index, const IPvX& source,
const IPvX& group)
| delete_membership |
Receive "delete membership" from the MLD/IGMP module.
Parameters:
vif_index | the vif index of the interface with membership change. |
source | the source address of the (S,G) or (*,G) entry that has changed membership. In case of Any-Source Multicast, it is IPvX::ZERO(). |
group | the group address. |
Returns: XORP_OK on success, otherwise XORP_ERROR.
bool is_directly_connected (const PimVif& pim_vif,
const IPvX& ipaddr_test)
| is_directly_connected |
[const]
Test if an address is directly connected to a specified virtual interface.
Note that the virtual interface the address is directly connected to must be UP.
Parameters:
pim_vif | the virtual interface to test against. |
ipaddr_test | the address to test. |
Returns: true if ipaddr_test is directly connected to vif, otherwise false.
PimVif * vif_find_pim_register ()
| vif_find_pim_register |
[const]
Get the PIM-Register virtual interface.
Returns: the PIM-Register virtual interface if exists, otherwise NULL.
uint16_t pim_register_vif_index ()
| pim_register_vif_index |
[const]
Get the vif index of the PIM-Register virtual interface.
Returns: the vif index of the PIM-Register virtual interface if exists, otherwise Vif::VIF_INDEX_INVALID.
PimMrt& pim_mrt ()
| pim_mrt |
Get the PIM Multicast Routing Table.
Returns: a reference to the PIM Multicast Routing Table (PimMrt).
PimMribTable& pim_mrib_table ()
| pim_mrib_table |
Get the table with the Multicast Routing Information Base used by PIM.
Returns: a reference to the table with the Multicast Routing Information Base used by PIM (PimMribTable).
PimBsr& pim_bsr ()
| pim_bsr |
Get the PIM Bootstrap entity.
Returns: a reference to the PIM Bootstrap entity (PimBsr).
RpTable& rp_table ()
| rp_table |
Get the PIM RP table.
Returns: a reference to the PIM RP table (RpTable).
PimScopeZoneTable& pim_scope_zone_table ()
| pim_scope_zone_table |
Get the PIM Scope-Zone table.
Returns: a reference to the PIM Scope-Zone table.
Mifset& pim_vifs_dr ()
| pim_vifs_dr |
Get the set of vifs for which this PIM note is a Designated Router.
Returns: the Mifset indicating the vifs for which this PIM node is a Designated Router.
void set_pim_vifs_dr (uint16_t vif_index, bool v)
| set_pim_vifs_dr |
Set/reset a virtual interface as a Designated Router.
Parameters:
vif_index | the vif index of the virtual interface to set/reset as a Designated Router. |
v | if true, set the virtual interface as a Designated Router, otherwise reset it. |
PimNbr * pim_nbr_rpf_find (const IPvX& dst_addr)
| pim_nbr_rpf_find |
Find the RPF PIM neighbor for a given destination address.
Parameters:
dst_addr | the destination address to lookup. |
Returns: the RPF PIM neighbor (PimNbr) toward dst_addr if found, otherwise NULL.
PimNbr * pim_nbr_rpf_find (const IPvX& dst_addr, const Mrib *mrib)
| pim_nbr_rpf_find |
Find the RPF PIM neighbor for a given destination address, and already known Mrib entry.
Parameters:
dst_addr | the destination address to lookup. |
mrib | the already known Mrib entry. |
Returns: the RPF PIM neighbor (PimNbr) toward dst_addr if found, otherwise NULL.
PimNbr * pim_nbr_find (const IPvX& nbr_addr)
| pim_nbr_find |
Find a PIM neighbor by its address.
Note: this method should be used in very limited cases, because in case of IPv6 a neighbor's IP address may be non-unique within the PIM neighbor database due to scope issues.
Parameters:
nbr_addr | the address of the PIM neighbor. |
Returns: the PIM neighbor (PimNbr) if found, otherwise NULL.
void enable_bsr ()
| enable_bsr |
Enable the PIM Bootstrap mechanism.
void disable_bsr ()
| disable_bsr |
Disable the PIM Bootstrap mechanism.
int start_bsr ()
| start_bsr |
Start the Bootstrap mechanism.
Returns: XORP_OK on success, otherwise XORP_ERROR.
int stop_bsr ()
| stop_bsr |
Stop the Bootstrap mechanism.
Returns: XORP_OK on success, otherwise XORP_ERROR.
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 get_vif_proto_version (const string& vif_name,
int& proto_version,
string& error_msg)
| get_vif_proto_version |
int set_vif_proto_version (const string& vif_name,
int proto_version,
string& error_msg)
| set_vif_proto_version |
int reset_vif_proto_version (const string& vif_name,
string& error_msg)
| reset_vif_proto_version |
int get_vif_hello_triggered_delay (const string& vif_name,
uint16_t& hello_triggered_delay,
string& error_msg)
| get_vif_hello_triggered_delay |
int set_vif_hello_triggered_delay (const string& vif_name,
uint16_t hello_triggered_delay,
string& error_msg)
| set_vif_hello_triggered_delay |
int reset_vif_hello_triggered_delay (const string& vif_name,
string& error_msg)
| reset_vif_hello_triggered_delay |
int get_vif_hello_period (const string& vif_name,
uint16_t& hello_period,
string& error_msg)
| get_vif_hello_period |
int set_vif_hello_period (const string& vif_name,
uint16_t hello_period,
string& error_msg)
| set_vif_hello_period |
int reset_vif_hello_period (const string& vif_name,
string& error_msg)
| reset_vif_hello_period |
int get_vif_hello_holdtime (const string& vif_name,
uint16_t& hello_holdtime,
string& error_msg)
| get_vif_hello_holdtime |
int set_vif_hello_holdtime (const string& vif_name,
uint16_t hello_holdtime,
string& error_msg)
| set_vif_hello_holdtime |
int reset_vif_hello_holdtime (const string& vif_name,
string& error_msg)
| reset_vif_hello_holdtime |
int get_vif_dr_priority (const string& vif_name,
uint32_t& dr_priority,
string& error_msg)
| get_vif_dr_priority |
int set_vif_dr_priority (const string& vif_name,
uint32_t dr_priority,
string& error_msg)
| set_vif_dr_priority |
int reset_vif_dr_priority (const string& vif_name,
string& error_msg)
| reset_vif_dr_priority |
int get_vif_lan_delay (const string& vif_name,
uint16_t& lan_delay,
string& error_msg)
| get_vif_lan_delay |
int set_vif_lan_delay (const string& vif_name,
uint16_t lan_delay,
string& error_msg)
| set_vif_lan_delay |
int reset_vif_lan_delay (const string& vif_name,
string& error_msg)
| reset_vif_lan_delay |
int get_vif_override_interval (const string& vif_name,
uint16_t& override_interval,
string& error_msg)
| get_vif_override_interval |
int set_vif_override_interval (const string& vif_name,
uint16_t override_interval,
string& error_msg)
| set_vif_override_interval |
int reset_vif_override_interval (const string& vif_name,
string& error_msg)
| reset_vif_override_interval |
int get_vif_is_tracking_support_disabled (const string& vif_name,
bool& is_tracking_support_disabled,
string& error_msg)
| get_vif_is_tracking_support_disabled |
int set_vif_is_tracking_support_disabled (const string& vif_name,
bool is_tracking_support_disabled,
string& error_msg)
| set_vif_is_tracking_support_disabled |
int reset_vif_is_tracking_support_disabled (const string& vif_name,
string& error_msg)
| reset_vif_is_tracking_support_disabled |
int get_vif_accept_nohello_neighbors (const string& vif_name,
bool& accept_nohello_neighbors,
string& error_msg)
| get_vif_accept_nohello_neighbors |
int set_vif_accept_nohello_neighbors (const string& vif_name,
bool accept_nohello_neighbors,
string& error_msg)
| set_vif_accept_nohello_neighbors |
int reset_vif_accept_nohello_neighbors (const string& vif_name,
string& error_msg)
| reset_vif_accept_nohello_neighbors |
int get_vif_join_prune_period (const string& vif_name,
uint16_t& join_prune_period,
string& error_msg)
| get_vif_join_prune_period |
int set_vif_join_prune_period (const string& vif_name,
uint16_t join_prune_period,
string& error_msg)
| set_vif_join_prune_period |
int reset_vif_join_prune_period (const string& vif_name,
string& error_msg)
| reset_vif_join_prune_period |
int get_switch_to_spt_threshold (bool& is_enabled,
uint32_t& interval_sec,
uint32_t& bytes,
string& error_msg)
| get_switch_to_spt_threshold |
int set_switch_to_spt_threshold (bool is_enabled,
uint32_t interval_sec,
uint32_t bytes,
string& error_msg)
| set_switch_to_spt_threshold |
int reset_switch_to_spt_threshold (string& error_msg)
| reset_switch_to_spt_threshold |
int add_config_scope_zone_by_vif_name (const IPvXNet& scope_zone_id,
const string& vif_name,
string& error_msg)
| add_config_scope_zone_by_vif_name |
int add_config_scope_zone_by_vif_addr (const IPvXNet& scope_zone_id,
const IPvX& vif_addr,
string& error_msg)
| add_config_scope_zone_by_vif_addr |
int delete_config_scope_zone_by_vif_name (const IPvXNet& scope_zone_id,
const string& vif_name,
string& error_msg)
| delete_config_scope_zone_by_vif_name |
int delete_config_scope_zone_by_vif_addr (const IPvXNet& scope_zone_id,
const IPvX& vif_addr,
string& error_msg)
| delete_config_scope_zone_by_vif_addr |
int add_config_cand_bsr_by_vif_name (const IPvXNet& scope_zone_id,
bool is_scope_zone,
const string& vif_name,
uint8_t bsr_priority,
uint8_t hash_mask_len,
string& error_msg)
| add_config_cand_bsr_by_vif_name |
int add_config_cand_bsr_by_addr (const IPvXNet& scope_zone_id,
bool is_scope_zone,
const IPvX& my_cand_bsr_addr,
uint8_t bsr_priority,
uint8_t hash_mask_len,
string& error_msg)
| add_config_cand_bsr_by_addr |
int delete_config_cand_bsr (const IPvXNet& scope_zone_id,
bool is_scope_zone,
string& error_msg)
| delete_config_cand_bsr |
int add_config_cand_rp_by_vif_name (const IPvXNet& group_prefix,
bool is_scope_zone,
const string& vif_name,
uint8_t rp_priority,
uint16_t rp_holdtime,
string& error_msg)
| add_config_cand_rp_by_vif_name |
int add_config_cand_rp_by_addr (const IPvXNet& group_prefix,
bool is_scope_zone,
const IPvX& my_cand_rp_addr,
uint8_t rp_priority,
uint16_t rp_holdtime,
string& error_msg)
| add_config_cand_rp_by_addr |
int delete_config_cand_rp_by_vif_name (const IPvXNet& group_prefix,
bool is_scope_zone,
const string& vif_name,
string& error_msg)
| delete_config_cand_rp_by_vif_name |
int delete_config_cand_rp_by_addr (const IPvXNet& group_prefix,
bool is_scope_zone,
const IPvX& my_cand_rp_addr,
string& error_msg)
| delete_config_cand_rp_by_addr |
int add_config_static_rp (const IPvXNet& group_prefix,
const IPvX& rp_addr,
uint8_t rp_priority,
uint8_t hash_mask_len,
string& error_msg)
| add_config_static_rp |
int delete_config_static_rp (const IPvXNet& group_prefix,
const IPvX& rp_addr,
string& error_msg)
| delete_config_static_rp |
int config_static_rp_done (string& error_msg)
| config_static_rp_done |
int add_alternative_subnet (const string& vif_name,
const IPvXNet& subnet,
string& error_msg)
| add_alternative_subnet |
int delete_alternative_subnet (const string& vif_name,
const IPvXNet& subnet,
string& error_msg)
| delete_alternative_subnet |
int remove_all_alternative_subnets (const string& vif_name,
string& error_msg)
| remove_all_alternative_subnets |
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. |
int add_test_jp_entry (const IPvX& source_addr,
const IPvX& group_addr,
uint8_t group_mask_len,
mrt_entry_type_t mrt_entry_type,
action_jp_t action_jp, uint16_t holdtime,
bool new_group_bool)
| add_test_jp_entry |
int send_test_jp_entry (const IPvX& nbr_addr)
| send_test_jp_entry |
int send_test_assert (const string& vif_name,
const IPvX& source_addr,
const IPvX& group_addr,
bool rpt_bit,
uint32_t metric_preference,
uint32_t metric)
| send_test_assert |
int add_test_bsr_zone (const PimScopeZoneId& zone_id,
const IPvX& bsr_addr,
uint8_t bsr_priority,
uint8_t hash_mask_len,
uint16_t fragment_tag)
| add_test_bsr_zone |
int add_test_bsr_group_prefix (const PimScopeZoneId& zone_id,
const IPvXNet& group_prefix,
bool is_scope_zone,
uint8_t expected_rp_count)
| add_test_bsr_group_prefix |
int add_test_bsr_rp (const PimScopeZoneId& zone_id,
const IPvXNet& group_prefix,
const IPvX& rp_addr,
uint8_t rp_priority,
uint16_t rp_holdtime)
| add_test_bsr_rp |
int send_test_bootstrap (const string& vif_name)
| send_test_bootstrap |
int send_test_bootstrap_by_dest (const string& vif_name,
const IPvX& dest_addr)
| send_test_bootstrap_by_dest |
int send_test_cand_rp_adv ()
| send_test_cand_rp_adv |
void add_pim_mre_no_pim_nbr (PimMre *pim_mre)
| add_pim_mre_no_pim_nbr |
void delete_pim_mre_no_pim_nbr (PimMre *pim_mre)
| delete_pim_mre_no_pim_nbr |
list<PimNbr *>& processing_pim_nbr_list ()
| processing_pim_nbr_list |
void init_processing_pim_mre_rp (uint16_t vif_index,
const IPvX& pim_nbr_addr)
| init_processing_pim_mre_rp |
void init_processing_pim_mre_wc (uint16_t vif_index,
const IPvX& pim_nbr_addr)
| init_processing_pim_mre_wc |
void init_processing_pim_mre_sg (uint16_t vif_index,
const IPvX& pim_nbr_addr)
| init_processing_pim_mre_sg |
void init_processing_pim_mre_sg_rpt (uint16_t vif_index,
const IPvX& pim_nbr_addr)
| init_processing_pim_mre_sg_rpt |
PimNbr * find_processing_pim_mre_rp (uint16_t vif_index,
const IPvX& pim_nbr_addr)
| find_processing_pim_mre_rp |
PimNbr * find_processing_pim_mre_wc (uint16_t vif_index,
const IPvX& pim_nbr_addr)
| find_processing_pim_mre_wc |
PimNbr * find_processing_pim_mre_sg (uint16_t vif_index,
const IPvX& pim_nbr_addr)
| find_processing_pim_mre_sg |
PimNbr * find_processing_pim_mre_sg_rpt (uint16_t vif_index,
const IPvX& pim_nbr_addr)
| find_processing_pim_mre_sg_rpt |
ConfigParam<bool>& is_switch_to_spt_enabled ()
| is_switch_to_spt_enabled |
ConfigParam<uint32_t>& switch_to_spt_threshold_interval_sec ()
| switch_to_spt_threshold_interval_sec |
ConfigParam<uint32_t>& switch_to_spt_threshold_bytes ()
| switch_to_spt_threshold_bytes |
bool is_receive_mrib_from_mfea ()
| is_receive_mrib_from_mfea |
[const]
void set_receive_mrib_from_mfea (bool v)
| set_receive_mrib_from_mfea |
void clear_pim_statistics ()
| clear_pim_statistics |
int clear_pim_statistics_per_vif (const string& vif_name,
string& error_msg)
| clear_pim_statistics_per_vif |
uint32_t pimstat_hello_messages_received ()
| pimstat_hello_messages_received |
[const]
uint32_t pimstat_hello_messages_sent ()
| pimstat_hello_messages_sent |
[const]
uint32_t pimstat_hello_messages_rx_errors ()
| pimstat_hello_messages_rx_errors |
[const]
uint32_t pimstat_register_messages_received ()
| pimstat_register_messages_received |
[const]
uint32_t pimstat_register_messages_sent ()
| pimstat_register_messages_sent |
[const]
uint32_t pimstat_register_messages_rx_errors ()
| pimstat_register_messages_rx_errors |
[const]
uint32_t pimstat_register_stop_messages_received ()
| pimstat_register_stop_messages_received |
[const]
uint32_t pimstat_register_stop_messages_sent ()
| pimstat_register_stop_messages_sent |
[const]
uint32_t pimstat_register_stop_messages_rx_errors ()
| pimstat_register_stop_messages_rx_errors |
[const]
uint32_t pimstat_join_prune_messages_received ()
| pimstat_join_prune_messages_received |
[const]
uint32_t pimstat_join_prune_messages_sent ()
| pimstat_join_prune_messages_sent |
[const]
uint32_t pimstat_join_prune_messages_rx_errors ()
| pimstat_join_prune_messages_rx_errors |
[const]
uint32_t pimstat_bootstrap_messages_received ()
| pimstat_bootstrap_messages_received |
[const]
uint32_t pimstat_bootstrap_messages_sent ()
| pimstat_bootstrap_messages_sent |
[const]
uint32_t pimstat_bootstrap_messages_rx_errors ()
| pimstat_bootstrap_messages_rx_errors |
[const]
uint32_t pimstat_assert_messages_received ()
| pimstat_assert_messages_received |
[const]
uint32_t pimstat_assert_messages_sent ()
| pimstat_assert_messages_sent |
[const]
uint32_t pimstat_assert_messages_rx_errors ()
| pimstat_assert_messages_rx_errors |
[const]
uint32_t pimstat_graft_messages_received ()
| pimstat_graft_messages_received |
[const]
uint32_t pimstat_graft_messages_sent ()
| pimstat_graft_messages_sent |
[const]
uint32_t pimstat_graft_messages_rx_errors ()
| pimstat_graft_messages_rx_errors |
[const]
uint32_t pimstat_graft_ack_messages_received ()
| pimstat_graft_ack_messages_received |
[const]
uint32_t pimstat_graft_ack_messages_sent ()
| pimstat_graft_ack_messages_sent |
[const]
uint32_t pimstat_graft_ack_messages_rx_errors ()
| pimstat_graft_ack_messages_rx_errors |
[const]
uint32_t pimstat_candidate_rp_messages_received ()
| pimstat_candidate_rp_messages_received |
[const]
uint32_t pimstat_candidate_rp_messages_sent ()
| pimstat_candidate_rp_messages_sent |
[const]
uint32_t pimstat_candidate_rp_messages_rx_errors ()
| pimstat_candidate_rp_messages_rx_errors |
[const]
uint32_t pimstat_unknown_type_messages ()
| pimstat_unknown_type_messages |
[const]
uint32_t pimstat_unknown_version_messages ()
| pimstat_unknown_version_messages |
[const]
uint32_t pimstat_neighbor_unknown_messages ()
| pimstat_neighbor_unknown_messages |
[const]
uint32_t pimstat_bad_length_messages ()
| pimstat_bad_length_messages |
[const]
uint32_t pimstat_bad_checksum_messages ()
| pimstat_bad_checksum_messages |
[const]
uint32_t pimstat_bad_receive_interface_messages ()
| pimstat_bad_receive_interface_messages |
[const]
uint32_t pimstat_rx_interface_disabled_messages ()
| pimstat_rx_interface_disabled_messages |
[const]
uint32_t pimstat_rx_register_not_rp ()
| pimstat_rx_register_not_rp |
[const]
uint32_t pimstat_rp_filtered_source ()
| pimstat_rp_filtered_source |
[const]
uint32_t pimstat_unknown_register_stop ()
| pimstat_unknown_register_stop |
[const]
uint32_t pimstat_rx_join_prune_no_state ()
| pimstat_rx_join_prune_no_state |
[const]
uint32_t pimstat_rx_graft_graft_ack_no_state ()
| pimstat_rx_graft_graft_ack_no_state |
[const]
uint32_t pimstat_rx_graft_on_upstream_interface ()
| pimstat_rx_graft_on_upstream_interface |
[const]
uint32_t pimstat_rx_candidate_rp_not_bsr ()
| pimstat_rx_candidate_rp_not_bsr |
[const]
uint32_t pimstat_rx_bsr_when_bsr ()
| pimstat_rx_bsr_when_bsr |
[const]
uint32_t pimstat_rx_bsr_not_rpf_interface ()
| pimstat_rx_bsr_not_rpf_interface |
[const]
uint32_t pimstat_rx_unknown_hello_option ()
| pimstat_rx_unknown_hello_option |
[const]
uint32_t pimstat_rx_data_no_state ()
| pimstat_rx_data_no_state |
[const]
uint32_t pimstat_rx_rp_no_state ()
| pimstat_rx_rp_no_state |
[const]
uint32_t pimstat_rx_aggregate ()
| pimstat_rx_aggregate |
[const]
uint32_t pimstat_rx_malformed_packet ()
| pimstat_rx_malformed_packet |
[const]
uint32_t pimstat_no_rp ()
| pimstat_no_rp |
[const]
uint32_t pimstat_no_route_upstream ()
| pimstat_no_route_upstream |
[const]
uint32_t pimstat_rp_mismatch ()
| pimstat_rp_mismatch |
[const]
uint32_t pimstat_rpf_neighbor_unknown ()
| pimstat_rpf_neighbor_unknown |
[const]
uint32_t pimstat_rx_join_rp ()
| pimstat_rx_join_rp |
[const]
uint32_t pimstat_rx_prune_rp ()
| pimstat_rx_prune_rp |
[const]
uint32_t pimstat_rx_join_wc ()
| pimstat_rx_join_wc |
[const]
uint32_t pimstat_rx_prune_wc ()
| pimstat_rx_prune_wc |
[const]
uint32_t pimstat_rx_join_sg ()
| pimstat_rx_join_sg |
[const]
uint32_t pimstat_rx_prune_sg ()
| pimstat_rx_prune_sg |
[const]
uint32_t pimstat_rx_join_sg_rpt ()
| pimstat_rx_join_sg_rpt |
[const]
uint32_t pimstat_rx_prune_sg_rpt ()
| pimstat_rx_prune_sg_rpt |
[const]
int pimstat_hello_messages_received_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_hello_messages_received_per_vif |
[const]
int pimstat_hello_messages_sent_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_hello_messages_sent_per_vif |
[const]
int pimstat_hello_messages_rx_errors_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_hello_messages_rx_errors_per_vif |
[const]
int pimstat_register_messages_received_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_register_messages_received_per_vif |
[const]
int pimstat_register_messages_sent_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_register_messages_sent_per_vif |
[const]
int pimstat_register_messages_rx_errors_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_register_messages_rx_errors_per_vif |
[const]
int pimstat_register_stop_messages_received_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_register_stop_messages_received_per_vif |
[const]
int pimstat_register_stop_messages_sent_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_register_stop_messages_sent_per_vif |
[const]
int pimstat_register_stop_messages_rx_errors_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_register_stop_messages_rx_errors_per_vif |
[const]
int pimstat_join_prune_messages_received_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_join_prune_messages_received_per_vif |
[const]
int pimstat_join_prune_messages_sent_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_join_prune_messages_sent_per_vif |
[const]
int pimstat_join_prune_messages_rx_errors_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_join_prune_messages_rx_errors_per_vif |
[const]
int pimstat_bootstrap_messages_received_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_bootstrap_messages_received_per_vif |
[const]
int pimstat_bootstrap_messages_sent_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_bootstrap_messages_sent_per_vif |
[const]
int pimstat_bootstrap_messages_rx_errors_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_bootstrap_messages_rx_errors_per_vif |
[const]
int pimstat_assert_messages_received_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_assert_messages_received_per_vif |
[const]
int pimstat_assert_messages_sent_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_assert_messages_sent_per_vif |
[const]
int pimstat_assert_messages_rx_errors_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_assert_messages_rx_errors_per_vif |
[const]
int pimstat_graft_messages_received_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_graft_messages_received_per_vif |
[const]
int pimstat_graft_messages_sent_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_graft_messages_sent_per_vif |
[const]
int pimstat_graft_messages_rx_errors_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_graft_messages_rx_errors_per_vif |
[const]
int pimstat_graft_ack_messages_received_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_graft_ack_messages_received_per_vif |
[const]
int pimstat_graft_ack_messages_sent_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_graft_ack_messages_sent_per_vif |
[const]
int pimstat_graft_ack_messages_rx_errors_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_graft_ack_messages_rx_errors_per_vif |
[const]
int pimstat_candidate_rp_messages_received_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_candidate_rp_messages_received_per_vif |
[const]
int pimstat_candidate_rp_messages_sent_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_candidate_rp_messages_sent_per_vif |
[const]
int pimstat_candidate_rp_messages_rx_errors_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_candidate_rp_messages_rx_errors_per_vif |
[const]
int pimstat_unknown_type_messages_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_unknown_type_messages_per_vif |
[const]
int pimstat_unknown_version_messages_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_unknown_version_messages_per_vif |
[const]
int pimstat_neighbor_unknown_messages_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_neighbor_unknown_messages_per_vif |
[const]
int pimstat_bad_length_messages_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_bad_length_messages_per_vif |
[const]
int pimstat_bad_checksum_messages_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_bad_checksum_messages_per_vif |
[const]
int pimstat_bad_receive_interface_messages_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_bad_receive_interface_messages_per_vif |
[const]
int pimstat_rx_interface_disabled_messages_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_interface_disabled_messages_per_vif |
[const]
int pimstat_rx_register_not_rp_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_register_not_rp_per_vif |
[const]
int pimstat_rp_filtered_source_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rp_filtered_source_per_vif |
[const]
int pimstat_unknown_register_stop_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_unknown_register_stop_per_vif |
[const]
int pimstat_rx_join_prune_no_state_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_join_prune_no_state_per_vif |
[const]
int pimstat_rx_graft_graft_ack_no_state_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_graft_graft_ack_no_state_per_vif |
[const]
int pimstat_rx_graft_on_upstream_interface_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_graft_on_upstream_interface_per_vif |
[const]
int pimstat_rx_candidate_rp_not_bsr_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_candidate_rp_not_bsr_per_vif |
[const]
int pimstat_rx_bsr_when_bsr_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_bsr_when_bsr_per_vif |
[const]
int pimstat_rx_bsr_not_rpf_interface_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_bsr_not_rpf_interface_per_vif |
[const]
int pimstat_rx_unknown_hello_option_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_unknown_hello_option_per_vif |
[const]
int pimstat_rx_data_no_state_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_data_no_state_per_vif |
[const]
int pimstat_rx_rp_no_state_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_rp_no_state_per_vif |
[const]
int pimstat_rx_aggregate_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_aggregate_per_vif |
[const]
int pimstat_rx_malformed_packet_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_malformed_packet_per_vif |
[const]
int pimstat_no_rp_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_no_rp_per_vif |
[const]
int pimstat_no_route_upstream_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_no_route_upstream_per_vif |
[const]
int pimstat_rp_mismatch_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rp_mismatch_per_vif |
[const]
int pimstat_rpf_neighbor_unknown_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rpf_neighbor_unknown_per_vif |
[const]
int pimstat_rx_join_rp_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_join_rp_per_vif |
[const]
int pimstat_rx_prune_rp_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_prune_rp_per_vif |
[const]
int pimstat_rx_join_wc_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_join_wc_per_vif |
[const]
int pimstat_rx_prune_wc_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_prune_wc_per_vif |
[const]
int pimstat_rx_join_sg_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_join_sg_per_vif |
[const]
int pimstat_rx_prune_sg_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_prune_sg_per_vif |
[const]
int pimstat_rx_join_sg_rpt_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_join_sg_rpt_per_vif |
[const]
int pimstat_rx_prune_sg_rpt_per_vif (const string& vif_name, uint32_t& result, string& error_msg)
| pimstat_rx_prune_sg_rpt_per_vif |
[const]