def _api_handle_path_request(self, msg, meta): """ Path request: | \x00 (1B) | ISD (12bits) | AS (20bits) | Reply: |p1_len(1B)|p1((p1_len*8)B)|fh_type(1B)|fh_IP(?B)|fh_port(2B)|mtu(2B)| p1_if_count(1B)|p1_if_1(5B)|...|p1_if_n(5B)| p2_len(1B)|... or b"" when no path found. """ dst_ia = ISD_AS(msg[1:ISD_AS.LEN + 1]) thread = threading.current_thread() thread.name = "SCIONDaemon API id:%s %s -> %s" % ( thread.ident, self.addr.isd_as, dst_ia) paths = self.get_paths(dst_ia) reply = [] logging.debug("Replying to api request for %s with %d paths", dst_ia, len(paths)) for path in paths: raw_path = path.pack() fwd_if = path.get_fwd_if() # Set dummy host addr if path is empty. if fwd_if == 0: haddr, port = HostAddrNone(), SCION_UDP_EH_DATA_PORT else: br = self.ifid2br[fwd_if] haddr, port = br.addr, br.port path_len = len(raw_path) // 8 reply.append( struct.pack("!B", path_len) + raw_path + struct.pack("!B", haddr.TYPE) + haddr.pack() + struct.pack("!H", port) + struct.pack("!H", path.mtu) + struct.pack("!B", len(path.interfaces))) for interface in path.interfaces: isd_as, link = interface reply.append(isd_as.pack()) reply.append(struct.pack("!H", link)) self.send_meta(b"".join(reply), meta)
def _build_packet(self, dst_host=None, path=None, ext_hdrs=(), dst_ia=None, payload=None, dst_port=0): if dst_host is None: dst_host = HostAddrNone() if dst_ia is None: dst_ia = self.addr.isd_as if path is None: path = SCIONPath() if payload is None: payload = PayloadRaw() dst_addr = SCIONAddr.from_values(dst_ia, dst_host) cmn_hdr, addr_hdr = build_base_hdrs(dst_addr, self.addr) udp_hdr = SCIONUDPHeader.from_values( self.addr, self._port, dst_addr, dst_port) return SCIONL4Packet.from_values( cmn_hdr, addr_hdr, path, ext_hdrs, udp_hdr, payload)