Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
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]
Ejemplo n.º 6
0
    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)])
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
 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)