示例#1
0
 def _install_redirect_flow(self, imsi, ip_addr, rule, version):
     rule_num = self._rule_mapper.get_or_create_rule_num(rule.id)
     # CWF generates an internal IP for redirection so ip_addr is not needed
     if self._setup_type == 'CWF':
         ip_addr_str = None
     elif ip_addr and ip_addr.address:
         ip_addr_str = ip_addr.address.decode('utf-8')
     priority = rule.priority
     # TODO currently if redirection is enabled we ignore other flows
     # from rule.flow_list, confirm that this is the expected behaviour
     redirect_request = RedirectionManager.RedirectRequest(
         imsi=imsi,
         ip_addr=ip_addr_str,
         rule=rule,
         rule_num=rule_num,
         rule_version=version,
         priority=priority,
     )
     try:
         if self._setup_type == 'CWF':
             self._redirect_manager.setup_cwf_redirect(
                 self._datapath, self.loop, redirect_request,
             )
         else:
             self._redirect_manager.setup_lte_redirect(
                 self._datapath, self.loop, redirect_request,
             )
         return RuleModResult.SUCCESS
     except RedirectException as err:
         self.logger.error(
             'Redirect Exception for imsi %s, rule.id - %s : %s',
             imsi, rule.id, err,
         )
         return RuleModResult.FAILURE
示例#2
0
 def _install_redirect_flow(self, imsi, ip_addr, rule):
     rule_num = self._rule_mapper.get_or_create_rule_num(rule.id)
     rule_version = self._session_rule_version_mapper.get_version(imsi,
                                                                  ip_addr,
                                                                  rule.id)
     priority = rule.priority
     # TODO currently if redirection is enabled we ignore other flows
     # from rule.flow_list, confirm that this is the expected behaviour
     redirect_request = RedirectionManager.RedirectRequest(
         imsi=imsi,
         ip_addr=ip_addr.address.decode('utf-8'),
         rule=rule,
         rule_num=rule_num,
         rule_version=rule_version,
         priority=priority)
     try:
         if self._setup_type == 'CWF':
             self._redirect_manager.setup_cwf_redirect(
                 self._datapath, self.loop, redirect_request)
         else:
             self._redirect_manager.setup_lte_redirect(
                 self._datapath, self.loop, redirect_request)
         return RuleModResult.SUCCESS
     except RedirectException as err:
         self.logger.error(
             'Redirect Exception for imsi %s, rule.id - %s : %s',
             imsi, rule.id, err
         )
         return RuleModResult.FAILURE
示例#3
0
 def _install_redirect_flow(self, imsi, ip_addr, rule, version):
     rule_num = self._rule_mapper.get_or_create_rule_num(rule.id)
     priority = Utils.get_of_priority(rule.priority)
     redirect_request = RedirectionManager.RedirectRequest(
         imsi=imsi,
         ip_addr=ip_addr.address.decode('utf-8'),
         rule=rule,
         rule_num=rule_num,
         rule_version=version,
         priority=priority,
     )
     try:
         self._redirect_manager.setup_lte_redirect(
             self._datapath,
             self.loop,
             redirect_request,
         )
         return RuleModResult.SUCCESS
     except RedirectException as err:
         self.logger.error(
             'Redirect Exception for imsi %s, rule.id - %s : %s',
             imsi,
             rule.id,
             err,
         )
         return RuleModResult.FAILURE
示例#4
0
    def _install_flow_for_rule(self, imsi, ip_addr, rule):
        """
        Install a flow to get stats for a particular rule. Flows will match on
        IMSI, cookie (the rule num), in/out direction

        Args:
            imsi (string): subscriber to install rule for
            ip_addr (string): subscriber session ipv4 address
            rule (PolicyRule): policy rule proto
        """
        rule_num = self._rule_mapper.get_or_create_rule_num(rule.id)
        priority = self.get_of_priority(rule.priority)
        ul_qos = rule.qos.max_req_bw_ul
        dl_qos = rule.qos.max_req_bw_dl

        if rule.redirect.support == rule.redirect.ENABLED:
            # TODO currently if redirection is enabled we ignore other flows
            # from rule.flow_list, confirm that this is the expected behaviour
            redirect_request = RedirectionManager.RedirectRequest(
                imsi=imsi,
                ip_addr=ip_addr,
                rule=rule,
                rule_num=rule_num,
                priority=priority)
            try:
                self._redirect_manager.handle_redirection(
                    self._datapath, self.loop, redirect_request)
                return RuleModResult.SUCCESS
            except RedirectException as err:
                self.logger.error(
                    'Redirect Exception for imsi %s, rule.id - %s : %s',
                    imsi, rule.id, err
                )
                return RuleModResult.FAILURE

        if not rule.flow_list:
            self.logger.error('The flow list for imsi %s, rule.id - %s'
                              'is empty, this shoudn\'t happen', imsi, rule.id)
            return RuleModResult.FAILURE

        flow_adds = []
        for flow in rule.flow_list:
            try:
                flow_adds.append(self._get_classify_rule_flow_msg(
                    imsi, flow, rule_num, priority, ul_qos,
                    dl_qos, rule.hard_timeout,
                    rule.id))
            except FlowMatchError as err:  # invalid match
                self.logger.error(
                    "Failed to install rule %s for subscriber %s: %s",
                    rule.id, imsi, err)
                return RuleModResult.FAILURE
        chan = self._msg_hub.send(flow_adds, self._datapath)

        return self._wait_for_responses(imsi, rule, chan)
示例#5
0
 def _install_redirect_flow(self, imsi, ip_addr, rule):
     rule_num = self._rule_mapper.get_or_create_rule_num(rule.id)
     priority = self.get_of_priority(rule.priority)
     redirect_request = RedirectionManager.RedirectRequest(
         imsi=imsi,
         ip_addr=ip_addr,
         rule=rule,
         rule_num=rule_num,
         priority=priority)
     try:
         self._redirect_manager.handle_redirection(self._datapath,
                                                   self.loop,
                                                   redirect_request)
         return RuleModResult.SUCCESS
     except RedirectException as err:
         self.logger.error(
             'Redirect Exception for imsi %s, rule.id - %s : %s', imsi,
             rule.id, err)
         return RuleModResult.FAILURE