o
    _8                     @   sh   d dl mZ d dlT ddlZddlmZ ddlmZ ddl	Z	ddl
Z
ej ZdZG dd	 d	ejZdS )
   )base)*    N)ethcard)commandspumbagsdc                       s  e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
edd Zedd Zedd Zedd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zed&d' Zed(d)d*d+d, Zed(dPd.d/Zed0d1d2 Zed0d3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"	?dQd@dAZ#dBdC Z$e%dDd)d*dEdF Z&e%dGd)d*dHdI Z'e%dJd)d*dKdL Z(e%dMd)d*dNdO Z)  Z*S )RNetTuningPluginz,
	Plugin for ethernet card options tuning.
	c                    s.   t t| j|i | d| _d| _t | _d S )Ng?   )superr   __init___load_smallest_level_stepsr   _cmd)selfargskwargs	__class__ :/usr/lib/python3/dist-packages/tuned/plugins/plugin_net.pyr      s   zNetTuningPlugin.__init__c                 C   sd   d| _ t | _t | _td}| jdD ]}||j	r%| j
|j qtdt| j  d S )NTz(?!.*/virtual/.*)netzdevices: %s)_devices_supportedset_free_devices_assigned_devicesrecompile_hardware_inventoryget_devicesmatchdevice_pathaddsys_namelogdebugstr)r   re_not_virtualdevicer   r   r   _init_devices   s   
zNetTuningPlugin._init_devicesc                    s    fdd|D S )Nc                    s   g | ]	} j d |qS )r   )r   
get_device.0xr   r   r   
<listcomp>%   s    z7NetTuningPlugin._get_device_objects.<locals>.<listcomp>r   )r   devicesr   r-   r   _get_device_objects$   s   z#NetTuningPlugin._get_device_objectsc                 C   sZ   d|_ | |jd rd|_| jd|j|_i |_i |_	d S d|_d |_d |_d |_	d S )NTdynamicr   F)
_has_static_tuning_option_booloptions_has_dynamic_tuning_monitors_repositorycreateassigned_devices_load_monitor_idle_statsr   instancer   r   r   _instance_init'   s   

zNetTuningPlugin._instance_initc                 C   s&   |j d ur| j|j  d |_ d S d S N)r9   r6   deleter<   r   r   r   _instance_cleanup4   s   

z!NetTuningPlugin._instance_cleanupc                 C   s   |  || d S r?   )_instance_update_dynamicr   r=   r'   r   r   r   _instance_apply_dynamic9   s   z'NetTuningPlugin._instance_apply_dynamicc                 C   s<  dd |j |D }|d u rd S ||jvr| || | ||| | || |j| }|j| }|d dkrZ|d | jkrZ|d | jkrZd|d< t	d|  t
|d	 n#|d dkr}|d dksl|d dkr}d|d< t	d
|  t
|  td||d |d f  td||d |d |d f  d S )Nc                 S      g | ]}t |qS r   int)r+   valuer   r   r   r.   =       z<NetTuningPlugin._instance_update_dynamic.<locals>.<listcomp>levelr   readwriter   z%s: setting 100Mbpsd   %s: setting max speedz %s load: read %0.2f, write %0.2fz$%s idle: read %d, write %d, level %d)r9   get_device_loadr;   _init_stats_and_idle_update_stats_update_idler:   r   r#   infor   	set_speedset_max_speedr$   )r   r=   r'   loadstatsidler   r   r   rB   <   s&   


($&z(NetTuningPlugin._instance_update_dynamicc                 C   sz   i dd dd dd dd dd dd dd dd d	d d
d dd dd dd dd dd dd dd d d d d d dS )Nzadaptive-rxzadaptive-txzrx-usecsz	rx-frameszrx-usecs-irqzrx-frames-irqztx-usecsz	tx-framesztx-usecs-irqztx-frames-irqzstats-block-usecszpkt-rate-lowzrx-usecs-lowzrx-frames-lowztx-usecs-lowztx-frames-lowzpkt-rate-high)zrx-usecs-highzrx-frames-highztx-usecs-highztx-frames-highzsample-intervalr   clsr   r   r   _get_config_options_coalesceU   sR   	
z,NetTuningPlugin._get_config_options_coalescec                 C   s   d d d dS )N)autonegrxtxr   rY   r   r   r   _get_config_options_pausep   s   z)NetTuningPlugin._get_config_options_pausec                 C   s   d d d d dS )N)r]   rx-minirx-jumbor^   r   rY   r   r   r   _get_config_options_ringv   s
   z(NetTuningPlugin._get_config_options_ringc                 C   s   dd d d d d d dS )NT)r1   wake_on_lannf_conntrack_hashsizefeaturescoalescepauseringr   rY   r   r   r   _get_config_options}   s   z#NetTuningPlugin._get_config_optionsc                 C   sF   |  t| }ddg d|dg d|j|< dddd|j|< d S )N   r      r   )newmax)rJ   rK   rL   )_calc_speedr   get_max_speedr;   r:   )r   r=   r'   	max_speedr   r   r   rP      s   z$NetTuningPlugin._init_stats_and_idlec                 C   s   |j | d  |j | d< }||j | d< dd t||D }||j | d< |j | d }dd t||D }||j | d< t|d t|d  |j | d	< t|d
 t|d
  |j | d< d S )Nrl   oldc                 S   s   g | ]
}|d  |d  qS )r   r   r   )r+   new_oldr   r   r   r.          z1NetTuningPlugin._update_stats.<locals>.<listcomp>diffrm   c                 S   rE   r   )rm   )r+   pairr   r   r   r.      rI   r   rK   rk   rL   )r;   zipfloat)r   r=   r'   new_loadold_loadrt   old_max_loadmax_loadr   r   r   rQ      s   "&zNetTuningPlugin._update_statsc                 C   sH   dD ]}|j | | | jk r|j| |  d7  < qd|j| |< qd S )N)rK   rL   r   r   )r;   r   r:   )r   r=   r'   	operationr   r   r   rR      s
   zNetTuningPlugin._update_idlec                 C   sP   ||j v r$|j | d dkr&d|j | d< td|  t|  d S d S d S )NrJ   r   rN   )r:   r#   rS   r   rU   rC   r   r   r   _instance_unapply_dynamic   s
   z)NetTuningPlugin._instance_unapply_dynamicc                 C   s   t d| d S )Ng333333#A   rF   )r   speedr   r   r   rn      s   zNetTuningPlugin._calc_speedc                 C   sx   t tdd| }t|}|d dkr"td|t |f  d S |dkr)t S ttt	|d d d |dd d S )Nz (:\s*)|(\s+)|(\s*;\s*)|(\s*,\s*) rk   r   zinvalid %s parameter: '%s'r   )
r%   r   subsplitlenr#   errordictlistrv   )r   rH   contextvlvr   r   r   _parse_config_parameters   s   &z(NetTuningPlugin._parse_config_parametersc                 C   s   | j i ddddddddd	d
dddddddddddddddddddddd d!d"d#d$i|}d%d& |d'D }t|d(k rPd S td)d& d*d& |d+d  D D S ),NzAdaptive RX:zadaptive-rx:z\s+TX:z
adaptive-tx:zrx-frame-low:zrx-frames-low:zrx-frame-high:zrx-frames-high:ztx-frame-low:ztx-frames-low:ztx-frame-high:ztx-frames-high:zlarge-receive-offload:zlro:zrx-checksumming:zrx:ztx-checksumming:ztx:zscatter-gather:zsg:ztcp-segmentation-offload:ztso:zudp-fragmentation-offload:zufo:zgeneric-segmentation-offload:zgso:zgeneric-receive-offload:zgro:zrx-vlan-offload:zrxvlan:ztx-vlan-offload:ztxvlan:zntuple-filters:zntuple:zreceive-hashing:zrxhash:c                 S   s0   g | ]}t t|d krtdt|s|qS )r   z
\[fixed\]$)r   r%   r   searchr+   r   r   r   r   r.      s   0 z<NetTuningPlugin._parse_device_parameters.<locals>.<listcomp>
rk   c                 S      g | ]
}t |d kr|qS rk   r   )r+   ur   r   r   r.      rs   c                 S   s   g | ]
}t d t|qS z:\s*)r   r   r%   r   r   r   r   r.      rs   r   )r   multiple_re_replacer   r   r   )r   rH   vlr   r   r   _parse_device_parameters   sV   	
$z(NetTuningPlugin._parse_device_parametersc                 C   s   dS )Nz,/sys/module/nf_conntrack/parameters/hashsizer   r-   r   r   r   _nf_conntrack_hashsize_path   s   z+NetTuningPlugin._nf_conntrack_hashsize_pathrc   T)
per_devicec                 C   s^   |d u rd S t ddt|}t dt d |s td d S |s-| jdd|d|g |S )	N0dz^[z]+$zIncorrect 'wake_on_lan' value.ethtoolz-swol)	r   r   r%   r   
WOL_VALUESr#   warnr   execute)r   rH   r'   simr   r   r   _set_wake_on_lan   s   
z NetTuningPlugin._set_wake_on_lanFc                 C   s\   d }z!t dt d | jd|gd t j}|r!|d}W |S W |S  ty-   Y |S w )Nz.*Wake-on:\s*([z]+).*r   r   )r   r   r   r   r   SgroupIOError)r   r'   ignore_missingrH   mr   r   r   _get_wake_on_lan   s   (z NetTuningPlugin._get_wake_on_lanrd   c                 C   s:   |d u rd S t |}|dkr|s| j|  | |S d S Nr   )rG   r   write_to_filer   )r   rH   r   hashsizer   r   r   _set_nf_conntrack_hashsize  s   z*NetTuningPlugin._set_nf_conntrack_hashsizec                 C   s(   | j |  }t|dkrt|S d S r   )r   	read_filer   r   rG   )r   rH   r   r   r   _get_nf_conntrack_hashsize  s   z*NetTuningPlugin._get_nf_conntrack_hashsizec                 C   sh   |dkrdS t | }| j| j| jd}t ||   }||s2td|t|| f  dS dS )Nre   T)rf   rg   rh   zunknown %s parameter(s): %sF)	r   keysr[   r_   rb   issubsetr#   r   r%   )r   r   r   paramssupported_getter	supportedr   r   r   _check_parameters  s   
z!NetTuningPlugin._check_parametersc                 C   sR   | j dddd|}|ddd  }dd |D }td	d d
d |D D S )Nr\   r]   r^   )AutonegotiateRXTXr   r   c                 S   s$   g | ]}|d krt d|s|qS ) z	\[fixed\])r   r   r*   r   r   r   r.   +  s   $ z;NetTuningPlugin._parse_pause_parameters.<locals>.<listcomp>c                 S   r   r   r   r*   r   r   r   r.   ,  rs   c                 S      g | ]}t d |qS r   r   r   r*   r   r   r   r.   ,      )r   r   r   r   )r   slr   r   r   _parse_pause_parameters%  s   z'NetTuningPlugin._parse_pause_parametersc                 C   sj   t jd|t jd}|d }| jddddd|}|d	}d
d |D }dd dd |D D }t|S )Nz^Current hardware settings:$)flagsr   r]   r`   ra   r^   )r   zRX MinizRX Jumbor   r   c                 S   s   g | ]}|d kr|qS )r   r   r*   r   r   r   r.   8  r   z:NetTuningPlugin._parse_ring_parameters.<locals>.<listcomp>c                 S   r   r   r   r*   r   r   r   r.   9  rs   c                 S   r   r   r   r*   r   r   r   r.   9  r   )r   r   	MULTILINEr   r   r   )r   r   ar   r   r   r   _parse_ring_parameters/  s   
z&NetTuningPlugin._parse_ring_parametersc           	      C   sN   t | }t | }|| }|D ]}td|||f  ||d qdS )a  Filter unsupported parameters and log warnings about it

		Positional parameters:
		context -- context of change
		parameters -- parameters to change
		device -- name of device on which should be parameters set
		dev_params -- dictionary of currently known parameters of device
		z-%s parameter %s is not supported by device %sN)r   r   r#   warningpop)	r   r   
parametersr'   
dev_paramssupported_parametersparameters_to_changeunsupported_parametersparamr   r   r   _check_device_support<  s   	z%NetTuningPlugin._check_device_supportc           
      C   s   ddddd}|| }| j d||g\}}|dks t|dkr"d S | j| j| j| jd}|| }||}	|dkrA| ||	sAd S |	S )	Nz-cz-kz-az-grf   re   rg   rh   r   r   rf   )r   r   r   r   r   r   r   )
r   r   r'   context2optoptretrH   context2parserparserr   r   r   r   _get_device_parametersS  s   z&NetTuningPlugin._get_device_parametersNc           	      C   s   |d u s
t |dkrd S | ||}|d u s| ||si S |r(| |||| |sXt |dkrXtd|t|f  ddddd}|| }| jjd||g| j	| d	gd
 |S )Nr   zsetting %s: %sz-Cz-Kz-Az-Gr   r   P   )	no_errors)
r   r   r   r   r#   r$   r%   r   r   	dict2list)	r   r   rH   r'   r   r   r   r   r   r   r   r   _set_device_parametersc  s   $z&NetTuningPlugin._set_device_parametersc                    s   | j ||d}|rZ| ||}| j|||||d t dkr!dS  fdd| D }t|}|rJ| j | j|k}	| j||	 ||d |	S | j	
|d| j| d S | j	|}
| ||
|d d S )	N)command_namedevice_name)r   r   Fc                    s    g | ]\}}| v r||fqS r   r   )r+   r   rH   
params_setr   r   r.     s    z6NetTuningPlugin._custom_parameters.<locals>.<listcomp>)r'   r   )_storage_keyr   r   r   itemsr   r   r   _log_verification_result_storager   joinget)r   r   startrH   r'   verifystorage_keyparams_currentrelevant_params_currentresoriginal_valuer   r   r   _custom_parametersv  sF   



z"NetTuningPlugin._custom_parametersre   c                 C      |  d||||S )Nre   r   r   r   rH   r'   r   r   r   r   r   	_features     zNetTuningPlugin._featuresrf   c                 C   r   )Nrf   r   r   r   r   r   	_coalesce  r   zNetTuningPlugin._coalescerg   c                 C   r   )Nrg   r   r   r   r   r   _pause  r   zNetTuningPlugin._pauserh   c                 C   r   )Nrh   r   r   r   r   r   _ring  r   zNetTuningPlugin._ring)Fr?   )+__name__
__module____qualname____doc__r   r(   r0   r>   rA   rD   rB   classmethodr[   r_   rb   ri   rP   rQ   rR   r}   rn   r   r   r   command_setr   command_getr   r   r   r   r   r   r   r   r   r   command_customr   r   r   r   __classcell__r   r   r   r   r      sd    



	 








$





r   )r   r   
decorators
tuned.logstunedtuned.utils.nettoolr   tuned.utils.commandsr   osr   logsr   r#   r   Pluginr   r   r   r   r   <module>   s    
