182 lines
5.9 KiB
C
Executable file
182 lines
5.9 KiB
C
Executable file
/****************************************************************************
|
|
*
|
|
* Copyright (c) 2012 - 2017 Samsung Electronics Co., Ltd. All rights reserved
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef CAC_H
|
|
#define CAC_H
|
|
|
|
#include <linux/kernel.h>
|
|
#include "dev.h"
|
|
#include "debug.h"
|
|
#include "mlme.h"
|
|
#include "mgt.h"
|
|
|
|
/* management */
|
|
#define WLAN_OUI_CISCO 0x004096 /* Cisco systems OUI */
|
|
#define WLAN_OUI_TYPE_CISCO_EDCA 0x09
|
|
|
|
#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0
|
|
#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1
|
|
#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2
|
|
#define WMM_VERSION 1
|
|
#define WMM_ACTION_CODE_ADDTS_REQ 0
|
|
#define WMM_ACTION_CODE_ADDTS_RESP 1
|
|
#define WMM_ACTION_CODE_DELTS 2
|
|
#define WMM_ADDTS_STATUS_ADMISSION_ACCEPTED 0
|
|
#define WMM_ADDTS_STATUS_INVALID_PARAMETERS 1
|
|
/* 2 - Reserved */
|
|
#define WMM_ADDTS_STATUS_REFUSED 3
|
|
/* 4-255 - Reserved */
|
|
|
|
/* WMM TSPEC Direction Field Values */
|
|
#define WMM_TSPEC_DIRECTION_UPLINK 0
|
|
#define WMM_TSPEC_DIRECTION_DOWNLINK 1
|
|
/* 2 - Reserved */
|
|
#define WMM_TSPEC_DIRECTION_BI_DIRECTIONAL 3
|
|
|
|
/* WMM TSPEC PSB Field Values */
|
|
#define WMM_TSPEC_PSB_UNSPECIFIED 2
|
|
|
|
#define ADDTS_STATUS_ACCEPTED 0x00
|
|
#define ADDTS_STATUS_INVALID_PARAM 0x01
|
|
#define ADDTS_STATUS_REFUSED 0x03
|
|
#define ADDTS_STATUS_DELAY 0x2F
|
|
#define ADDTS_STATUS_UNSPECIFIED 0xC8
|
|
#define ADDTS_STATUS_POLICY_CONFIG 0xC9
|
|
#define ADDTS_STATUS_ASSOC_DENIED 0xCA
|
|
#define ADDTS_STATUS_INVALID_PARAM2 0xCB
|
|
|
|
#define TSINFO_MASK 0x00FFFFFF
|
|
|
|
#define CCX_MAX_NUM_RATES 8
|
|
|
|
#define TSID_MIN 0
|
|
#define TSID_MAX 7
|
|
|
|
#define TSRS_RATE_PER_UNIT 500000
|
|
#define IEEE80211_HEADER_SIZE 24
|
|
|
|
#define MAX_TRANSMIT_MSDU_LIFETIME_NOT_VALID -1
|
|
#define BSS_CCX_DISABLED 0
|
|
#define BSS_CCX_ENABLED 1
|
|
|
|
/* Macros for handling unaligned memory accesses */
|
|
#define CAC_GET_LE16(a) ((u16)(((a)[1] << 8) | (a)[0]))
|
|
#define CAC_PUT_LE16(a, val) \
|
|
do { \
|
|
(a)[1] = ((u16)(val)) >> 8; \
|
|
(a)[0] = ((u16)(val)) & 0xff; \
|
|
} while (0)
|
|
#define CAC_PUT_BE24(a, val) \
|
|
do { \
|
|
(a)[0] = (u8)((((u32)(val)) >> 16) & 0xff); \
|
|
(a)[1] = (u8)((((u32)(val)) >> 8) & 0xff); \
|
|
(a)[2] = (u8)(((u32)(val)) & 0xff); \
|
|
} while (0)
|
|
#define CAC_GET_LE24(a) ((((u32)(a)[2]) << 16) | (((u32)(a)[1]) << 8) | ((u32)(a)[0]))
|
|
#define CAC_PUT_LE24(a, val) \
|
|
do { \
|
|
(a)[2] = (u8)((((u32)(val)) >> 16) & 0xff); \
|
|
(a)[1] = (u8)((((u32)(val)) >> 8) & 0xff); \
|
|
(a)[0] = (u8)(((u32)(val)) & 0xff); \
|
|
} while (0)
|
|
#define CAC_GET_LE32(a) ((((u32)(a)[3]) << 24) | (((u32)(a)[2]) << 16) | \
|
|
(((u32)(a)[1]) << 8) | ((u32)(a)[0]))
|
|
#define CAC_PUT_LE32(a, val) \
|
|
do { \
|
|
(a)[3] = (u8)((((u32)(val)) >> 24) & 0xff); \
|
|
(a)[2] = (u8)((((u32)(val)) >> 16) & 0xff); \
|
|
(a)[1] = (u8)((((u32)(val)) >> 8) & 0xff); \
|
|
(a)[0] = (u8)(((u32)(val)) & 0xff); \
|
|
} while (0)
|
|
|
|
#define IEEE80211_FC(type, stype) (u16)(type | stype)
|
|
|
|
/* WMM TSPEC Element */
|
|
struct wmm_tspec_element {
|
|
char eid; /* 221 = 0xdd */
|
|
u8 length; /* 6 + 55 = 61 */
|
|
u8 oui[3]; /* 00:50:f2 */
|
|
u8 oui_type; /* 2 */
|
|
u8 oui_subtype; /* 2 */
|
|
u8 version; /* 1 */
|
|
/* WMM TSPEC body (55 octets): */
|
|
u8 ts_info[3];
|
|
u16 nominal_msdu_size;
|
|
u16 maximum_msdu_size;
|
|
u32 minimum_service_interval;
|
|
u32 maximum_service_interval;
|
|
u32 inactivity_interval;
|
|
u32 suspension_interval;
|
|
u32 service_start_time;
|
|
u32 minimum_data_rate;
|
|
u32 mean_data_rate;
|
|
u32 peak_data_rate;
|
|
u32 maximum_burst_size;
|
|
u32 delay_bound;
|
|
u32 minimum_phy_rate;
|
|
u16 surplus_bandwidth_allowance;
|
|
u16 medium_time;
|
|
} __packed;
|
|
|
|
#define MSDU_LIFETIME_DEFAULT 512
|
|
|
|
struct cac_activated_tspec {
|
|
struct wmm_tspec_element tspec;
|
|
int ebw;
|
|
};
|
|
|
|
struct tspec_field {
|
|
const char *name;
|
|
int read_only;
|
|
int is_tsinfo_field;
|
|
u8 size;
|
|
u32 offset;
|
|
};
|
|
|
|
struct cac_tspec {
|
|
struct cac_tspec *next;
|
|
int id;
|
|
struct wmm_tspec_element tspec;
|
|
u8 psb_specified;
|
|
int ebw;
|
|
int accepted;
|
|
u8 dialog_token;
|
|
};
|
|
|
|
#define OFFSETOF(m) ((size_t)&((struct wmm_tspec_element *)0)->m)
|
|
|
|
struct wmm_action_hdr {
|
|
u8 category;
|
|
u8 action;
|
|
u8 dialog_token;
|
|
u8 status_code;
|
|
} __packed;
|
|
|
|
struct action_addts_req {
|
|
struct wmm_action_hdr hdr;
|
|
struct wmm_tspec_element tspec;
|
|
} __packed;
|
|
|
|
struct action_addts_rsp {
|
|
struct wmm_action_hdr hdr;
|
|
} __packed;
|
|
|
|
struct action_delts_req {
|
|
struct wmm_action_hdr hdr;
|
|
struct wmm_tspec_element tspec;
|
|
} __packed;
|
|
/* prototypes for public functions */
|
|
int cac_ctrl_create_tspec(struct slsi_dev *sdev, char *args);
|
|
int cac_ctrl_config_tspec(struct slsi_dev *sdev, char *args);
|
|
int cac_ctrl_send_addts(struct slsi_dev *sdev, char *args);
|
|
int cac_ctrl_send_delts(struct slsi_dev *sdev, char *args);
|
|
int cac_update_local_tspec(struct slsi_dev *sdev, u16 msdu_lifetime, struct wmm_tspec_element *tspec);
|
|
int cac_get_active_tspecs(struct cac_activated_tspec **tspecs);
|
|
void cac_delete_tspec_list(struct slsi_dev *sdev);
|
|
int cac_ctrl_delete_tspec(struct slsi_dev *sdev, char *args);
|
|
void cac_rx_wmm_action(struct slsi_dev *sdev, struct net_device *netdev, struct ieee80211_mgmt *data, size_t len);
|
|
void cac_update_roam_traffic_params(struct slsi_dev *sdev, struct net_device *dev);
|
|
#endif /* CAC_H */
|