Esempio n. 1
0
    def create_local_station(self, props, identification, name):
        self.station = self.station_mgr.create(props.local_address, self.rvcid)
        self.station.is_connected = True

        local_station_url = self.backend.local_station.copy()
        local_station_url["natm"] = props.nat_mapping
        local_station_url["natf"] = props.nat_filtering
        local_station_url["port"] = props.local_address[1]

        public_station_url = self.backend.public_station.copy()
        public_station_url["natm"] = props.nat_mapping
        public_station_url["natf"] = props.nat_filtering
        public_station_url["port"] = props.public_address[1]

        self.secure_client.replace_url(self.backend.local_station,
                                       local_station_url)
        self.backend.local_station = local_station_url
        self.backend.public_station = public_station_url

        local_location = StationLocation.from_station_url(local_station_url)
        public_location = StationLocation.from_station_url(public_station_url)
        self.station.connection_info = StationConnectionInfo(
            public_location, local_location)

        self.station.identification_info = IdentificationInfo(
            identification, name)
Esempio n. 2
0
    def send_join_response(self, station, assigned_index, host_index,
                           stations):
        logger.info("Sending join response")

        infosize = (StationConnectionInfo.sizeof() + 4) & ~3
        limit = self.transport.size_limit() - 0xC

        per_packet = limit // infosize
        fragments = (len(stations) + per_packet - 1) // per_packet

        for i in range(fragments):
            offset = i * per_packet
            remaining = len(stations) - offset
            num_infos = min(remaining, per_packet)

            data = bytes([
                self.MESSAGE_JOIN_RESPONSE,
                len(stations), host_index, assigned_index, fragments, i,
                num_infos, offset
            ])

            for j in range(num_infos):
                station_info = stations[offset + j]
                data += station_info.connection_info.serialize()
                data += bytes([station_info.index, 0])
            self.send(station, data, 0, True)
Esempio n. 3
0
    def connect_to_host(self, host_urls):
        public_url = None
        local_url = None

        for url in host_urls:
            if url.is_public():
                public_url = url
            else:
                local_url = url

        if not public_url or not local_url:
            raise ValueError("Incomplete station url list")

        public_location = StationLocation.from_station_url(public_url)
        local_location = StationLocation.from_station_url(local_url)
        conn_info = StationConnectionInfo(public_location, local_location)

        self.connection_mgr.connect(conn_info)
        return self.station_mgr.find_by_rvcid(public_url["RVCID"])
Esempio n. 4
0
 def sizeof():
     return StationConnectionInfo.sizeof() + 2
Esempio n. 5
0
 def deserialize(cls, data):
     conn_info = StationConnectionInfo.deserialize(data)
     index = data[conn_info.sizeof()]
     return cls(conn_info, index)