def test_ue_flows_del(self): """ Verify that a proxy flows are setup """ cls = self.__class__ self._msg_hub = MessageHub(HeTableTest.he_controller.logger) dp = HeTableTest.he_controller._datapath ue_ip1 = '1.1.1.200' tun_id1 = 1 dest_server1 = '2.2.2.4' rule1 = 123 flow_msg = cls.he_controller.get_subscriber_he_flows( 'rule1', Direction.OUT, ue_ip1, tun_id1, dest_server1, rule1, ['abc.com'], 'IMSI01', b'1', ) ue_ip2 = '10.10.10.20' tun_id2 = 2 dest_server2 = '20.20.20.40' rule2 = 1230 flow_msg2 = cls.he_controller.get_subscriber_he_flows( 'rule2', Direction.OUT, ue_ip2, tun_id2, dest_server2, rule2, ['abc.com'], 'IMSI01', b'1', ) flow_msg.extend(flow_msg2) chan = self._msg_hub.send(flow_msg, dp) self._wait_for_responses(chan, len(flow_msg), HeTableTest.he_controller.logger) cls.he_controller.remove_subscriber_he_flows( convert_ip_str_to_ip_proto(ue_ip2), 'rule2', rule2) cls.he_controller.remove_subscriber_he_flows( convert_ip_str_to_ip_proto(ue_ip2), 'rule_random', 3223) snapshot_verifier = SnapshotVerifier( self, self.BRIDGE, self.service_manager, max_sleep_time=20, datapath=HeTableTest.he_controller._datapath, ) with snapshot_verifier: pass
def _ng_qer_update( self, request: SessionSet, pdr_entry: PDRRuleEntry, ) -> Tuple[List[RuleModResult], List[RuleModResult]]: enforcement_res = [] failed_policy_rules_results = [] local_f_teid_ng = request.local_f_teid # PDR is deleted with ActiveRules or DelActive rules recieved if pdr_entry.pdr_state == PdrState.Value('REMOVE'): qos_enforce_rule = pdr_entry.del_qos_enforce_rule if qos_enforce_rule.ip_addr: ipv4 = convert_ip_str_to_ip_proto(qos_enforce_rule.ip_addr) self._ng_deactivate_qer_flows( ipv4, local_f_teid_ng, qos_enforce_rule, ) if qos_enforce_rule.ipv6_addr: ipv6 = convert_ipv6_bytes_to_ip_proto(qos_enforce_rule.ipv6_addr) self._ng_deactivate_qer_flows( ipv6, local_f_teid_ng, qos_enforce_rule, ) elif pdr_entry.pdr_state == PdrState.Value('IDLE'): qos_enforce_rule = pdr_entry.add_qos_enforce_rule if qos_enforce_rule.ip_addr: ipv4 = convert_ipv4_str_to_ip_proto(qos_enforce_rule.ip_addr) self._ng_inactivate_qer_flows(ipv4, qos_enforce_rule) if qos_enforce_rule.ipv6_addr: ipv6 = convert_ipv6_bytes_to_ip_proto(qos_enforce_rule.ipv6_addr) self._ng_inactivate_qer_flows(ipv6, qos_enforce_rule) # Install PDR rules elif pdr_entry.pdr_state == PdrState.Value('INSTALL'): qos_enforce_rule = pdr_entry.add_qos_enforce_rule if qos_enforce_rule.ip_addr: ipv4 = convert_ip_str_to_ip_proto(qos_enforce_rule.ip_addr) enforcement_res = \ self._ng_activate_qer_flow( ipv4, local_f_teid_ng, qos_enforce_rule, ) failed_policy_rules_results = \ _retrieve_failed_results(enforcement_res) if qos_enforce_rule.ipv6_addr: ipv6 = convert_ipv6_bytes_to_ip_proto(qos_enforce_rule.ipv6_addr) enforcement_res = \ self._ng_activate_qer_flow( ipv6, local_f_teid_ng, qos_enforce_rule, ) failed_policy_rules_results = \ _retrieve_failed_results(enforcement_res) return failed_policy_rules_results
def gtp_handler( self, session_state, precedence: int, local_f_teid: int, o_teid: int, gnb_ip_addr: str, ue_ip_addr: str = None, sid: int = None, ng_flag: bool = True, ue_ipv6_address: str = None, apn: str = None, vlan: int = 0, ip_flow_dl: IPFlowDL = None, ): ue_ip_adr = None ue_ipv6_adr = None if ue_ip_addr: ue_ip_adr = convert_ip_str_to_ip_proto(ue_ip_addr) if ue_ipv6_address: ue_ipv6_adr = convert_ip_str_to_ip_proto(ue_ipv6_address) if ( session_state == PdrState.Value('INSTALL') or session_state == UESessionState.ACTIVE ): # TODO: Will make same priority value for paging as active session # then probably not required remove_paging_flow call. self.remove_paging_flow(ue_ip_adr, ue_ipv6_adr) self.add_tunnel_flows( precedence, local_f_teid, o_teid, gnb_ip_addr, ue_ip_adr, sid, ng_flag, ue_ipv6_adr, apn, vlan, ip_flow_dl, ) elif ( session_state == PdrState.Value('IDLE') or session_state == UESessionState.INSTALL_IDLE ): self.delete_tunnel_flows(local_f_teid, ue_ip_adr, gnb_ip_addr, ip_flow_dl, ue_ipv6_adr) self.install_paging_flow(local_f_teid, ue_ip_adr, ng_flag, ue_ipv6_adr) elif ( session_state == PdrState.Value('REMOVE') or session_state == UESessionState.UNREGISTERED ): self.delete_tunnel_flows( local_f_teid, ue_ip_adr, gnb_ip_addr, ip_flow_dl, ue_ipv6_adr, ) self.remove_paging_flow(ue_ip_adr, ue_ipv6_adr) elif (session_state == UESessionState.RESUME_DATA): self.resume_tunnel_flows( local_f_teid, ue_ip_adr, ip_flow_dl, ) elif (session_state == UESessionState.SUSPENDED_DATA): self.discard_tunnel_flows( local_f_teid, ue_ip_adr, ip_flow_dl, ) return True
def test_ue_flows_multi_rule(self): """ Verify that a proxy flows are setup """ cls = self.__class__ self._msg_hub = MessageHub(HeTableTest.he_controller.logger) dp = HeTableTest.he_controller._datapath ue_ip1 = '1.1.1.200' tun_id1 = 1 dest_server1 = '2.2.2.4' rule1 = 123 flow_msg = cls.he_controller.get_subscriber_he_flows('rule1', Direction.OUT, ue_ip1, tun_id1, dest_server1, rule1, ['abc.com'], 'IMSI01', b'1') tun_id2 = 2 dest_server2 = '20.20.20.40' rule2 = 1230 flow_msg.extend(cls.he_controller.get_subscriber_he_flows('rule2', Direction.OUT, ue_ip1, tun_id2, dest_server2, rule2, ['abc1.com'], 'IMSI01', b'1')) self.assertEqual(cls.he_controller._ue_rule_counter.get(ue_ip1), 2) dest_server2 = '20.20.40.40' rule3 = 1230 flow_msg.extend(cls.he_controller.get_subscriber_he_flows('rule3', Direction.OUT, ue_ip1, tun_id2, dest_server2, rule3, ['abc2.com'], 'IMSI01', None)) self.assertEqual(cls.he_controller._ue_rule_counter.get(ue_ip1), 3) dest_server2 = '20.20.50.50' rule4 = 22 flow_msg.extend(cls.he_controller.get_subscriber_he_flows('rule4', Direction.OUT, ue_ip1, tun_id2, dest_server2, rule4, ['abc2.com'], 'IMSI01', None)) self.assertEqual(cls.he_controller._ue_rule_counter.get(ue_ip1), 4) chan = self._msg_hub.send(flow_msg, dp) self._wait_for_responses(chan, len(flow_msg), HeTableTest.he_controller.logger) cls.he_controller.remove_subscriber_he_flows(convert_ip_str_to_ip_proto(ue_ip1), "rule1", rule1) snapshot_verifier = SnapshotVerifier(self, self.BRIDGE, self.service_manager, max_sleep_time=20, datapath=HeTableTest.he_controller._datapath) with snapshot_verifier: pass # verify multiple remove works. cls.he_controller.remove_subscriber_he_flows(convert_ip_str_to_ip_proto(ue_ip1), "rule2", rule2) self.assertEqual(cls.he_controller._ue_rule_counter.get(ue_ip1), 2) cls.he_controller.remove_subscriber_he_flows(convert_ip_str_to_ip_proto(ue_ip1)) self.assertEqual(cls.he_controller._ue_rule_counter.get(ue_ip1), 0)
def _create_subscriber_ip_requests(self): """ Generates ryu requests for subscriber flows Based on the provided ip create 2 flows, that are matched based on dst/src ip and set value of the direction register. Additional reg values are set from set_reg_value """ uplink = copy.deepcopy(self._request) downlink = copy.deepcopy(self._request) uplink["instructions"].append({ "type": "APPLY_ACTIONS", "actions": self._reg_sets + [self._ulink_action] }) downlink["instructions"].append({ "type": "APPLY_ACTIONS", "actions": self._reg_sets + [self._dlink_action] }) ip_addr = convert_ip_str_to_ip_proto(self._ip) if ip_addr.version == IPAddress.IPV4: uplink["match"].update( {"ipv4_src": self._ip}) downlink["match"].update( {"ipv4_dst": self._ip}) else: uplink["match"].update( {"ipv6_src": self._ip}) downlink["match"].update( {"ipv6_dst": self._ip}) return [uplink, downlink]
def _deactivate_subscriber_rules(self): ip_addr = convert_ip_str_to_ip_proto(self.cfg.ip) if self._nuke_flows_on_exit: def deactivate_flows(): self._ec.deactivate_rules(imsi=self.cfg.imsi, ip_addr=ip_addr, rule_ids=None) hub.joinall([hub.spawn(deactivate_flows)])
def activate_flows(): ip_addr = convert_ip_str_to_ip_proto(self.cfg.ip) self._ec.activate_rules(imsi=self.cfg.imsi, ip_addr=ip_addr, apn_ambr=default_ambr_config, static_rule_ids=self._static_rule_names, dynamic_rules=self._dynamic_rules) if self._esc: self._esc.activate_rules( imsi=self.cfg.imsi, ip_addr=ip_addr, apn_ambr=default_ambr_config, static_rule_ids=self._static_rule_names, dynamic_rules=self._dynamic_rules)
def activate_flows(): ip_addr = convert_ip_str_to_ip_proto(self.cfg.ip) self._ec.activate_rules(imsi=self.cfg.imsi, msisdn=None, uplink_tunnel=None, ip_addr=ip_addr, apn_ambr=default_ambr_config, policies=self._policies) if self._esc: self._esc.activate_rules(imsi=self.cfg.imsi, msisdn=None, uplink_tunnel=None, ip_addr=ip_addr, apn_ambr=default_ambr_config, policies=self._policies)