1  /*
2   * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for
6   * any purpose with or without fee is hereby granted, provided that the
7   * above copyright notice and this permission notice appear in all
8   * copies.
9   *
10   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17   * PERFORMANCE OF THIS SOFTWARE.
18   */
19  
20  /**
21   * DOC: wlan_tdls_mgmt.h
22   *
23   * TDLS management frames include file
24   */
25  
26  #ifndef _WLAN_TDLS_MGMT_H_
27  #define _WLAN_TDLS_MGMT_H_
28  
29  #include "wlan_tdls_cmds_process.h"
30  
31  #define TDLS_PUBLIC_ACTION_FRAME_OFFSET 24
32  /* TDLS_PUBLIC_ACTION_FRAME_OFFSET(category[1]) + action[1] + dialog[1]
33   * + cap[2]
34   */
35  #define TDLS_PUBLIC_ACTION_FRAME_TDLS_IE_OFFSET 29
36  #define TDLS_PUBLIC_ACTION_FRAME 4
37  #define TDLS_PUBLIC_ACTION_DISC_RESP 14
38  #define TDLS_ACTION_FRAME 12
39  #define TDLS_80211_PEER_ADDR_OFFSET (TDLS_PUBLIC_ACTION_FRAME + \
40  				     QDF_MAC_ADDR_SIZE)
41  #define TDLS_ACTION_FRAME_TYPE_MAX 11
42  
43  /**
44   * struct tdls_link_identifier - tdls link identifier ie
45   * @id: element id
46   * @len: length
47   * @bssid: bssid
48   * @initsta: the mac address of initiator
49   * @respsta: the mac address of responder
50   */
51  struct tdls_link_identifier {
52  	uint8_t id;
53  	uint8_t len;
54  	uint8_t bssid[6];
55  	uint8_t initsta[6];
56  	uint8_t respsta[6];
57  };
58  
59  /**
60   * struct tdls_rx_mgmt_event - tdls rx mgmt frame event
61   * @tdls_soc_obj: tdls soc private object
62   * @rx_mgmt: tdls rx mgmt frame structure
63   */
64  struct tdls_rx_mgmt_event {
65  	struct tdls_soc_priv_obj *tdls_soc_obj;
66  	struct tdls_rx_mgmt_frame *rx_mgmt;
67  };
68  
69  /**
70   * tdls_process_mgmt_req() - send a TDLS mgmt request to serialize module
71   * @tdls_mgmt_req: tdls management request
72   *
73   * TDLS request API, called from cfg80211 to send a TDLS frame in
74   * serialized manner to PE
75   *
76   *Return: QDF_STATUS
77   */
78  QDF_STATUS tdls_process_mgmt_req(
79  			struct tdls_action_frame_request *tdls_mgmt_req);
80  
81  /**
82   * tdls_process_mlo_cal_tdls_link_score() - process mlo cal tdls link
83   * @vdev: object manager vdev
84   *
85   * Converts rx tdls frame freq to a link score and stores the score
86   * in relative tdls_vdev object.
87   *
88   *Return: QDF_STATUS
89   */
90  QDF_STATUS
91  tdls_process_mlo_cal_tdls_link_score(struct wlan_objmgr_vdev *vdev);
92  
93  /**
94   * tdls_mlo_get_tdls_link_vdev() - wrapper function
95   * @vdev: vdev object
96   *
97   * Return: tdls vdev
98   */
99  struct wlan_objmgr_vdev *
100  tdls_mlo_get_tdls_link_vdev(struct wlan_objmgr_vdev *vdev);
101  
102  /**
103   * tdls_set_remain_links_unforce() - unforce links
104   * @vdev: vdev object
105   *
106   * Return: void
107   */
108  void tdls_set_remain_links_unforce(struct wlan_objmgr_vdev *vdev);
109  
110  /**
111   * tdls_mgmt_rx_ops() - register or unregister rx callback
112   * @psoc: psoc object
113   * @isregister: register if true, unregister if false
114   *
115   * This function registers or unregisters rx callback to mgmt txrx
116   * component.
117   *
118   * Return: QDF_STATUS
119   */
120  QDF_STATUS tdls_mgmt_rx_ops(struct wlan_objmgr_psoc *psoc,
121  	bool isregister);
122  
123  /**
124   * tdls_process_rx_frame() - process tdls rx frames
125   * @msg: scheduler msg
126   *
127   * Return: QDF_STATUS
128   */
129  QDF_STATUS tdls_process_rx_frame(struct scheduler_msg *msg);
130  
131  /**
132   * tdls_set_rssi() - Set TDLS RSSI on peer given by mac
133   * @vdev: vdev object
134   * @mac: MAC address of Peer
135   * @rssi: rssi value
136   *
137   * Set RSSI on TDSL peer
138   *
139   * Return: QDF_STATUS
140   */
141  QDF_STATUS tdls_set_rssi(struct wlan_objmgr_vdev *vdev,
142  			 uint8_t *mac, int8_t rssi);
143  
144  /**
145   * tdls_process_mlo_choice_tdls_vdev() - choice one vdev for tdls vdev
146   * @vdev: object manager vdev
147   *
148   * Return: pointer of vdev object
149   */
150  struct wlan_objmgr_vdev *
151  tdls_process_mlo_choice_tdls_vdev(struct wlan_objmgr_vdev *vdev);
152  
153  /**
154   * tdls_set_no_force_vdev() - set no force for the vdev
155   * @vdev: object manager vdev
156   * @flag: true, set all vdev as no force; false, except the current one.
157   *
158   * Return: void
159   */
160  void tdls_set_no_force_vdev(struct wlan_objmgr_vdev *vdev, bool flag);
161  
162  /**
163   * tdls_set_link_mode() - force active or unfore link for MLO case
164   * @req: the pointer of tdls_action_frame_request
165   *
166   * Return: QDF_STATUS
167   */
168  QDF_STATUS tdls_set_link_mode(struct tdls_action_frame_request *req);
169  #endif
170  
171