Home | History | Annotate | Download | only in contrib
      1 from enum import test
      2 % LLDP test campaign
      3 
      4 #
      5 # execute test:
      6 # > test/run_tests -P "load_contrib('lldp')" -t scapy/contrib/lldp.uts
      7 #
      8 
      9 + Basic layer handling
     10 = build basic LLDP frames
     11 
     12 frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/ \
     13       LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
     14       LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\
     15       LLDPDUTimeToLive()/\
     16       LLDPDUSystemName(system_name='mate')/\
     17       LLDPDUSystemCapabilities(telephone_available=1, router_available=1, telephone_enabled=1)/\
     18       LLDPDUManagementAddress(
     19             management_address_subtype=LLDPDUManagementAddress.SUBTYPE_MANAGEMENT_ADDRESS_IPV4,
     20             management_address='1.2.3.4',
     21             interface_numbering_subtype=LLDPDUManagementAddress.SUBTYPE_INTERFACE_NUMBER_IF_INDEX,
     22             interface_number=23,
     23             object_id='abcd') / \
     24       LLDPDUEndOfLLDPDU()
     25 
     26 frm = frm.build()
     27 frm = Ether(frm)
     28 
     29 = add padding if required
     30 
     31 conf.contribs['LLDP'].strict_mode_disable()
     32 frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC) / \
     33       LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_INTERFACE_NAME, id='eth0') / \
     34       LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
     35       LLDPDUTimeToLive() / \
     36       LLDPDUEndOfLLDPDU()
     37 assert(len(raw(frm)) == 60)
     38 assert(len(raw(Ether(raw(frm))[Padding])) == 24)
     39 
     40 frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC) / \
     41       LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_INTERFACE_NAME, id='eth012345678901234567890123') / \
     42       LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
     43       LLDPDUTimeToLive() / \
     44       LLDPDUEndOfLLDPDU()
     45 assert (len(raw(frm)) == 60)
     46 assert (len(raw(Ether(raw(frm))[Padding])) == 1)
     47 
     48 frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC) / \
     49       LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_INTERFACE_NAME, id='eth0123456789012345678901234') / \
     50       LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
     51       LLDPDUTimeToLive() / \
     52       LLDPDUEndOfLLDPDU()
     53 assert (len(raw(frm)) == 60)
     54 try:
     55       Ether(raw(frm))[Padding]
     56       assert False
     57 except IndexError:
     58       pass
     59 
     60 
     61 + strict mode handling - build
     62 = basic frame structure
     63 
     64 conf.contribs['LLDP'].strict_mode_enable()
     65 
     66 # invalid lenght in LLDPDUEndOfLLDPDU
     67 try:
     68       frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU(_length=8)
     69       frm.build()
     70       assert False
     71 except LLDPInvalidLengthField:
     72       pass
     73 
     74 # missing chassis id
     75 try:
     76       frm = Ether()/LLDPDUChassisID()/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU()
     77       frm.build()
     78       assert False
     79 except LLDPInvalidLengthField:
     80       pass
     81 
     82 # missing management address
     83 try:
     84       frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUManagementAddress()/LLDPDUEndOfLLDPDU()
     85       frm.build()
     86       assert False
     87 except LLDPInvalidLengthField:
     88       pass
     89 
     90 + strict mode handling - dissect
     91 = basic frame structure
     92 
     93 conf.contribs['LLDP'].strict_mode_enable()
     94 # missing PortIDTLV
     95 try:
     96       frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
     97       Ether(frm.build())
     98       assert False
     99 except LLDPInvalidFrameStructure:
    100       pass
    101 
    102 # invalid order
    103 try:
    104       frm = Ether() / LLDPDUPortID(id='42') / LLDPDUChassisID(id='slartibart') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
    105       Ether(frm.build())
    106       assert False
    107 except LLDPInvalidFrameStructure:
    108       pass
    109 
    110 # layer LLDPDUPortID occures twice
    111 try:
    112       frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUPortID(id='23')  / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
    113       Ether(frm.build())
    114       assert False
    115 except LLDPInvalidFrameStructure:
    116       pass
    117 
    118 # missing LLDPDUEndOfLLDPDU
    119 try:
    120       frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / \
    121             LLDPDUPortID(id='23') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
    122       Ether(frm.build())
    123       assert False
    124 except LLDPInvalidFrameStructure:
    125       pass
    126 
    127 conf.contribs['LLDP'].strict_mode_disable()
    128 frm = Ether()/LLDPDUChassisID()/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU()
    129 frm = Ether(frm.build())
    130 
    131 = length fields / value sizes checks
    132 
    133 conf.contribs['LLDP'].strict_mode_enable()
    134 # missing chassis id => invalid length
    135 try:
    136       frm = Ether() / LLDPDUChassisID() / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
    137       Ether(frm.build())
    138       assert False
    139 except LLDPInvalidLengthField:
    140       pass
    141 
    142 # invalid lenght in LLDPDUEndOfLLDPDU
    143 try:
    144       frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU(_length=8)
    145       Ether(frm.build())
    146       assert False
    147 except LLDPInvalidLengthField:
    148       pass
    149 
    150 # invalid management address
    151 try:
    152       frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUManagementAddress() / LLDPDUEndOfLLDPDU()
    153       Ether(frm.build())
    154       assert False
    155 except LLDPInvalidLengthField:
    156       pass
    157 
    158 conf.contribs['LLDP'].strict_mode_disable()
    159 
    160 frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
    161 frm = Ether(frm.build())
    162 
    163 frm = Ether() / LLDPDUChassisID() / LLDPDUPortID() / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU(_length=8)
    164 frm = Ether(frm.build())
    165 
    166 = test attribute values
    167 
    168 conf.contribs['LLDP'].strict_mode_enable()
    169 
    170 frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/ \
    171       LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
    172       LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\
    173       LLDPDUTimeToLive()/\
    174       LLDPDUSystemName(system_name='things will')/\
    175       LLDPDUSystemCapabilities(telephone_available=1,
    176                                router_available=1,
    177                                telephone_enabled=1,
    178                                router_enabled=1)/\
    179       LLDPDUManagementAddress(
    180             management_address_subtype=LLDPDUManagementAddress.SUBTYPE_MANAGEMENT_ADDRESS_IPV4,
    181             management_address='1.2.3.4',
    182             interface_numbering_subtype=LLDPDUManagementAddress.SUBTYPE_INTERFACE_NUMBER_IF_INDEX,
    183             interface_number=23,
    184             object_id='burn') / \
    185       LLDPDUSystemDescription(description='without tests.') / \
    186       LLDPDUPortDescription(description='always!') / \
    187       LLDPDUEndOfLLDPDU()
    188 
    189 frm = Ether(frm.build())
    190 
    191 assert str2mac(frm[LLDPDUChassisID].id) == '06:05:04:03:02:01'
    192 assert str2mac(frm[LLDPDUPortID].id) == '01:02:03:04:05:06'
    193 sys_capabilities = frm[LLDPDUSystemCapabilities]
    194 assert sys_capabilities.reserved_5_available == 0
    195 assert sys_capabilities.reserved_4_available == 0
    196 assert sys_capabilities.reserved_3_available == 0
    197 assert sys_capabilities.reserved_2_available == 0
    198 assert sys_capabilities.reserved_1_available == 0
    199 assert sys_capabilities.two_port_mac_relay_available == 0
    200 assert sys_capabilities.s_vlan_component_available == 0
    201 assert sys_capabilities.c_vlan_component_available == 0
    202 assert sys_capabilities.station_only_available == 0
    203 assert sys_capabilities.docsis_cable_device_available == 0
    204 assert sys_capabilities.telephone_available == 1
    205 assert sys_capabilities.router_available == 1
    206 assert sys_capabilities.wlan_access_point_available == 0
    207 assert sys_capabilities.mac_bridge_available == 0
    208 assert sys_capabilities.repeater_available == 0
    209 assert sys_capabilities.other_available == 0
    210 assert sys_capabilities.reserved_5_enabled == 0
    211 assert sys_capabilities.reserved_4_enabled == 0
    212 assert sys_capabilities.reserved_3_enabled == 0
    213 assert sys_capabilities.reserved_2_enabled == 0
    214 assert sys_capabilities.reserved_1_enabled == 0
    215 assert sys_capabilities.two_port_mac_relay_enabled == 0
    216 assert sys_capabilities.s_vlan_component_enabled == 0
    217 assert sys_capabilities.c_vlan_component_enabled == 0
    218 assert sys_capabilities.station_only_enabled == 0
    219 assert sys_capabilities.docsis_cable_device_enabled == 0
    220 assert sys_capabilities.telephone_enabled == 1
    221 assert sys_capabilities.router_enabled == 1
    222 assert sys_capabilities.wlan_access_point_enabled == 0
    223 assert sys_capabilities.mac_bridge_enabled == 0
    224 assert sys_capabilities.repeater_enabled == 0
    225 assert sys_capabilities.other_enabled == 0
    226 assert frm[LLDPDUManagementAddress].management_address == b'1.2.3.4'
    227 assert frm[LLDPDUSystemName].system_name == b'things will'
    228 assert frm[LLDPDUManagementAddress].object_id == b'burn'
    229 assert frm[LLDPDUSystemDescription].description == b'without tests.'
    230 assert frm[LLDPDUPortDescription].description == b'always!'
    231