1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
* Copyright (C) 2024-2025 Intel Corporation
*/
#ifndef __session_protect_h__
#define __session_protect_h__
#include "mld.h"
#include "hcmd.h"
#include <net/mac80211.h>
#include "fw/api/mac-cfg.h"
/**
* DOC: session protection
*
* Session protection is an API from the firmware that allows the driver to
* request time on medium. This is needed before the association when we need
* to be on medium for the association frame exchange. Once we configure the
* firmware as 'associated', the firmware will allocate time on medium without
* needed a session protection.
*
* TDLS discover uses this API as well even after association to ensure that
* other activities internal to the firmware will not interrupt our presence
* on medium.
*/
/**
* struct iwl_mld_session_protect - session protection parameters
* @end_jiffies: expected end_jiffies of current session protection.
* 0 if not active
* @duration: the duration in tu of current session
* @session_requested: A session protection command was sent and wasn't yet
* answered
*/
struct iwl_mld_session_protect {
unsigned long end_jiffies;
u32 duration;
bool session_requested;
};
#define IWL_MLD_SESSION_PROTECTION_ASSOC_TIME_MS 900
#define IWL_MLD_SESSION_PROTECTION_MIN_TIME_MS 400
/**
* iwl_mld_handle_session_prot_notif - handles %SESSION_PROTECTION_NOTIF
* @mld: the mld component
* @pkt: the RX packet containing the notification
*/
void iwl_mld_handle_session_prot_notif(struct iwl_mld *mld,
struct iwl_rx_packet *pkt);
/**
* iwl_mld_schedule_session_protection - schedule a session protection
* @mld: the mld component
* @vif: the virtual interface for which the protection issued
* @duration: the requested duration of the protection
* @min_duration: the minimum duration of the protection
* @link_id: The link to schedule a session protection for
*/
void iwl_mld_schedule_session_protection(struct iwl_mld *mld,
struct ieee80211_vif *vif,
u32 duration, u32 min_duration,
int link_id);
/**
* iwl_mld_start_session_protection - start a session protection
* @mld: the mld component
* @vif: the virtual interface for which the protection issued
* @duration: the requested duration of the protection
* @min_duration: the minimum duration of the protection
* @link_id: The link to schedule a session protection for
* @timeout: timeout for waiting
*
* This schedules the session protection, and waits for it to start
* (with timeout)
*
* Returns: 0 if successful, error code otherwise
*/
int iwl_mld_start_session_protection(struct iwl_mld *mld,
struct ieee80211_vif *vif,
u32 duration, u32 min_duration,
int link_id, unsigned long timeout);
/**
* iwl_mld_cancel_session_protection - cancel the session protection.
* @mld: the mld component
* @vif: the virtual interface for which the session is issued
* @link_id: cancel the session protection for given link
*
* This functions cancels the session protection which is an act of good
* citizenship. If it is not needed any more it should be canceled because
* the other mac contexts wait for the medium during that time.
*
* Returns: 0 if successful, error code otherwise
*
*/
int iwl_mld_cancel_session_protection(struct iwl_mld *mld,
struct ieee80211_vif *vif,
int link_id);
#endif /* __session_protect_h__ */
|