1. 24 4月, 2017 1 次提交
    • R
      util: relax virNetDevSetCoalesce() stub · 5e010605
      Roman Bogorodskiy 提交于
      Currently, virNetDevSetCoalesce() stub is always returning error. As
      it's used by virNetDevTapCreateInBridgePort(), it essentially breaks
      bridged networking if coalesce is not supported.
      
      To make it work, relax the stub to trigger error only when its
      coalesce argument is not NULL, otherwise report success.
      5e010605
  2. 21 4月, 2017 3 次提交
    • L
      util: allow ignoring SIOCSIFHWADDR when errno is EPERM · 997134fb
      Laine Stump 提交于
      Commit f4ef3a71 made a variation of virNetDevSetMAC that would return
      without logging an error message if errno was set to
      EADDRNOTAVAIL. This errno is set by some SRIOV VF drivers (in
      particular igbvf) when they fail to set the device's MAC address due
      to the PF driver refusing the request. This is useful if we want to
      try a different method of setting the VF MAC address before giving up
      (Commit 86556e16 actually does this, setting the desired MAC address
      to the "admin MAC in the PF, then detaching and reattaching the VF
      netdev driver to force a reinit of the MAC address).
      
      During testing of Bug 1442040 t was discovered that the ixgbe driver
      returns EPERM in this situation, so this patch changes the exception
      case for silent+non-terminal failure to account for this difference.
      
      Completes resolution to: https://bugzilla.redhat.com/1415609 (RHEL 7.4)
                               https://bugzilla.redhat.com/1442040 (RHEL 7.3.z)
      997134fb
    • D
      util: fix virNetDevSetCoalesce fallback on Win32/FreeBSD · e6625ed4
      Daniel P. Berrange 提交于
      The current fallback stub for virNetDevSetCoalesce is inside an
      earlier conditional block. This deals with the feature being
      missing on older Linux platforms. We need a second fallback stub
      though, outside the top level conditional, to ensure builds work
      on Win32/FreeBSD platforms too.
      Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
      e6625ed4
    • M
      util: Add virNetDevSetCoalesce function · 652ef9bc
      Martin Kletzander 提交于
      That function is able to configure coalesce settings for an interface,
      similarly to 'ethtool -C'.  This function also updates back the
      structure so that it contains actual data on the device (if the device
      doesn't support some settings kernel might just return 0 and not set
      whatever is not supported), so this way we'll have up-to-date
      information in the live domain XML.
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      652ef9bc
  3. 28 3月, 2017 3 次提交
  4. 27 3月, 2017 5 次提交
    • L
      util: log all setting of MAC addresses and vlan tags · 6ec36b06
      Laine Stump 提交于
      Having this information available will make it easier to determine the
      culprit when MAC or vlan tag appear to not be set, eg.:
      
        https://bugzilla.redhat.com/1364073
      
      (This patch doesn't fix that bug, just makes it easier to diagnose)
      6ec36b06
    • L
      util: try *really* hard to set the MAC address of an SRIOV VF · 86556e16
      Laine Stump 提交于
      If an SRIOV VF has previously been used for VFIO device assignment,
      the "admin MAC" that is stored in the PF driver's table of VF info
      will have been set to the MAC address that the virtual machine wanted
      the device to have. Setting the admin MAC for a VF also sets a flag in
      the PF that is loosely called the "administratively set" flag. Once
      that flag is set, it is no longer possible for the net driver of the
      VF (either on the host or in a virtual machine) to directly set the
      VF's MAC again; this flag isn't reset until the *PF* driver is
      restarted, and that requires taking *all* VFs offline, so it's not
      really feasible to do.
      
      If the same SRIOV VF is later used for macvtap passthrough mode, the
      VF's MAC address must be set, but normally we don't unbind the VF from
      its host net driver (since we actually need the host net driver in
      this case). Since setting the VF MAC directly will fail, in the past
      "we" ("I") had tried to fix the problem by simply setting the admin MAC
      (via the PF) instead. This *appeared* to work (and might have at one
      time, due to promiscuous mode being turned on somewhere or something),
      but it currently creates a non-working interface because only the
      value for admin MAC is set to the desired value, *not* the actual MAC
      that the VF is using.
      
      Earlier patches in this series reverted that behavior, so that we once
      again set the MAC of the VF itself for macvtap passthrough operation,
      not the admin MAC. But that brings back the original bug - if the
      interface has been used for VFIO device assignment, you can no longer
      use it for macvtap passthrough.
      
      This patch solves that problem by noticing when virNetDevSetMAC()
      fails for a VF, and in that case it sets the desired MAC to the admin
      MAC via the PF, then "bounces" the VF driver (by unbinding and the
      immediately rebinding it to the VF). This causes the VF's MAC to be
      reinitialized from the admin MAC, and everybody is happy (until the
      *next* time someone wants to set the VF's MAC address, since the
      "administratively set" bit is still turned on).
      86556e16
    • L
      util: if setting admin MAC to 00:00:00:00:00:00 fails, try 02:00:00:00:00:00 · d5f4abef
      Laine Stump 提交于
      Some PF drivers allow setting the admin MAC (that is the MAC address
      that the VF will be initialized to the next time the VF's driver is
      loaded) to 00:00:00:00:00:00, and some don't. Multiple drivers
      initialize the admin MACs to all 0, but don't allow setting it to that
      very same value. It has been an uphill battle convincing the driver
      people that it's reasonable to expect The argument that's used is
      that an all 0 device MAC address on a device is invalid; however, from
      an outsider's point of view, when the admin MAC is set to 0 at the
      time the VF driver is loaded, the VF's MAC is *not* set to 0, but to a
      random non-0 value. But that's beside the point - even if I could
      convince one or two SRIOV driver maintainers to permit setting the
      admin MAC to 0, there are still several other drivers.
      
      So rather than fighting that losing battle, this patch checks for a
      failure to set the admin MAC due to an all 0 value, and retries it
      with 02:00:00:00:00:00. That won't result in a random value being set
      in the VF MAC at next VF driver init, but that's okay, because we
      always want to set a specific value anyway. Rather, the "almost 0"
      setting makes it easy to visually detect from the output of "ip link
      show" which VFs are currently in use and which are free.
      d5f4abef
    • L
      util: remove unused functions from virnetdev.c · bc4168f3
      Laine Stump 提交于
      The global functions virNetDevReplaceMacAddress(),
      virNetDevReplaceNetConfig(), virNetDevRestoreMacAddress(), and
      virNetDevRestoreNetConfig() are no longer used, as their functionality
      has been replaced by virNetDev(Save|Read|Set)NetConfig().
      
      The static functions virNetDevReplaceVfConfig() and
      virNetDevRestoreVfConfig() were only used by the above-named global
      functions that were removed.
      bc4168f3
    • L
      util: new functions virNetDev(Save|Read|Set)NetConfig() · 26694daf
      Laine Stump 提交于
      These three functions are destined to replace
      virNetDev(Replace|Restore)NetConfig() and
      virNetDev(Replace|Restore)MacAddress(), which both do the save and set
      together as a single step. We need to separate the save, read, and set
      steps because there will be situations where we need to do something
      else in between (in particular, we will need to rebind a VF's driver
      after save but before set).
      
      This patch creates the new functions, but doesn't call them - that
      will come in a subsequent patch. Note that the new functions to
      read/write the file that stores the original network config now uses
      JSON rather than plaintext (it still recognizes the old format as well
      though, so it won't get confused during an upgrade).
      26694daf
  5. 25 3月, 2017 1 次提交
    • R
      util: fix build on non-Linux · a7496ad2
      Roman Bogorodskiy 提交于
      Fix typo in virNetDevPFGetVF() stub:
      
        ATTRUBUTE_UNUSED -> ATTRIBUTE_UNUSED.
      
      While here, use common indent style for arguments in
      virNetDevGetVirtualFunctionIndex() stub.
      a7496ad2
  6. 24 3月, 2017 5 次提交
    • L
      util: new function virNetDevPFGetVF() · 554253ad
      Laine Stump 提交于
      Given an SRIOV PF netdev name (e.g. "enp2s0f0") and VF#, this new
      function returns the netdev name of the referenced VF device
      (e.g. "enp2s11f6"), or NULL if the device isn't bound to a net driver.
      554253ad
    • L
      util: new internal function to permit silent failure of virNetDevSetMAC() · f4ef3a71
      Laine Stump 提交于
      We will want to allow silent failure of virNetDevSetMAC() in the case
      that the SIOSIFHWADDR ioctl fails with errno == EADDRNOTAVAIL. (Yes,
      that is very specific, but we really *do* want a logged failure in all
      other circumstances, and don't want to duplicate code in the caller
      for the other possibilities).
      
      This patch renames the 3 different virNetDevSetMAC() functions to
      virNetDevSetMACInternal(), adding a 3rd arg called "quiet" and making
      them static (because this extra control will only be needed within
      virnetdev.c). A new global virNetDevSetMAC() is defined that calls
      whichever of the three *Internal() functions gets compiled with quiet
      = false. Callers in virnetdev.c that want to notice a failure with
      errno == EADDRNOTAVAIL and retry with a different strategy rather than
      immediately failing, can call virNetDevSetMACInternal(..., true).
      f4ef3a71
    • L
      util: change virPCIGetNetName() to not return error if device has no net name · d6ee56d7
      Laine Stump 提交于
      ...and cleanup the callers to report it when it *is* an error.
      
      In many cases It's useful for virPCIGetNetName() to not log an error
      and simply return a NULL pointer when the given device isn't bound to
      a net driver (e.g. we're looking at a VF that is permanently bound to
      vfio-pci). The existing code would silently return an error in this
      case, which could eventually lead to the dreaded "An error occurred
      but the cause is unknown" log message.
      
      This patch changes virPCIGetNetName() to still return success if the
      device simply isn't bound to a net driver, and adjusts all the callers
      that require a non-null netname to check for that condition and log an
      error when it happens.
      d6ee56d7
    • L
      util: remove unused args from virNetDevSetVfConfig() · 0a583c26
      Laine Stump 提交于
      This function is only called in two places, and the ifindex,
      nltarget_kernel, and getPidFunc args are never used (and never will
      be).
      
      ifindex - we always know the name of the device, and never know the
      ifindex - if we really did need the ifindex we would have to get it
      from the name using virNetDevGetIndex(). In practice, we just send -1
      to virNetDevSetVfConfig(), which doesn't bother to learn the real
      ifindex (you only need a name *or* an ifindex for the netlink command
      to succeed, not both).
      
      nltarget_kernel - messages to set the config of an SRIOV VF will
      always go to netlink in the kernel, not to another user process, so
      this arg is always true (there are other uses of netlink messages
      where the message might need to go to another user process, but never
      in the case of RTM_SETLINK for SRIOV).
      
      getPidFunc - this arg is only used if nltarget_kernel is false, and it
      never is.
      
      None of this has any functional effect, it just makes it easier to
      follow what's happening when virNetDevSetVfConfig() is called.
      0a583c26
    • L
      util: permit querying a VF MAC address or VLAN tag by itself · 176229dd
      Laine Stump 提交于
      virNetDevParseVfConfig() assumed that both the MAC address and VLAN
      tag pointers were valid, so even if you only wanted one or the other,
      you would need a variable to hold the returned value for both. This
      patch checks each for a NULL pointer before filling it in.
      176229dd
  7. 23 3月, 2017 4 次提交
    • R
      util: fix build on non-Linux · 80958284
      Roman Bogorodskiy 提交于
      Decorate unused arguments of the virNetDevGetMaster() stub
      with ATTRIBUTE_UNUSED to fix build on systems where this
      stub is used.
      80958284
    • L
      util: new function virNetDevGetMaster() · e75f5bfb
      Laine Stump 提交于
      This function provides the bridge/bond device that the given network
      device is attached to. The return value is 0 or -1, and the master
      device is a char** argument to the function - this is needed in order
      to allow for a "success" return from a device that has no master.
      e75f5bfb
    • L
      util: allow retrieving ethtool features when unprivileged · 549fe5a8
      Laine Stump 提交于
      The only reason that the ethtool features weren't being retrieved in
      an unprivileged libvirtd was because they required ioctl(), and the
      ioctl was using an AF_PACKET socket, which requires root. Now that we
      are using AF_UNIX for ioctl(), this restriction can be removed.
      549fe5a8
    • L
      util: use AF_UNIX family (not AF_PACKET) for ioctl sockets · 1c9a8746
      Laine Stump 提交于
      The exact family of the socket created for the fd used by ioctl(7)
      doesn't matter, it just needs to be a socket and not a file. But for
      some reason when macvtap support was added, it used
      AF_PACKET/SOCK_DGRAM sockets for its ioctls; we later used the same
      AF_PACKET/SOCK_DGRAM socket for new ioctls we added, and eventually
      modified the other pre-existing ioctl sockets (for creating/deleting
      bridges) to also use AF_PACKET/SOCK_DGRAM (that code originally used
      AF_UNIX/SOCK_STREAM).
      
      The problem with using AF_PACKET (intended for sending/receiving "raw"
      packets, i.e. packets that can be some protocol other than TCP or UDP)
      is that it requires root privileges. This meant that none of the
      ioctls in virnetdev.c or virnetdevip.c would work when running
      libvirtd unprivileged.
      
      This packet solves that problem by changing the family to AF_UNIX when
      creating the socket used for any ioctl().
      1c9a8746
  8. 22 3月, 2017 1 次提交
  9. 17 2月, 2017 1 次提交
    • M
      qemu: Allow empty script path to <interface/> · 1d9ab0f0
      Michal Privoznik 提交于
      Before 9c17d665 (v1.3.2 - I know, right?) it was possible to
      have the following interface configuration:
      
        <interface type='ethernet'/>
          <script path=''/>
        </interface>
      
      This resulted in -netdev tap,script=,.. Fortunately, qemu helped
      us to get away with this as it just ignored the empty script
      path. However, after the commit mentioned above it's libvirtd
      who is executing the script. Unfortunately without special
      case-ing empty script path.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      1d9ab0f0
  10. 27 6月, 2016 3 次提交
    • L
      util: new files virnetdevip.[ch] for IP-related netdev functions · cf0568b0
      Laine Stump 提交于
      This patch splits virnetdev.[ch] into multiple files, with the new
      virnetdevip.[ch] containing all the functions related to setting and
      retrieving IP-related info for a device (both addresses and routes).
      cf0568b0
    • L
      util: move virInterface(State|Link)/virNetDevFeature from conf to util · 638c6e5b
      Laine Stump 提交于
      These had been declared in conf/device_conf.h, but then used in
      util/virnetdev.c, meaning that we had to #include conf/device_conf.h
      in virnetdev.c (which we have for a long time said shouldn't be done.
      
      This caused a bigger problem when I tried to #include util/virnetdev.h
      in a file in src/conf (which is allowed) - for some reason the
      "device_conf.h: File not found" error.
      
      The solution is to move the data types and functions used in util
      sources from conf to util. Some names were adjusted during the move
      ("virInterface" --> "virNetDevIf", and "VIR_INTERFACE" -->
      "VIR_NETDEV_IF")
      638c6e5b
    • L
      util: move virNetDevLinkDump to virnetlink.c · 943a400c
      Laine Stump 提交于
      virNetDevLinkDump should have been in virnetlink.c, but that file
      didn't exist yet when the function was created. It didn't really
      matter until now - I found that having virnetlink.h included by
      virnetdev.h caused build problems when trying to #include virnetdev.h
      in a .c file in src/conf (due to missing directory in -I). Rather than
      fix that to further institutionalize the incorrect placement of this
      one function, this patch moves the function.
      943a400c
  11. 24 6月, 2016 3 次提交
    • J
      Use virDirOpen · e81de04c
      Ján Tomko 提交于
      Switch from opendir to virDirOpen everywhere we need to report an error.
      e81de04c
    • J
      Do not ignore hidden files in /sys and /proc · 70a033ab
      Ján Tomko 提交于
      The directories we iterate over are unlikely to contain any entries
      starting with a dot, other than '.' and '..' which is already skipped
      by virDirRead.
      70a033ab
    • J
      Introduce VIR_DIR_CLOSE · a4e6f1eb
      Ján Tomko 提交于
      Introduce a helper that only calls closedir if DIR* is non-NULL
      and sets it to NULL afterwards.
      a4e6f1eb
  12. 17 6月, 2016 1 次提交
    • L
      util: fix missing broadcast address in bridge and tap device IP addresses · bf913385
      Laine Stump 提交于
      Commit b3d06987 added peer address setting to the low level
      virNetDevSetIPAddress() function, but ended up causing a segfault in
      cases where the caller passed NULL for peer address.
      
      Commit a3510e33 fixed the segfault, but managed to cause us to
      skip setting the broadcast address when setting an interface's IP
      address. The result is that the broadcast address is 0.0.0.0 for all
      libvirt-created bridges (and interfaces in lxc containers with IP
      addresses set by libvirt).
      
      This was reported on the mailing list:
      
        https://www.redhat.com/archives/libvir-list/2016-June/msg00027.html
      
      but I was too busy to investigate at the time. I found it by accident
      today while refactoring virNetDevSetIPAddress(). Since this regression
      is present in the 1.3.5 release, I'm sending the bugfix as a separate
      patch from my larger refactoring patchset.
      bf913385
  13. 09 6月, 2016 1 次提交
  14. 07 6月, 2016 7 次提交
  15. 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