1 /*
2 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 /**
20 * DOC: contains nud event tracking function declarations
21 */
22
23 #ifndef _WLAN_DP_NUD_TRACKING_H_
24 #define _WLAN_DP_NUD_TRACKING_H_
25
26 #ifdef WLAN_NUD_TRACKING
27
28 /**
29 * struct dp_nud_tx_rx_stats - Capture tx and rx count during NUD tracking
30 * @pre_tx_packets: Number of tx packets at NUD_PROBE event
31 * @pre_tx_acked: Number of tx acked at NUD_PROBE event
32 * @pre_rx_packets: Number of rx packets at NUD_PROBE event
33 * @post_tx_packets: Number of tx packets at NUD_FAILED event
34 * @post_tx_acked: Number of tx acked at NUD_FAILED event
35 * @post_rx_packets: Number of rx packets at NUD_FAILED event
36 * @gw_rx_packets: Number of rx packets from the registered gateway
37 * during the period from NUD_PROBE to NUD_FAILED
38 */
39 struct dp_nud_tx_rx_stats {
40 uint32_t pre_tx_packets;
41 uint32_t pre_tx_acked;
42 uint32_t pre_rx_packets;
43 uint32_t post_tx_packets;
44 uint32_t post_tx_acked;
45 uint32_t post_rx_packets;
46 qdf_atomic_t gw_rx_packets;
47 };
48
49 /**
50 * struct dp_nud_tracking_info - structure to keep track for NUD information
51 * @curr_state: current state of NUD machine
52 * @ignore_nud_tracking: true if nud tracking is not required else false
53 * @tx_rx_stats: Number of packets during NUD tracking
54 * @gw_mac_addr: gateway mac address for which NUD events are tracked
55 * @nud_event_work: work to be scheduled during NUD_FAILED
56 * @is_gw_rx_pkt_track_enabled: true if rx pkt capturing is enabled for GW,
57 * else false
58 * @is_gw_updated: true if GW is updated for NUD Tracking
59 */
60 struct dp_nud_tracking_info {
61 uint8_t curr_state;
62 bool ignore_nud_tracking;
63 struct dp_nud_tx_rx_stats tx_rx_stats;
64 struct qdf_mac_addr gw_mac_addr;
65 qdf_work_t nud_event_work;
66 bool is_gw_rx_pkt_track_enabled;
67 bool is_gw_updated;
68 };
69
70 /**
71 * dp_nud_set_gateway_addr() - set gateway mac address
72 * @vdev: vdev handle
73 * @gw_mac_addr: mac address to be set
74 *
75 * Return: none
76 */
77 void dp_nud_set_gateway_addr(struct wlan_objmgr_vdev *vdev,
78 struct qdf_mac_addr gw_mac_addr);
79
80 /**
81 * dp_nud_incr_gw_rx_pkt_cnt() - Increment rx count for gateway
82 * @dp_intf: Pointer to DP interface
83 * @mac_addr: Gateway mac address
84 *
85 * Return: None
86 */
87 void dp_nud_incr_gw_rx_pkt_cnt(struct wlan_dp_intf *dp_intf,
88 struct qdf_mac_addr *mac_addr);
89
90 /**
91 * dp_nud_init_tracking() - initialize NUD tracking
92 * @dp_intf: Pointer to dp interface
93 *
94 * Return: None
95 */
96 void dp_nud_init_tracking(struct wlan_dp_intf *dp_intf);
97
98 /**
99 * dp_nud_reset_tracking() - reset NUD tracking
100 * @dp_intf: Pointer to dp interface
101 *
102 * Return: None
103 */
104 void dp_nud_reset_tracking(struct wlan_dp_intf *dp_intf);
105
106 /**
107 * dp_nud_deinit_tracking() - deinitialize NUD tracking
108 * @dp_intf: Pointer to dp interface
109 *
110 * Return: None
111 */
112 void dp_nud_deinit_tracking(struct wlan_dp_intf *dp_intf);
113
114 /**
115 * dp_nud_ignore_tracking() - set/reset nud trackig status
116 * @dp_intf: Pointer to dp interface
117 * @ignoring: Ignore status to set
118 *
119 * Return: None
120 */
121 void dp_nud_ignore_tracking(struct wlan_dp_intf *dp_intf,
122 bool ignoring);
123
124 /**
125 * dp_nud_flush_work() - flush pending nud work
126 * @dp_intf: Pointer to dp interface
127 *
128 * Return: None
129 */
130 void dp_nud_flush_work(struct wlan_dp_intf *dp_intf);
131
132 /**
133 * dp_nud_indicate_roam() - reset NUD when roaming happens
134 * @vdev: vdev handle
135 *
136 * Return: None
137 */
138 void dp_nud_indicate_roam(struct wlan_objmgr_vdev *vdev);
139
140 /**
141 * dp_nud_netevent_cb() - netevent callback
142 * @netdev_addr: netdev_addr
143 * @gw_mac_addr: Gateway MAC address
144 * @nud_state : NUD State
145 *
146 * Return: None
147 */
148 void dp_nud_netevent_cb(struct qdf_mac_addr *netdev_addr,
149 struct qdf_mac_addr *gw_mac_addr, uint8_t nud_state);
150 #else
dp_nud_set_gateway_addr(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr gw_mac_addr)151 static inline void dp_nud_set_gateway_addr(struct wlan_objmgr_vdev *vdev,
152 struct qdf_mac_addr gw_mac_addr)
153 {
154 }
155
dp_nud_incr_gw_rx_pkt_cnt(struct wlan_dp_intf * dp_intf,struct qdf_mac_addr * mac_addr)156 static inline void dp_nud_incr_gw_rx_pkt_cnt(struct wlan_dp_intf *dp_intf,
157 struct qdf_mac_addr *mac_addr)
158 {
159 }
160
dp_nud_init_tracking(struct wlan_dp_intf * dp_intf)161 static inline void dp_nud_init_tracking(struct wlan_dp_intf *dp_intf)
162 {
163 }
164
dp_nud_reset_tracking(struct wlan_dp_intf * dp_intf)165 static inline void dp_nud_reset_tracking(struct wlan_dp_intf *dp_intf)
166 {
167 }
168
dp_nud_deinit_tracking(struct wlan_dp_intf * dp_intf)169 static inline void dp_nud_deinit_tracking(struct wlan_dp_intf *dp_intf)
170 {
171 }
172
dp_nud_ignore_tracking(struct wlan_dp_intf * dp_intf,bool status)173 static inline void dp_nud_ignore_tracking(struct wlan_dp_intf *dp_intf,
174 bool status)
175 {
176 }
177
178 static inline void
dp_nud_flush_work(struct wlan_dp_intf * dp_intf)179 dp_nud_flush_work(struct wlan_dp_intf *dp_intf)
180 {
181 }
182
183 static inline void
dp_nud_indicate_roam(struct wlan_objmgr_vdev * vdev)184 dp_nud_indicate_roam(struct wlan_objmgr_vdev *vdev)
185 {
186 }
187
188 static inline
dp_nud_netevent_cb(struct qdf_mac_addr * netdev_addr,struct qdf_mac_addr * gw_mac_addr,uint8_t nud_state)189 void dp_nud_netevent_cb(struct qdf_mac_addr *netdev_addr,
190 struct qdf_mac_addr *gw_mac_addr, uint8_t nud_state)
191 {
192 }
193 #endif /* WLAN_NUD_TRACKING */
194 #endif /* end of _WLAN_NUD_TRACKING_H_ */
195