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- 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'>]
- 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'>]
- 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'>]
- 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')}
- class scapy.layers.sixlowpan.LoWPANUncompressedIPv6(_pkt, /, *, _type=65)[source]
Bases:
Packet- aliastypes = [<class 'scapy.layers.sixlowpan.LoWPANUncompressedIPv6'>, <class 'scapy.packet.Packet'>]
- 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'>]
- 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>]
- 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'>]
- 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:
Packet6LoWPAN IPv6 header compressed packets
It follows the implementation of RFC6282
- aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_IPHC'>, <class 'scapy.packet.Packet'>]
- 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')}
- 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>]
- class scapy.layers.sixlowpan.LoWPAN_NHC(_pkt, /, *, exts=[])[source]
Bases:
Packet- aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_NHC'>, <class 'scapy.packet.Packet'>]
- class scapy.layers.sixlowpan.LoWPAN_NHC_Hdr(_pkt, /)[source]
Bases:
Packet- aliastypes = [<class 'scapy.layers.sixlowpan.LoWPAN_NHC_Hdr'>, <class 'scapy.packet.Packet'>]
- 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>]
- 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'>]
- class scapy.layers.sixlowpan.SixLoWPAN(_pkt, /)[source]
Bases:
Packet- aliastypes = [<class 'scapy.layers.sixlowpan.SixLoWPAN'>, <class 'scapy.packet.Packet'>]
- class scapy.layers.sixlowpan.SixLoWPAN_ESC(_pkt, /, *, dispatch=0)[source]
Bases:
Packet- aliastypes = [<class 'scapy.layers.sixlowpan.SixLoWPAN_ESC'>, <class 'scapy.packet.Packet'>]
- 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_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)