@@ -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,186 @@ 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 .dmsid = dms_params -> dmsid ;
1012
+ dms_info .dialog_token = dms_params -> dialog_token ;
1013
+
1014
+ dms_info .up = dms_params -> tclas_elem .up ;
1015
+ dms_info .tclas_type = dms_params -> tclas_elem .classifier_info .type ;
1016
+ dms_info .tclas_mask = dms_params -> tclas_elem .classifier_info .mask ;
1017
+ dms_info .version = dms_params -> tclas_elem .classifier_info .param_info .version ;
1018
+ dms_info .src_ip_addr = dms_params -> tclas_elem .classifier_info .param_info .src_ip_addr ;
1019
+ dms_info .src_port = dms_params -> tclas_elem .classifier_info .param_info .src_port ;
1020
+ dms_info .dest_ip_addr = dms_params -> tclas_elem .classifier_info .param_info .dest_ip_addr ;
1021
+ dms_info .dest_port = dms_params -> tclas_elem .classifier_info .param_info .dest_port ;
1022
+ dms_info .dscp = dms_params -> tclas_elem .classifier_info .param_info .dscp ;
1023
+ dms_info .protocol = dms_params -> tclas_elem .classifier_info .param_info .protocol ;
1024
+
1025
+ status = nrf_wifi_fmac_req_add_dms (rpu_ctx_zep -> rpu_ctx ,
1026
+ vif_ctx_zep -> vif_idx ,
1027
+ & dms_info );
1028
+ break ;
1029
+ case WIFI_DMS_REQ_REMOVE :
1030
+ if (!(vif_ctx_zep -> dms_id_map & BIT (dms_params -> dmsid ))) {
1031
+ dms_params -> fail_reason = WIFI_FAIL_INVALID_DMS_ID ;
1032
+ goto out ;
1033
+ }
1034
+ dms_info .dmsid = dms_params -> dmsid ;
1035
+
1036
+ status = nrf_wifi_fmac_req_remove_dms (vif_ctx_zep ,
1037
+ vif_ctx_zep -> vif_idx ,
1038
+ & dms_info );
1039
+ break ;
1040
+ case WIFI_DMS_REQ_CHANGE :
1041
+ if (vif_ctx_zep -> dms_id_in_progress_map & BIT (dms_params -> dmsid )) {
1042
+ dms_params -> fail_reason = WIFI_FAIL_OPERATION_IN_PROGRESS ;
1043
+ goto out ;
1044
+ }
1045
+
1046
+ if (!(vif_ctx_zep -> dms_id_map & BIT (dms_params -> dmsid ))) {
1047
+ dms_params -> fail_reason = WIFI_FAIL_INVALID_DMS_ID ;
1048
+ goto out ;
1049
+ }
1050
+
1051
+ dms_info .dmsid = dms_params -> dmsid ;
1052
+ dms_info .dialog_token = dms_params -> dialog_token ;
1053
+
1054
+ dms_info .up = dms_params -> tclas_elem .up ;
1055
+ dms_info .tclas_type = dms_params -> tclas_elem .classifier_info .type ;
1056
+ dms_info .tclas_mask = dms_params -> tclas_elem .classifier_info .mask ;
1057
+ dms_info .version = dms_params -> tclas_elem .classifier_info .param_info .version ;
1058
+ dms_info .src_ip_addr = dms_params -> tclas_elem .classifier_info .param_info .src_ip_addr ;
1059
+ dms_info .src_port = dms_params -> tclas_elem .classifier_info .param_info .src_port ;
1060
+ dms_info .dest_ip_addr = dms_params -> tclas_elem .classifier_info .param_info .dest_ip_addr ;
1061
+ dms_info .dest_port = dms_params -> tclas_elem .classifier_info .param_info .dest_port ;
1062
+ dms_info .dscp = dms_params -> tclas_elem .classifier_info .param_info .dscp ;
1063
+ dms_info .protocol = dms_params -> tclas_elem .classifier_info .param_info .protocol ;
1064
+
1065
+ status = nrf_wifi_fmac_req_change_dms (rpu_ctx_zep -> rpu_ctx ,
1066
+ vif_ctx_zep -> vif_idx ,
1067
+ & dms_info );
1068
+ break ;
1069
+ default :
1070
+ LOG_ERR ("Unknown DMS operation" );
1071
+ status = NRF_WIFI_STATUS_FAIL ;
1072
+ break ;
1073
+ }
1074
+
1075
+ if (status != NRF_WIFI_STATUS_SUCCESS ) {
1076
+ LOG_ERR ("%s: nrf_wifi_req_dms %s failed" ,
1077
+ __func__ ,
1078
+ (dms_params -> operation == WIFI_DMS_REQ_ADD ) ? "add" :
1079
+ (dms_params -> operation == WIFI_DMS_REQ_REMOVE ) ? "remove" : "change" );
1080
+ goto out ;
1081
+ }
1082
+
1083
+ ret = 0 ;
1084
+ out :
1085
+ k_mutex_unlock (& vif_ctx_zep -> vif_lock );
1086
+ return ret ;
1087
+ }
1088
+
1089
+ void nrf_wifi_event_proc_dms_zep (void * vif_ctx ,
1090
+ struct nrf_wifi_umac_dms_op * dms_info ,
1091
+ unsigned int event_len )
1092
+ {
1093
+ struct nrf_wifi_vif_ctx_zep * vif_ctx_zep = NULL ;
1094
+ struct wifi_dms_params dms_params ;
1095
+
1096
+ if (!vif_ctx || !dms_info ) {
1097
+ return ;
1098
+ }
1099
+
1100
+ vif_ctx_zep = vif_ctx ;
1101
+
1102
+ dms_params .dmsid = dms_info -> info .dmsid ;
1103
+ dms_params .dialog_token = dms_info -> info .dialog_token ;
1104
+ dms_params .tclas_elem .up = dms_info -> info .up ;
1105
+ dms_params .tclas_elem .classifier_info .param_info .version = dms_info -> info .version ;
1106
+ dms_params .tclas_elem .classifier_info .param_info .src_ip_addr = dms_info -> info .src_ip_addr ;
1107
+ dms_params .tclas_elem .classifier_info .param_info .src_port = dms_info -> info .src_port ;
1108
+ dms_params .tclas_elem .classifier_info .param_info .dest_ip_addr = dms_info -> info .dest_ip_addr ;
1109
+ dms_params .tclas_elem .classifier_info .param_info .dest_port = dms_info -> info .dest_port ;
1110
+ dms_params .tclas_elem .classifier_info .param_info .dscp = dms_info -> info .dscp ;
1111
+ dms_params .tclas_elem .classifier_info .param_info .protocol = dms_info -> info .protocol ;
1112
+ dms_params .tclas_elem .classifier_info .type = dms_info -> info .tclas_type ;
1113
+ dms_params .tclas_elem .classifier_info .mask = dms_info -> info .tclas_mask ;
1114
+
1115
+ switch (dms_info -> info .event_type ) {
1116
+ case NRF_WIFI_DMS_EVENT_ACCEPT :
1117
+ dms_params .operation = WIFI_DMS_REQ_ADD ;
1118
+ if (dms_info -> info .dms_resp_status == 0 ) {
1119
+ nrf_wifi_dms_update_internal_state (vif_ctx_zep , true, dms_params .dmsid );
1120
+ }
1121
+ break ;
1122
+ case NRF_WIFI_DMS_EVENT_REJECT :
1123
+ break ;
1124
+ case NRF_WIFI_DMS_EVENT_TERMINATE :
1125
+ nrf_wifi_dms_update_internal_state (vif_ctx_zep , false, dms_params .dmsid );
1126
+ break ;
1127
+ case NRF_WIFI_DMS_EVENT_INVALID :
1128
+ LOG_ERR ("Unknown DMS event received" );
1129
+ break ;
1130
+ }
1131
+
1132
+ wifi_mgmt_raise_dms_event (vif_ctx_zep -> zep_net_if_ctx , & dms_params );
1133
+ }
0 commit comments