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.