Tuning Cisco and Linux IGMP for AoIP

Modern AoIP implementations from vendors like Wheatstone or Telos utilize multicast networking to efficiently deliver audio streams among devices on a network. Without multicast, bandwidth usage and latency on the network can spike. Uplinks connecting access switches with the core network are particularly susceptible to saturation as they create bottlenecks on the network over which the majority of the network’s audio traffic flows.

Wheatstone recommends that IGMP snooping be configured in a specific way in order to operate with its AoIP implementation. In case you don’t know, IGMP is an integral part of multicast networking as it provides a way for network devices to track which switch ports require which multicast streams. Specifically, Wheatstone indicates this configuration on a Cisco switch:

# Global configuration
ip igmp snooping querier 
ip igmp snooping querier max-response-time 25
ip igmp snooping querier timer expiry 205

# Access port configuration
switchport mode access
spanning-tree portfast
no ip igmp snooping tcn flood
# The next line not related to multicast
switchport nonegotiate

# Trunk port configuration
switchport mode trunk
no ip igmp snooping tcn flood

At my station, we host some AoIP appliances on virtual machines managed by KVM, the virtualization technology provided in the Linux kernel. These appliances utilize bridged network interfaces on the host for their network access, so each bridge must be configured with similar multicast/IGMP commands for proper operation. The following Linux networking commands are equivalent to Cisco commands above:

# Enable IGMP snooping
echo 1 > /sys/devices/virtual/net/ifn_br10/bridge/multicast_querier
# Tune the query timer expiration to 205 seconds
echo 2050 > /sys/devices/virtual/net/ifn_br10/bridge/multicast_query_interval
# Tune the response timer to 25 seconds
echo 250 > /sys/devices/virtual/net/ifn_br10/bridge/multicast_query_response_interval

A few things to note:

  • Time values provided to Linux are in milliseconds whereas Cisco values are in seconds.
  • These tuning commands are not persistent across reboots. To achieve persistence, add these commmds to the rc.local script (don’t forget to make this file executable!) so they will be run late in the boot process.