Skip to content

Commit decfa9e

Browse files
committed
drivers: wifi: DMS support
Support for Directed multicast service(DMS). Signed-off-by: Ajay Parida <[email protected]>
1 parent 058452a commit decfa9e

File tree

4 files changed

+197
-4
lines changed

4 files changed

+197
-4
lines changed

drivers/wifi/nrf700x/inc/fmac_main.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ struct nrf_wifi_vif_ctx_zep {
8080
#endif /* CONFIG_NRF700X_DATA_TX */
8181
unsigned long rssi_record_timestamp_us;
8282
signed short rssi;
83+
unsigned char dms_id_map;
84+
unsigned char dms_id_in_progress_map;
8385
#endif /* CONFIG_NRF700X_STA_MODE */
8486
};
8587

drivers/wifi/nrf700x/inc/wifi_mgmt.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,10 @@ int nrf_wifi_filter(const struct device *dev,
7070
struct wifi_filter_info *filter);
7171
#endif /* CONFIG_NRF700X_RAW_DATA_RX || CONFIG_NRF700X_PROMISC_DATA_RX */
7272

73+
int nrf_wifi_req_dms(const struct device *dev,
74+
struct wifi_dms_params *dms_params);
75+
76+
void nrf_wifi_event_proc_dms_zep(void *vif_ctx,
77+
struct nrf_wifi_umac_dms_op *dms_accept_info,
78+
unsigned int event_len);
7379
#endif /* __ZEPHYR_WIFI_MGMT_H__ */

drivers/wifi/nrf700x/src/fmac_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,7 @@ static int nrf_wifi_drv_main_zep(const struct device *dev)
721721
callbk_fns.event_get_wiphy = nrf_wifi_wpa_supp_event_get_wiphy;
722722
callbk_fns.mgmt_rx_callbk_fn = nrf_wifi_wpa_supp_event_mgmt_rx_callbk_fn;
723723
callbk_fns.get_conn_info_callbk_fn = nrf_wifi_supp_event_proc_get_conn_info;
724+
callbk_fns.dms_callbk_fn = nrf_wifi_event_proc_dms_zep;
724725
#endif /* CONFIG_NRF700X_STA_MODE */
725726

726727
rpu_drv_priv_zep.fmac_priv = nrf_wifi_fmac_init(&data_config,
@@ -786,6 +787,7 @@ static struct wifi_mgmt_ops nrf_wifi_mgmt_ops = {
786787
.set_twt = nrf_wifi_set_twt,
787788
.reg_domain = nrf_wifi_reg_domain,
788789
.get_power_save_config = nrf_wifi_get_power_save_config,
790+
.req_dms = nrf_wifi_req_dms,
789791
#endif /* CONFIG_NRF700X_STA_MODE */
790792
#ifdef CONFIG_NRF700X_SYSTEM_MODE
791793
.mode = nrf_wifi_mode,

drivers/wifi/nrf700x/src/wifi_mgmt.c

Lines changed: 187 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -508,20 +508,20 @@ int nrf_wifi_set_twt(const struct device *dev,
508508
twt_params->flow_id >= WIFI_MAX_TWT_FLOWS) {
509509
LOG_ERR("%s: Invalid flow id: %d",
510510
__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;
512512
goto out;
513513
}
514514

515515
switch (twt_params->operation) {
516516
case WIFI_TWT_SETUP:
517517
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;
519519
goto out;
520520
}
521521

522522
if (twt_params->setup_cmd == WIFI_TWT_SETUP_CMD_REQUEST) {
523523
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;
525525
goto out;
526526
}
527527
}
@@ -559,7 +559,7 @@ int nrf_wifi_set_twt(const struct device *dev,
559559

560560
if (!twt_params->teardown.teardown_all) {
561561
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;
563563
goto out;
564564
}
565565
start_flow_id = twt_params->flow_id;
@@ -948,3 +948,186 @@ int nrf_wifi_filter(const struct device *dev,
948948
return ret;
949949
}
950950
#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

Comments
 (0)