Ejemplo n.º 1
0
 def decode(self, stream):
     if stream.settings.get("pia.version") < 51000:
         self.connection_info = stream.extract(StationConnectionInfo)
     else:
         substream = StreamIn(stream.read(0x3E), stream.settings)
         location = substream.extract(StationLocation)
         self.connection_info = StationConnectionInfo(location)
     self.index = stream.u8()
     stream.align(4)
Ejemplo n.º 2
0
    def join_mesh(self, session_key, host_location):
        self.session_key = session_key

        connection_info = StationConnectionInfo(host_location)

        address = host_location.local.address
        host = self.stations.create()
        host.address = address.host, address.port
        host.connection_info = connection_info
        self.connect_station(host)
        host.wait_connected()

        self.mesh_protocol.join(host)
Ejemplo n.º 3
0
    def prepare(self, identification_info):
        logger.info("Initializing PIA session")
        self.create_protocols()

        self.transport.prepare()

        location = self.prepare_station_location()

        connection_info = StationConnectionInfo(location)

        self.my_station = self.stations.create()
        self.my_station.connection_state = ConnectionState.CONNECTED
        self.my_station.address = self.transport.local_address()
        self.my_station.connection_info = connection_info
        self.my_station.identification_info = identification_info
        self.my_station.id = self.build_station_id()

        self.event = scheduler.add_socket(self.handle_recv, self.transport)
Ejemplo n.º 4
0
    def __init__(self):
        self.session_start = time.monotonic()

        self.address = None

        self.rtt_timer = None
        self.base_timer = None

        self.index = 0xFD
        self.id = None

        self.connection_state = ConnectionState.DISCONNECTED

        self.connection_id_out_temp = 0
        self.connection_id_in_temp = 0
        self.connection_id_out = 0
        self.connection_id_in = 0
        self.sequence_id_out = 0
        self.sequence_id_in = 1

        self.nonce = 0

        self.connection_info = StationConnectionInfo()
        self.identification_info = None
Ejemplo n.º 5
0
    def handle_connection_request(self, station, data):
        logger.debug("Received connection request")

        stream = StreamIn(data, self.settings)
        stream.skip(1)

        connection_id = stream.u8()
        version = stream.u8()
        inverse = stream.bool()

        if version != self.version:
            logger.error(
                "Received connection request with wrong version number")
            self.send_denying_connection_response(station, 2)
            return

        local_station = self.session.local_station()
        local_info = local_station.connection_info.local
        if self.version >= 7:
            if stream.pid() != local_info.pid:
                logger.error("Received connection request with wrong pid")
                return
        if self.version >= 8:
            if stream.u32() != local_info.cid:
                logger.error("Received connection request with wrong cid")
                return
            inverse_id = stream.u8()
            if inverse_id != station.connection_id_out_temp:
                logger.error(
                    "Received connection request with wrong inverse connection id: %i",
                    inverse_id)
                return

        if self.version == 8:
            conn_info = stream.extract(StationConnectionInfo)
        else:
            location = stream.extract(StationLocation)
            conn_info = StationConnectionInfo(location)

        ack_id = stream.u32()

        if inverse:
            if station.connection_state != ConnectionState.WAIT_INVERSE_REQUEST:
                logger.error("Received unexpected inverse connection request")
                self.send_denying_connection_response(station, 1)
                return

            station.connection_id_in_temp = connection_id
            station.connection_info = conn_info

            self.send_ack(station, ack_id)
            self.send_connection_response(station)

            station.connection_state = ConnectionState.WAIT_RESPONSE
        else:
            if station.connection_state != ConnectionState.DISCONNECTED:
                logger.error("Received unexpected connection request")
                self.send_denying_connection_response(station, 1)
                return

            station.connection_id_out_temp = random.randint(2, 0xFF)
            station.connection_id_in_temp = connection_id
            station.connection_info = conn_info

            self.send_ack(station, ack_id)
            self.send_connection_request(station, connection_id)

            station.connection_state = ConnectionState.WAIT_INVERSE_RESPONSE