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
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
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
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)
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