Ejemplo n.º 1
0
    def add_ue_mac_flow(self, sid, mac_addr):
        # TODO report add flow result back to sessiond
        if self._datapath is None:
            return FlowResponse(result=FlowResponse.FAILURE)

        uplink_match = MagmaMatch(eth_src=mac_addr)
        self._add_resubmit_flow(sid, uplink_match,
                                priority=flows.UE_FLOW_PRIORITY,
                                next_table=self._passthrough_set_tbl)

        downlink_match = MagmaMatch(eth_dst=mac_addr)
        self._add_resubmit_flow(sid, downlink_match,
                                priority=flows.UE_FLOW_PRIORITY,
                                next_table=self._passthrough_set_tbl)

        # For handling internal ipfix pkt sampling
        if self._service_manager.is_app_enabled(IPFIXController.APP_NAME):
            self._add_resubmit_flow(sid, uplink_match,
                                    priority=flows.UE_FLOW_PRIORITY,
                                    tbl_num=self._imsi_set_tbl_num,
                                    next_table=self._ipfix_sample_tbl_num)
            self._add_resubmit_flow(sid, downlink_match,
                                    priority=flows.UE_FLOW_PRIORITY,
                                    tbl_num=self._imsi_set_tbl_num,
                                    next_table=self._ipfix_sample_tbl_num)

        return FlowResponse(result=FlowResponse.SUCCESS)
Ejemplo n.º 2
0
    def AddUEMacFlow(self, request, context):
        """
        Associate UE MAC address to subscriber
        """
        self._log_grpc_payload(request)
        if not self._service_manager.is_app_enabled(
                UEMacAddressController.APP_NAME):
            context.set_code(grpc.StatusCode.UNAVAILABLE)
            context.set_details('Service not enabled!')
            return None

        if not self._ue_mac_app.is_controller_ready():
            context.set_code(grpc.StatusCode.UNAVAILABLE)
            context.set_details('UE MAC service not initialized!')
            return FlowResponse()

        # 12 hex characters + 5 colons
        if len(request.mac_addr) != 17:
            context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
            context.set_details('Invalid UE MAC address provided')
            return None

        fut = Future()
        self._loop.call_soon_threadsafe(self._add_ue_mac_flow, request, fut)

        try:
            return fut.result(timeout=self._call_timeout)
        except concurrent.futures.TimeoutError:
            logging.error("AddUEMacFlow processing timed out")
            return FlowResponse()
Ejemplo n.º 3
0
    def DeleteUEMacFlow(self, request, context):
        """
        Delete UE MAC address to subscriber association
        """
        self._log_grpc_payload(request)
        if not self._service_manager.is_app_enabled(
                UEMacAddressController.APP_NAME, ):
            context.set_code(grpc.StatusCode.UNAVAILABLE)
            context.set_details('Service not enabled!')
            return None

        if not self._ue_mac_app.is_controller_ready():
            context.set_code(grpc.StatusCode.UNAVAILABLE)
            context.set_details('UE MAC service not initialized!')
            return FlowResponse()

        # 12 hex characters + 5 colons
        if len(request.mac_addr) != 17:
            context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
            context.set_details('Invalid UE MAC address provided')
            return None

        self._loop.call_soon_threadsafe(
            self._ue_mac_app.delete_ue_mac_flow,
            request.sid.id,
            request.mac_addr,
        )

        if self._service_manager.is_app_enabled(CheckQuotaController.APP_NAME):
            self._loop.call_soon_threadsafe(
                self._check_quota_app.remove_subscriber_flow,
                request.sid.id,
            )

        if self._service_manager.is_app_enabled(VlanLearnController.APP_NAME):
            self._loop.call_soon_threadsafe(
                self._vlan_learn_app.remove_subscriber_flow,
                request.sid.id,
            )

        if self._service_manager.is_app_enabled(
                TunnelLearnController.APP_NAME):
            self._loop.call_soon_threadsafe(
                self._tunnel_learn_app.remove_subscriber_flow,
                request.mac_addr,
            )

        if self._service_manager.is_app_enabled(IPFIXController.APP_NAME):
            # Delete trace flow
            self._loop.call_soon_threadsafe(
                self._ipfix_app.delete_ue_sample_flow,
                request.sid.id,
            )

        resp = FlowResponse()
        return resp
Ejemplo n.º 4
0
    def AddUEMacFlow(self, request, context):
        """
        Associate UE MAC address to subscriber
        """
        if not self._service_manager.is_app_enabled(
                UEMacAddressController.APP_NAME):
            context.set_code(grpc.StatusCode.UNAVAILABLE)
            context.set_details('Service not enabled!')
            return None

        # 12 hex characters + 5 colons
        if len(request.mac_addr) != 17:
            context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
            context.set_details('Invalid UE MAC address provided')
            return None

        self._loop.call_soon_threadsafe(self._ue_mac_app.add_ue_mac_flow,
                                        request.sid.id, request.mac_addr)

        if self._service_manager.is_app_enabled(IPFIXController.APP_NAME):
            # Install trace flow
            self._loop.call_soon_threadsafe(self._ipfix_app.add_ue_sample_flow,
                                            request.sid.id, request.msisdn,
                                            request.ap_mac_addr,
                                            request.ap_name)

        resp = FlowResponse()
        return resp
Ejemplo n.º 5
0
 def UpdateFlowStats(self, request, context):
     """
     Update stats for a flow
     """
     if not self._service_manager.is_app_enabled(DPIController.APP_NAME):
         context.set_code(grpc.StatusCode.UNAVAILABLE)
         context.set_details('Service not enabled!')
         return None
     resp = FlowResponse()
     return resp
Ejemplo n.º 6
0
    def UpdateSubscriberQuotaState(self, request, context):
        """
        Updates the subcsciber quota state
        """
        self._log_grpc_payload(request)
        if not self._service_manager.is_app_enabled(
                CheckQuotaController.APP_NAME):
            context.set_code(grpc.StatusCode.UNAVAILABLE)
            context.set_details('Service not enabled!')
            return None

        if not self._check_quota_app.is_controller_ready():
            context.set_code(grpc.StatusCode.UNAVAILABLE)
            context.set_details('Check Quota service not initialized!')
            return FlowResponse()

        resp = FlowResponse()
        self._loop.call_soon_threadsafe(
            self._check_quota_app.update_subscriber_quota_state, request.updates)
        return resp
Ejemplo n.º 7
0
 def RemoveFlow(self, request, context):
     """
     Add dpi flow
     """
     if not self._service_manager.is_app_enabled(DPIController.APP_NAME):
         context.set_code(grpc.StatusCode.UNAVAILABLE)
         context.set_details('Service not enabled!')
         return None
     resp = FlowResponse()
     self._loop.call_soon_threadsafe(self._dpi_app.remove_classify_flow,
                                     request.match)
     return resp
Ejemplo n.º 8
0
    def UpdateIPFIXFlow(self, request, context):
        """
        Update IPFIX sampling record
        """
        if self._service_manager.is_app_enabled(IPFIXController.APP_NAME):
            # Install trace flow
            self._loop.call_soon_threadsafe(
                self._ipfix_app.add_ue_sample_flow, request.sid.id,
                request.msisdn, request.ap_mac_addr, request.ap_name)

        resp = FlowResponse()
        return resp
Ejemplo n.º 9
0
 def CreateFlow(self, request, context):
     """
     Add dpi flow
     """
     self._log_grpc_payload(request)
     if not self._service_manager.is_app_enabled(DPIController.APP_NAME):
         context.set_code(grpc.StatusCode.UNAVAILABLE)
         context.set_details('Service not enabled!')
         return None
     resp = FlowResponse()
     self._loop.call_soon_threadsafe(self._dpi_app.add_classify_flow,
                                     request.match, request.state,
                                     request.app_name, request.service_type)
     return resp