@@ -508,20 +508,20 @@ int nrf_wifi_set_twt(const struct device *dev,
508
508
twt_params -> flow_id >= WIFI_MAX_TWT_FLOWS ) {
509
509
LOG_ERR ("%s: Invalid flow id: %d" ,
510
510
__func__ , twt_params -> flow_id );
511
- twt_params -> fail_reason = WIFI_TWT_FAIL_INVALID_FLOW_ID ;
511
+ twt_params -> fail_reason = WIFI_FAIL_INVALID_FLOW_ID ;
512
512
goto out ;
513
513
}
514
514
515
515
switch (twt_params -> operation ) {
516
516
case WIFI_TWT_SETUP :
517
517
if (vif_ctx_zep -> twt_flow_in_progress_map & BIT (twt_params -> flow_id )) {
518
- twt_params -> fail_reason = WIFI_TWT_FAIL_OPERATION_IN_PROGRESS ;
518
+ twt_params -> fail_reason = WIFI_FAIL_OPERATION_IN_PROGRESS ;
519
519
goto out ;
520
520
}
521
521
522
522
if (twt_params -> setup_cmd == WIFI_TWT_SETUP_CMD_REQUEST ) {
523
523
if (vif_ctx_zep -> twt_flows_map & BIT (twt_params -> flow_id )) {
524
- twt_params -> fail_reason = WIFI_TWT_FAIL_FLOW_ALREADY_EXISTS ;
524
+ twt_params -> fail_reason = WIFI_FAIL_FLOW_ALREADY_EXISTS ;
525
525
goto out ;
526
526
}
527
527
}
@@ -559,7 +559,7 @@ int nrf_wifi_set_twt(const struct device *dev,
559
559
560
560
if (!twt_params -> teardown .teardown_all ) {
561
561
if (!(vif_ctx_zep -> twt_flows_map & BIT (twt_params -> flow_id ))) {
562
- twt_params -> fail_reason = WIFI_TWT_FAIL_INVALID_FLOW_ID ;
562
+ twt_params -> fail_reason = WIFI_FAIL_INVALID_FLOW_ID ;
563
563
goto out ;
564
564
}
565
565
start_flow_id = twt_params -> flow_id ;
@@ -948,3 +948,167 @@ int nrf_wifi_filter(const struct device *dev,
948
948
return ret ;
949
949
}
950
950
#endif /* CONFIG_NRF700X_RAW_DATA_RX || CONFIG_NRF700X_PROMISC_DATA_RX */
951
+
952
+ static void nrf_wifi_dms_update_internal_state (struct nrf_wifi_vif_ctx_zep * vif_ctx_zep ,
953
+ bool add , unsigned char dmsid )
954
+ {
955
+ if (add ) {
956
+ vif_ctx_zep -> dms_id_map |= BIT (dmsid );
957
+ vif_ctx_zep -> dms_id_in_progress_map &= ~BIT (dmsid );
958
+ } else {
959
+ vif_ctx_zep -> dms_id_map &= ~BIT (dmsid );
960
+ }
961
+ }
962
+
963
+ int nrf_wifi_req_dms (const struct device * dev ,
964
+ struct wifi_dms_params * dms_params )
965
+ {
966
+ enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL ;
967
+ struct nrf_wifi_ctx_zep * rpu_ctx_zep = NULL ;
968
+ struct nrf_wifi_vif_ctx_zep * vif_ctx_zep = NULL ;
969
+ struct nrf_wifi_umac_config_dms_info dms_info = {0 };
970
+ int ret = -1 ;
971
+
972
+ if (!dev || !dms_params ) {
973
+ LOG_ERR ("%s: dev or dms_params is NULL" , __func__ );
974
+ return ret ;
975
+ }
976
+
977
+ vif_ctx_zep = dev -> data ;
978
+
979
+ if (!vif_ctx_zep ) {
980
+ LOG_ERR ("%s: vif_ctx_zep is NULL" , __func__ );
981
+ return ret ;
982
+ }
983
+
984
+ rpu_ctx_zep = vif_ctx_zep -> rpu_ctx_zep ;
985
+
986
+ if (!rpu_ctx_zep ) {
987
+ LOG_ERR ("%s: rpu_ctx_zep is NULL" , __func__ );
988
+ return ret ;
989
+ }
990
+
991
+ k_mutex_lock (& vif_ctx_zep -> vif_lock , K_FOREVER );
992
+ if (!rpu_ctx_zep -> rpu_ctx ) {
993
+ LOG_DBG ("%s: RPU context not initialized" , __func__ );
994
+ goto out ;
995
+ }
996
+
997
+ switch (dms_params -> operation ) {
998
+ case WIFI_DMS_REQ_ADD :
999
+ if (vif_ctx_zep -> dms_id_in_progress_map & BIT (dms_params -> dmsid )) {
1000
+ dms_params -> fail_reason = WIFI_FAIL_OPERATION_IN_PROGRESS ;
1001
+ goto out ;
1002
+ }
1003
+
1004
+ if (dms_params -> operation == WIFI_DMS_REQ_ADD ) {
1005
+ if (vif_ctx_zep -> dms_id_map & BIT (dms_params -> dmsid )) {
1006
+ dms_params -> fail_reason = WIFI_FAIL_FLOW_ALREADY_EXISTS ;
1007
+ goto out ;
1008
+ }
1009
+ }
1010
+
1011
+ dms_info .req_type = NRF_WIFI_DMS_REQ_ADD ;
1012
+ break ;
1013
+ case WIFI_DMS_REQ_REMOVE :
1014
+ if (!(vif_ctx_zep -> dms_id_map & BIT (dms_params -> dmsid ))) {
1015
+ dms_params -> fail_reason = WIFI_FAIL_INVALID_DMS_ID ;
1016
+ goto out ;
1017
+ }
1018
+ dms_info .req_type = NRF_WIFI_DMS_REQ_REMOVE ;
1019
+ dms_info .dmsid = dms_params -> dmsid ;
1020
+ break ;
1021
+ case WIFI_DMS_REQ_CHANGE :
1022
+ if (vif_ctx_zep -> dms_id_in_progress_map & BIT (dms_params -> dmsid )) {
1023
+ dms_params -> fail_reason = WIFI_FAIL_OPERATION_IN_PROGRESS ;
1024
+ goto out ;
1025
+ }
1026
+
1027
+ if (!(vif_ctx_zep -> dms_id_map & BIT (dms_params -> dmsid ))) {
1028
+ dms_params -> fail_reason = WIFI_FAIL_INVALID_DMS_ID ;
1029
+ goto out ;
1030
+ }
1031
+ dms_info .req_type = NRF_WIFI_DMS_REQ_CHANGE ;
1032
+ break ;
1033
+ default :
1034
+ LOG_ERR ("Unknown DMS operation" );
1035
+ status = NRF_WIFI_STATUS_FAIL ;
1036
+ goto out ;
1037
+ }
1038
+
1039
+ dms_info .dmsid = dms_params -> dmsid ;
1040
+ dms_info .dialog_token = dms_params -> dialog_token ;
1041
+ dms_info .up = dms_params -> tclas_elem .up ;
1042
+ dms_info .tclas_type = dms_params -> tclas_elem .classifier_info .type ;
1043
+ dms_info .tclas_mask = dms_params -> tclas_elem .classifier_info .mask ;
1044
+ dms_info .version = dms_params -> tclas_elem .classifier_info .param_info .version ;
1045
+ dms_info .src_ip_addr = dms_params -> tclas_elem .classifier_info .param_info .src_ip_addr ;
1046
+ dms_info .src_port = dms_params -> tclas_elem .classifier_info .param_info .src_port ;
1047
+ dms_info .dest_ip_addr = dms_params -> tclas_elem .classifier_info .param_info .dest_ip_addr ;
1048
+ dms_info .dest_port = dms_params -> tclas_elem .classifier_info .param_info .dest_port ;
1049
+ dms_info .dscp = dms_params -> tclas_elem .classifier_info .param_info .dscp ;
1050
+ dms_info .protocol = dms_params -> tclas_elem .classifier_info .param_info .protocol ;
1051
+
1052
+ status = nrf_wifi_fmac_req_dms (rpu_ctx_zep -> rpu_ctx ,
1053
+ vif_ctx_zep -> vif_idx ,
1054
+ & dms_info );
1055
+
1056
+ if (status != NRF_WIFI_STATUS_SUCCESS ) {
1057
+ LOG_ERR ("%s: nrf_wifi_req_dms %s failed" ,
1058
+ __func__ ,
1059
+ (dms_params -> operation == WIFI_DMS_REQ_ADD ) ? "add" :
1060
+ (dms_params -> operation == WIFI_DMS_REQ_REMOVE ) ? "remove" : "change" );
1061
+ goto out ;
1062
+ }
1063
+
1064
+ ret = 0 ;
1065
+ out :
1066
+ k_mutex_unlock (& vif_ctx_zep -> vif_lock );
1067
+ return ret ;
1068
+ }
1069
+
1070
+ void nrf_wifi_event_proc_dms_zep (void * vif_ctx ,
1071
+ struct nrf_wifi_umac_cmd_config_dms * dms_info ,
1072
+ unsigned int event_len )
1073
+ {
1074
+ struct nrf_wifi_vif_ctx_zep * vif_ctx_zep = NULL ;
1075
+ struct wifi_dms_params dms_params ;
1076
+
1077
+ if (!vif_ctx || !dms_info ) {
1078
+ return ;
1079
+ }
1080
+
1081
+ vif_ctx_zep = vif_ctx ;
1082
+
1083
+ dms_params .dmsid = dms_info -> info .dmsid ;
1084
+ dms_params .dialog_token = dms_info -> info .dialog_token ;
1085
+ dms_params .tclas_elem .up = dms_info -> info .up ;
1086
+ dms_params .tclas_elem .classifier_info .param_info .version = dms_info -> info .version ;
1087
+ dms_params .tclas_elem .classifier_info .param_info .src_ip_addr = dms_info -> info .src_ip_addr ;
1088
+ dms_params .tclas_elem .classifier_info .param_info .src_port = dms_info -> info .src_port ;
1089
+ dms_params .tclas_elem .classifier_info .param_info .dest_ip_addr = dms_info -> info .dest_ip_addr ;
1090
+ dms_params .tclas_elem .classifier_info .param_info .dest_port = dms_info -> info .dest_port ;
1091
+ dms_params .tclas_elem .classifier_info .param_info .dscp = dms_info -> info .dscp ;
1092
+ dms_params .tclas_elem .classifier_info .param_info .protocol = dms_info -> info .protocol ;
1093
+ dms_params .tclas_elem .classifier_info .type = dms_info -> info .tclas_type ;
1094
+ dms_params .tclas_elem .classifier_info .mask = dms_info -> info .tclas_mask ;
1095
+
1096
+ switch (dms_info -> event_type ) {
1097
+ case NRF_WIFI_DMS_EVENT_ACCEPT :
1098
+ dms_params .operation = WIFI_DMS_REQ_ADD ;
1099
+ if (dms_info -> dms_resp_status == 0 ) {
1100
+ nrf_wifi_dms_update_internal_state (vif_ctx_zep , true, dms_params .dmsid );
1101
+ }
1102
+ break ;
1103
+ case NRF_WIFI_DMS_EVENT_REJECT :
1104
+ break ;
1105
+ case NRF_WIFI_DMS_EVENT_TERMINATE :
1106
+ nrf_wifi_dms_update_internal_state (vif_ctx_zep , false, dms_params .dmsid );
1107
+ break ;
1108
+ case NRF_WIFI_DMS_EVENT_INVALID :
1109
+ LOG_ERR ("Unknown DMS event received" );
1110
+ break ;
1111
+ }
1112
+
1113
+ wifi_mgmt_raise_dms_event (vif_ctx_zep -> zep_net_if_ctx , & dms_params );
1114
+ }
0 commit comments