scapy.layers.sixlowpan

6LoWPAN Protocol Stack

This implementation follows the next documents:

  • Transmission of IPv6 Packets over IEEE 802.15.4 Networks: RFC 4944

  • Compression Format for IPv6 Datagrams in Low Power and Lossy networks (6LoWPAN): RFC 6282

  • RFC 4291

Application

Application Protocols

Transport

UDP

TCP

Network

IPv6

LoWPAN

Data Link Layer

IEEE 802.15.4 MAC

Physical

IEEE 802.15.4 PHY

Note that:

  • Only IPv6 is supported

  • LoWPAN is in the middle between network and data link layer

The Internet Control Message protocol v6 (ICMPv6) is used for control messaging.

Adaptation between full IPv6 and the LoWPAN format is performed by routers at the edge of 6LoWPAN islands.

A LoWPAN support addressing; a direct mapping between the link-layer address and the IPv6 address is used for achieving compression.

Known Issues:
  • Unimplemented context information

  • Unimplemented IPv6 extensions fields

class scapy.layers.sixlowpan.IP6FieldLenField(name, default, length_of=None)

Bases: scapy.fields.IP6Field

addfield(pkt, s, val)

Add an internal value to a string

getfield(pkt, s)
length_of
class scapy.layers.sixlowpan.LoWPANBroadcast(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    RESERVED   |      SEQ      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                       Fig. LoWPANBroadcast                       
LoWPANBroadcast fields

reserved

ByteField

80

seq

ByteField

0

payload_guess

Possible sublayers: SixLoWPAN

class scapy.layers.sixlowpan.LoWPANFragmentationFirst(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RESERVED|     DATAGRAMSIZE    |          DATAGRAMTAG          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                  Fig. LoWPANFragmentationFirst                   
LoWPANFragmentationFirst fields

reserved

BitField (5 bits)

24

datagramSize

BitField (11 bits)

0

datagramTag

XShortField

0

payload_guess

Possible sublayers: SixLoWPAN

class scapy.layers.sixlowpan.LoWPANFragmentationSubsequent(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RESERVED|     DATAGRAMSIZE    |          DATAGRAMTAG          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DATAGRAMOFFSET|
+-+-+-+-+-+-+-+-+

                Fig. LoWPANFragmentationSubsequent                
LoWPANFragmentationSubsequent fields

reserved

BitField (5 bits)

28

datagramSize

BitField (11 bits)

0

datagramTag

XShortField

<RandShort>

datagramOffset

ByteField

0

class scapy.layers.sixlowpan.LoWPANMesh(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
deprecated_fields = {'_destinyAddr': ('dst', '2.4.4'), '_f': ('f', '2.4.4'), '_sourceAddr': ('src', '2.4.4'), '_v': ('v', '2.4.4')}
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|RES|V|F|HOPSLEF|                      SRC                      |
+-+-+-+-+-+-+                                                   +
|                                                               |
+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |                      DST                      |
+-+-+-+-+-+-+-+-+                                               +
|                                                               |
+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |
+-+-+-+-+-+-+-+-+

                         Fig. LoWPANMesh                          
LoWPANMesh fields

reserved

BitField (2 bits)

2

v

BitEnumField (1 bit)

0

f

BitEnumField (1 bit)

0

hopsLeft

BitField (4 bits)

0

src

MultipleTypeField

None

dst

MultipleTypeField

None

payload_guess

Possible sublayers: SixLoWPAN

class scapy.layers.sixlowpan.LoWPANUncompressedIPv6(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
default_payload_class(pay)
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      TYPE     |
+-+-+-+-+-+-+-+-+

                   Fig. LoWPANUncompressedIPv6                    
LoWPANUncompressedIPv6 fields

_type

BitField (8 bits)

65

class scapy.layers.sixlowpan.LoWPAN_HC1(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
decompressDestAddr()
decompressSourceAddr()
do_build()
do_build_payload()
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    RESERVED   |S|S|D|D|T| NH|H|            HC2FIELD           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    HOPLIMIT   |                      SRC                      |
+-+-+-+-+-+-+-+-+                                               +
|                                                               |
+                                                               +
|                                                               |
+                                                               +
|                                                               |
+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |                      DST                      |
+-+-+-+-+-+-+-+-+                                               +
|                                                               |
+                                                               +
|                                                               |
+                                                               +
|                                                               |
+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               | TRAFFIC CLASS |           FLOW LABEL          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       |         UDPSOURCEPORT         |      UDPDESTPORT      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       |           UDPLENGTH           |      UDPCHECKSUM      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       |PA|
+-+-+-+-+

                         Fig. LoWPAN_HC1                          
LoWPAN_HC1 fields

reserved

ByteField

66

sp

BitEnumField (1 bit)

0

si

BitEnumField (1 bit)

0

dp

BitEnumField (1 bit)

0

di

BitEnumField (1 bit)

0

tc_fl

BitEnumField (1 bit)

0

nh

BitEnumField (2 bits)

0

hc2

BitEnumField (1 bit)

0

hc2Field

MultipleTypeField (Cond)

None

hopLimit

ByteField

0

src

IP6FieldLenField

'::'

dst

IP6FieldLenField

'::'

traffic_class

ByteField (Cond)

0

flow_label

BitField (Cond) (20 bits)

0

udpSourcePort

MultipleTypeField (Cond)

None

udpDestPort

MultipleTypeField (Cond)

None

udpLength

BitField (Cond) (16 bits)

0

udpChecksum

XBitField (Cond) (16 bits)

0

pad

BitFixedLenField (0 bit)

0

payload_guess

Possible sublayers: IPv6

post_dissect(data)
class scapy.layers.sixlowpan.LoWPAN_HC2_UDP(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
default_payload_class(payload)
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|S|D|L|   RES   |
+-+-+-+-+-+-+-+-+

                       Fig. LoWPAN_HC2_UDP                        
LoWPAN_HC2_UDP fields

sc

BitEnumField (1 bit)

0

dc

BitEnumField (1 bit)

0

lc

BitEnumField (1 bit)

0

res

BitField (5 bits)

0

class scapy.layers.sixlowpan.LoWPAN_IPHC(*args, **kargs)

Bases: scapy.packet.Packet

6LoWPAN IPv6 header compressed packets

It follows the implementation of RFC6282

aliastypes
compressDestAddr(ipv6)
compressSourceAddr(ipv6)
decompressDestAddr(packet)
decompressSourceAddr(packet)
deprecated_fields = {'_hopLimit': ('hopLimit', '2.4.4'), '_nhField': ('nhField', '2.4.4'), 'destinyAddr': ('dst', '2.4.4'), 'sourceAddr': ('src', '2.4.4'), 'udpDestinyPort': ('udpDestPort', '2.4.4')}
do_build()
do_build_payload()
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RESE| TF|N|HLI|C|S|SAM|M|D|DAM|  SCI  |  DCI  |TC |  TC DSCP  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|RSV|               FLOWLABEL               |    NHFIELD    |HOP|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           |                        SRC                        |
+-+-+-+-+-+-+                                                   +
|                                                               |
+                                                               +
|                                                               |
+                                                               +
|                                                               |
+           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           |                        DST                        |
+-+-+-+-+-+-+                                                   +
|                                                               |
+                                                               +
|                                                               |
+                                                               +
|                                                               |
+           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           |
+-+-+-+-+-+-+

                         Fig. LoWPAN_IPHC                         
LoWPAN_IPHC fields

_reserved

BitField (3 bits)

3

tf

BitField (2 bits)

0

nh

BitEnumField (1 bit)

0

hlim

BitEnumField (2 bits)

0

cid

BitEnumField (1 bit)

0

sac

BitEnumField (1 bit)

0

sam

BitEnumField (2 bits)

0

m

BitEnumField (1 bit)

0

dac

BitEnumField (1 bit)

0

dam

BitEnumField (2 bits)

0

sci

BitField (Cond) (4 bits)

0

dci

BitField (Cond) (4 bits)

0

tc_ecn

BitField (Cond) (2 bits)

0

tc_dscp

BitField (Cond) (6 bits)

0

rsv

MultipleTypeField (Cond)

None

flowlabel

BitField (Cond) (20 bits)

0

nhField

ByteEnumField (Cond)

0

hopLimit

ByteField (Cond)

0

src

IP6FieldLenField

'::'

dst

IP6FieldLenField

'::'

guess_payload_class(payload)
post_dissect(data)

dissect the IPv6 package compressed into this IPHC packet.

The packet payload needs to be decompressed and depending on the arguments, several conversions should be done.

class scapy.layers.sixlowpan.LoWPAN_NHC(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
do_build()
do_build_payload()
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              EXTS             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                         Fig. LoWPAN_NHC                          
LoWPAN_NHC fields

exts

PacketListField

[]

guess_payload_class(payload)
post_dissect(data)
class scapy.layers.sixlowpan.LoWPAN_NHC_Hdr(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
classmethod dispatch_hook(_pkt=b'', *args, **kargs)
extract_padding(s)
classmethod get_next_cls(s)
class scapy.layers.sixlowpan.LoWPAN_NHC_IPv6Ext(*args, **kargs)

Bases: scapy.layers.sixlowpan.LoWPAN_NHC_Hdr

aliastypes
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  RES  | EID |N|    NHFIELD    |      LEN      |      DATA     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |
+-+-+-+-+-+-+-+-+

                     Fig. LoWPAN_NHC_IPv6Ext                      
LoWPAN_NHC_IPv6Ext fields

res

BitField (4 bits)

14

eid

BitEnumField (3 bits)

0

nh

BitField (1 bit)

0

nhField

ByteField (Cond)

0

len

FieldLenField

None

data

StrFixedLenField

b''

post_build(p, pay)
class scapy.layers.sixlowpan.LoWPAN_NHC_UDP(*args, **kargs)

Bases: scapy.layers.sixlowpan.LoWPAN_NHC_Hdr

aliastypes
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   RES   |C| P |         UDPSOURCEPORT         |  UDPDESTPORT  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |          UDPCHECKSUM          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                       Fig. LoWPAN_NHC_UDP                        
LoWPAN_NHC_UDP fields

res

BitField (5 bits)

30

C

BitField (1 bit)

0

P

BitField (2 bits)

0

udpSourcePort

MultipleTypeField

None

udpDestPort

MultipleTypeField

None

udpChecksum

XShortField (Cond)

0

class scapy.layers.sixlowpan.SixLoWPAN(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
classmethod dispatch_hook(_pkt=b'', *args, **kargs)

Depending on the payload content, the frame type we should interpretate

class scapy.layers.sixlowpan.SixLoWPAN_ESC(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
fields_desc
Display RFC-like schema
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    DISPATCH   |
+-+-+-+-+-+-+-+-+

                        Fig. SixLoWPAN_ESC                        
SixLoWPAN_ESC fields

dispatch

ByteField

0

scapy.layers.sixlowpan.dest_addr_size(pkt)

Destination address size

This function depending on the arguments returns the amount of bits to be used by the destination address.

Keyword arguments: pkt – packet object instance

scapy.layers.sixlowpan.sixlowpan_defragment(packet_list)
scapy.layers.sixlowpan.sixlowpan_fragment(packet, datagram_tag=1)

Split a packet into different links to transmit as 6lowpan packets. Usage example:

>>> ipv6 = ..... (very big packet)
>>> pkts = sixlowpan_fragment(ipv6, datagram_tag=0x17)
>>> send = [Dot15d4()/Dot15d4Data()/x for x in pkts]
>>> wireshark(send)
scapy.layers.sixlowpan.source_addr_size(pkt)

Source address size

This function depending on the arguments returns the amount of bits to be used by the source address.

Keyword arguments: pkt – packet object instance