
    g                         d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlZdZdZd	Z G d
 de      Z G d de      Z G d de      Z G d dej(                        Zy)z"netplan SR-IOV rebind command line    N)sleep   )utils)	PCIDevicebind_vfs_get_pci_slot_name   g?   c                       e Zd Zy)MLX5VFLAGStateNotFoundN__name__
__module____qualname__     ;/usr/share/netplan/netplan_cli/cli/commands/sriov_rebind.pyr   r   #       r   r   c                       e Zd Zy)MLX5VFLAGStateCannotBeReadNr   r   r   r   r   r   '   r   r   r   c                       e Zd Zy)MLX5VFLAGStateDisabledNr   r   r   r   r   r   +   r   r   r   c                   f     e Zd Z fdZd Zd ZdedefdZdefdZ	ded	e
fd
Zded	efdZ xZS )NetplanSriovRebindc                 *    t         |   ddd       y )NrebindzKRebind SR-IOV virtual functions of given physical functions to their driverT)
command_iddescriptionleaf)super__init__)self	__class__s    r   r!   zNetplanSriovRebind.__init__1   s    H%r" 	 	$r   c                    | j                   j                  ddd       | j                   j                  dt        dg d       | j                  | _        t        j                  d	      | _        d
| j                  _        t        j                  t        j                        }| j                          | j                  rm| j                  j                  t
        j                         |j                  t
        j                         |j!                  t        j"                  d             nl| j                  j                  t
        j$                         |j                  t
        j$                         |j!                  t        j"                  d             | j                  j'                  |       | j)                          y )Nz
--root-dir/zBSearch for configuration files in this root directory instead of /)defaulthelpnetdevs*z*Space separated list of PF interface names)typenargsr&   r'   sriov_rebindF)streamz%(levelname)s:%(message)sz%(message)s)parseradd_argumentstrcommand_rebindfunclogging	getLoggerlogger	propagateStreamHandlersysstdout
parse_argsdebugsetLevelDEBUGsetFormatter	FormatterINFO
addHandlerrun_command)r"   log_handlers     r   runzNetplanSriovRebind.run6   s7     s&j 	! 	l  C&R 	! 	T''	''7 %++3::> ::KK  /  /$$W%6%67R%STKK  .  .$$W%6%6}%EF{+r   c           	         | j                   D ]  }t        |      }t        |      }|j                  s+| j                  j                  dj                  |             P| j                  ||       t        |j                  |j                        }| j                  j                  dj                  |t        |                    y)zeBind virtual functions of SR-IOV devices to their corresponding driver after eswitch mode was changedz1{} does not seem to be a SR-IOV physical functionz{}: bound {} VFsN)r(   r   r   is_pfr5   r;   format!_perform_hardware_specific_quirksr   vfsdriverlen)r"   ifacepci_addrpcidev	bound_vfss        r   r1   z!NetplanSriovRebind.command_rebindQ   s    \\ 	QE)%0Hx(F<<!!"U"\"\]b"cd
 225&A V]];IKK077IOP	Qr   rL   pfc                    |j                   dv rJt        j                         }|j                  | j                         t        j
                         }|j                  |       |j                  j                         D ]  }|j                  r|j                  |k(  s|j                  |k(  s.|j                  j                  d      x}sL|j                  }| j                  |      s"| j                   j#                  | d| d       | j                   j#                  | d       	 | j%                  |       | j                   j#                  | d        y
y
# t&        $ r" | j                   j#                  | d       Y t(        $ r" | j                   j#                  | d       Y 0t*        $ r" | j                   j#                  | d	       Y Yw xY w)z
        Perform any hardware-specific quirks for the given SR-IOV device to make
        sure it's ready before the bind.
        )	mlx5_corebondz - LAG mode z is not supported by VF LAGz+ - waiting for the LAG state to be 'active'z - VF LAG state is 'active'z - VF LAG state cannot be readz& - VF LAG state debugfs file not foundz1 - VF LAG state is still 'disabled' after waitingN)rJ   netplanParserload_yaml_hierarchyroot_dirStateimport_parser_results	ethernetsvalues
_has_matchset_nameidlinksget
_bond_mode_is_bond_mode_supportedr5   r;   "_wait_for_mlx5_pf_lag_state_activer   r   r   )r"   rL   rP   r.   np_statenetdef	bond_link	bond_modes           r   rH   z4NetplanSriovRebind._perform_hardware_specific_quirksb   s    99% ^^%F&&t}}5}}H**62",,335 W%%&//U*BvyyTYGY$*LL$4$4V$<<y< %.$8$8	#;;IF KK--|I;Ni.jk$))UG3`*ab	W CCBG !KK--7T.UV7W &8  : X KK--7U.VW5 ` KK--7].^_5 m KK--7j.klms   (E'G&G.&GGc                    t        t        t        z        }|j                  }d| d}t        j
                  j                  |      st        t               t        |dkD  rP	 | j                  |      dk7  r.| j                  j                  | d       t        t               ny	 |dz
  }|dkD  rPt        # t        $ r t        w xY w)z
        The mlx5 driver added support for debugfs in https://github.com/torvalds/linux/commit/7f46a0b7327a
        It's available since kernel 5.19 https://cdn.kernel.org/pub/linux/kernel/v5.x/ChangeLog-5.19
        /sys/kernel/debug/mlx5/
/lag/stater   activez, VF LAG state is not active yet, retrying...N   )intMAX_WAITING_TIME_SECINTERVAL_SECrM   ospathexistsr   FALLBACK_WAIT_TIME_SECr   _get_mlx5_vf_lag_stater5   r;   	Exceptionr   r   )r"   rP   retriesrM   rq   s        r   rc   z5NetplanSriovRebind._wait_for_mlx5_pf_lag_state_active   s    
 *\9:;;(
*=ww~~d# ()((k
1..x8HDKK%%
2^&_` ,' ( kG k %$  1001s   #AB8 8Cmodereturnc                 
    |dv S )zx
        Return True or False if the bond mode is one of the supported modes
        for the VG LAG activation.
        )zactive-backupzbalanced-xorz802.3adr   )r"   rw   s     r   rb   z*NetplanSriovRebind._is_bond_mode_supported   s    
 CCCr   rM   c                     d| d}t        |d      5 }|j                         j                         cd d d        S # 1 sw Y   y xY w)Nri   rj   r)openreadstrip)r"   rM   rq   fs       r   rt   z)NetplanSriovRebind._get_mlx5_vf_lag_state   s@    (
*=$_ 	$668>>#	$ 	$ 	$s	   ;A)r   r   r   r!   rD   r1   r0   r   rH   rc   boolrb   rt   __classcell__)r#   s   @r   r   r   /   s`    $
6Q")Ws )W	 )WV"%Y "%HDC DD D$s $s $r   r   )__doc__r3   rp   r8   timer    r   sriovr   r   r   rT   rs   ro   rn   ru   r   r   r   NetplanCommandr   r   r   r   <module>r      sm   $ )  	 
   ; ;    	Y 		 		Y 	M$-- M$r   