• S
    add 802.1Qbh and 802.1Qbg handling · ca3b22bb
    Stefan Berger 提交于
    This patch that adds support for configuring 802.1Qbg and 802.1Qbh
    switches. The 802.1Qbh part has been successfully tested with real
    hardware. The 802.1Qbg part has only been tested with a (dummy)
    server that 'behaves' similarly to how we expect lldpad to 'behave'.
    
    The following changes were made during the development of this patch:
    
     - Merging Scott's v13-pre1 patch
     - Fixing endptr related bug while using virStrToLong_ui() pointed out
       by Jim Meyering
     - Addressing Jim Meyering's comments to v11
     - requiring mac address to the vpDisassociateProfileId() function to
       pass it further to the 802.1Qbg disassociate part (802.1Qbh untouched)
     - determining pid of lldpad daemon by reading it from /var/run/libvirt.pid
       (hardcode as is hardcode alson in lldpad sources)
     - merging netlink send code for kernel target and user space target
       (lldpad) using one function nlComm() to send the messages
     - adding a select() after the sending and before the reading of the
       netlink response in case lldpad doesn't respond and so we don't hang
     - when reading the port status, in case of 802.1Qbg, no status may be
       received while things are 'in progress' and only at the end a status
       will be there.
     - when reading the port status, use the given instanceId and vf to pick
       the right IFLA_VF_PORT among those nested under IFLA_VF_PORTS.
     - never sending nor parsing IFLA_PORT_SELF type of messages in the
       802.1Qbg case
     - iterating over the elements in a IFLA_VF_PORTS to pick the right
       IFLA_VF_PORT by either IFLA_PORT_PROFILE and given profileId
       (802.1Qbh) or IFLA_PORT_INSTANCE_UUID and given instanceId (802.1Qbg)
       and reading the current status in IFLA_PORT_RESPONSE.
     - recycling a previous patch that adds functionality to interface.c to
       - get the vlan identifier on an interface
       - get the flags of an interface and some convenience function to
         check whether an interface is 'up' or not (not currently used here)
     - adding function to determine the root physical interface of an
       interface. For example if a macvtap is linked to eth0.100, it will
       find eth0. Also adding a function that finds the vlan on the 'way to
       the root physical interface'
     - conveying the root physical interface name and index in case of 802.1Qbg
     - conveying mac address of macvlan device and vlan identifier in
       IFLA_VFINFO_LIST[ IFLA_VF_INFO[ IFLA_VF_MAC(mac), IFLA_VF_VLAN(vlan) ] ]
       to (future) lldpad via netlink
      - To enable build with --without-macvtap rename the
        [dis|]associatePortProfileId functions, prepend 'vp' before their
        name and make them non-static functions.
      - Renaming variable multicast to nltarget_kernel and inverting
        the logic
      - Addressing Jim Meyering's comments; this also touches existing
        code for example for correcting indentation of break statements or
        simplification of switch statements.
      - Renamed occurrencvirVirtualPortProfileDef to virVirtualPortProfileParamses
      - 802.1Qbg part prepared for sending a RTM_SETLINK and getting
        processing status back plus a subsequent RTM_GETLINK to
        get IFLA_PORT_RESPONSE.
        Note: This interface for 802.1Qbg may still change
      - [David Allan] move getPhysfn inside IFLA_VF_PORT_MAX to avoid
    compiler
        warning when latest if_link.h isn't available
      - move from Stefan's 802.1Qb{g|h} XML v8 to v9
      - move hostuuid and vf index calcs to inside doPortProfileOp8021Qbh
      - remove debug fprintfs
      - use virGetHostUUID (thanks Stefan!)
      - fix compile issue when latest if_link.h isn't available
      - change poll timeout to 10s, at 1/8 intervals
         - if polling times out, log msg and return -ETIMEDOUT
      - Add Stefan's code for getPortProfileStatus
      - Poll for up to 2 secs for port-profile status, at 1/8 sec intervals:
         - if status indicates error, abort openMacvtapTap
         - if status indicates success, exit polling
         - if status is "in-progress" after 2 secs of polling, exit
           polling loop silently, without error
    
    My patch finishes out the 802.1Qbh parts, which Stefan had mostly complete.
    I've tested using the recent kernel updates for VF_PORT netlink msgs and
    enic for Cisco's 10G Ethernet NIC.  I tested many VMs, each with several
    direct interfaces, each configured with a port-profile per the XML.  VM-to-VM,
    and VM-to-external work as expected.  VM-to-VM on same host (using same NIC)
    works same as VM-to-VM where VMs are on diff hosts.  I'm able to change
    settings on the port-profile while the VM is running to change the virtual
    port behaviour.  For example, adjusting a QoS setting like rate limit.  All
    VMs with interfaces using that port-profile immediatly see the effect of the
    change to the port-profile.
    
    I don't have a SR-IOV device to test so source dev is a non-SR-IOV device,
    but most of the code paths include support for specifing the source dev and
    VF index.  We'll need to complete this by discovering the PF given the VF
    linkdev.  Once we have the PF, we'll also have the VF index.  All this info-
    mation is available from sysfs.
    ca3b22bb
libvirt_private.syms 15.1 KB