Example #1
0
    def process_mme_tunnel_request(
            self, tunnel_msg: UESessionSet,
    ) -> UESessionContextResponse:
        """Do process the mme tunnel message and send response

        Entry point to MME session creation in UPF

        Args:
            tunnel_msg: Tunnel Creation/Modification/Deletion message

        Returns:
               UESessionContextResponse: Tunnel ops result
        """
        cause_ie = CauseIE.REQUEST_ACCEPTED
        result = True

        ue_session_entry = create_ue_session_entry(tunnel_msg)

        # Call the mme state machine
        session_state = ue_session_entry.ue_session_state
        self.logger.debug("UE State = %d\n", session_state)

        result = self.mme_fsm[session_state](ue_session_entry)

        if result is False:
            cause_ie = CauseIE.RULE_CREATION_OR_MODIFICATION_FAILURE

        return (
            UESessionContextResponse(
                ue_ipv4_address=tunnel_msg.ue_ipv4_address,
                ue_ipv6_address=tunnel_msg.ue_ipv6_address,
                operation_type=ue_session_entry.ue_session_state,
                cause_info=CauseIE(cause_ie=cause_ie),
            )
        )
Example #2
0
    def UpdateUEState(self, request, context):

        self._log_grpc_payload(request)

        if not self._service_manager.is_app_enabled(Classifier.APP_NAME):
            context.set_code(grpc.StatusCode.UNAVAILABLE)
            context.set_details('Service not enabled!')
            return None

        fut = Future()
        self._loop.call_soon_threadsafe(\
                      self._setup_pg_tunnel_update, request, fut)
        try:
            return fut.result(timeout=self._call_timeout)
        except concurrent.futures.TimeoutError:
            logging.error("UpdateUEState processing timed out")
            return UESessionContextResponse(
                operation_type=request.ue_session_state.ue_config_state,
                cause_info=CauseIE(
                    cause_ie=CauseIE.REQUEST_REJECTED_NO_REASON))
Example #3
0
    def process_mme_tunnel_request(
        self, request: UESessionSet,
    ) -> UESessionContextResponse:
        """Do process the mme tunnel message and send response
        Entry point to MME session creation in UPF

        Args:
               tunnel_msg: Tunnel Creation/Modification/Deletion message
        Returns:
               UESessionContextResponse: Tunnel ops result
        """
        cause_ie = CauseIE.REQUEST_ACCEPTED
        result = True
        res = True
        ue_ipv4_address = None
        ue_ipv6_address = None

        if request.ue_ipv4_address.address:
            addr_str = socket.inet_ntop(
                socket.AF_INET,
                request.ue_ipv4_address.address,
            )
            ue_ipv4_address = IPAddress(
                version=IPAddress.IPV4,
                address=addr_str.encode('utf8'),
            )

        if request.ue_ipv6_address.address:
            addr_str6 = socket.inet_ntop(
                socket.AF_INET6, request.ue_ipv6_address.address,
            )
            ue_ipv6_address = IPAddress(
                version=IPAddress.IPV6,
                address=addr_str6.encode('utf8'),
            )

        if (
            request.ue_session_state.ue_config_state == \
            UESessionState.ACTIVE
        ):
            result = self._validate_ue_session(request)
            if result == False:
                cause_ie = CauseIE.RULE_CREATION_OR_MODIFICATION_FAILURE
            else:
                res = self.add_tunnel_flows(
                    request.precedence,
                    request.in_teid,
                    request.out_teid,
                    ipaddress.ip_address(request.enb_ip_address.address),
                    ue_ipv4_address,
                    encode_imsi(request.subscriber_id.id),
                    False, ue_ipv6_address,
                    request.apn, request.vlan, request.ip_flow_dl,
                )

        elif (
            request.ue_session_state.ue_config_state == \
            UESessionState.UNREGISTERED
        ):
            res = self.delete_tunnel_flows(
                request.in_teid,
                ue_ipv4_address,
                ipaddress.ip_address(request.enb_ip_address.address),
                request.ip_flow_dl,
            )

        elif (
            request.ue_session_state.ue_config_state == \
            UESessionState.UNINSTALL_IDLE
        ):
            res = self.remove_paging_flow(ue_ipv4_address)

        elif (
            request.ue_session_state.ue_config_state == \
            UESessionState.INSTALL_IDLE
        ):
            res = self.install_paging_flow(
                request.in_teid,
                ue_ipv4_address,
                False,
            )

        elif (
            request.ue_session_state.ue_config_state == \
            UESessionState.RESUME_DATA
        ):
            res = self.resume_tunnel_flows(
                request.in_teid,
                ue_ipv4_address,
                request.ip_flow_dl,
            )

        elif (
            request.ue_session_state.ue_config_state == \
            UESessionState.SUSPENDED_DATA
        ):
            res = self.discard_tunnel_flows(
                request.in_teid,
                ue_ipv4_address,
                request.ip_flow_dl,
            )

        if res == False:
            cause_ie = CauseIE.RULE_CREATION_OR_MODIFICATION_FAILURE

        return(
            UESessionContextResponse(
                ue_ipv4_address=request.ue_ipv4_address,
                ue_ipv6_address=request.ue_ipv6_address,
                operation_type=request.ue_session_state.ue_config_state,
                cause_info=CauseIE(cause_ie=cause_ie),
            )
        )