Example #1
0
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
Example #2
0
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
Example #3
0
    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)
Example #4
0
    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"
Example #5
0
    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
Example #6
0
    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
Example #7
0
 async def unset_strategy(self, name: str):
     interest = make_command('strategy-choice', 'unset', name=name)
     return await self.issue_command_interest(interest)
Example #8
0
 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)
Example #9
0
 async def remove_face(self, face_id: int):
     interest = make_command('faces', 'destroy', face_id=face_id)
     return await self.issue_command_interest(interest)