def handle_pcbs_propagation(self): """ Generate a new beacon or gets ready to forward the one received. """ timestamp = int(SCIONTime.get_time()) # Create beacon for downstream ASes. down_iof = InfoOpaqueField.from_values(timestamp, self.addr.isd_as[0]) downstream_pcb = PathSegment.from_values(down_iof) propagated_pcbs = self.propagate_downstream_pcb(downstream_pcb) # Create beacon for core ASes. core_iof = InfoOpaqueField.from_values(timestamp, self.addr.isd_as[0]) core_pcb = PathSegment.from_values(core_iof) propagated = self.propagate_core_pcb(core_pcb) for k, v in propagated.items(): propagated_pcbs[k].extend(v) # Propagate received beacons. A core beacon server can only receive # beacons from other core beacon servers. beacons = [] with self._rev_seg_lock: for ps in self.core_beacons.values(): beacons.extend(ps.get_best_segments()) for pcb in beacons: propagated = self.propagate_core_pcb(pcb) for k, v in propagated.items(): propagated_pcbs[k].extend(v) self._log_propagations(propagated_pcbs)
def _create_one_hop_path(self, egress_if): ts = int(SCIONTime.get_time()) info = InfoOpaqueField.from_values(ts, self.addr.isd_as[0], hops=2) hf1 = HopOpaqueField.from_values(self.HOF_EXP_TIME, 0, egress_if) hf1.set_mac(self.of_gen_key, ts, None) # Return a path where second HF is empty. return SCIONPath.from_values(info, [hf1, HopOpaqueField()])
def handle_pcbs_propagation(self): """ Generate a new beacon or gets ready to forward the one received. """ timestamp = int(SCIONTime.get_time()) # Create beacon for downstream ASes. down_iof = InfoOpaqueField.from_values(timestamp, self.addr.isd_as[0]) downstream_pcb = PathSegment.from_values(down_iof) self.propagate_downstream_pcb(downstream_pcb) # Create beacon for core ASes. core_iof = InfoOpaqueField.from_values(timestamp, self.addr.isd_as[0]) core_pcb = PathSegment.from_values(core_iof) core_count = self.propagate_core_pcb(core_pcb) # Propagate received beacons. A core beacon server can only receive # beacons from other core beacon servers. beacons = [] for ps in self.core_beacons.values(): beacons.extend(ps.get_best_segments()) for pcb in beacons: core_count += self.propagate_core_pcb(pcb) if core_count: logging.info("Propagated %d Core PCBs", core_count)
def test(self): """ Test the main functionalities of the path store. """ path_policy_file = "topology/ISD1/path_policies/ISD1-AD10.json" path_policy = PathPolicy.from_file(path_policy_file) test_segments = PathStore(path_policy) print("Best paths: " + str(len(test_segments.get_best_segments()))) print("Paths in path store: " + str(len(test_segments.candidates))) print("Paths in latest history snapshot: " + str(len(test_segments.get_latest_history_snapshot())) + "\n") path = 1 for _ in range(1, 6): for _ in range(1, 6): pcb = PathSegment() pcb.iof = InfoOpaqueField.from_values(OFT.TDC_XOVR, False, int(time.time()), path) ad_marking = self._create_ad_marking() pcb.add_ad(ad_marking) print("insert path " + str(path) + ", exp time: " + str(pcb.get_expiration_time())) test_segments.add_segment(pcb) path += 1 print("Best paths: " + str(len(test_segments.get_best_segments()))) print("Paths in path store: " + str(len(test_segments.candidates))) print("Paths in latest history snapshot: " + str(len(test_segments.get_latest_history_snapshot()))) print("Time: " + str(int(time.time())) + "\n") time.sleep(5) print("Waiting for some paths to expire...") time.sleep(25) print("Best paths: " + str(len(test_segments.get_best_segments()))) print("Paths in path store: " + str(len(test_segments.candidates))) print("Paths in latest history snapshot: " + str(len(test_segments.get_latest_history_snapshot())))