1. 24 6月, 2016 3 次提交
  2. 01 6月, 2016 1 次提交
    • L
      network: restart dnsmasq after adding/removing txt and srv records · 93b59fcf
      Laine Stump 提交于
      Although dns host records are stored in a separate configuration file
      that is reread by dnsmasq when it receives a SIGHUP, the txt and srv
      records are directly in the dnsmasq .conf file which can't be reread
      after initial dnsmasq startup. This means that if an srv or txt record
      is modified in a network config, libvirt needs to restart the dnsmasq
      process rather than just sending a SIGHUP.
      
      This was pointed out in a question in
      https://bugzilla.redhat.com/show_bug.cgi?id=988718 , but no separate
      BZ was filed.
      93b59fcf
  3. 13 5月, 2016 1 次提交
  4. 11 5月, 2016 1 次提交
    • L
      util: set vlan tag for macvtap passthrough mode on SRIOV VFs · 75db9997
      Laine Stump 提交于
      SRIOV VFs used in macvtap passthrough mode can take advantage of the
      SRIOV card's transparent vlan tagging. All the code was there to set
      the vlan tag, and it has been used for SRIOV VFs used for hostdev
      interfaces for several years, but for some reason, the vlan tag for
      macvtap passthrough devices was stubbed out with a -1.
      
      This patch moves a bit of common validation down to a lower level
      (virNetDevReplaceNetConfig()) so it is shared by hostdev and macvtap
      modes, and updates the macvtap caller to actually send the vlan config
      instead of -1.
      75db9997
  5. 10 5月, 2016 1 次提交
  6. 02 5月, 2016 2 次提交
    • C
      network: Fix segfault on daemon reload · 26af7e4e
      Cole Robinson 提交于
      We will segfault of a daemon reload picks up a new network config
      that needs to be autostarted. We shouldn't be passing NULL for
      network_driver here. This seems like it was missed in the larger
      rework in commit 1009a61e
      26af7e4e
    • M
      Change virDevicePCIAddress to virPCIDeviceAddress · c36b1f7b
      Martin Kletzander 提交于
      We had both and the only difference was that the latter also included
      information about multifunction setting.  The problem with that was that
      we couldn't use functions made for only one of the structs (e.g.
      parsing).  To consolidate those two structs, use the one in virpci.h,
      include that in domain_conf.h and add the multifunction member in it.
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      c36b1f7b
  7. 22 4月, 2016 1 次提交
    • L
      network: fix DHCPv6 on networks with prefix != 64 · bf3d9f30
      Laine Stump 提交于
      According to the dnsmasq manpage, the netmask for IPv4 address ranges
      will be auto-deteremined from the interface dnsmasq is listening on,
      but it can't do this for IPv6 for some reason - it instead assumes a
      network prefix of 64 for all IPv6 address ranges. If this is
      incorrect, dnsmasq will refuse to give out an address to clients,
      instead logging this message:
      
       dnsmasq-dhcp[2380]: no address range available for DHCPv6 request via virbr0
      
      The solution is for libvirt to add ",$prefix" to all IPv6 dhcp-range
      arguments when building the dnsmasq.conf file.
      
      Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1033739
      bf3d9f30
  8. 08 4月, 2016 1 次提交
  9. 04 4月, 2016 1 次提交
    • L
      network: new function networkGetActualType · 3992ff14
      Laine Stump 提交于
      There are times when it's necessary to learn the actual type of a
      network connection before any resources have been allocated
      (e.g. during qemuProcessPrepareDomain()), but in the past it was
      necessary to call networkAllocateActualDevice() in order to have the
      actual type filled in.
      
      This new function returns the type of network that *will be* setup
      once it actually happens, but without making any changes on the host.
      3992ff14
  10. 26 3月, 2016 2 次提交
    • L
      network: call proper start/stop functions for macvtap bridge-mode networks · b41261f0
      Laine Stump 提交于
      networkStartNetwork() and networkShutdownNetwork() were calling the
      wrong type-specific function in the case of networks that were
      configured for macvtap ("direct") bridge mode - they were instead
      calling the functions for a tap+bridge network. Currently none of
      these functions does anything (they just return 0) so it hasn't
      created any problems, but that could change in the future.
      b41261f0
    • L
      network: differentiate macvtap/bridge from host-bridge based networks · 2a537fe1
      Laine Stump 提交于
      Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1316465
      
      An attempt to simplify the code for the VIR_NETWORK_FORWARD_BRIDGE
      case of networkUpdateState in commit b61db335 (first in release
      1.2.14) resulted in networks based on macvtap bridge mode being
      erroneously marked as inactive any time libvirtd was restarted.
      
      The problem is that the original code had differentiated between a
      network using tap devices to connect to an existing host-bridge device
      (forward mode of VIR_NETWORK_FORWARD_BRIDGE and a non-NULL
      def->bridge), and one using macvtap bridge mode to connect to any
      ethernet device (still forward mode VIR_NETWORK_FORWARD_BRIDGE, but
      null def->bridge), but the changed code assumed that all networks with
      VIR_NETWORK_FORWARD_BRIDGE were tap + host-bridge networks, so a null
      def->bridge was interpreted as "inactive".
      
      This patch restores the original code in networkUpdateState
      2a537fe1
  11. 18 3月, 2016 1 次提交
    • M
      Drop paths.h include · 865764de
      Michal Privoznik 提交于
      We include the file in plenty of places. This is mostly due to
      historical reasons. The only place that needs something from the
      header file is storage_backend_fs which opens _PATH_MOUNTED. But
      it gets the file included indirectly via mntent.h. At no other
      place in our code we need _PATH_.*. Drop the include and
      configure check then.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      865764de
  12. 07 3月, 2016 1 次提交
  13. 15 2月, 2016 2 次提交
    • L
      network: consolidated info log for all network allocate/free operations · eb72bd63
      Laine Stump 提交于
      There are three functions that deal with allocating and freeing
      devices from a networks netdev/pci device pool:
      network(Allocate|Notify|Release)ActualDevice(). These functions also
      maintain a counter of the number of domains currently using a network
      (regardless of whether or not that network uses a device pool). Each
      of these functions had multiple log messages (output using VIR_DEBUG)
      that were in slightly different formats and gave varying amounts of
      information.
      
      This patch creates a single function to log the pertinent information
      in a consistent manner for all three of these functions. Along with
      assuring that all the functions produce a consistent form of output
      (and making it simpler to change), it adds the MAC address of the
      domain interface involved in the operation, making it possible to
      verify which interface of which domain the operation is being done for
      (assuming that all MAC addresses are unique, of course).
      
      All of these messages are raised from DEBUG to INFO, since they don't
      happen that often (once per interface per domain/libvirtd start or
      domain stop), and can be very informative and helpful - eliminating
      the need to log debug level messages makes it much easier to sort
      these out.
      eb72bd63
    • L
      network: consolidate connection count updates for device pool · 3ea8b8b8
      Laine Stump 提交于
      networkReleaseActualDevice() and networkNotifyActualDevice() both were
      updating the individual devices' connections count in two separate
      places (unlike networkAllocateActualDevice() which does it in a single
      unified place after success:). The code is correct, but prone to
      confusion / later breakage. All of these updates are anyway located at
      the end of if/else clauses that are (with the exception of a single
      VIR_DEBUG() in each case) immediately followed by the success: label
      anyway, so this patch replaces the duplicated ++/-- instructions with
      a single ++/-- inside a qualifying "if (dev)" down below success:.
      (NB: if dev != NULL, by definition we are using a device (either pci
      or netdev, doesn't matter for these purposes) from the network's pool)
      
      The VIR_DEBUG args (which will be replaced in a followup patch anyway)
      were all adjusted to account for the connection count being out of
      date at the time.
      3ea8b8b8
  14. 04 2月, 2016 1 次提交
  15. 03 12月, 2015 1 次提交
  16. 25 11月, 2015 1 次提交
    • L
      nodedev: report maxCount for virtual_functions capability · f391889f
      Laine Stump 提交于
      A PCI device may have the capability to setup virtual functions (VFs)
      but have them currently all disabled. Prior to this patch, if that was
      the case the the node device XML for the device wouldn't report any
      virtual_functions capability.
      
      With this patch, if a file called "sriov_totalvfs" is found in the
      device's sysfs directory, its contents will be interpreted as a
      decimal number, and that value will be reported as "maxCount" in a
      capability element of the device's XML, e.g.:
      
         <capability type='virtual_functions' maxCount='7'/>
      
      This will be reported regardless of whether or not any VFs are
      currently enabled for the device.
      
      NB: sriov_numvfs (the number of VFs currently active) is also
      available in sysfs, but that value is implied by the number of items
      in the list that is inside the capability element, so there is no
      reason to explicitly provide it as an attribute.
      
      sriov_totalvfs and sriov_numvfs are available in kernels at least as far
      back as the 2.6.32 that is in RHEL6.7, but in the case that they
      simply aren't there, libvirt will behave as it did prior to this patch
      - no maxCount will be displayed, and the virtual_functions capability
      will be absent from the device's XML when 0 VFs are enabled.
      f391889f
  17. 29 10月, 2015 1 次提交
    • M
      network: wait for DAD to finish for bridge IPv6 addresses · 0f7436ca
      Maxim Perevedentsev 提交于
      commit db488c79 assumed that dnsmasq would complete IPv6 DAD before
      daemonizing, but in reality it doesn't wait, which creates problems
      when libvirt's bridge driver sets the matching "dummy tap device" to
      IFF_DOWN prior to DAD completing.
      
      This patch waits for DAD completion by periodically polling the kernel
      using netlink to check whether there are any IPv6 addresses assigned
      to bridge which have a 'tentative' state (if there are any in this
      state, then DAD hasn't yet finished). After DAD is finished, execution
      continues. To avoid an endless hang in case something was wrong with
      the kernel's DAD, we wait a maximum of 5 seconds.
      0f7436ca
  18. 09 10月, 2015 1 次提交
    • M
      virJSONValueArraySize: return ssize_t · 4f77c48c
      Michal Privoznik 提交于
      The internal representation of a JSON array counts the items in
      size_t. However, for some reason, when asking for the count it's
      reported as int. Firstly, we need the function to return a signed
      type as it's returning -1 on an error. But, not every system has
      integer the same size as size_t. Therefore, lets return ssize_t.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      4f77c48c
  19. 12 8月, 2015 2 次提交
  20. 11 8月, 2015 3 次提交
    • M
      bridge_driver: Introduce networkBandwidthUpdate · 812932be
      Michal Privoznik 提交于
      So, if a domain vNIC's bandwidth has been successfully set, it's
      possible that because @floor is set on network's bridge, this
      part may need updating too. And that's exactly what this function
      does. While the previous commit introduced a function to check if
      @floor can be satisfied, this does all the hard work. In general,
      there may be three, well four possibilities:
      
        1) No change in @floor value (either it remain unset, or its
        value hasn't changed)
      
        2) The @floor value has changed from a non-zero to a non-zero
        value
      
        3) New @floor is to be set
      
        4) Old @floor must be cleared out
      
      The difference between 2), 3) and 4) is, that while in 2) the QoS
      tree on the network's bridge already has a special class for the
      vNIC, in 3) the class must be created from scratch. In 4) it must
      be removed. Fortunately, we have helpers for all three
      interesting cases.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      812932be
    • M
      bridge_driver: Introduce networkBandwidthChangeAllowed · 41a1531d
      Michal Privoznik 提交于
      When a domain vNIC's bandwidth is to be changed (at runtime) it is
      possible that guaranteed minimal bandwidth (@floor) will change too.
      Well, so far it is, because we still don't have an implementation that
      allows setting it dynamically, so it's effectively erased on:
      
          #virsh domiftune $dom vnet0 --inbound 0
      
      However, that's slightly unfortunate. We do some checks on domain
      startup to see if @floor can be guaranteed. We ought do the same if
      QoS is changed at runtime.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      41a1531d
    • M
      virNetDevBandwidthUpdateRate: turn class_id into integer · 45090449
      Michal Privoznik 提交于
      This is no functional change. It's just that later in the series we
      will need to pass class_id as an integer.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      45090449
  21. 04 6月, 2015 1 次提交
  22. 03 6月, 2015 3 次提交
  23. 24 5月, 2015 1 次提交
    • J
      network: Resolve Coverity FORWARD_NULL · 38f0fc19
      John Ferlan 提交于
      To silence Coverity just add a 'p &&' in front of the check in
      networkFindUnusedBridgeName after the strchr() call.  Even though
      we know it's not possible to have strchr return NULL since the only
      way into the function is if there is a '%' in def->bridge or it's NULL.
      Signed-off-by: NJohn Ferlan <jferlan@redhat.com>
      38f0fc19
  24. 11 5月, 2015 1 次提交
    • J
      Ignore bridge template names with multiple printf conversions · 076dd379
      Ján Tomko 提交于
      For some reason, we allow a bridge name with %d in it, which we replace
      with an unsigned integer to form a bridge name that does not yet exist
      on the host.
      
      Do not blindly pass it to virAsprintf if it's not the only conversion,
      to prevent crashing on input like:
      
      <network>
        <name>test</name>
        <forward mode='none'/>
        <bridge name='virbr%d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s'/>
      </network>
      
      Ignore any template strings that do not have exactly one %d conversion,
      like we do in various drivers before calling virNetDevTapCreateInBridgePort.
      076dd379
  25. 28 4月, 2015 2 次提交
    • L
      network: check for bridge name conflict with existing devices · 37b8bc6f
      Laine Stump 提交于
      Since some people use the same naming convention as libvirt for bridge
      devices they create outside the context of libvirt, it is much nicer
      if we check for those devices when looking for a bridge device name to
      auto-assign to a new network.
      37b8bc6f
    • L
      network: move auto-assign of bridge name from XML parser to net driver · a28d3e48
      Laine Stump 提交于
      We already check that any auto-assigned bridge device name for a
      virtual network (e.g. "virbr1") doesn't conflict with the bridge name
      for any existing libvirt network (via virNetworkSetBridgeName() in
      conf/network_conf.c).
      
      We also want to check that the name doesn't conflict with any bridge
      device created on the host system outside the control of libvirt
      (history: possibly due to the ploriferation of references to libvirt's
      bridge devices in HOWTO documents all around the web, it is not
      uncommon for an admin to manually create a bridge in their host's
      system network config and name it "virbrX"). To add such a check to
      virNetworkBridgeInUse() (which is called by virNetworkSetBridgeName())
      we would have to call virNetDevExists() (from util/virnetdev.c); this
      function calls ioctl(SIOCGIFFLAGS), which everyone on the mailing list
      agreed should not be done from an XML parsing function in the conf
      directory.
      
      To remedy that problem, this patch removes virNetworkSetBridgeName()
      from conf/network_conf.c and puts an identically functioning
      networkBridgeNameValidate() in network/bridge_driver.c (because it's
      reasonable for the bridge driver to call virNetDevExists(), although
      we don't do that yet because I wanted this patch to have as close to 0
      effect on function as possible).
      
      There are a couple of inevitable changes though:
      
      1) We no longer check the bridge name during
         virNetworkLoadConfig(). Close examination of the code shows that
         this wasn't necessary anyway - the only *correct* way to get XML
         into the config files is via networkDefine(), and networkDefine()
         will always call networkValidate(), which previously called
         virNetworkSetBridgeName() (and now calls
         networkBridgeNameValidate()). This means that the only way the
         bridge name can be unset during virNetworkLoadConfig() is if
         someone edited the config file on disk by hand (which we explicitly
         prohibit).
      
      2) Just on the off chance that somebody *has* edited the file by hand,
         rather than crashing when they try to start their malformed
         network, a check for non-NULL bridge name has been added to
         networkStartNetworkVirtual().
      
         (For those wondering why I don't instead call
         networkValidateBridgeName() there to set a bridge name if one
         wasn't present - the problem is that during
         networkStartNetworkVirtual(), the lock for the network being
         started has already been acquired, but the lock for the network
         list itself *has not* (because we aren't adding/removing a
         network). But virNetworkBridgeInuse() iterates through *all*
         networks (including this one) and locks each network as it is
         checked for a duplicate entry; it is necessary to lock each network
         even before checking if it is the designated "skip" network because
         otherwise some other thread might acquire the list lock and delete
         the very entry we're examining. In the end, permitting a setting of
         the bridge name during network start would require that we lock the
         entire network list during any networkStartNetwork(), which
         eliminates a *lot* of parallelism that we've worked so hard to
         achieve (it can make a huge difference during libvirtd startup). So
         rather than try to adjust for someone playing against the rules, I
         choose to instead give them the error they deserve.)
      
      3) virNetworkAllocateBridge() (now removed) would leak any "template"
         string set as the bridge name. Its replacement
         networkFindUnusedBridgeName() doesn't leak the template string - it
         is properly freed.
      a28d3e48
  26. 10 4月, 2015 2 次提交
  27. 23 3月, 2015 2 次提交
    • M
      network_conf: Drop virNetworkObjIsDuplicate · d9706aea
      Michal Privoznik 提交于
      This function does not make any sense now, that network driver is
      (almost) dropped. I mean, previously, when threads were
      serialized, this function was there to check, if no other network
      with the same name or UUID exists. However, nowadays that threads
      can run more in parallel, this function is useless, in fact it
      gives misleading return values. Consider the following scenario.
      Two threads, both trying to define networks with same name but
      different UUID (e.g. because it was generated during XML parsing
      phase, whatever). Lets assume that both threads are about to call
      networkValidate() which immediately calls
      virNetworkObjIsDuplicate().
      
      T1: calls virNetworkObjIsDuplicate() and since no network with
      given name or UUID exist, success is returned.
      T2: calls virNetworkObjIsDuplicate() and since no network with
      given name or UUID exist, success is returned.
      
      T1: calls virNetworkAssignDef() and successfully places its
      network into the virNetworkObjList.
      T2: calls virNetworkAssignDef() and since network with the same
      name exists, the network definition is replaced.
      
      Okay, this is mainly because virNetworkAssignDef() does not check
      whether name and UUID matches. Well, lets make it so! And drop
      useless function too.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      d9706aea
    • M
      networkStateInitialize: Don't lock network driver · dd7bfb2c
      Michal Privoznik 提交于
      There's no need to lock the network driver, as network driver
      initialization is done prior accepting any client. There's nobody
      to hop in and do something over partially initialized driver. Nor
      qemu driver is doing that.
      
      ==30532== Observed (incorrect) order is: acquisition of lock at 0x1439EF50
      ==30532==    at 0x4C31A26: pthread_mutex_lock (in /usr/lib64/valgrind/vgpreload_helgrind-amd64-linux.so)
      ==30532==    by 0x5324895: virMutexLock (virthread.c:88)
      ==30532==    by 0x5307E86: virObjectLock (virobject.c:323)
      ==30532==    by 0x5396440: virNetworkObjListForEach (network_conf.c:4511)
      ==30532==    by 0x19B29308: networkStateInitialize (bridge_driver.c:686)
      ==30532==    by 0x53E1CCC: virStateInitialize (libvirt.c:777)
      ==30532==    by 0x11DEB7: daemonRunStateInit (libvirtd.c:906)
      ==30532==    by 0x5324B6A: virThreadHelper (virthread.c:197)
      ==30532==    by 0x4C30456: ??? (in /usr/lib64/valgrind/vgpreload_helgrind-amd64-linux.so)
      ==30532==    by 0xA1EC1F2: start_thread (in /lib64/libpthread-2.19.so)
      ==30532==    by 0xA4EDC8C: clone (in /lib64/libc-2.19.so)
      ==30532==
      ==30532==  followed by a later acquisition of lock at 0x1439CD60
      ==30532==    at 0x4C31A26: pthread_mutex_lock (in /usr/lib64/valgrind/vgpreload_helgrind-amd64-linux.so)
      ==30532==    by 0x5324895: virMutexLock (virthread.c:88)
      ==30532==    by 0x19B27B2C: networkDriverLock (bridge_driver.c:102)
      ==30532==    by 0x19B27B60: networkGetDnsmasqCaps (bridge_driver.c:113)
      ==30532==    by 0x19B2856A: networkUpdateState (bridge_driver.c:389)
      ==30532==    by 0x53963E9: virNetworkObjListForEachHelper (network_conf.c:4488)
      ==30532==    by 0x52E2224: virHashForEach (virhash.c:521)
      ==30532==    by 0x539645B: virNetworkObjListForEach (network_conf.c:4512)
      ==30532==    by 0x19B29308: networkStateInitialize (bridge_driver.c:686)
      ==30532==    by 0x53E1CCC: virStateInitialize (libvirt.c:777)
      ==30532==    by 0x11DEB7: daemonRunStateInit (libvirtd.c:906)
      ==30532==    by 0x5324B6A: virThreadHelper (virthread.c:197)
      ==30532==
      ==30532== Required order was established by acquisition of lock at 0x1439CD60
      ==30532==    at 0x4C31A26: pthread_mutex_lock (in /usr/lib64/valgrind/vgpreload_helgrind-amd64-linux.so)
      ==30532==    by 0x5324895: virMutexLock (virthread.c:88)
      ==30532==    by 0x19B27B2C: networkDriverLock (bridge_driver.c:102)
      ==30532==    by 0x19B28DF9: networkStateInitialize (bridge_driver.c:609)
      ==30532==    by 0x53E1CCC: virStateInitialize (libvirt.c:777)
      ==30532==    by 0x11DEB7: daemonRunStateInit (libvirtd.c:906)
      ==30532==    by 0x5324B6A: virThreadHelper (virthread.c:197)
      ==30532==    by 0x4C30456: ??? (in /usr/lib64/valgrind/vgpreload_helgrind-amd64-linux.so)
      ==30532==    by 0xA1EC1F2: start_thread (in /lib64/libpthread-2.19.so)
      ==30532==    by 0xA4EDC8C: clone (in /lib64/libc-2.19.so)
      ==30532==
      ==30532==  followed by a later acquisition of lock at 0x1439EF50
      ==30532==    at 0x4C31A26: pthread_mutex_lock (in /usr/lib64/valgrind/vgpreload_helgrind-amd64-linux.so)
      ==30532==    by 0x5324895: virMutexLock (virthread.c:88)
      ==30532==    by 0x5307E86: virObjectLock (virobject.c:323)
      ==30532==    by 0x538A09C: virNetworkAssignDef (network_conf.c:527)
      ==30532==    by 0x5391EB2: virNetworkLoadState (network_conf.c:3008)
      ==30532==    by 0x53922D4: virNetworkLoadAllState (network_conf.c:3128)
      ==30532==    by 0x19B2929A: networkStateInitialize (bridge_driver.c:671)
      ==30532==    by 0x53E1CCC: virStateInitialize (libvirt.c:777)
      ==30532==    by 0x11DEB7: daemonRunStateInit (libvirtd.c:906)
      ==30532==    by 0x5324B6A: virThreadHelper (virthread.c:197)
      ==30532==    by 0x4C30456: ??? (in /usr/lib64/valgrind/vgpreload_helgrind-amd64-linux.so)
      ==30532==    by 0xA1EC1F2: start_thread (in /lib64/libpthread-2.19.so)
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      dd7bfb2c