예제 #1
0
    def parse(bitstream, payload_length):
        control = Control.parse(bitstream)
        payload_length = payload_length - 1  # subtract control byte

        dialog_id = bitstream.read("uint:8")
        payload_length = payload_length - 1

        transaction_id = bitstream.read("uint:8")
        payload_length = payload_length - 1

        target_rx_level_i = None
        if control.has_agc:
            target_rx_level_i = bitstream.read("uint:8")
            payload_length -= 1

        tl = None
        if control.has_tl:
            tl = CT.parse(bitstream)
            payload_length -= 1

        te = None
        if control.has_te:
            te = CT.parse(bitstream)
            payload_length -= 1

        tc = None
        # TODO currently we have no way to know if Tc is present or not
        # Tc is present when control.is_ack_requested AND when we are requester,
        # while responders copy this flag but do NOT provide a Tc.
        # When parsing single frames without knowledge of dialogs we cannot determine this.
        # We use control.is_dialog_start for now but this will break when we start supporting multiple transactions per dialog
        if control.is_ack_requested and control.is_dialog_start:
            tc = CT.parse(bitstream)
            payload_length -= 1

        ack_template = None
        if control.is_ack_not_void:
            transaction_id_start = bitstream.read("uint:8")
            payload_length = payload_length - 1
            transaction_id_stop = bitstream.read("uint:8")
            payload_length = payload_length - 1
            assert transaction_id_start == transaction_id, "Other case not implemented yet"
            assert transaction_id_stop == transaction_id, "Other case not implemented yet"
            # TODO ack bitmap (for when transaction_id_start != transaction_id)
            ack_template = [transaction_id_start, transaction_id_stop]

        assert control.is_ack_record_requested == False, "Not implemented yet"
        assert control.is_ack_not_void == False, "Not implemented yet"

        alp_command = AlpParser().parse(bitstream, payload_length)

        return Frame(control=control,
                     dialog_id=dialog_id,
                     transaction_id=transaction_id,
                     agc_rx_level_i=target_rx_level_i,
                     tl=tl,
                     te=te,
                     tc=tc,
                     ack_template=ack_template,
                     alp_command=alp_command)
예제 #2
0
    def parse(s):
        channel_header = ChannelHeader.parse(s)
        channel_index = s.read("uint:16")
        rx_level = s.read("int:8")
        link_budget = s.read("uint:8")
        target_rx_level = s.read("uint:8")
        nls = s.read("bool")
        missed = s.read("bool")
        retry = s.read("bool")
        unicast = s.read("bool")
        _ = s.read("pad:4")
        fifo_token = s.read("uint:8")
        seq_nr = s.read("uint:8")
        response_to = CT.parse(s)
        addressee = Addressee.parse(s)

        return Status(channel_header=channel_header,
                      channel_index=channel_index,
                      rx_level=rx_level,
                      link_budget=link_budget,
                      target_rx_level=target_rx_level,
                      nls=nls,
                      missed=missed,
                      retry=retry,
                      unicast=unicast,
                      fifo_token=fifo_token,
                      seq_nr=seq_nr,
                      response_to=response_to,
                      addressee=addressee)
예제 #3
0
  def parse_alp_interface_status_d7asp(self, s):
    channel_header  = s.read("uint:8") # TODO parse
    channel_index   = struct.unpack(">h", s.read("bytes:2"))[0]
    rx_level        = s.read("int:8")
    link_budget     = s.read("uint:8")
    target_rx_level = s.read("uint:8")
    nls             = s.read("bool")
    missed          = s.read("bool")
    retry           = s.read("bool")
    unicast         = s.read("bool" )
    _               = s.read("pad:4")
    fifo_token      = s.read("uint:8")
    seq_nr          = s.read("uint:8")
    response_to     = CT.parse(s)
    addressee       = Addressee.parse(s)

    status = Status(channel_header=channel_header, channel_index=channel_index,
                    rx_level=rx_level, link_budget=link_budget,
                    target_rx_level=target_rx_level, nls=nls, missed=missed,
                    retry=retry, unicast=unicast, fifo_token=fifo_token,
                    seq_nr=seq_nr, response_to=response_to, addressee=addressee)

    return InterfaceStatus(
      operand=InterfaceStatusOperand(interface_id=0xd7, interface_status=status)
    )
예제 #4
0
    def parse_alp_interface_status_d7asp(self, s):
        channel_header = ChannelHeader.parse(s)
        channel_index = struct.unpack(">h", s.read("bytes:2"))[0]
        rx_level = s.read("int:8")
        link_budget = s.read("uint:8")
        target_rx_level = s.read("uint:8")
        nls = s.read("bool")
        missed = s.read("bool")
        retry = s.read("bool")
        unicast = s.read("bool")
        _ = s.read("pad:4")
        fifo_token = s.read("uint:8")
        seq_nr = s.read("uint:8")
        response_to = CT.parse(s)
        addressee = Addressee.parse(s)

        status = Status(channel_header=channel_header,
                        channel_index=channel_index,
                        rx_level=rx_level,
                        link_budget=link_budget,
                        target_rx_level=target_rx_level,
                        nls=nls,
                        missed=missed,
                        retry=retry,
                        unicast=unicast,
                        fifo_token=fifo_token,
                        seq_nr=seq_nr,
                        response_to=response_to,
                        addressee=addressee)

        return InterfaceStatus(operand=InterfaceStatusOperand(
            interface_id=0xd7, interface_status=status))
예제 #5
0
  def parse(self, bitstream, payload_length):
    timeout = CT.parse(bitstream)
    payload_length = payload_length - 1 # substract timeout

    control = Control(
      has_network_layer_security=bitstream.read("bool"),
      has_multi_hop=bitstream.read("bool"),
      has_origin_access_id=bitstream.read("bool"),
      is_origin_access_id_vid=bitstream.read("bool"),
      origin_access_class=bitstream.read("uint:4")
    )
    payload_length = payload_length - 1 # substract control

    assert control.has_multi_hop == False, "Not implemented yet"
    assert control.has_network_layer_security == False, "Not implemented yet"

    if control.has_origin_access_id:
      if control.is_origin_access_id_vid:
        origin_access_id = map(ord, bitstream.read("bytes:2"))
        payload_length = payload_length - 2
      else:
        origin_access_id = map(ord, bitstream.read("bytes:8"))
        payload_length = payload_length - 8
    else:
      origin_access_id = []

    #payload=map(ord,bitstream.read("bytes:" + str(payload_length)))
    d7atp_frame = D7atpParser().parse(bitstream, payload_length)
    return Frame(timeout=timeout, control=control, origin_access_id=origin_access_id, d7atp_frame=d7atp_frame)
예제 #6
0
  def parse(s):
    scan_type_is_foreground = s.read("bool")
    csma_ca_mode = CsmaCaMode(s.read("uint:4"))
    nr_of_subbands = s.read("uint:3")
    subnet = s.read("int:8")
    scan_automation_period = CT.parse(s)
    s.read("uint:8") # RFU
    subbands = []
    for i in range(nr_of_subbands):
      subbands.append(Subband.parse(s))

    return AccessProfile(scan_type_is_foreground=scan_type_is_foreground,
                         csma_ca_mode=csma_ca_mode,
                         subnet=subnet,
                         scan_automation_period=scan_automation_period,
                         subbands=subbands)
예제 #7
0
 def parse(s):
     qos = QoS.parse(s)
     dorm_to = CT.parse(s)
     addressee = Addressee.parse(s)
     return Configuration(qos=qos, dorm_to=dorm_to, addressee=addressee)
예제 #8
0
 def parse(s):
     subband_bitmap = s.read("uint:8")
     scan_automation_period = CT.parse(s)
     return SubProfile(subband_bitmap=subband_bitmap,
                       scan_automation_period=scan_automation_period)
예제 #9
0
 def parse(s):
   qos = QoS.parse(s)
   dorm_to = CT.parse(s)
   addressee = Addressee.parse(s)
   return Configuration(qos=qos, dorm_to=dorm_to, addressee=addressee)