Learn OpenStack · reference/decision-guides
Choose a Neutron ML2 Mechanism Driver
Neutron uses the ML2 plugin with a mechanism driver that handles L2 connectivity. The three main choices are ML2/OVS (Open vSwitch), ML2/OVN (Open Virtual Network), and ML2/Linux Bridge.
Feature Comparison
| Feature | ML2/OVS | ML2/OVN | ML2/Linux Bridge |
|---|---|---|---|
| Performance | High | High | Medium |
| Distributed routing (DVR) | Yes (complex, DVR mode) | Yes (native, default) | No |
| Distributed DHCP | No (centralized DHCP agent) | Yes (native, no agent needed) | No |
| Security groups | iptables/conntrack or OVS firewall driver | Native OVN ACLs (no iptables) | iptables |
| DPDK support | Yes (OVS-DPDK) | Yes (OVN-DPDK) | No |
| SR-IOV support | Yes (with SR-IOV agent) | Yes (with OVN hardware offload) | No |
| Hardware offload | Yes (selected SmartNICs) | Yes (selected SmartNICs) | No |
| BGP dynamic routing | Yes (with neutron-dynamic-routing) | Yes (native BGP in OVN) | Limited |
| Trunk ports (802.1q) | Yes | Yes | Yes |
| QoS | Yes | Yes | Yes |
| IPv6 | Yes | Yes | Yes |
| Agent count | Many (OVS + L3 + DHCP + metadata per node) | Few (ovn-northd, ovn-controller per node) | Many (Linux Bridge + L3 + DHCP + metadata) |
| Centralized L3 agent | Yes (unless DVR) | No (distributed by default) | Yes |
| Operational complexity | Medium | Medium-High | Low |
| Community direction | Maintenance mode | Active development (default since Yoga) | Legacy, minimal new features |
| Stability | Very mature | Mature (production since Train) | Very mature |
| Debugging tools | ovs-vsctl, ovs-ofctl, ovs-appctl | ovn-nbctl, ovn-sbctl, ovs-vsctl | brctl, ip, iptables |
Recommendation by Use Case
Development and Learning
Use ML2/Linux Bridge. Simplest to understand, no OVS daemon required, easy to trace with standard Linux tools. Not suitable for production.
Small to Medium Production Cloud (< 50 compute nodes)
Use ML2/OVN. Default since Yoga (2022.1). Distributed routing and DHCP are built in — no need to scale out L3 and DHCP agents. Fewer moving parts than OVS with DVR.
Large Production Cloud (> 50 compute nodes)
Use ML2/OVN. OVN scales better than OVS+DVR because the control plane (ovn-northd) is centralized but the data plane is fully distributed. The OVN SB (Southbound) database synchronizes per-chassis state efficiently.
Existing OVS Deployment
Stay on ML2/OVS unless you have a clear migration window. OVS is in maintenance mode but fully functional. Plan migration to OVN on the next major upgrade.
DPDK Workloads (NFV, high throughput)
Use ML2/OVN with OVN-DPDK for new deployments. OVS-DPDK is also supported but OVN is the strategic direction. DPDK requires dedicated CPU cores (PMD threads) and huge pages.
Hardware Offload (SmartNIC)
Use ML2/OVN with OVN hardware offload. Better integration with NVIDIA/Mellanox BlueField and similar NICs.
Migration: OVS to OVN
Migrating an existing ML2/OVS cloud to ML2/OVN requires a maintenance window. There is no hot migration path.
Pre-migration Checks
# Verify OVN packages are available
apt-cache show ovn-central ovn-host 2>/dev/null || dnf info ovn 2>/dev/null
# Check current ML2 config
grep "mechanism_drivers\|type_drivers" /etc/neutron/plugins/ml2/ml2_conf.ini
# List all agents that will be replaced
openstack network agent list --agent-type "Open vSwitch agent"
openstack network agent list --agent-type "L3 agent"
openstack network agent list --agent-type "DHCP agent"
Migration Steps (Outline)
- Deploy OVN (ovn-central on network/controller nodes, ovn-host on all nodes).
- Run the Neutron OVN migration script to translate existing Neutron state to OVN NB/SB databases:
neutron-ovn-migration-mtu. - Update
mechanism_drivers = ovninml2_conf.ini. - Restart neutron-server.
- Remove OVS agents and L3/DHCP agents from each compute node.
- Start
ovn-controlleron each compute node. - Verify port bindings:
openstack port list | grep binding_failed. - Validate connectivity from instances.
Refer to the official Neutron OVN migration documentation for the full procedure for your release.
Post-migration Verification
# All ports should be bound
openstack port list -f json | jq '[.[] | select(."Binding VIF Type" == "binding_failed")] | length'
# Should return 0
# OVN controller status on each compute node
sudo ovn-appctl -t ovn-controller connection-status
# Check logical flows
sudo ovn-sbctl lflow-list | wc -l
# Verify no legacy agents remain
openstack network agent list --agent-type "Open vSwitch agent"
openstack network agent list --agent-type "DHCP agent"
openstack network agent list --agent-type "L3 agent"
Configuration Quick Reference
ML2/OVN (new deployment)
# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
mechanism_drivers = ovn
type_drivers = local,flat,vlan,geneve
tenant_network_types = geneve
[ml2_type_geneve]
vni_ranges = 1:65536
max_header_size = 38
[ovn]
ovn_nb_connection = tcp:127.0.0.1:6641
ovn_sb_connection = tcp:127.0.0.1:6642
ovn_l3_scheduler = leastloaded
ML2/OVS (existing deployment)
# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
mechanism_drivers = openvswitch
type_drivers = local,flat,vlan,vxlan,gre
tenant_network_types = vxlan
[ml2_type_vxlan]
vni_ranges = 1:1000
[ovs]
bridge_mappings = provider:br-ex
local_ip = <TUNNEL_ENDPOINT_IP>
[securitygroup]
firewall_driver = openvswitch
ML2/Linux Bridge
# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
mechanism_drivers = linuxbridge
type_drivers = local,flat,vlan,vxlan
tenant_network_types = vxlan
[ml2_type_vxlan]
vni_ranges = 1:1000
[linux_bridge]
physical_interface_mappings = provider:eth1
[securitygroup]
firewall_driver = iptables