ó
æ”\c           @   s   d  d l  m Z d  d l Td d l Z d d l m Z d d l m Z d d l	 Z	 d d l
 Z
 e j j ƒ  Z d Z d e j f d	 „  ƒ  YZ d S(
   i   (   t   base(   t   *iÿÿÿÿN(   t   ethcard(   t   commandst   pumbagsdt   NetTuningPluginc           B   sâ  e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 e
 d „  ƒ Z e
 d	 „  ƒ Z e
 d
 „  ƒ Z e
 d „  ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e
 d „  ƒ Z e d d e ƒd „  ƒ Z e d ƒ e d „ ƒ Z e d ƒ d „  ƒ Z e d ƒ d „  ƒ Z d „  Z d „  Z  d „  Z! d „  Z" d „  Z# d* d  „ Z% d! „  Z& e' d" d e ƒd# „  ƒ Z( e' d$ d e ƒd% „  ƒ Z) e' d& d e ƒd' „  ƒ Z* e' d( d e ƒd) „  ƒ Z+ RS(+   s,   
	Plugin for ethernet card options tuning.
	c         O   s;   t  t |  ƒ j | | Ž  d |  _ d |  _ t ƒ  |  _ d  S(   Ngš™™™™™©?i   (   t   superR   t   __init__t   _load_smallestt   _level_stepsR   t   _cmd(   t   selft   argst   kwargs(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyR      s    		c         C   s“   t  |  _ t ƒ  |  _ t ƒ  |  _ t j d ƒ } xB |  j j d ƒ D]. } | j	 | j
 ƒ rC |  j j | j ƒ qC qC Wt j d t |  j ƒ ƒ d  S(   Ns   (?!.*/virtual/.*)t   nets   devices: %s(   t   Truet   _devices_supportedt   sett   _free_devicest   _assigned_devicest   ret   compilet   _hardware_inventoryt   get_devicest   matcht   device_patht   addt   sys_namet   logt   debugt   str(   R   t   re_not_virtualt   device(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _init_devices   s    	c         C   s&   g  | D] } |  j  j d | ƒ ^ q S(   NR   (   R   t
   get_device(   R   t   devicest   x(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _get_device_objects$   s    c         C   s€   t  | _ |  j | j d ƒ rX t  | _ |  j j d | j ƒ | _ i  | _	 i  | _
 n$ t | _ d  | _ d  | _	 d  | _
 d  S(   Nt   dynamicR   (   R   t   _has_static_tuningt   _option_boolt   optionst   _has_dynamic_tuningt   _monitors_repositoryt   createt   assigned_devicest   _load_monitort   _idlet   _statst   Falset   None(   R   t   instance(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _instance_init'   s    						c         C   s2   | j  d  k	 r. |  j j | j  ƒ d  | _  n  d  S(   N(   R.   R2   R+   t   delete(   R   R3   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _instance_cleanup4   s    c         C   s   |  j  | | ƒ d  S(   N(   t   _instance_update_dynamic(   R   R3   R    (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _instance_apply_dynamic9   s    c         C   s®  g  | j  j | ƒ D] } t | ƒ ^ q } | d  k r; d  S| | j k r] |  j | | ƒ n  |  j | | | ƒ |  j | | ƒ | j | } | j | } | d d k r| d |  j	 k r| d |  j	 k rd | d <t
 j d | ƒ t | ƒ j d ƒ n^ | d d k r_| d d k s1| d d k r_d | d <t
 j d | ƒ t | ƒ j ƒ  n  t
 j d	 | | d | d f ƒ t
 j d
 | | d | d | d f ƒ d  S(   Nt   leveli    t   readt   writei   s   %s: setting 100Mbpsid   s   %s: setting max speeds    %s load: read %0.2f, write %0.2fs$   %s idle: read %d, write %d, level %d(   R.   t   get_device_loadt   intR2   R0   t   _init_stats_and_idlet   _update_statst   _update_idleR/   R	   R   t   infoR   t	   set_speedt   set_max_speedR   (   R   R3   R    t   valuet   loadt   statst   idle(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyR7   <   s&    +6
0
"c         C   sž   i d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d	 6d  d
 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6S(   Ns   adaptive-rxs   adaptive-txs   rx-usecss	   rx-framess   rx-usecs-irqs   rx-frames-irqs   tx-usecss	   tx-framess   tx-usecs-irqs   tx-frames-irqs   stats-block-usecss   pkt-rate-lows   rx-usecs-lows   rx-frames-lows   tx-usecs-lows   tx-frames-lows   pkt-rate-highs   rx-usecs-highs   rx-frames-highs   tx-usecs-highs   tx-frames-highs   sample-interval(   R2   (   t   cls(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _get_config_options_coalesceU   s.    c         C   s   i d  d 6d  d 6d  d 6S(   Nt   autonegt   rxt   tx(   R2   (   RH   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _get_config_options_pausep   s    
c         C   s    i d  d 6d  d 6d  d 6d  d 6S(   NRK   s   rx-minis   rx-jumboRL   (   R2   (   RH   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _get_config_options_ringv   s    
c         C   s5   i t  d 6d  d 6d  d 6d  d 6d  d 6d  d 6d  d 6S(   NR&   t   wake_on_lant   nf_conntrack_hashsizet   featurest   coalescet   pauset   ring(   R   R2   (   RH   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _get_config_options}   s    c         C   sm   |  j  t | ƒ j ƒ  ƒ } i d d g d 6d | d g d 6| j | <i d d 6d d 6d d	 6| j | <d  S(
   Ni   i    t   newi   i   t   maxR9   R:   R;   (   t   _calc_speedR   t   get_max_speedR0   R/   (   R   R3   R    t	   max_speed(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyR>   ‰   s    ,c   
      C   s  | j  | d | j  | d <} | | j  | d <g  t | | ƒ D] } | d | d ^ qA } | | j  | d <| j  | d } g  t | | ƒ D] } t | ƒ ^ q‘ }	 |	 | j  | d <t | d ƒ t |	 d ƒ | j  | d <t | d ƒ t |	 d ƒ | j  | d	 <d  S(
   NRV   t   oldi    i   t   diffRW   R:   i   R;   (   R0   t   zipRW   t   float(
   R   R3   R    t   new_loadt   old_loadt   new_oldR\   t   old_max_loadt   pairt   max_load(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyR?   Ž   s     .()c         C   s`   xY d d g D]K } | j  | | |  j k  rG | j | | c d 7<q d | j | | <q Wd  S(   NR:   R;   i   i    (   R0   R   R/   (   R   R3   R    t	   operation(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyR@       s    c         C   s_   | | j  k r[ | j  | d d k r[ d | j  | d <t j d | ƒ t | ƒ j ƒ  n  d  S(   NR9   i    s   %s: setting max speed(   R/   R   RA   R   RC   (   R   R3   R    (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _instance_unapply_dynamic¨   s    &c         C   s   t  d | d ƒ S(   Ng333333ã?i   i   g333333ƒ@g333333#A(   R=   (   R   t   speed(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyRX   ®   s    c         C   s¤   t  t j d d | ƒ ƒ j ƒ  } t | ƒ } | d d k r^ t j d | t  | ƒ f ƒ d  S| d k rq t ƒ  St t	 t
 | d  d  d … | d d  d … ƒ ƒ ƒ S(   Ns    (:\s*)|(\s+)|(\s*;\s*)|(\s*,\s*)t    i   i    s   invalid %s parameter: '%s'i   (   R   R   t   subt   splitt   lenR   t   errorR2   t   dictt   listR]   (   R   RD   t   contextt   vt   lv(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _parse_config_parameters·   s    !c         C   sT  |  j  j i d d 6d d 6d d 6d d 6d	 d
 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d  6d! d" 6d# d$ 6| ƒ } g  | j d% ƒ D]= } t t | ƒ ƒ d& k r£ t j d' t | ƒ ƒ r£ | ^ q£ } t | ƒ d( k  rü d  St g  g  | d) D] } t j d* t | ƒ ƒ ^ qD] } t | ƒ d( k r/| ^ q/ƒ S(+   Ns   adaptive-rx:s   Adaptive RX:s   
adaptive-tx:s   \s+TX:s   rx-frames-low:s   rx-frame-low:s   rx-frames-high:s   rx-frame-high:s   tx-frames-low:s   tx-frame-low:s   tx-frames-high:s   tx-frame-high:s   lro:s   large-receive-offload:s   rx:s   rx-checksumming:s   tx:s   tx-checksumming:s   sg:s   scatter-gather:s   tso:s   tcp-segmentation-offload:s   ufo:s   udp-fragmentation-offload:s   gso:s   generic-segmentation-offload:s   gro:s   generic-receive-offload:s   rxvlan:s   rx-vlan-offload:s   txvlan:s   tx-vlan-offload:s   ntuple:s   ntuple-filters:s   rxhash:s   receive-hashing:s   
i    s
   \[fixed\]$i   i   s   :\s*(	   R
   t   multiple_re_replaceRj   Rk   R   R   t   searchR2   Rm   (   R   RD   Rp   t   vlt   u(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _parse_device_parametersÄ   s0    	Sc         C   s   d S(   Ns,   /sys/module/nf_conntrack/parameters/hashsize(    (   R   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _nf_conntrack_hashsize_pathä   s    RO   t
   per_devicec         C   s‚   | d  k r d  St j d d t | ƒ ƒ } t j d t d | ƒ sV t j d ƒ d  S| s~ |  j j	 d d | d | g ƒ n  | S(	   Nt   0t   ds   ^[s   ]+$s   Incorrect 'wake_on_lan' value.t   ethtools   -st   wol(
   R2   R   Ri   R   R   t
   WOL_VALUESR   t   warnR
   t   execute(   R   RD   R    t   sim(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _set_wake_on_lanè   s    "c         C   sp   d  } yR t j d t d |  j j d | g ƒ d t j ƒ } | rW | j d ƒ } n  Wn t k
 rk n X| S(   Ns   .*Wake-on:\s*([s   ]+).*R|   i   (	   R2   R   R   R~   R
   R€   t   St   groupt   IOError(   R   R    t   ignore_missingRD   t   m(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _get_wake_on_lan÷   s    6RP   c         C   sV   | d  k r d  St | ƒ } | d k rN | sJ |  j j |  j ƒ  | ƒ n  | Sd  Sd  S(   Ni    (   R2   R=   R
   t   write_to_fileRx   (   R   RD   R   t   hashsize(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _set_nf_conntrack_hashsize  s    c         C   s8   |  j  j |  j ƒ  ƒ } t | ƒ d k r4 t | ƒ Sd  S(   Ni    (   R
   t	   read_fileRx   Rk   R=   R2   (   R   RD   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _get_nf_conntrack_hashsize  s    
c         C   s—   | d k r t  St | j ƒ  ƒ } i |  j d 6|  j d 6|  j d 6} t | | ƒ  j ƒ  ƒ } | j | ƒ s“ t j d | t	 | | ƒ f ƒ t
 St  S(   NRQ   RR   RS   RT   s   unknown %s parameter(s): %s(   R   R   t   keysRI   RM   RN   t   issubsetR   Rl   R   R1   (   R   Ro   R{   t   paramst   supported_gettert	   supported(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _check_parameters  s    
!c         C   sÃ   |  j  j i d d 6d d 6d d 6| ƒ } | j d ƒ d } g  | D]+ } | d	 k rD t j d
 | ƒ rD | ^ qD } t g  g  | D] } t j d | ƒ ^ q‚ D] } t | ƒ d k rž | ^ qž ƒ S(   NRJ   t   AutonegotiateRK   t   RXRL   t   TXs   
i   t    s	   \[fixed\]s   :\s*i   (   R
   Rs   Rj   R   Rt   Rm   Rk   (   R   t   st   lR$   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _parse_pause_parameters%  s    	
8c         C   sÞ   t  j d | d t  j ƒ} | d } |  j j i d d 6d d 6d d	 6d
 d 6| ƒ } | j d ƒ } g  | D] } | d k rl | ^ ql } g  g  | D] } t  j d | ƒ ^ q” D] } t | ƒ d k r° | ^ q° } t | ƒ S(   Ns   ^Current hardware settings:$t   flagsi   RK   R•   s   rx-minis   RX Minis   rx-jumbos   RX JumboRL   R–   s   
R—   s   :\s*i   (   R   Rj   t	   MULTILINER
   Rs   Rk   Rm   (   R   R˜   t   aR™   R$   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _parse_ring_parameters/  s    
	
%Jc   	      C   sm   t  | j ƒ  ƒ } t  | j ƒ  ƒ } | | } x8 | D]0 } t j d | | | f ƒ | j | d ƒ q5 Wd S(   s  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
		s-   %s parameter %s is not supported by device %sN(   R   RŽ   R   t   warningt   popR2   (	   R   Ro   t
   parametersR    t
   dev_paramst   supported_parameterst   parameters_to_changet   unsupported_parameterst   param(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _check_device_support<  s    		c   
      C   sÚ   i d d 6d d 6d d 6d d 6} | | } |  j  j d	 | | g ƒ \ } } | d
 k sk t | ƒ d
 k ro d  Si |  j d 6|  j d 6|  j d 6|  j d 6} | | } | | ƒ }	 | d k rÖ |  j | |	 ƒ rÖ d  S|	 S(   Ns   -cRR   s   -kRQ   s   -aRS   s   -gRT   R|   i    (   R
   R€   Rk   R2   Rw   Rš   Rž   R“   (
   R   Ro   R    t   context2optt   optt   retRD   t   context2parsert   parserR{   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _get_device_parametersS  s    "
!


c   	      C   s  | d  k s t | ƒ d k r" d  S|  j | | ƒ } | d  k sS |  j | | ƒ rW i  S| rv |  j | | | | ƒ n  | rt | ƒ d k rt j d | t | ƒ f ƒ i d d 6d d 6d d 6d	 d
 6} | | } |  j j	 d | | g |  j j
 | ƒ d d g ƒn  | S(   Ni    s   setting %s: %ss   -CRR   s   -KRQ   s   -ARS   s   -GRT   R|   t	   no_errorsiP   (   R2   Rk   Rr   R“   R§   R   R   R   R
   R€   t	   dict2list(	   R   Ro   RD   R    R   R¢   R{   R¨   R©   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _set_device_parametersc  s    "
5c         C   sH  |  j  d | d | ƒ } | r|  j | | ƒ } |  j | | | | d | ƒ} t | ƒ d k rd t Sg  | j ƒ  D]$ \ }	 } |	 | k rq |	 | f ^ qq }
 t |
 ƒ }
 | rñ |  j j | ƒ |  j j |
 ƒ k } |  j	 | | | |
 d | ƒ| S|  j
 j | d j |  j j |
 ƒ ƒ ƒ n( |  j
 j | ƒ } |  j | | | t ƒ d  S(   Nt   command_namet   device_nameR¢   i    R    Rh   (   t   _storage_keyR­   R°   Rk   R1   t   itemsRm   R
   R¯   t   _log_verification_resultt   _storageR   t   joint   getR2   (   R   Ro   t   startRD   R    t   verifyt   storage_keyt   params_currentt
   params_setR¦   t   relevant_params_currentt   rest   original_value(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _custom_parametersv  s8    						RQ   c         C   s   |  j  d | | | | ƒ S(   NRQ   (   RÁ   (   R   R¹   RD   R    Rº   R†   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt	   _featuresš  s    RR   c         C   s   |  j  d | | | | ƒ S(   NRR   (   RÁ   (   R   R¹   RD   R    Rº   R†   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt	   _coalescež  s    RS   c         C   s   |  j  d | | | | ƒ S(   NRS   (   RÁ   (   R   R¹   RD   R    Rº   R†   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _pause¢  s    RT   c         C   s   |  j  d | | | | ƒ S(   NRT   (   RÁ   (   R   R¹   RD   R    Rº   R†   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   _ring¦  s    N(,   t   __name__t
   __module__t   __doc__R   R!   R%   R4   R6   R8   R7   t   classmethodRI   RM   RN   RU   R>   R?   R@   Rf   RX   Rr   Rw   Rx   t   command_setR   R‚   t   command_getR1   Rˆ   R‹   R   R“   Rš   Rž   R§   R­   R2   R°   RÁ   t   command_customRÂ   RÃ   RÄ   RÅ   (    (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyR      sH   															 	
		
				$(   R—   R    t
   decoratorst
   tuned.logst   tunedt   tuned.utils.nettoolR   t   tuned.utils.commandsR   t   osR   t   logsR¸   R   R~   t   PluginR   (    (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt   <module>   s   
