Beispiel #1
0
 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)
Beispiel #2
0
 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)