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