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)[source]

Bases: IP6Field

addfield(pkt, s, val)[source]

Add an internal value to a string

getfield(pkt, s)[source]
length_of
class scapy.layers.sixlowpan.LoWPANBroadcast(_pkt, /, *, reserved=80, seq=0)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPANBroadcast'>, <class 'scapy.packet.Packet'>]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<ByteField (LoWPANBroadcast).reserved>, <ByteField (LoWPANBroadcast).seq>]
payload_guess: List[Tuple[Dict[str, Any], Type[Packet]]] = [({}, <class 'scapy.layers.sixlowpan.SixLoWPAN'>)]
class scapy.layers.sixlowpan.LoWPANFragmentationFirst(_pkt, /, *, reserved=24, datagramSize=0, datagramTag=0)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPANFragmentationFirst'>, <class 'scapy.packet.Packet'>]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<BitField (LoWPANFragmentationFirst).reserved>, <BitField (LoWPANFragmentationFirst).datagramSize>, <XShortField (LoWPANFragmentationFirst).datagramTag>]
payload_guess: List[Tuple[Dict[str, Any], Type[Packet]]] = [({}, <class 'scapy.layers.sixlowpan.SixLoWPAN'>)]
class scapy.layers.sixlowpan.LoWPANFragmentationSubsequent(_pkt, /, *, reserved=28, datagramSize=0, datagramTag=<RandShort>, datagramOffset=0)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPANFragmentationSubsequent'>, <class 'scapy.packet.Packet'>]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<BitField (LoWPANFragmentationSubsequent).reserved>, <BitField (LoWPANFragmentationSubsequent).datagramSize>, <XShortField (LoWPANFragmentationSubsequent).datagramTag>, <ByteField (LoWPANFragmentationSubsequent).datagramOffset>]
class scapy.layers.sixlowpan.LoWPANMesh(_pkt, /, *, reserved=2, v=0, f=0, hopsLeft=0, src=None, dst=None)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPANMesh'>, <class 'scapy.packet.Packet'>]
deprecated_fields: Dict[str, Tuple[str, str]] = {'_destinyAddr': ('dst', '2.4.4'), '_f': ('f', '2.4.4'), '_sourceAddr': ('src', '2.4.4'), '_v': ('v', '2.4.4')}
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<BitField (LoWPANMesh).reserved>, <BitEnumField (LoWPANMesh).v>, <BitEnumField (LoWPANMesh).f>, <BitField (LoWPANMesh).hopsLeft>, <scapy.fields.MultipleTypeField object>, <scapy.fields.MultipleTypeField object>]
payload_guess: List[Tuple[Dict[str, Any], Type[Packet]]] = [({}, <class 'scapy.layers.sixlowpan.SixLoWPAN'>)]
class scapy.layers.sixlowpan.LoWPANUncompressedIPv6(_pkt, /, *, _type=65)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPANUncompressedIPv6'>, <class 'scapy.packet.Packet'>]
default_payload_class(pay)[source]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<BitField (LoWPANUncompressedIPv6)._type>]
class scapy.layers.sixlowpan.LoWPAN_HC1(_pkt, /, *, reserved=66, sp=0, si=0, dp=0, di=0, tc_fl=0, nh=0, hc2=0, hc2Field=None, hopLimit=0, src='::', dst='::', traffic_class=0, flow_label=0, udpSourcePort=None, udpDestPort=None, udpLength=0, udpChecksum=0, pad=0)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_HC1'>, <class 'scapy.packet.Packet'>]
decompressDestAddr()[source]
decompressSourceAddr()[source]
do_build()[source]
do_build_payload()[source]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<ByteField (LoWPAN_HC1).reserved>, <BitEnumField (LoWPAN_HC1).sp>, <BitEnumField (LoWPAN_HC1).si>, <BitEnumField (LoWPAN_HC1).dp>, <BitEnumField (LoWPAN_HC1).di>, <BitEnumField (LoWPAN_HC1).tc_fl>, <BitEnumField (LoWPAN_HC1).nh>, <BitEnumField (LoWPAN_HC1).hc2>, <scapy.fields.ConditionalField object>, <ByteField (LoWPAN_HC1).hopLimit>, <IP6FieldLenField (LoWPAN_HC1).src>, <IP6FieldLenField (LoWPAN_HC1).dst>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <BitLenField (LoWPAN_HC1).pad>]
payload_guess: List[Tuple[Dict[str, Any], Type[Packet]]] = [({}, <class 'scapy.layers.inet6.IPv6'>)]
post_dissect(data)[source]
class scapy.layers.sixlowpan.LoWPAN_HC2_UDP(_pkt, /, *, sc=0, dc=0, lc=0, res=0)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_HC2_UDP'>, <class 'scapy.packet.Packet'>]
default_payload_class(payload)[source]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<BitEnumField (LoWPAN_HC2_UDP).sc>, <BitEnumField (LoWPAN_HC2_UDP).dc>, <BitEnumField (LoWPAN_HC2_UDP).lc>, <BitField (LoWPAN_HC2_UDP).res>]
class scapy.layers.sixlowpan.LoWPAN_IPHC(_pkt, /, *, _reserved=3, tf=0, nh=0, hlim=0, cid=0, sac=0, sam=0, m=0, dac=0, dam=0, sci=0, dci=0, tc_ecn=0, tc_dscp=0, rsv=None, flowlabel=0, nhField=0, hopLimit=0, src='::', dst='::')[source]

Bases: Packet

6LoWPAN IPv6 header compressed packets

It follows the implementation of RFC6282

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_IPHC'>, <class 'scapy.packet.Packet'>]
compressDestAddr(ipv6)[source]
compressSourceAddr(ipv6)[source]
decompressDestAddr(packet)[source]
decompressSourceAddr(packet)[source]
deprecated_fields: Dict[str, Tuple[str, str]] = {'_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()[source]
do_build_payload()[source]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<BitField (LoWPAN_IPHC)._reserved>, <BitField (LoWPAN_IPHC).tf>, <BitEnumField (LoWPAN_IPHC).nh>, <BitEnumField (LoWPAN_IPHC).hlim>, <BitEnumField (LoWPAN_IPHC).cid>, <BitEnumField (LoWPAN_IPHC).sac>, <BitEnumField (LoWPAN_IPHC).sam>, <BitEnumField (LoWPAN_IPHC).m>, <BitEnumField (LoWPAN_IPHC).dac>, <BitEnumField (LoWPAN_IPHC).dam>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <IP6FieldLenField (LoWPAN_IPHC).src>, <IP6FieldLenField (LoWPAN_IPHC).dst>]
guess_payload_class(payload)[source]
post_dissect(data)[source]

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(_pkt, /, *, exts=[])[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_NHC'>, <class 'scapy.packet.Packet'>]
do_build()[source]
do_build_payload()[source]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<PacketListField (LoWPAN_NHC).exts>]
guess_payload_class(payload)[source]
post_dissect(data)[source]
class scapy.layers.sixlowpan.LoWPAN_NHC_Hdr(_pkt, /)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_NHC_Hdr'>, <class 'scapy.packet.Packet'>]
classmethod dispatch_hook(_pkt=b'', *args, **kargs)[source]
extract_padding(s)[source]
classmethod get_next_cls(s)[source]
class scapy.layers.sixlowpan.LoWPAN_NHC_IPv6Ext(_pkt, /, *, res=14, eid=0, nh=0, nhField=0, len=None, data=b'')[source]

Bases: LoWPAN_NHC_Hdr

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_NHC_IPv6Ext'>, <class 'scapy.layers.sixlowpan.LoWPAN_NHC_Hdr'>, <class 'scapy.packet.Packet'>]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<BitField (LoWPAN_NHC_IPv6Ext).res>, <BitEnumField (LoWPAN_NHC_IPv6Ext).eid>, <BitField (LoWPAN_NHC_IPv6Ext).nh>, <scapy.fields.ConditionalField object>, <FieldLenField (LoWPAN_NHC_IPv6Ext).len>, <StrFixedLenField (LoWPAN_NHC_IPv6Ext).data>]
post_build(p, pay)[source]
class scapy.layers.sixlowpan.LoWPAN_NHC_UDP(_pkt, /, *, res=30, C=0, P=0, udpSourcePort=None, udpDestPort=None, udpChecksum=0)[source]

Bases: LoWPAN_NHC_Hdr

aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_NHC_UDP'>, <class 'scapy.layers.sixlowpan.LoWPAN_NHC_Hdr'>, <class 'scapy.packet.Packet'>]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<BitField (LoWPAN_NHC_UDP).res>, <BitField (LoWPAN_NHC_UDP).C>, <BitField (LoWPAN_NHC_UDP).P>, <scapy.fields.MultipleTypeField object>, <scapy.fields.MultipleTypeField object>, <scapy.fields.ConditionalField object>]
class scapy.layers.sixlowpan.SixLoWPAN(_pkt, /)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.SixLoWPAN'>, <class 'scapy.packet.Packet'>]
classmethod dispatch_hook(_pkt=b'', *args, **kargs)[source]

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

class scapy.layers.sixlowpan.SixLoWPAN_ESC(_pkt, /, *, dispatch=0)[source]

Bases: Packet

aliastypes = [<class 'scapy.layers.sixlowpan.SixLoWPAN_ESC'>, <class 'scapy.packet.Packet'>]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<ByteField (SixLoWPAN_ESC).dispatch>]
scapy.layers.sixlowpan.dest_addr_size(pkt)[source]

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)[source]
scapy.layers.sixlowpan.sixlowpan_fragment(packet, datagram_tag=1)[source]

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]

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