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)
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)
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)
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
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