async def remove_route(app, name: str, face_id: int): interest = make_command('rib', 'unregister', name=name, face_id=face_id) try: _, _, data = await app.express_interest(interest, lifetime=1000, can_be_prefix=True, must_be_fresh=True) except (InterestCanceled, InterestTimeout, InterestNack, ValidationFailure, NetworkError): logging.error(f'Command failed') return False ret = parse_response(data) if ret['status_code'] <= 399: return True return False
async def set_strategy(app, name: str, strategy: str): interest = make_command('strategy-choice', 'set', name=name, strategy=strategy) try: _, _, data = await app.express_interest(interest, lifetime=1000, can_be_prefix=True, must_be_fresh=True) except (InterestCanceled, InterestTimeout, InterestNack, ValidationFailure, NetworkError): logging.error(f'Command failed') return False ret = parse_response(data) if ret['status_code'] <= 399: return True return False
async def add_face(self, uri): # It's not easy to distinguish udp4://127.0.0.1 and udp4://spurs.cs.ucla.edu # if reduce(lambda a, b: a or b, (x.isalpha() for x in uri)): # uri = socket.gethostbyname(uri) if uri[-1] == "/": uri = uri[:-1] if uri.find("://") < 0: uri = "udp4://" + uri if len(uri.split(":")) < 3: uri = uri + ":6363" interest = make_command('faces', 'create', uri=uri.encode()) return await self.issue_command_interest(interest)
async def autoconf(self): """ Automatically connect to ndn testbed. Add route /ndn and /localhop/nfd. """ uri = urllib.request.urlopen( "http://ndn-fch.named-data.net/").read().decode('utf-8') uri = socket.gethostbyname(uri) uri = "udp4://" + uri + ":6363" cmd = make_command('faces', 'create', uri=uri) ret = await self.issue_command_interest(cmd) if not isinstance(ret, dict): return False, "Create face failed" face_id = await self.query_face_id(uri) if face_id is None: return False, "Create face failed" route = '/ndn' cmd = make_command('rib', 'register', name=route, face_id=face_id, origin=66, cost=100) await self.issue_command_interest(cmd) route = '/localhop/nfd' cmd = make_command('rib', 'register', name=route, face_id=face_id, origin=66, cost=100) await self.issue_command_interest(cmd) return True, "Auto-configuration finished"
async def unregister(self, name: NonStrictName) -> bool: """ Unregister a route for a specific prefix. :param name: the Name prefix. :type name: :any:`NonStrictName` """ name = Name.normalize(name) del self._prefix_tree[name] try: await self.express_interest(make_command('rib', 'unregister', name=name), lifetime=1000) return True except (InterestNack, InterestTimeout, InterestCanceled, ValidationFailure): return False
async def register(self, name: NonStrictName, func: Optional[Route], validator: Optional[Validator] = None, need_raw_packet: bool = False, need_sig_ptrs: bool = False) -> bool: """ Register a route for a specific prefix dynamically. :param name: the Name prefix for this route. :type name: :any:`NonStrictName` :param func: the onInterest function for the specified route. If ``None``, the NDNApp will only send the register command to forwarder, without setting any callback function. :type func: Optional[Callable[[:any:`FormalName`, :any:`InterestParam`, Optional[:any:`BinaryStr`]], ``None``]] :param validator: the Validator used to validate coming Interests. :type validator: Optional[:any:`Validator`] :return: ``True`` if the registration succeeded. :param need_raw_packet: if True, pass the raw Interest packet to the callback as a keyword argument ``raw_packet``. :type need_raw_packet: bool :param need_sig_ptrs: if True, pass the Signature pointers to the callback as a keyword argument ``sig_ptrs``. :type need_sig_ptrs: bool :raises ValueError: the prefix is already registered. :raises NetworkError: the face to NFD is down now. """ name = Name.normalize(name) if func is not None: node = self._prefix_tree.setdefault(name, PrefixTreeNode()) if node.callback: raise ValueError( f'Duplicated registration: {Name.to_str(name)}') node.callback = func node.extra_param = { 'raw_packet': need_raw_packet, 'sig_ptrs': need_sig_ptrs } if validator: node.validator = validator # Fix the issue that NFD only allows one packet signed by a specific key for a timestamp number async with self._prefix_register_semaphore: try: _, _, reply = await self.express_interest(make_command( 'rib', 'register', name=name), lifetime=1000) ret = parse_response(reply) if ret['status_code'] != 200: logging.error( f'Registration for {Name.to_str(name)} failed: ' f'{ret["status_code"]} {bytes(ret["status_text"]).decode()}' ) return False else: logging.debug( f'Registration for {Name.to_str(name)} succeeded: ' f'{ret["status_code"]} {bytes(ret["status_text"]).decode()}' ) return True except (InterestNack, InterestTimeout, InterestCanceled, ValidationFailure) as e: logging.error( f'Registration for {Name.to_str(name)} failed: {e.__class__.__name__}' ) return False
async def unset_strategy(self, name: str): interest = make_command('strategy-choice', 'unset', name=name) return await self.issue_command_interest(interest)
async def remove_route(self, name: str, face_id: int): interest = make_command('rib', 'unregister', name=name, face_id=face_id) return await self.issue_command_interest(interest)
async def remove_face(self, face_id: int): interest = make_command('faces', 'destroy', face_id=face_id) return await self.issue_command_interest(interest)