qcacmn: NDP_END_REQ implementation

Add implementation of NDP_END_REQ.

Change-Id: Ifa0bdcdee09c15c68bb12c63ba1157c71650c5bc
CRs-Fixed: 2014795
This commit is contained in:
Naveen Rawat
2017-04-04 19:41:56 -07:00
gecommit door Sandeep Puligilla
bovenliggende f2bc82eb18
commit 52e9bb6d6f
5 gewijzigde bestanden met toevoegingen van 666 en 1 verwijderingen

Bestand weergeven

@@ -497,6 +497,9 @@ struct nan_callbacks {
int (*get_peer_idx)(uint8_t, struct qdf_mac_addr *);
QDF_STATUS (*add_ndi_peer)(uint32_t, struct qdf_mac_addr);
void (*peer_departed_ind)(uint8_t, uint16_t, struct qdf_mac_addr *,
bool);
void (*ndp_delete_peers)(struct peer_nan_datapath_map*, uint8_t);
void (*delete_peers_by_addr)(uint8_t, struct qdf_mac_addr);
};

Bestand weergeven

@@ -115,7 +115,6 @@ static void nan_req_incomplete(void *req, uint32_t cmdtype)
static void nan_req_activated(void *in_req, uint32_t cmdtype)
{
uint32_t req_type;
QDF_STATUS status;
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_vdev *vdev;
struct wlan_lmac_if_nan_tx_ops *tx_ops;
@@ -413,6 +412,57 @@ static QDF_STATUS nan_handle_responder_rsp(
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS nan_handle_ndp_end_rsp(
struct nan_datapath_end_rsp_event *rsp,
struct wlan_objmgr_vdev **vdev)
{
struct wlan_objmgr_psoc *psoc;
struct nan_psoc_priv_obj *psoc_nan_obj;
*vdev = rsp->vdev;
psoc = wlan_vdev_get_psoc(rsp->vdev);
if (!psoc) {
nan_err("psoc is NULL");
return QDF_STATUS_E_NULL_VALUE;
}
psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
if (!psoc_nan_obj) {
nan_err("psoc_nan_obj is NULL");
return QDF_STATUS_E_NULL_VALUE;
}
psoc_nan_obj->cb_obj.os_if_event_handler(psoc, rsp->vdev,
NDP_END_RSP, rsp);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS nan_handle_end_ind(
struct nan_datapath_end_indication_event *ind)
{
struct wlan_objmgr_psoc *psoc;
struct nan_psoc_priv_obj *psoc_nan_obj;
psoc = wlan_vdev_get_psoc(ind->vdev);
if (!psoc) {
nan_err("psoc is NULL");
return QDF_STATUS_E_NULL_VALUE;
}
psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
if (!psoc_nan_obj) {
nan_err("psoc_nan_obj is NULL");
return QDF_STATUS_E_NULL_VALUE;
}
psoc_nan_obj->cb_obj.ndp_delete_peers(ind->ndp_map, ind->num_ndp_ids);
psoc_nan_obj->cb_obj.os_if_event_handler(psoc, ind->vdev,
NDP_END_IND, ind);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS nan_event_handler(struct scheduler_msg *pe_msg)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -448,6 +498,14 @@ QDF_STATUS nan_event_handler(struct scheduler_msg *pe_msg)
cmd.cmd_type = WLAN_SER_CMD_NDP_RESP_REQ;
wlan_serialization_remove_cmd(&cmd);
break;
case NDP_END_RSP:
nan_handle_ndp_end_rsp(pe_msg->bodyptr, &cmd.vdev);
cmd.cmd_type = WLAN_SER_CMD_NDP_DATA_END_INIT_REQ;
wlan_serialization_remove_cmd(&cmd);
break;
case NDP_END_IND:
nan_handle_end_ind(pe_msg->bodyptr);
break;
default:
nan_alert("Unhandled NDP event: %d", pe_msg->type);
status = QDF_STATUS_E_NOSUPPORT;

Bestand weergeven

@@ -440,6 +440,40 @@ free_resources:
return NULL;
}
static struct nan_datapath_end_req *ucfg_nan_copy_end_req(
struct wlan_objmgr_vdev *vdev,
struct nan_datapath_end_req *in_req)
{
struct nan_datapath_end_req *req;
req = qdf_mem_malloc(sizeof(*req));
if (!req) {
nan_alert("malloc failed");
return NULL;
}
qdf_mem_copy(req, in_req, sizeof(*req));
if (in_req->num_ndp_instances) {
req->ndp_ids = qdf_mem_malloc(sizeof(uint32_t) *
in_req->num_ndp_instances);
if (!req->ndp_ids) {
nan_alert("malloc failed");
goto free_resources;
}
qdf_mem_copy(req->ndp_ids, in_req->ndp_ids,
sizeof(uint32_t) * in_req->num_ndp_instances);
}
/* do not get ref here, rather take ref when request is activated */
req->vdev = vdev;
return req;
free_resources:
qdf_mem_free(req->ndp_ids);
qdf_mem_free(req);
return NULL;
}
QDF_STATUS ucfg_nan_req_processor(struct wlan_objmgr_vdev *vdev,
void *in_req, uint32_t req_type)
{
@@ -459,6 +493,9 @@ QDF_STATUS ucfg_nan_req_processor(struct wlan_objmgr_vdev *vdev,
case NDP_RESPONDER_REQ:
req = ucfg_nan_copy_responder_req(vdev, in_req);
break;
case NDP_END_REQ:
req = ucfg_nan_copy_end_req(vdev, in_req);
break;
default:
nan_err("in correct message req type: %d", req_type);
return QDF_STATUS_E_INVAL;
@@ -522,6 +559,7 @@ int ucfg_nan_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc,
psoc_obj->cb_obj.get_peer_idx = cb_obj->get_peer_idx;
psoc_obj->cb_obj.new_peer_ind = cb_obj->new_peer_ind;
psoc_obj->cb_obj.peer_departed_ind = cb_obj->peer_departed_ind;
return 0;
}
@@ -537,6 +575,7 @@ int ucfg_nan_register_lim_callbacks(struct wlan_objmgr_psoc *psoc,
}
psoc_obj->cb_obj.add_ndi_peer = cb_obj->add_ndi_peer;
psoc_obj->cb_obj.ndp_delete_peers = cb_obj->ndp_delete_peers;
psoc_obj->cb_obj.delete_peers_by_addr = cb_obj->delete_peers_by_addr;
return 0;