a
    kÄ#dM  ã                   @   sþ  d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZ ddlmZmZmZmZ ddlmZ dddd	d
ddddddddddœZdddœZddddddddd œZd!d"d#d$d%d&œZd'd(d)d*d+d,d-œZd.d/d0d.d1d2d3œZ d4d5d6d7d8d9d:d;d<œZ!d=d>d?œZ"d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\œZ#G d]d^„ d^eƒZ$G d_d`„ d`eƒZ%G dadb„ dbeƒZ&G dcdd„ ddeƒZ'G dedf„ dfeƒZ(G dgdh„ dheƒZ)G didj„ djeƒZ*G dkdl„ dleƒZ+G dmdn„ dneƒZ,G dodp„ dpeƒZ-G dqdr„ dreƒZ.G dsdt„ dteƒZ/G dudv„ dveƒZ0G dwdx„ dxeƒZ1G dydz„ dzeƒZ2G d{d|„ d|eƒZ3G d}d~„ d~eƒZ4G dd€„ d€eƒZ5G d�d‚„ d‚eƒZ6G dƒd„„ d„eƒZ7G d…d†„ d†eƒZ8G d‡dˆ„ dˆeƒZ9G d‰dŠ„ dŠeƒZ:G d‹dŒ„ dŒeƒZ;G d�dŽ„ dŽeƒZ<G d�d�„ d�eƒZ=G d‘d’„ d’eƒZ>G d“d”„ d”eƒZ?eee?d•d–� eee?d•d—� eee?d•d•d˜� ee?e1d™dš� ee?e2d›dš� ee?e3dœdš� ee?e4d�dš� ee?e5dždš� ee?e6dŸdš� ee?e7d dš� ee?e8d¡dš� ee?e:d¢dš� ee?e9d£dš� ee?e;d¤dš� ee?e<d¥dš� ee?e=d¦dš� ee?e>d§dš� ee&eƒ ee'eƒ ee(eƒ ee)eƒ ee*eƒ ee+eƒ ee,eƒ ee-eƒ ee.eƒ ee/eƒ ee0eƒ ee1eƒ ee2eƒ ee3eƒ ee4eƒ ee5eƒ ee6eƒ ee7eƒ ee8eƒ ee9eƒ ee:eƒ ee;eƒ ee<eƒ ee=eƒ ee>eƒ dS )¨aà  
KNXNet/IP

This module provides Scapy layers for KNXNet/IP communications over UDP
according to KNX specifications v2.1 / ISO-IEC 14543-3.
Specifications can be downloaded for free here :
https://my.knx.org/en/shop/knx-specifications

Currently, the module (partially) supports the following services :
* SEARCH REQUEST/RESPONSE
* DESCRIPTION REQUEST/RESPONSE
* CONNECT, DISCONNECT, CONNECTION_STATE REQUEST/RESPONSE
* CONFIGURATION REQUEST/RESPONSE
* TUNNELING REQUEST/RESPONSE
é    N)ÚPacketFieldÚMultipleTypeFieldÚ	ByteFieldÚ
XByteFieldÚShortEnumFieldÚ
ShortFieldÚByteEnumFieldÚIPFieldÚStrFixedLenFieldÚMACFieldÚ	XBitFieldÚPacketListFieldÚFieldLenFieldÚStrLenFieldÚBitEnumFieldÚBitFieldÚConditionalField)ÚPacketÚbind_layersÚbind_bottom_upÚPadding)ÚUDPÚSEARCH_REQUESTÚSEARCH_RESPONSEÚDESCRIPTION_REQUESTÚDESCRIPTION_RESPONSEÚCONNECT_REQUESTÚCONNECT_RESPONSEÚCONNECTIONSTATE_REQUESTÚCONNECTIONSTATE_RESPONSEÚDISCONNECT_REQUESTÚDISCONNECT_RESPONSEÚCONFIGURATION_REQUESTÚCONFIGURATION_ACKÚTUNNELING_REQUESTÚTUNNELING_ACK)é  é  é  é  é  é  é  é  é	  é
  é  é  é   é!  ZIPV4_UDPZIPV4_TCP)é   é   ZDEVICE_INFOZSUPP_SVC_FAMILIESZ	IP_CONFIGZIP_CUR_CONFIGZKNX_ADDRESSESÚReservedZMFR_DATAznot used)r4   r5   é   é   é   é   éþ   éÿ   ZDEVICE_MANAGEMENT_CONNECTIONZTUNNEL_CONNECTIONZREMLOG_CONNECTIONZREMCONF_CONNECTIONZOBJSVR_CONNECTION)r7   r8   r:   é   é   z
L_Data.reqz
L_Data.conzM_PropRead.reqzM_PropRead.conzM_PropWrite.reqzM_PropWrite.con)é   é.   éü   éû   éö   éõ   ÚreservedZTP1ZPL110ZRFzKNX IP)r4   r5   r8   r>   é   é    ZGroupValueReadZGroupValueRespZGroupValueWriteZIndAddrWriteZIndAddrReadZIndAddrRespZAdcReadZAdcResp)r   r4   r5   r7   r8   r9   r:   r=   ZDEVICEzIP PARAMETER_OBJECT)r   é   ZPID_MANUFACTURER_IDZPID_PROJECT_INSTALLATION_IDZPID_KNX_INDIVIDUAL_ADDRESSZ#PID_ADDITIONAL_INDIVIDUAL_ADDRESSESZ PID_CURRENT_IP_ASSIGNMENT_METHODZPID_IP_ASSIGNMENT_METHODZPID_IP_CAPABILITIESZPID_CURRENT_IP_ADDRESSZPID_CURRENT_SUBNET_MASKZPID_CURRENT_DEFAULT_GATEWAYZPID_IP_ADDRESSZPID_SUBNET_MASKZPID_DEFAULT_GATEWAYZPID_DHCP_BOOTP_SERVERZPID_MAC_ADDRESSZ"PID_SYSTEM_SETUP_MULTICAST_ADDRESSZPID_ROUTING_MULTICAST_ADDRESSZPID_TTLZ PID_KNXNETIP_DEVICE_CAPABILITIESZPID_KNXNETIP_DEVICE_STATEZ!PID_KNXNETIP_ROUTING_CAPABILITIESZPID_PRIORITY_FIFO_ENABLEDZPID_QUEUE_OVERFLOW_TO_IPZPID_QUEUE_OVERFLOW_TO_KNXZPID_MSG_TRANSMIT_TO_IPZPID_MSG_TRANSMIT_TO_KNXZPID_FRIENDLY_NAMEZPID_ROUTING_BUSY_WAIT_TIME)é   é3   é4   é5   é6   é7   é8   é9   é:   é;   é<   é=   é>   é?   é@   éA   éB   éC   éD   éE   éF   éG   éH   éI   éJ   éK   éL   éN   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚKNXAddressFieldc                 C   s2   |d u rd S d|d? d@ |d? d@ |d@ f S d S )Nz%d.%d.%drI   é   r>   r<   © ©ÚselfÚpktÚxrg   rg   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/knx.pyÚi2reprœ   s    zKNXAddressField.i2reprc                 C   sb   t |tƒrTz.tt| d¡ƒ\}}}|d> |d> B |B }W n tyR   t|ƒ‚Y n0 t | ||¡S )NÚ.rI   r>   ©Ú
isinstanceÚstrÚmapÚintÚsplitÚ
ValueErrorr   Úany2i©ri   rj   rk   ÚaÚbÚcrg   rg   rl   rv   ¢   s    
zKNXAddressField.any2iN©Ú__name__Ú
__module__Ú__qualname__rm   rv   rg   rg   rg   rl   re   ›   s   re   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚKNXGroupFieldc                 C   s"   d|d? d@ |d? d@ |d@ f S )Nz%d/%d/%drH   é   r>   r=   r<   rg   rh   rg   rg   rl   rm   ®   s    zKNXGroupField.i2reprc                 C   sb   t |tƒrTz.tt| d¡ƒ\}}}|d> |d> B |B }W n tyR   t|ƒ‚Y n0 t | ||¡S )Nú/rH   r>   ro   rw   rg   rg   rl   rv   ±   s    
zKNXGroupField.any2iNr{   rg   rg   rg   rl   r   ­   s   r   c                   @   s>   e Zd Zd ZeddƒeddeƒeddƒeddƒgZ	dd„ Z
dS )	ÚHPAIÚstructure_lengthNZhost_protocolr4   Ú
ip_addressÚportc                 C   s.   | j d u r&t dt|ƒ¡|dd …  }|| S ©Nú!Br4   ©rƒ   ÚstructÚpackÚlen©ri   ÚpZpayrg   rg   rl   Ú
post_buildÇ   s    
zHPAI.post_build)r|   r}   r~   Únamer   r   ÚHOST_PROTOCOL_CODESr	   r   Úfields_descrŽ   rg   rg   rg   rl   r‚   ¾   s   
ür‚   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚServiceFamilyzService FamilyÚidNÚversion©r|   r}   r~   r�   r   r‘   rg   rg   rg   rl   r’   Î   s   þr’   c                   @   st   e Zd ZdZeddƒeddeƒeddeƒeddƒed	dƒe	d
dƒe
dddƒeddƒeddƒedddƒg
Zdd„ ZdS )ÚDIBDeviceInfozDIB: DEVICE_INFOrƒ   NÚdescription_typer4   Z
knx_mediumr5   Zdevice_statusZknx_addressZproject_installation_identifierZdevice_serial_numberé0   Zdevice_multicast_addressZdevice_mac_addressZdevice_friendly_nameé   c                 C   s.   | j d u r&t dt|ƒ¡|dd …  }|| S r†   rˆ   rŒ   rg   rg   rl   rŽ   è   s    
zDIBDeviceInfo.post_build)r|   r}   r~   r�   r   r   ÚDESCRIPTION_TYPE_CODESÚKNX_MEDIUM_CODESre   r   r   r	   r   r
   r‘   rŽ   rg   rg   rg   rl   r–   Ù   s   



ör–   c                	   @   sL   e Zd ZdZeddƒeddeƒeede	ƒ e	dd„ d�d	d„ ƒgZ
d
d„ ZdS )ÚDIBSuppSvcFamilieszDIB: SUPP_SVC_FAMILIESrƒ   r5   r—   Zservice_familyc                 C   s
   | j d S ©Nr5   ©rƒ   ©rj   rg   rg   rl   Ú<lambda>÷   s    zDIBSuppSvcFamilies.<lambda>©Zlength_fromc                 C   s
   | j dkS r�   rž   rŸ   rg   rg   rl   r    ù   ó    c                 C   s.   | j d u r&t dt|ƒ¡|dd …  }|| S r†   rˆ   rŒ   rg   rg   rl   rŽ   ü   s    
zDIBSuppSvcFamilies.post_buildN)r|   r}   r~   r�   r   r   rš   r   r   r’   r‘   rŽ   rg   rg   rg   rl   rœ   î   s   
ýúýrœ   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚTunnelingConnectionzTunneling ConnectionZ	knx_layerr5   rE   Nr•   rg   rg   rg   rl   r£     s   þr£   c                   @   s   e Zd ZdZeddƒgZdS )ÚCRDTunnelingConnectionzCRD Tunneling ConnectionZknx_individual_addressN)r|   r}   r~   r�   re   r‘   rg   rg   rg   rl   r¤     s   ÿr¤   c                   @   sD   e Zd ZdZeddƒeddeƒeede	ƒ e	ƒdd„ ƒgZ
d	d
„ ZdS )ÚCRIz$CRI (Connection Request Information)rƒ   r5   Úconnection_typer7   Úconnection_datac                 C   s
   | j dkS ©Nr8   ©r¦   rŸ   rg   rg   rl   r      r¢   zCRI.<lambda>c                 C   s.   | j d u r&t dt|ƒ¡|dd …  }|| S r†   rˆ   rŒ   rg   rg   rl   rŽ     s    
zCRI.post_buildN)r|   r}   r~   r�   r   r   ÚCONNECTION_TYPE_CODESr   r   r£   r‘   rŽ   rg   rg   rg   rl   r¥     s   
þýý	r¥   c                   @   sD   e Zd ZdZeddƒeddeƒeede	ƒ e	ƒdd„ ƒgZ
d	d
„ ZdS )ÚCRDzCRD (Connection Response Data)rƒ   r   r¦   r7   r§   c                 C   s
   | j dkS r¨   r©   rŸ   rg   rg   rl   r    ,  r¢   zCRD.<lambda>c                 C   s.   | j d u r&t dt|ƒ¡|dd …  }|| S r†   rˆ   rŒ   rg   rg   rl   rŽ   /  s    
zCRD.post_buildN)r|   r}   r~   r�   r   r   rª   r   r   r¤   r‘   rŽ   rg   rg   rg   rl   r«   $  s   
þýý	r«   c                   @   s  e Zd ZdZeddddd�edddd	„ d
�edddddiƒedddƒedddƒedddddiƒedddddiƒedddƒedddƒedddddiƒedddƒedddƒeddƒe	dd ƒed!ddd"d�ed#dddd"iƒed$dddd%iƒed&ddƒed'dde
ƒed"ddƒgZdS )(ÚLcEMIZL_cEMIÚadditional_information_lengthr   ÚBZadditional_information)ÚfmtZ	length_ofNc                 C   s   | j S )N)r­   rŸ   rg   rg   rl   r    =  r¢   zLcEMI.<lambda>r¡   Z
frame_typer4   ÚstandardZ
reserved_1Zrepeat_on_errorZbroadcast_typeÚdomainÚpriorityr7   r5   ÚlowZack_requestZconfirmation_errorZaddress_typeÚgroupZ	hop_countr:   Zextended_frame_formatr8   Úsource_addressZdestination_addressz1/2/3Znpdu_lengthÚdataZpacket_typeZsequence_typeZ
unnumberedZ
reserved_2Zacpi)r|   r}   r~   r�   r   r   r   r   re   r   ÚKNX_ACPI_CODESr‘   rg   rg   rg   rl   r¬   7  sL   ÿÿÿ

ÿÿ

ÿ

ÿÿ

Ûr¬   c                   @   s@   e Zd ZdZeddƒeddƒeddƒedddƒed	dd
ƒgZdS )ÚDPcEMIZDP_cEMIZobject_typeNZobject_instancer4   Zproperty_idZnumber_of_elementsr8   Ústart_indexrI   )r|   r}   r~   r�   r   r   r   r‘   rg   rg   rg   rl   r¸   c  s   

úr¸   c                   @   s¨   e Zd Zd Zeddeƒeedeƒ eƒdd„ fedeƒ eƒdd„ fede	ƒ e	ƒdd„ fede	ƒ e	ƒdd„ fede	ƒ e	ƒd	d„ fede	ƒ e	ƒd
d„ fgedeƒ eƒƒgZ
dS )ÚCEMIÚmessage_codeNZ	cemi_datac                 C   s
   | j dkS )Nr?   ©r»   rŸ   rg   rg   rl   r    v  r¢   zCEMI.<lambda>c                 C   s
   | j dkS )Nr@   r¼   rŸ   rg   rg   rl   r    x  r¢   c                 C   s
   | j dkS )NrA   r¼   rŸ   rg   rg   rl   r    z  r¢   c                 C   s
   | j dkS )NrB   r¼   rŸ   rg   rg   rl   r    |  r¢   c                 C   s
   | j dkS )NrC   r¼   rŸ   rg   rg   rl   r    ~  r¢   c                 C   s
   | j dkS )NrD   r¼   rŸ   rg   rg   rl   r    €  r¢   )r|   r}   r~   r�   r   ÚMESSAGE_CODESr   r   r¬   r¸   r‘   rg   rg   rg   rl   rº   o  s2   
ÿÿÿÿÿÿõñþrº   c                   @   s    e Zd ZdZedeƒ eƒgZdS )ÚKNXSearchRequest)r   Zdiscovery_endpointN©r|   r}   r~   r�   r   r‚   r‘   rg   rg   rg   rl   r¾   Š  s   ÿr¾   c                   @   s8   e Zd ZdZedeƒ eƒedeƒ eƒedeƒ eƒgZdS )ÚKNXSearchResponse)r   Úcontrol_endpointÚdevice_infoÚsupported_service_familiesN)	r|   r}   r~   r�   r   r‚   r–   rœ   r‘   rg   rg   rg   rl   rÀ   ’  s   ÿýrÀ   c                   @   s    e Zd ZdZedeƒ eƒgZdS )ÚKNXDescriptionRequestr   rÁ   Nr¿   rg   rg   rg   rl   rÄ   �  s   ÿrÄ   c                   @   s,   e Zd ZdZedeƒ eƒedeƒ eƒgZdS )ÚKNXDescriptionResponser   rÂ   rÃ   N)r|   r}   r~   r�   r   r–   rœ   r‘   rg   rg   rg   rl   rÅ   ¥  s   ÿþrÅ   c                   @   s8   e Zd ZdZedeƒ eƒedeƒ eƒedeƒ eƒgZdS )ÚKNXConnectRequestr   rÁ   Údata_endpointZconnection_request_informationN)r|   r}   r~   r�   r   r‚   r¥   r‘   rg   rg   rg   rl   rÆ   ²  s
   ýrÆ   c                   @   s<   e Zd ZdZeddƒeddƒedeƒ eƒedeƒ eƒgZdS )ÚKNXConnectResponser   Úcommunication_channel_idNÚstatusrÇ   Zconnection_response_data_block)	r|   r}   r~   r�   r   r   r‚   r«   r‘   rg   rg   rg   rl   rÈ   ¼  s   ürÈ   c                   @   s0   e Zd ZdZeddƒeddƒedeƒ eƒgZdS )ÚKNXConnectionstateRequestr   rÉ   NrE   rÁ   ©r|   r}   r~   r�   r   r   r‚   r‘   rg   rg   rg   rl   rË   Ç  s
   ýrË   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚKNXConnectionstateResponser   rÉ   NrÊ   r   r•   rg   rg   rg   rl   rÍ   Ñ  s   þrÍ   c                   @   s0   e Zd ZdZeddƒeddƒedeƒ eƒgZdS )ÚKNXDisconnectRequestr    rÉ   r4   rE   NrÁ   rÌ   rg   rg   rg   rl   rÎ   Ú  s
   ýrÎ   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚKNXDisconnectResponser!   rÉ   NrÊ   r   r•   rg   rg   rg   rl   rÏ   ä  s   þrÏ   c                   @   sH   e Zd ZdZeddƒeddƒeddƒeddƒed	eƒ eƒgZd
d„ ZdS )ÚKNXConfigurationRequestr"   rƒ   r8   rÉ   r4   Úsequence_counterNrE   Úcemic                 C   s6   | j d u r.t dt|d d… ƒ¡|dd …  }|| S ©Nr‡   r8   r4   rˆ   rŒ   rg   rg   rl   rŽ   ÷  s    
$z"KNXConfigurationRequest.post_build©	r|   r}   r~   r�   r   r   rº   r‘   rŽ   rg   rg   rg   rl   rÐ   í  s   ûrÐ   c                   @   s<   e Zd ZdZeddƒeddƒeddƒeddƒgZdd	„ ZdS )
ÚKNXConfigurationACKr#   rƒ   NrÉ   r4   rÑ   rÊ   c                 C   s.   | j d u r&t dt|ƒ¡|dd …  }|| S r†   rˆ   rŒ   rg   rg   rl   rŽ     s    
zKNXConfigurationACK.post_build©r|   r}   r~   r�   r   r‘   rŽ   rg   rg   rg   rl   rÕ   þ  s   ürÕ   c                   @   sH   e Zd ZdZeddƒeddƒeddƒeddƒed	eƒ eƒgZd
d„ ZdS )ÚKNXTunnelingRequestr$   rƒ   r8   rÉ   r4   rÑ   NrE   rÒ   c                 C   s6   | j d u r.t dt|d d… ƒ¡|dd …  }|| S rÓ   rˆ   rŒ   rg   rg   rl   rŽ     s    
$zKNXTunnelingRequest.post_buildrÔ   rg   rg   rg   rl   r×     s   ûr×   c                   @   s<   e Zd ZdZeddƒeddƒeddƒeddƒgZdd	„ ZdS )
ÚKNXTunnelingACKr%   rƒ   NrÉ   r4   rÑ   rÊ   c                 C   s.   | j d u r&t dt|ƒ¡|dd …  }|| S r†   rˆ   rŒ   rg   rg   rl   rŽ   (  s    
zKNXTunnelingACK.post_buildrÖ   rg   rg   rg   rl   rØ     s   ürØ   c                   @   s>   e Zd ZdZeddƒeddƒeddeƒeddƒgZ	dd	„ Z
dS )
ÚKNXz	KNXnet/IPÚheader_lengthNZprotocol_versionrF   Úservice_identifierÚtotal_lengthc                 C   s\   | j d u r&t dt|ƒ¡|dd …  }| jd u rT|d d… t dt|ƒt|ƒ ¡ }|| S )Nr‡   r4   éþÿÿÿz!H)rÚ   r‰   rŠ   r‹   rÜ   rŒ   rg   rg   rl   rŽ   =  s
    

$zKNX.post_build)r|   r}   r~   r�   r   r   r   ÚSERVICE_IDENTIFIER_CODESr   r‘   rŽ   rg   rg   rg   rl   rÙ   4  s   
ürÙ   iW  )Údport)Úsport)rà   rß   r&   )rÛ   r'   r(   r)   r*   r+   r,   r-   r/   r.   r0   r1   r2   r3   )@Ú__doc__r‰   Zscapy.fieldsr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Zscapy.packetr   r   r   r   Zscapy.layers.inetr   rÞ   r�   rš   rª   r½   r›   r·   ZCEMI_OBJECT_TYPESZCEMI_PROPERTIESre   r   r‚   r’   r–   rœ   r£   r¤   r¥   r«   r¬   r¸   rº   r¾   rÀ   rÄ   rÅ   rÆ   rÈ   rË   rÍ   rÎ   rÏ   rÐ   rÕ   r×   rØ   rÙ   rg   rg   rg   rl   Ú<module>   sD  Lòþøû
úúøþä#,

	
	























