Ejemplo n.º 1
0
    def do_build(self):
        _cur = self
        if isinstance(_cur.payload, LoWPAN_NHC):
            _cur = _cur.payload
        if not isinstance(_cur.payload, IPv6):
            return Packet.do_build(self)
        ipv6 = _cur.payload

        self._reserved = 0x03

        # NEW COMPRESSION TECHNIQUE!
        # a ) Compression Techniques

        # 1. Set Traffic Class
        if self.tf == 0x0:
            self.tc_ecn = ipv6.tc >> 6
            self.tc_dscp = ipv6.tc & 0x3F
            self.flowlabel = ipv6.fl
        elif self.tf == 0x1:
            self.tc_ecn = ipv6.tc >> 6
            self.flowlabel = ipv6.fl
        elif self.tf == 0x2:
            self.tc_ecn = ipv6.tc >> 6
            self.tc_dscp = ipv6.tc & 0x3F
        else:  # self.tf == 0x3:
            pass  # no field is set

        # 2. Next Header
        if self.nh == 0x0:
            self.nhField = ipv6.nh
        elif self.nh == 1:
            # This will be handled in LoWPAN_NHC
            pass

        # 3. HLim
        if self.hlim == 0x0:
            self.hopLimit = ipv6.hlim
        else:  # if hlim is 1, 2 or 3, there are nothing to do!
            pass

        # 4. Context (which context to use...)
        if self.cid == 0x0:
            pass
        else:
            # TODO: Context Unimplemented yet
            pass

        # 5. Compress Source Addr
        self.compressSourceAddr(ipv6)
        self.compressDestAddr(ipv6)

        return Packet.do_build(self)
Ejemplo n.º 2
0
    def do_build(self):
        if not isinstance(self.payload, IPv6):
            return Packet.do_build(self)
        ipv6 = self.payload

        self._reserved = 0x03

        # NEW COMPRESSION TECHNIQUE!
        # a ) Compression Techniques

        # 1. Set Traffic Class
        if self.tf == 0x0:
            self.tc_ecn = ipv6.tc >> 6
            self.tc_dscp = ipv6.tc & 0x3F
            self.flowlabel = ipv6.fl
        elif self.tf == 0x1:
            self.tc_ecn = ipv6.tc >> 6
            self.flowlabel = ipv6.fl
        elif self.tf == 0x2:
            self.tc_ecn = ipv6.tc >> 6
            self.tc_dscp = ipv6.tc & 0x3F
        else:  # self.tf == 0x3:
            pass  # no field is set

        # 2. Next Header
        if self.nh == 0x0:
            self.nh = 0  # ipv6.nh
        elif self.nh == 0x1:
            self.nh = 0  # disable compression
            # The Next Header field is compressed and the next header is encoded using LOWPAN_NHC, which is discussed in Section 4.1.  # noqa: E501
            warning(
                'Next header compression is not implemented yet ! Will be ignored'
            )  # noqa: E501

        # 3. HLim
        if self.hlim == 0x0:
            self._hopLimit = ipv6.hlim
        else:  # if hlim is 1, 2 or 3, there are nothing to do!
            pass

        # 4. Context (which context to use...)
        if self.cid == 0x0:
            pass
        else:
            # TODO: Context Unimplemented yet in my class
            self._contextIdentifierExtension = 0

        # 5. Compress Source Addr
        self.compressSourceAddr(ipv6)
        self.compressDestinyAddr(ipv6)

        return Packet.do_build(self)
Ejemplo n.º 3
0
    def do_build(self):
        if not isinstance(self.payload, IPv6):
            return Packet.do_build(self)
        ipv6 = self.payload

        self._reserved = 0x03

        # NEW COMPRESSION TECHNIQUE!
        # a ) Compression Techniques

        # 1. Set Traffic Class
        if self.tf == 0x0:
            self.tc_ecn = ipv6.tc >> 6
            self.tc_dscp = ipv6.tc & 0x3F
            self.flowlabel = ipv6.fl
        elif self.tf == 0x1:
            self.tc_ecn = ipv6.tc >> 6
            self.flowlabel = ipv6.fl
        elif self.tf == 0x2:
            self.tc_ecn = ipv6.tc >> 6
            self.tc_dscp = ipv6.tc & 0x3F
        else:  # self.tf == 0x3:
            pass  # no field is set

        # 2. Next Header
        if self.nh == 0x0:
            self.nh = 0  # ipv6.nh
        elif self.nh == 0x1:
            self.nh = 0  # disable compression
            # The Next Header field is compressed and the next header is encoded using LOWPAN_NHC, which is discussed in Section 4.1.  # noqa: E501
            warning('Next header compression is not implemented yet ! Will be ignored')  # noqa: E501

        # 3. HLim
        if self.hlim == 0x0:
            self._hopLimit = ipv6.hlim
        else:  # if hlim is 1, 2 or 3, there are nothing to do!
            pass

        # 4. Context (which context to use...)
        if self.cid == 0x0:
            pass
        else:
            # TODO: Context Unimplemented yet in my class
            self._contextIdentifierExtension = 0

        # 5. Compress Source Addr
        self.compressSourceAddr(ipv6)
        self.compressDestinyAddr(ipv6)

        return Packet.do_build(self)
Ejemplo n.º 4
0
 def do_build(self):
     if not isinstance(self.payload, IPv6):
         return Packet.do_build(self)
     pay = self.payload.payload
     while pay and isinstance(pay.payload, _IPv6ExtHdr):
         # XXX todo: populate a LoWPAN_NHC_IPv6Ext
         pay = pay.payload
     if isinstance(pay, UDP):
         try:
             udp_hdr = next(
                 x for x in self.exts if isinstance(x, LoWPAN_NHC_UDP)
             )
         except StopIteration:
             udp_hdr = LoWPAN_NHC_UDP()
             # Guess best compression
             if pay.sport >> 4 == 0xf0b and pay.dport >> 4 == 0xf0b:
                 udp_hdr.P = 3
             elif pay.sport >> 8 == 0xf0:
                 udp_hdr.P = 2
             elif pay.dport >> 8 == 0xf0:
                 udp_hdr.P = 1
             self.exts.insert(0, udp_hdr)
         # https://tools.ietf.org/html/rfc6282#section-4.3.3
         if udp_hdr.P == 0:
             udp_hdr.udpSourcePort = pay.sport
             udp_hdr.udpDestPort = pay.dport
         elif udp_hdr.P == 1:
             udp_hdr.udpSourcePort = pay.sport
             udp_hdr.udpDestPort = pay.dport & 255
         elif udp_hdr.P == 2:
             udp_hdr.udpSourcePort = pay.sport & 255
             udp_hdr.udpDestPort = pay.dport
         elif udp_hdr.P == 3:
             udp_hdr.udpSourcePort = pay.sport & 15
             udp_hdr.udpDestPort = pay.dport & 15
         if udp_hdr.C == 0:
             if pay.chksum:
                 udp_hdr.udpChecksum = pay.chksum
             else:
                 udp_hdr.udpChecksum = UDP(raw(pay)).chksum
     return Packet.do_build(self)
Ejemplo n.º 5
0
 def do_build(self):
     if not isinstance(self.payload, IPv6):
         return Packet.do_build(self)
     # IPv6
     ipv6 = self.payload
     self.src = ipv6.src
     self.dst = ipv6.dst
     self.flow_label = ipv6.fl
     self.traffic_class = ipv6.tc
     self.hopLimit = ipv6.hlim
     if isinstance(ipv6.payload, UDP):
         self.nh = 1
         self.hc2 = 1
         udp = ipv6.payload
         self.udpSourcePort = udp.sport
         self.udpDestPort = udp.dport
         if not udp.len or not udp.chksum:
             udp = UDP(raw(udp))
         self.udpLength = udp.len
         self.udpChecksum = udp.chksum
     return Packet.do_build(self)
Ejemplo n.º 6
0
    def do_build(self):
        self.delta_ext, self.delta = self._populate_extended(self.delta)
        self.len_ext, self.len = self._populate_extended(len(self.opt_val))

        return Packet.do_build(self)
Ejemplo n.º 7
0
    def do_build(self):
        self.delta_ext, self.delta = self._populate_extended(self.delta)
        self.len_ext, self.len = self._populate_extended(len(self.opt_val))

        return Packet.do_build(self)