• L
    Give each virtual network bridge its own fixed MAC address · 5754dbd5
    Laine Stump 提交于
    This fixes https://bugzilla.redhat.com/show_bug.cgi?id=609463
    
    The problem was that, since a bridge always acquires the MAC address
    of the connected interface with the numerically lowest MAC, as guests
    are started and stopped, it was possible for the MAC address to change
    over time, and this change in the network was being detected by
    Windows 7 (it sees the MAC of the default route change), so on each
    reboot it would bring up a dialog box asking about this "new network".
    
    The solution is to create a dummy tap interface with a MAC guaranteed
    to be lower than any guest interface's MAC, and attach that tap to the
    bridge as soon as it's created. Since all guest MAC addresses start
    with 0xFE, we can just generate a MAC with the standard "0x52, 0x54,
    0" prefix, and it's guaranteed to always win (physical interfaces are
    never connected to these bridges, so we don't need to worry about
    competing numerically with them).
    
    Note that the dummy tap is never set to IFF_UP state - that's not
    necessary in order for the bridge to take its MAC, and not setting it
    to UP eliminates the clutter of having an (eg) "virbr0-nic" displayed
    in the output of the ifconfig command.
    
    I chose to not auto-generate the MAC address in the network XML
    parser, as there are likely to be consumers of that API that don't
    need or want to have a MAC address associated with the
    bridge.
    
    Instead, in bridge_driver.c when the network is being defined, if
    there is no MAC, one is generated. To account for virtual network
    configs that already exist when upgrading from an older version of
    libvirt, I've added a %post script to the specfile that searches for
    all network definitions in both the config directory
    (/etc/libvirt/qemu/networks) and the state directory
    (/var/lib/libvirt/network) that are missing a mac address, generates a
    random address, and adds it to the config (and a matching address to
    the state file, if there is one).
    
    docs/formatnetwork.html.in: document <mac address.../>
    docs/schemas/network.rng: add nac address to schema
    libvirt.spec.in: %post script to update existing networks
    src/conf/network_conf.[ch]: parse and format <mac address.../>
    src/libvirt_private.syms: export a couple private symbols we need
    src/network/bridge_driver.c:
        auto-generate mac address when needed,
        create dummy interface if mac address is present.
    tests/networkxml2xmlin/isolated-network.xml
    tests/networkxml2xmlin/routed-network.xml
    tests/networkxml2xmlout/isolated-network.xml
    tests/networkxml2xmlout/routed-network.xml: add mac address to some tests
    5754dbd5
network_conf.c 36.7 KB