937 lines
24 KiB
C
937 lines
24 KiB
C
/*
|
|
* DECT MAC Layer - Header and global definitions
|
|
*
|
|
* Copyright (c) 2009 Patrick McHardy <kaber@trash.net>
|
|
*/
|
|
|
|
#ifndef _NET_DECT_MAC_H
|
|
#define _NET_DECT_MAC_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#define DECT_FRAME_SIZE 24
|
|
#define DECT_HALF_FRAME_SIZE (DECT_FRAME_SIZE / 2)
|
|
|
|
/*
|
|
* A-Field
|
|
*/
|
|
|
|
#define DECT_A_FIELD_SIZE 8
|
|
|
|
#define DECT_RA_FIELD_SIZE 2
|
|
#define DECT_RA_FIELD_OFF 6
|
|
|
|
/*
|
|
* Header field
|
|
*/
|
|
|
|
#define DECT_HDR_FIELD_SIZE 1
|
|
#define DECT_HDR_FIELD_OFF 0
|
|
|
|
#define DECT_HDR_TA_OFF 0
|
|
#define DECT_HDR_TA_MASK 0xe0
|
|
#define DECT_HDR_TA_SHIFT 5
|
|
|
|
#define DECT_HDR_Q1_OFF 0
|
|
#define DECT_HDR_Q1_FLAG 0x10
|
|
|
|
#define DECT_HDR_BA_OFF 0
|
|
#define DECT_HDR_BA_MASK 0x0e
|
|
#define DECT_HDR_BA_SHIFT 1
|
|
|
|
#define DECT_HDR_Q2_OFF 0
|
|
#define DECT_HDR_Q2_FLAG 0x01
|
|
|
|
/*
|
|
* T-Field
|
|
*/
|
|
|
|
#define DECT_T_FIELD_OFF 1
|
|
#define DECT_T_FIELD_SIZE 5
|
|
|
|
/**
|
|
* dect_tail_identification - MAC layer T-Field identification
|
|
*
|
|
* @DECT_TI_CT_PKT_0: C_T data packet number 0
|
|
* @DECT_TI_CT_PKT_1: C_T data packet number 1
|
|
* @DECT_TI_NT_CL: Identities information on connectionless bearer
|
|
* @DECT_TI_NT: Identities information
|
|
* @DECT_TI_QT: Multiframe synchronisation und system information
|
|
* @DECT_TI_RESERVED: Reserved
|
|
* @DECT_TI_MT: MAC layer control
|
|
* @DECT_TI_PT: Paging tail (RFP only)
|
|
* @DECT_TI_MT_PKT_0: MAC layer control (first PP transmission, PP only)
|
|
*/
|
|
enum dect_tail_identifications {
|
|
DECT_TI_CT_PKT_0 = 0x0 << DECT_HDR_TA_SHIFT,
|
|
DECT_TI_CT_PKT_1 = 0x1 << DECT_HDR_TA_SHIFT,
|
|
DECT_TI_NT_CL = 0x2 << DECT_HDR_TA_SHIFT,
|
|
DECT_TI_NT = 0x3 << DECT_HDR_TA_SHIFT,
|
|
DECT_TI_QT = 0x4 << DECT_HDR_TA_SHIFT,
|
|
DECT_TI_RESERVED = 0x5 << DECT_HDR_TA_SHIFT,
|
|
DECT_TI_MT = 0x6 << DECT_HDR_TA_SHIFT,
|
|
DECT_TI_PT = 0x7 << DECT_HDR_TA_SHIFT,
|
|
DECT_TI_MT_PKT_0 = 0x7 << DECT_HDR_TA_SHIFT,
|
|
};
|
|
|
|
struct dect_skb_a_cb {
|
|
enum dect_tail_identifications id;
|
|
};
|
|
|
|
#define DECT_A_CB(skb) ((struct dect_skb_a_cb *)(skb)->cb)
|
|
|
|
/*
|
|
* Identities channel (N-channel)
|
|
*/
|
|
|
|
/* Identities information */
|
|
#define DECT_NT_ID_RFPI_LEN 5
|
|
|
|
/*
|
|
* Acess Rights Identity (ARI)
|
|
*/
|
|
|
|
#define DECT_ARI_ARC_MASK 0xe000000000000000ULL
|
|
#define DECT_ARI_ARC_SHIFT 61
|
|
|
|
/* Class A */
|
|
#define DECT_ARI_A_EMC_MASK 0x1fffe00000000000ULL
|
|
#define DECT_ARI_A_EMC_SHIFT 45
|
|
|
|
#define DECT_ARI_A_FPN_MASK 0x00001ffff0000000ULL
|
|
#define DECT_ARI_A_FPN_SHIFT 28
|
|
|
|
/* Class B */
|
|
#define DECT_ARI_B_EIC_MASK 0x1fffe00000000000ULL
|
|
#define DECT_ARI_B_EIC_SHIFT 45
|
|
|
|
#define DECT_ARI_B_FPN_MASK 0x00001fe000000000ULL
|
|
#define DECT_ARI_B_FPN_SHIFT 37
|
|
|
|
#define DECT_ARI_B_FPS_MASK 0x0000001e00000000ULL
|
|
#define DECT_ARI_B_FPS_SHIFT 33
|
|
|
|
/* Class C */
|
|
#define DECT_ARI_C_POC_MASK 0x1fffe00000000000ULL
|
|
#define DECT_ARI_C_POC_SHIFT 45
|
|
|
|
#define DECT_ARI_C_FPN_MASK 0x00001fe000000000ULL
|
|
#define DECT_ARI_C_FPN_SHIFT 37
|
|
|
|
#define DECT_ARI_C_FPS_MASK 0x0000001e00000000ULL
|
|
#define DECT_ARI_C_FPS_SHIFT 33
|
|
|
|
/* Class D */
|
|
#define DECT_ARI_D_GOP_MASK 0x1ffffe0000000000ULL
|
|
#define DECT_ARI_D_GOP_SHIFT 41
|
|
#define DECT_ARI_D_FPN_MASK 0x000001fe00000000ULL
|
|
#define DECT_ARI_D_FPN_SHIFT 33
|
|
|
|
/* Class E */
|
|
#define DECT_ARI_E_FIL_MASK 0x1fffe00000000000ULL
|
|
#define DECT_ARI_E_FIL_SHIFT 45
|
|
|
|
#define DECT_ARI_E_FPN_MASK 0x00001ffe00000000ULL
|
|
#define DECT_ARI_E_FPN_SHIFT 33
|
|
|
|
#include <linux/dect_netlink.h>
|
|
|
|
struct dect_ari_ {
|
|
enum dect_ari_classes arc;
|
|
uint32_t fpn;
|
|
uint32_t fps;
|
|
union {
|
|
uint16_t emc;
|
|
uint16_t eic;
|
|
uint16_t poc;
|
|
uint32_t gop;
|
|
uint16_t fil;
|
|
};
|
|
};
|
|
|
|
#if 0
|
|
enum dect_ari_lengths {
|
|
DECT_ARC_A_LEN = 36,
|
|
DECT_ARC_B_LEN = 31,
|
|
DECT_ARC_C_LEN = 31,
|
|
DECT_ARC_D_LEN = 31,
|
|
DECT_ARC_E_LEN = 31,
|
|
};
|
|
#endif
|
|
|
|
/*
|
|
* RFPI
|
|
*/
|
|
|
|
#define DECT_RFPI_E_FLAG 0x8000000000000000ULL
|
|
#define DECT_RFPI_ARI_SHIFT 1
|
|
#define DECT_RFPI_RPN_SHIFT 24
|
|
|
|
/**
|
|
* @e: indicates whether SARIs are available
|
|
* @pari: primary access rights identifier
|
|
* @rpn: radio part number
|
|
*/
|
|
struct dect_idi {
|
|
bool e;
|
|
struct dect_ari pari;
|
|
uint8_t rpn;
|
|
};
|
|
|
|
/*
|
|
* System information and multiframe marker (Q-channel)
|
|
*/
|
|
|
|
/* RFP Q-channel T-MUX rules: only frame 8 */
|
|
#define DECT_Q_CHANNEL_FRAME 8
|
|
|
|
/* System information header */
|
|
#define DECT_QT_H_MASK 0xf000000000000000ULL
|
|
#define DECT_QT_H_SHIFT 60
|
|
|
|
/**
|
|
* dect_system_information_types - codes for system information messages
|
|
*
|
|
* @DECT_QT_SI_SSI: static system information
|
|
* @DECT_QT_SI_ERFC: extended RF carriers
|
|
* @DECT_QT_SI_FPC: fixed part capabilities
|
|
* @DECT_QT_SI_EFPC: extended fixed part capabilities
|
|
* @DECT_QT_SI_SARI: SARI list contents
|
|
* @DECT_QT_SI_MFN: multi-frame number
|
|
* @DECT_QT_SI_ESC: escape
|
|
* @DECT_QT_SI_ERFC2: extended RF carriers part 2
|
|
* @DECT_QT_SI_TXI transmit information
|
|
* @DECT_QT_SI_EFPC2: extended fixed part capabilities part 2
|
|
*/
|
|
enum dect_mac_system_information_types {
|
|
DECT_QT_SI_SSI = 0x0ULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_SSI2 = 0x1ULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_ERFC = 0x2ULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_FPC = 0x3ULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_EFPC = 0x4ULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_SARI = 0x5ULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_MFN = 0x6ULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_ESC = 0x7ULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_ERFC2 = 0x9ULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_TXI = 0xbULL << DECT_QT_H_SHIFT,
|
|
DECT_QT_SI_EFPC2 = 0xcULL << DECT_QT_H_SHIFT,
|
|
};
|
|
|
|
/*
|
|
* Static system information - repeated every 8 multiframes
|
|
*/
|
|
|
|
#define DECT_QT_SSI_FREQ 8
|
|
|
|
/* normal reverse */
|
|
#define DECT_QT_SSI_NR_FLAG 0x1000000000000000ULL
|
|
|
|
/* slot number */
|
|
#define DECT_QT_SSI_SN_MASK 0x0f00000000000000ULL
|
|
#define DECT_QT_SSI_SN_SHIFT 56
|
|
|
|
/* start position */
|
|
#define DECT_QT_SSI_SP_MASK 0x00c0000000000000ULL
|
|
#define DECT_QT_SSI_SP_SHIFT 54
|
|
|
|
/* escape bit */
|
|
#define DECT_QT_SSI_ESC_FLAG 0x0020000000000000ULL
|
|
|
|
/* number of transceivers */
|
|
#define DECT_QT_SSI_TXS_MASK 0x0018000000000000ULL
|
|
#define DECT_QT_SSI_TXS_SHIFT 51
|
|
|
|
/* extended RF carrier information available */
|
|
#define DECT_QT_SSI_MC_FLAG 0x0004000000000000ULL
|
|
|
|
/* RF carriers available */
|
|
#define DECT_QT_SSI_RFCARS_MASK 0x0003ff0000000000ULL
|
|
#define DECT_QT_SSI_RFCARS_SHIFT 40
|
|
|
|
/* carrier number */
|
|
#define DECT_QT_SSI_CN_MASK 0x0000003f00000000ULL
|
|
#define DECT_QT_SSI_CN_SHIFT 32
|
|
|
|
/* primary scan carrier number */
|
|
#define DECT_QT_SSI_PSCN_MASK 0x000000003f000000ULL
|
|
#define DECT_QT_SSI_PSCN_SHIFT 24
|
|
|
|
struct dect_ssi {
|
|
bool nr;
|
|
bool mc;
|
|
uint16_t rfcars;
|
|
uint8_t sn;
|
|
uint8_t sp;
|
|
uint8_t txs;
|
|
uint8_t cn;
|
|
uint8_t pscn;
|
|
};
|
|
|
|
/*
|
|
* Extended RF carrier information
|
|
*/
|
|
|
|
#define DECT_QT_ERFC_FREQ 8
|
|
|
|
#define DECT_QT_ERFC_RFCARS_MASK 0x0fffffe000000000ULL
|
|
#define DECT_QT_ERFC_RFCARS_SHIFT 9
|
|
|
|
#define DECT_QT_ERFC_RFBAND_MASK 0x0000001f00000000ULL
|
|
#define DECT_QT_ERFC_RFBAND_SHIFT 32
|
|
|
|
#define DECT_QT_ERFC_ERFC2_FLAG 0x0000000080000000ULL
|
|
|
|
#define DECT_QT_ERFC_NUM_RFCARS_MASK 0x000000003f000000ULL
|
|
#define DECT_QT_ERFC_NUM_RFCARS_SHIFT 24
|
|
|
|
struct dect_erfc {
|
|
uint32_t rfcars;
|
|
uint8_t band;
|
|
uint8_t num_rfcars;
|
|
bool erfc2;
|
|
};
|
|
|
|
/*
|
|
* Fixed Part capabilities
|
|
*/
|
|
|
|
#define DECT_QT_FPC_FREQ 8
|
|
|
|
#define DECT_QT_FPC_CAPABILITY_MASK 0x0fffff0000000000ULL
|
|
#define DECT_QT_FPC_CAPABILITY_SHIFT 40
|
|
|
|
#define DECT_QT_FPC_HLC_MASK 0x000000ffff000000ULL
|
|
#define DECT_QT_FPC_HLC_SHIFT 24
|
|
|
|
struct dect_fpc {
|
|
uint32_t fpc;
|
|
uint16_t hlc;
|
|
};
|
|
|
|
/*
|
|
* Extended Fixed Part capabilities
|
|
*/
|
|
|
|
#define DECT_QT_EFPC_EFPC_MASK 0x0fff800000000000ULL
|
|
#define DECT_QT_EFPC_EFPC_SHIFT 47
|
|
|
|
#define DECT_QT_EFPC_EHLC_MASK 0x00007fffff000000ULL
|
|
#define DECT_QT_EFPC_EHLC_SHIFT 24
|
|
|
|
struct dect_efpc {
|
|
uint16_t fpc;
|
|
uint32_t hlc;
|
|
};
|
|
|
|
#define DECT_QT_EFPC2_FPC_MASK 0x0fff000000000000ULL
|
|
#define DECT_QT_EFPC2_FPC_SHIFT 48
|
|
|
|
#define DECT_QT_EFPC2_HLC_MASK 0x0000ffffff000000ULL
|
|
#define DECT_QT_EFPC2_HLC_SHIFT 24
|
|
|
|
struct dect_efpc2 {
|
|
uint16_t fpc;
|
|
uint32_t hlc;
|
|
};
|
|
|
|
/*
|
|
* SARI message
|
|
*/
|
|
|
|
#define DECT_QT_SARI_FREQ 4
|
|
|
|
#define DECT_QT_SARI_LIST_CYCLE_MASK 0x000e000000000000ULL
|
|
#define DECT_QT_SARI_LIST_CYCLE_SHIFT 49
|
|
|
|
#define DECT_QT_SARI_TARI_FLAG 0x0001000000000000ULL
|
|
|
|
#define DECT_QT_SARI_BLACK_FLAG 0x0000800000000000ULL
|
|
|
|
#define DECT_QT_SARI_ARI_MASK 0x00007fffffff0000ULL
|
|
#define DECT_QT_SARI_ARI_SHIFT 17
|
|
|
|
struct dect_sari {
|
|
uint8_t list_cycle;
|
|
bool tari;
|
|
bool black;
|
|
//struct dect_ari ari;
|
|
};
|
|
|
|
#define DECT_SARI_CYCLE_MAX 16
|
|
|
|
/*
|
|
* Multiframe number - repeated every 8 multiframes if supported
|
|
*/
|
|
|
|
#define DECT_QT_MFN_FREQ 8
|
|
|
|
#define DECT_QT_MFN_MASK 0x0000ffffff000000ULL
|
|
#define DECT_QT_MFN_SHIFT 24
|
|
|
|
struct dect_mfn {
|
|
uint32_t num;
|
|
};
|
|
|
|
/*
|
|
* Extended RF carrier information part 2
|
|
*/
|
|
|
|
#define DECT_QT_TXI_ERFC2_FREQ 8
|
|
|
|
#define DECT_QT_ERFC2_RFCARS_MASK 0x0fffffffe0000000ULL
|
|
#define DECT_QT_ERFC2_RFCARS_SHIFT 29
|
|
|
|
struct dect_erfc2 {
|
|
uint32_t rfcars;
|
|
};
|
|
|
|
/*
|
|
* Transmit Information
|
|
*/
|
|
|
|
#define DECT_QT_TXI_FREQ 8
|
|
|
|
#define DECT_QT_TXI_TYPE_MASK 0x0f00000000000000ULL
|
|
#define DECT_QT_TXI_TYPE_SHIFT 56
|
|
|
|
#define DECT_QT_TXI_PWL_MASK 0x00ff000000000000ULL
|
|
#define DECT_QT_TXI_PWL_SHIFT 48
|
|
|
|
/*
|
|
* Extended fixed part capabilitiees part 2
|
|
*/
|
|
|
|
/*
|
|
* Paging Tail (P-channel)
|
|
*/
|
|
|
|
#define DECT_PT_HDR_EXTEND_FLAG 0x8000000000000000ULL
|
|
|
|
#define DECT_PT_HDR_LENGTH_MASK 0x7000000000000000ULL
|
|
#define DECT_PT_HDR_LENGTH_SHIFT 60
|
|
|
|
/**
|
|
* @DECT_PT_ZERO_PAGE: zero length page
|
|
* @DECT_PT_SHORT_PAGE: short page
|
|
* @DECT_PT_FULL_PAGE: full page
|
|
* @DECT_PT_MAX_RESUME_PAGE: MAC resume and control page
|
|
* @DECT_PT_LONG_PAGE: not the last 36 bits of a long page
|
|
* @DECT_PT_LONG_PAGE_FIRST: the first 36 bits of a long page
|
|
* @DECT_PT_LONG_PAGE_LAST: the last 36 bits of a long page
|
|
* @DECT_PT_LONG_PAGE_ALL: all of a long page (first and last)
|
|
*
|
|
*/
|
|
enum dect_page_lengths {
|
|
DECT_PT_ZERO_PAGE = 0x0ULL << DECT_PT_HDR_LENGTH_SHIFT,
|
|
DECT_PT_SHORT_PAGE = 0x1ULL << DECT_PT_HDR_LENGTH_SHIFT,
|
|
DECT_PT_FULL_PAGE = 0x2ULL << DECT_PT_HDR_LENGTH_SHIFT,
|
|
DECT_PT_RESUME_PAGE = 0x3ULL << DECT_PT_HDR_LENGTH_SHIFT,
|
|
DECT_PT_LONG_PAGE = 0x4ULL << DECT_PT_HDR_LENGTH_SHIFT,
|
|
DECT_PT_LONG_PAGE_FIRST = 0x5ULL << DECT_PT_HDR_LENGTH_SHIFT,
|
|
DECT_PT_LONG_PAGE_LAST = 0x6ULL << DECT_PT_HDR_LENGTH_SHIFT,
|
|
DECT_PT_LONG_PAGE_ALL = 0x7ULL << DECT_PT_HDR_LENGTH_SHIFT,
|
|
};
|
|
|
|
/* zero length pages */
|
|
#define DECT_PT_ZP_RFPI_MASK 0x0fffff0000000000ULL
|
|
#define DECT_PT_ZP_RFPI_SHIFT 40
|
|
|
|
/* short page B_S channel data */
|
|
#define DECT_PT_SP_BS_DATA_MASK 0x0fffff0000000000ULL
|
|
#define DECT_PT_SP_BS_DATA_SHIFT 40
|
|
#define DECT_PT_SP_BS_DATA_SIZE 3
|
|
|
|
/* long and full page B_S channel data */
|
|
#define DECT_PT_LFP_BS_DATA_MASK 0x0fffffffff000000ULL
|
|
#define DECT_PT_LFP_BS_DATA_SHIFT 24
|
|
#define DECT_PT_LFP_BS_DATA_SIZE 5
|
|
|
|
struct dect_page {
|
|
bool extend;
|
|
enum dect_page_lengths length;
|
|
uint32_t rfpi;
|
|
};
|
|
|
|
/* MAC layer information */
|
|
#define DECT_PT_INFO_TYPE_MASK 0x000000f000000000ULL
|
|
#define DECT_PT_INFO_TYPE_SHIFT 36
|
|
#define DECT_PT_INFO_TYPE_SIZE 2
|
|
|
|
/**
|
|
* @DECT_PT_IT_FILL_BITS_OR_BLIND_LONG_SLOTS: fill bits/blind long slots if bit 47 set
|
|
* @DECT_PT_IT_BLIND_FULL_SLOT: blind full slot information
|
|
* @DECT_PT_IT_OTHER_BEARER:
|
|
* @DECT_PT_IT_RECOMMENDED_OTHER_BEARER:
|
|
* @DECT_PT_IT_GOOD_RFP_BEARER:
|
|
* @DECT_PT_IT_DUMMY_OR_CL_BEARER_POSITION:
|
|
* @DECT_PT_IT_RFP_IDENTITY:
|
|
* @DECT_PT_IT_ESCAPE:
|
|
* @DECT_PT_IT_DUMMY_OR_CL_BEARER_MARKER:
|
|
* @DECT_PT_IT_BEARER_HANDOVER_INFO:
|
|
* @DECT_PT_IT_RFP_STATUS:
|
|
* @DECT_PT_IT_ACTIVE_CARRIERS:
|
|
* @DECT_PT_IT_CL_BEARER_POSITION:
|
|
* @DECT_PT_IT_RECOMMENDED_POWER_LEVEL:
|
|
* @DECT_PT_IT_BLIND_DOUBLE_SLOT:
|
|
* @DECT_PT_IT_BLIND_FULL_SLOT_PACKET_MODE:
|
|
*
|
|
*/
|
|
enum dect_pt_info_types {
|
|
DECT_PT_IT_FILL_BITS_OR_BLIND_LONG_SLOTS= 0x0ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_BLIND_FULL_SLOT = 0x1ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_OTHER_BEARER = 0x2ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_RECOMMENDED_OTHER_BEARER = 0x3ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_GOOD_RFP_BEARER = 0x4ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_DUMMY_OR_CL_BEARER_POSITION = 0x5ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_RFP_IDENTITY = 0x6ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_ESCAPE = 0x7ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_DUMMY_OR_CL_BEARER_MARKER = 0x8ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_BEARER_HANDOVER_INFO = 0x9ULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_RFP_STATUS = 0xaULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_ACTIVE_CARRIERS = 0xbULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_CL_BEARER_POSITION = 0xcULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_RECOMMENDED_POWER_LEVEL = 0xdULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_BLIND_DOUBLE_SLOT = 0xeULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
DECT_PT_IT_BLIND_FULL_SLOT_PACKET_MODE = 0xfULL << DECT_PT_INFO_TYPE_SHIFT,
|
|
};
|
|
|
|
/* blind full slot information */
|
|
#define DECT_PT_BFS_MASK 0x0000000fff000000ULL
|
|
#define DECT_PT_BFS_SHIFT 24
|
|
|
|
struct dect_bfs {
|
|
struct dect_page page;
|
|
uint16_t mask;
|
|
};
|
|
|
|
/* Bearer description */
|
|
#define DECT_PT_BEARER_SN_MASK 0x0000000f00000000ULL
|
|
#define DECT_PT_BEARER_SN_SHIFT 32
|
|
|
|
#define DECT_PT_BEARER_SP_MASK 0x00000000c0000000ULL
|
|
#define DECT_PT_BEARER_SP_SHIFT 30
|
|
|
|
#define DECT_PT_BEARER_CN_MASK 0x000000003f000000ULL
|
|
#define DECT_PT_BEARER_CN_SHIFT 24
|
|
|
|
struct dect_bearer_desc {
|
|
struct dect_page page;
|
|
enum dect_pt_info_types bt;
|
|
uint8_t sn;
|
|
uint8_t sp;
|
|
uint8_t cn;
|
|
};
|
|
|
|
/* RFP identity */
|
|
#define DECT_PT_RFP_ID_MASK 0x0000000fff000000ULL
|
|
#define DECT_PT_RFP_ID_SHIFT 24
|
|
|
|
struct dect_rfp_id {
|
|
struct dect_page page;
|
|
uint16_t id;
|
|
};
|
|
|
|
/* RFP status */
|
|
#define DECT_PT_RFPS_RFP_BUSY_FLAG 0x0000000100000000ULL
|
|
#define DECT_PT_RFPS_SYS_BUSY_FLAG 0x0000000200000000ULL
|
|
|
|
struct dect_rfp_status {
|
|
struct dect_page page;
|
|
bool rfp_busy;
|
|
bool sys_busy;
|
|
};
|
|
|
|
/* Active carriers */
|
|
#define DECT_PT_ACTIVE_CARRIERS_MASK 0x0000000ffc000000ULL
|
|
#define DECT_PT_ACTIVE_CARRIERS_SHIFT 26
|
|
|
|
struct dect_active_carriers {
|
|
struct dect_page page;
|
|
uint16_t active;
|
|
};
|
|
|
|
/*
|
|
* MAC control (M-channel)
|
|
*/
|
|
|
|
#define DECT_MT_FRAME_RATE 2
|
|
|
|
#define DECT_MT_HDR_MASK 0xf000000000000000ULL
|
|
#define DECT_MT_HDR_SHIFT 60
|
|
|
|
#define DECT_MT_CMD_MASK 0x0f00000000000000ULL
|
|
#define DECT_MT_CMD_SHIFT 56
|
|
|
|
/**
|
|
* enum dect_mt_hdr_type - MAC tail header types
|
|
*/
|
|
enum dect_mt_hdr_type {
|
|
DECT_MT_BASIC_CCTRL = 0x0ULL << DECT_MT_HDR_SHIFT,
|
|
DECT_MT_ADV_CCTRL = 0x1ULL << DECT_MT_HDR_SHIFT,
|
|
DECT_MT_MAC_TEST = 0x2ULL << DECT_MT_HDR_SHIFT,
|
|
DECT_MT_QUALITY_CTRL = 0x3ULL << DECT_MT_HDR_SHIFT,
|
|
DECT_MT_BRD_CL_SERVICE = 0x4ULL << DECT_MT_HDR_SHIFT,
|
|
DECT_MT_ENC_CTRL = 0x5ULL << DECT_MT_HDR_SHIFT,
|
|
DECT_MT_XYZ = 0x6ULL << DECT_MT_HDR_SHIFT,
|
|
DECT_MT_ESC = 0x7ULL << DECT_MT_HDR_SHIFT,
|
|
DECT_MT_TARI = 0x8ULL << DECT_MT_HDR_SHIFT,
|
|
DECT_MT_REP_CCTRL = 0x9ULL << DECT_MT_HDR_SHIFT,
|
|
};
|
|
|
|
/* advanced connection control */
|
|
enum dect_cctrl_cmds {
|
|
DECT_CCTRL_ACCESS_REQ = 0x0ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_BEARER_HANDOVER_REQ = 0x1ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_CONNECTION_HANDOVER_REQ = 0x2ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_UNCONFIRMED_ACCESS_REQ = 0x3ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_BEARER_CONFIRM = 0x4ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_WAIT = 0x5ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_ATTRIBUTES_T_REQUEST = 0x6ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_ATTRIBUTES_T_CONFIRM = 0x7ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_BANDWIDTH_T_REQUEST = 0x8ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_BANDWIDTH_T_CONFIRM = 0x9ULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_CHANNEL_LIST = 0xaULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_UNCONFIRMED_DUMMY = 0xbULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_UNCONFIRMED_HANDOVER = 0xcULL << DECT_MT_CMD_SHIFT,
|
|
DECT_CCTRL_RELEASE = 0xfULL << DECT_MT_CMD_SHIFT,
|
|
};
|
|
|
|
/* Most messages */
|
|
#define DECT_CCTRL_FMID_MASK 0x00fff00000000000ULL
|
|
#define DECT_CCTRL_FMID_SHIFT 44
|
|
|
|
#define DECT_CCTRL_PMID_MASK 0x00000fffff000000ULL
|
|
#define DECT_CCTRL_PMID_SHIFT 24
|
|
|
|
/* Attributes-T request/confirm */
|
|
#define DECT_CCTRL_ATTR_ECN_MASK 0x00f0000000000000ULL
|
|
#define DECT_CCTRL_ATTR_ECN_SHIFT 52
|
|
|
|
#define DECT_CCTRL_ATTR_LBN_MASK 0x000f000000000000ULL
|
|
#define DECT_CCTRL_ATTR_LBN_SHIFT 48
|
|
|
|
#define DECT_CCTRL_ATTR_TYPE_MASK 0x0000c00000000000ULL
|
|
#define DECT_CCTRL_ATTR_TYPE_SHIFT 46
|
|
|
|
enum dect_cctrl_connection_types {
|
|
DECT_CCTRL_TYPE_ASYMETRIC_UPLINK = 0x0,
|
|
DECT_CCTRL_TYPE_ASYMETRIC_DOWNLINK = 0x1,
|
|
DECT_CCTRL_TYPE_SYMETRIC_MULTIBEARER = 0x2,
|
|
DECT_CCTRL_TYPE_SYMETRIC_BEARER = 0x3,
|
|
};
|
|
|
|
#define DECT_CCTRL_ATTR_SERVICE_MASK 0x00003f0000000000ULL
|
|
#define DECT_CCTRL_ATTR_SERVICE_SHIFT 40
|
|
|
|
enum dect_mac_service_types {
|
|
DECT_SERVICE_IN_MIN_DELAY = 0x0,
|
|
DECT_SERVICE_IPX_ENCODED_PROTECTED = 0x1,
|
|
DECT_SERVICE_IN_NORM_DELAY = 0x2,
|
|
DECT_SERVICE_UNKNOWN = 0x4,
|
|
DECT_SERVICE_C_ONLY = 0x5,
|
|
DECT_SERVICE_IP_ERROR_DETECTION = 0x10,
|
|
DECT_SERVICE_IPQ_ERROR_DETECTION = 0x14,
|
|
/* Lifetime encoded in low three bits */
|
|
DECT_SERVICE_IP_ERROR_CORRECTION = 0x18,
|
|
DECT_SERVICE_IPQ_ERROR_CORRECTION = 0x38,
|
|
};
|
|
|
|
#define DECT_SERVICE_LIFETIME_MASK = 0x7
|
|
|
|
#define DECT_CCTRL_ATTR_SLOT_MASK 0x000000f000000000ULL
|
|
#define DECT_CCTRL_ATTR_SLOT_SHIFT 36
|
|
|
|
#define DECT_CCTRL_ATTR_CF_FLAG 0x0000000800000000ULL
|
|
|
|
#define DECT_CCTRL_ATTR_BZ_EXT_MOD_MASK 0x0000000700000000ULL
|
|
#define DECT_CCTRL_ATTR_BZ_EXT_MOD_SHIFT 32
|
|
|
|
#define DECT_CCTRL_ATTR_ACR_MASK 0x00000000f0000000ULL
|
|
#define DECT_CCTRL_ATTR_ACR_SHIFT 28
|
|
|
|
enum dect_adaptive_code_rates {
|
|
DECT_ACR_NONE = 0x0,
|
|
};
|
|
|
|
#define DECT_CCTRL_ATTR_A_MOD_MASK 0x000000000c000000ULL
|
|
#define DECT_CCTRL_ATTR_A_MOD_SHIFT 26
|
|
|
|
#define DECT_CCTRL_ATTR_BZ_MOD_MASK 0x0000000003000000ULL
|
|
#define DECT_CCTRL_ATTR_BZ_MOD_SHIFT 24
|
|
|
|
enum dect_modulation_type {
|
|
DECT_MODULATION_2_LEVEL = 0x3,
|
|
DECT_MODULATION_4_LEVEL = 0x2,
|
|
DECT_MODULATION_8_LEVEL = 0x1,
|
|
};
|
|
|
|
/* Release */
|
|
|
|
#define DECT_CCTRL_RELEASE_INFO1_MASK 0x00f0000000000000ULL
|
|
#define DECT_CCTRL_RELEASE_INFO1_SHIFT 52
|
|
|
|
#define DECT_CCTRL_RELEASE_LBN_MASK 0x000f000000000000ULL
|
|
#define DECT_CCTRL_RELEASE_LBN_SHIFT 48
|
|
|
|
#define DECT_CCTRL_RELEASE_REASON_MASK 0x0000f00000000000ULL
|
|
#define DECT_CCTRL_RELEASE_REASON_SHIFT 44
|
|
|
|
enum dect_mac_release_reasons {
|
|
DECT_REASON_UNKNOWN = 0x0,
|
|
DECT_REASON_BEARER_RELEASE = 0x1,
|
|
DECT_REASON_CONNECTION_RELEASE = 0x2,
|
|
DECT_REASON_BEARER_SETUP_OR_HANDOVER_FAILED = 0x3,
|
|
DECT_REASON_BEARER_HANDOVER_COMPLETED = 0x4,
|
|
DECT_REASON_BEARER_HANDOVER_CLUSTER = 0x5,
|
|
DECT_REASON_TIMEOUT_LOST_SIGNAL = 0x6,
|
|
DECT_REASON_TIMEOUT_LOST_HANDSHAKE = 0x7,
|
|
DECT_REASON_REQUESTED_UNACCEPTABLE_SLOT_TYPE = 0x8,
|
|
DECT_REASON_REQUESTED_UNACCEPTABLE_MAC_SERVICE = 0x9,
|
|
DECT_REASON_BASE_STATION_BUSY = 0xa,
|
|
DECT_REASON_REVERSE_DIRECTION = 0xb,
|
|
DECT_REASON_DUPLICATE_PMID = 0xc,
|
|
DECT_REASON_UNACCEPTABLE_PMID = 0xd,
|
|
DECT_REASON_STAY_ON_LISTEN = 0xe,
|
|
};
|
|
|
|
#define DECT_CCTRL_RELEASE_PMID_MASK 0x00000fffff000000ULL
|
|
#define DECT_CCTRL_RELEASE_PMID_SHIFT 24
|
|
|
|
struct dect_cctrl {
|
|
enum dect_cctrl_cmds cmd;
|
|
union {
|
|
struct {
|
|
uint32_t pmid;
|
|
uint16_t fmid;
|
|
};
|
|
struct {
|
|
uint8_t lbn;
|
|
uint8_t ecn;
|
|
uint8_t type;
|
|
uint8_t service;
|
|
uint8_t slot;
|
|
bool cf;
|
|
uint8_t a_mod;
|
|
uint8_t bz_mod;
|
|
uint8_t bz_ext_mod;
|
|
uint8_t acr;
|
|
};
|
|
struct {
|
|
uint32_t pmid;
|
|
uint8_t lbn;
|
|
uint8_t reason;
|
|
};
|
|
};
|
|
};
|
|
|
|
/* Encryption Control */
|
|
|
|
#define DECT_ENCCTRL_FILL_MASK 0x5000000000000000ULL
|
|
|
|
#define DECT_ENCCTRL_CMD_MASK 0x0f00000000000000ULL
|
|
#define DECT_ENCCTRL_CMD_SHIFT 56
|
|
|
|
enum dect_encctrl_cmds {
|
|
DECT_ENCCTRL_START_REQUEST = 0x0,
|
|
DECT_ENCCTRL_START_CONFIRM = 0x1,
|
|
DECT_ENCCTRL_START_GRANT = 0x2,
|
|
DECT_ENCCTRL_STOP_REQUEST = 0x4,
|
|
DECT_ENCCTRL_STOP_CONFIRM = 0x5,
|
|
DECT_ENCCTRL_STOP_GRANT = 0x6,
|
|
};
|
|
|
|
#define DECT_ENCCTRL_FMID_MASK 0x00fff00000000000ULL
|
|
#define DECT_ENCCTRL_FMID_SHIFT 44
|
|
|
|
#define DECT_ENCCTRL_PMID_MASK 0x00000fffff000000ULL
|
|
#define DECT_ENCCTRL_PMID_SHIFT 24
|
|
|
|
struct dect_encctrl {
|
|
enum dect_encctrl_cmds cmd;
|
|
uint32_t pmid;
|
|
uint16_t fmid;
|
|
};
|
|
|
|
/* marker for T-MUX exceptions */
|
|
#define DECT_MT_HIGH_PRIORITY 0x1
|
|
|
|
/*
|
|
* C_T data
|
|
*/
|
|
|
|
#define DECT_C_S_SDU_SIZE 5
|
|
|
|
struct dect_ct_data {
|
|
uint8_t seq;
|
|
};
|
|
|
|
/*
|
|
* Flat representation of tail message contents
|
|
*/
|
|
enum dect_tail_msg_types {
|
|
DECT_TM_TYPE_INVALID,
|
|
DECT_TM_TYPE_ID,
|
|
DECT_TM_TYPE_SSI,
|
|
DECT_TM_TYPE_ERFC,
|
|
DECT_TM_TYPE_FPC,
|
|
DECT_TM_TYPE_EFPC,
|
|
DECT_TM_TYPE_EFPC2,
|
|
DECT_TM_TYPE_SARI,
|
|
DECT_TM_TYPE_MFN,
|
|
DECT_TM_TYPE_PAGE,
|
|
DECT_TM_TYPE_BFS,
|
|
DECT_TM_TYPE_BD,
|
|
DECT_TM_TYPE_RFP_ID,
|
|
DECT_TM_TYPE_RFP_STATUS,
|
|
DECT_TM_TYPE_ACTIVE_CARRIERS,
|
|
DECT_TM_TYPE_BCCTRL,
|
|
DECT_TM_TYPE_ACCTRL,
|
|
DECT_TM_TYPE_ENCCTRL,
|
|
DECT_TM_TYPE_CT,
|
|
};
|
|
|
|
struct dect_tail_msg {
|
|
enum dect_tail_identifications ti;
|
|
enum dect_tail_msg_types type;
|
|
union {
|
|
struct dect_idi idi;
|
|
struct dect_ssi ssi;
|
|
struct dect_erfc erfc;
|
|
struct dect_fpc fpc;
|
|
struct dect_efpc efpc;
|
|
struct dect_efpc2 efpc2;
|
|
struct dect_sari sari;
|
|
struct dect_mfn mfn;
|
|
struct dect_page page;
|
|
struct dect_bfs bfs;
|
|
struct dect_bearer_desc bd;
|
|
struct dect_rfp_id rfp_id;
|
|
struct dect_rfp_status rfp_status;
|
|
struct dect_active_carriers active_carriers;
|
|
struct dect_cctrl cctl;
|
|
struct dect_encctrl encctl;
|
|
struct dect_ct_data ctd;
|
|
};
|
|
};
|
|
|
|
struct dect_si {
|
|
uint32_t mask;
|
|
struct dect_ssi ssi;
|
|
struct dect_erfc erfc;
|
|
struct dect_fpc fpc;
|
|
struct dect_efpc efpc;
|
|
struct dect_efpc2 efpc2;
|
|
struct dect_sari sari[DECT_SARI_CYCLE_MAX];
|
|
struct dect_mfn mfn;
|
|
uint8_t num_saris;
|
|
};
|
|
|
|
/*
|
|
* B-Field
|
|
*/
|
|
|
|
#define DECT_B_FIELD_SIZE 40
|
|
|
|
/**
|
|
* dect_b_identitifications - MAC layer B-Field Identification
|
|
*
|
|
* @DECT_BI_UTYPE_0: U-Type, I_N, SI_N, SI_P or I_P packet number 0
|
|
* @DECT_BI_UTYPE_1: U-Type, I_P error detect or I_P packet number 1
|
|
* @DECT_BI_ETYPE_CF_0: E-Type, all C_F or CL_F, packet number 0
|
|
* @DECT_BI_ETYPE_CF_1: E-Type, all C_F, packet number 1
|
|
* @DECT_BI_ETYPE_MAC: E-Type, all MAC control (unnumbered)
|
|
* @DECT_BI_NONE: no B-Field
|
|
*/
|
|
enum dect_b_identifications {
|
|
DECT_BI_UTYPE_0 = 0x0 << DECT_HDR_BA_SHIFT,
|
|
DECT_BI_UTYPE_1 = 0x1 << DECT_HDR_BA_SHIFT,
|
|
DECT_BI_ETYPE_CF_0 = 0x2 << DECT_HDR_BA_SHIFT,
|
|
DECT_BI_ETYPE_CF_1 = 0x3 << DECT_HDR_BA_SHIFT,
|
|
DECT_BI_ETYPE_NOT_ALL_CF_0 = 0x4 << DECT_HDR_BA_SHIFT,
|
|
DECT_BI_ETYPE_NOT_ALL_CF_1 = 0x5 << DECT_HDR_BA_SHIFT,
|
|
DECT_BI_ETYPE_MAC = 0x6 << DECT_HDR_BA_SHIFT,
|
|
DECT_BI_NONE = 0x7 << DECT_HDR_BA_SHIFT,
|
|
};
|
|
|
|
struct dect_skb_b_cb {
|
|
enum dect_b_identifications id;
|
|
};
|
|
|
|
#define DECT_B_CB(skb) ((struct dect_skb_b_cb *)(skb)->cb)
|
|
|
|
#define DECT_C_F_SDU_SIZE 8
|
|
#define DECT_G_F_SDU_SIZE 8
|
|
|
|
/**
|
|
* enum dect_mac_channels - internal MAC control channels
|
|
*
|
|
* @DECT_MC_Q: System information and multiframe marker
|
|
* @DECT_MC_N: Identities information
|
|
* @DECT_MC_M: MAC control channel
|
|
* @DECT_MC_P: MAC Paging channel
|
|
*/
|
|
enum dect_mac_channels {
|
|
DECT_MC_Q,
|
|
DECT_MC_N,
|
|
DECT_MC_M,
|
|
DECT_MC_P,
|
|
};
|
|
|
|
/**
|
|
* enum dect_data_channels - logical MAC data channels
|
|
*
|
|
* @DECT_MC_G_F:
|
|
* @DECT_MC_C_S: Higher layer C-Plane channel (slow)
|
|
* @DECT_MC_C_F: Higher layer C-Plane channel (fast)
|
|
* @DECT_MC_I_N: Higher layer U-Plane channel (numbered)
|
|
* @DECT_MC_I_P: Higher layer U-Plane channel (protected)
|
|
* @DECT_MC_SI_N: Higher layer connectionless U-Plane channel (numbered)
|
|
* @DECT_MC_SI_P: Higher layer connectionless U-Plane channel (protected)
|
|
*/
|
|
enum dect_data_channels {
|
|
DECT_MC_G_F,
|
|
DECT_MC_C_S,
|
|
DECT_MC_C_F,
|
|
DECT_MC_I_N,
|
|
DECT_MC_I_P,
|
|
DECT_MC_SI_N,
|
|
DECT_MC_SI_P,
|
|
__DECT_MC_MAX
|
|
};
|
|
#define DECT_MC_MAX (__DECT_MC_MAX - 1)
|
|
|
|
/**
|
|
* enum dect_mac_connection_types - MAC Connection types
|
|
*
|
|
* @DECT_MAC_CONN_BASIC: Basic connection, always I_N_min_delay service
|
|
* @DECT_MAC_CONN_ADVANCED: Advanced connection
|
|
* @DECT_MAC_CONN_COMPLEMENT: Complementary connection
|
|
*/
|
|
enum dect_mac_connection_types {
|
|
DECT_MAC_CONN_BASIC,
|
|
DECT_MAC_CONN_ADVANCED,
|
|
DECT_MAC_CONN_COMPLEMENT,
|
|
};
|
|
|
|
/**
|
|
* struct dect_mbc_id
|
|
*
|
|
* @mcei: MAC Connection Endpoint Identifier
|
|
* @type: Connection Type (Basic/Advanced)
|
|
* @ari: FT identifier
|
|
* @pmid: Portable MAC Identity
|
|
* @ecn: Exchanged Connection Number
|
|
* @service: Service type
|
|
*/
|
|
struct dect_mbc_id {
|
|
uint32_t mcei;
|
|
enum dect_mac_connection_types type;
|
|
//struct dect_ari ari;
|
|
//struct dect_pmid pmid;
|
|
uint8_t ecn;
|
|
enum dect_mac_service_types service;
|
|
};
|
|
|
|
#endif /* _NET_DECT_MAC_H */
|