/*
 * FST module - FST related definitions
 * Copyright (c) 2014, Qualcomm Atheros, Inc.
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */

#ifndef IEEE_80211_FST_DEFS_H
#define IEEE_80211_FST_DEFS_H

/* IEEE Std 802.11ad */

#define MB_STA_CHANNEL_ALL 0

enum session_type {
	SESSION_TYPE_BSS = 0, /*  Infrastructure BSS */
	SESSION_TYPE_IBSS = 1,
	SESSION_TYPE_DLS = 2,
	SESSION_TYPE_TDLS = 3,
	SESSION_TYPE_PBSS = 4
};

#define SESSION_CONTROL(session_type, switch_intent) \
	(((u8) ((session_type) & 0x7)) | ((switch_intent) ? 0x10 : 0x00))

#define GET_SESSION_CONTROL_TYPE(session_control) \
	((u8) ((session_control) & 0x7))

#define GET_SESSION_CONTROL_SWITCH_INTENT(session_control) \
	(((session_control) & 0x10) >> 4)

/* 8.4.2.147  Session Transition element */
struct session_transition_ie {
	u8 element_id;
	u8 length;
	u32 fsts_id;
	u8 session_control;
	u8 new_band_id;
	u8 new_band_setup;
	u8 new_band_op;
	u8 old_band_id;
	u8 old_band_setup;
	u8 old_band_op;
} STRUCT_PACKED;

struct fst_setup_req {
	u8 action;
	u8 dialog_token;
	u32 llt;
	struct session_transition_ie stie;
	/* Multi-band (optional) */
	/* Wakeup Schedule (optional) */
	/* Awake Window (optional) */
	/* Switching Stream (optional) */
} STRUCT_PACKED;

struct fst_setup_res {
	u8 action;
	u8 dialog_token;
	u8 status_code;
	struct session_transition_ie stie;
	/* Multi-band (optional) */
	/* Wakeup Schedule (optional) */
	/* Awake Window (optional) */
	/* Switching Stream (optional) */
	/* Timeout Interval (optional) */
} STRUCT_PACKED;

struct fst_ack_req {
	u8 action;
	u8 dialog_token;
	u32 fsts_id;
} STRUCT_PACKED;

struct fst_ack_res {
	u8 action;
	u8 dialog_token;
	u32 fsts_id;
} STRUCT_PACKED;

struct fst_tear_down {
	u8 action;
	u32 fsts_id;
} STRUCT_PACKED;

#endif /* IEEE_80211_FST_DEFS_H */
