dect
/
libnl
Archived
13
0
Fork 0

dect: adapt capability handling to latest kernel changes

Signed-off-by: Patrick McHardy <kaber@trash.net>
This commit is contained in:
Patrick McHardy 2010-03-08 04:02:53 +01:00
parent 2826c89a77
commit 44fde8fcbb
6 changed files with 300 additions and 355 deletions

View File

@ -169,22 +169,22 @@ enum dect_fixed_part_capabilities {
DECT_FPC_DOUBLE_DUPLEX_BEARER_CONNECTION= 0x40000,
DECT_FPC_RESERVED = 0x20000,
DECT_FPC_DOUBLE_SLOT = 0x10000,
DECT_FPC_HALF_SLOT = 0x8000,
DECT_FPC_FULL_SLOT = 0x4000,
DECT_FPC_FREQ_CONTROL = 0x2000,
DECT_FPC_PAGE_REPETITION = 0x1000,
DECT_FPC_CO_SETUP_ON_DUMMY = 0x800,
DECT_FPC_CL_UPLINK = 0x400,
DECT_FPC_CL_DOWNLINK = 0x200,
DECT_FPC_BASIC_A_FIELD_SETUP = 0x100,
DECT_FPC_ADV_A_FIELD_SETUP = 0x80,
DECT_FPC_B_FIELD_SETUP = 0x40,
DECT_FPC_CF_MESSAGES = 0x20,
DECT_FPC_IN_MIN_DELAY = 0x10,
DECT_FPC_IN_NORM_DELAY = 0x8,
DECT_FPC_IP_ERROR_DETECTION = 0x4,
DECT_FPC_IP_ERROR_CORRECTION = 0x2,
DECT_FPC_MULTIBEARER_CONNECTIONS = 0x1,
DECT_FPC_HALF_SLOT = 0x08000,
DECT_FPC_FULL_SLOT = 0x04000,
DECT_FPC_FREQ_CONTROL = 0x02000,
DECT_FPC_PAGE_REPETITION = 0x01000,
DECT_FPC_CO_SETUP_ON_DUMMY = 0x00800,
DECT_FPC_CL_UPLINK = 0x00400,
DECT_FPC_CL_DOWNLINK = 0x00200,
DECT_FPC_BASIC_A_FIELD_SETUP = 0x00100,
DECT_FPC_ADV_A_FIELD_SETUP = 0x00080,
DECT_FPC_B_FIELD_SETUP = 0x00040,
DECT_FPC_CF_MESSAGES = 0x00020,
DECT_FPC_IN_MIN_DELAY = 0x00010,
DECT_FPC_IN_NORM_DELAY = 0x00008,
DECT_FPC_IP_ERROR_DETECTION = 0x00004,
DECT_FPC_IP_ERROR_CORRECTION = 0x00002,
DECT_FPC_MULTIBEARER_CONNECTIONS = 0x00001,
};
enum dect_higher_layer_capabilities {
@ -192,41 +192,91 @@ enum dect_higher_layer_capabilities {
DECT_HLC_GAP_PAP_BASIC_SPEECH = 0x4000,
DECT_HLC_NON_VOICE_CIRCUIT_SWITCHED = 0x2000,
DECT_HLC_NON_VOICE_PACKET_SWITCHED = 0x1000,
DECT_HLC_STANDARD_AUTHENTICATION = 0x800,
DECT_HLC_STANDARD_CIPHERING = 0x400,
DECT_HLC_LOCATION_REGISTRATION = 0x200,
DECT_HLC_SIM_SERVICES = 0x100,
DECT_HLC_NON_STATIC_FIXED_PART = 0x80,
DECT_HLC_CISS_SERVICE = 0x40,
DECT_HLC_CLMS_SERVICE = 0x20,
DECT_HLC_COMS_SERVICE = 0x10,
DECT_HLC_ACCESS_RIGHT_REQUESTS = 0x8,
DECT_HLC_EXTERNAL_HANDOVER = 0x4,
DECT_HLC_CONNECTION_HANDOVER = 0x2,
DECT_HLC_RESERVED = 0x1,
DECT_HLC_STANDARD_AUTHENTICATION = 0x0800,
DECT_HLC_STANDARD_CIPHERING = 0x0400,
DECT_HLC_LOCATION_REGISTRATION = 0x0200,
DECT_HLC_SIM_SERVICES = 0x0100,
DECT_HLC_NON_STATIC_FIXED_PART = 0x0080,
DECT_HLC_CISS_SERVICE = 0x0040,
DECT_HLC_CLMS_SERVICE = 0x0020,
DECT_HLC_COMS_SERVICE = 0x0010,
DECT_HLC_ACCESS_RIGHT_REQUESTS = 0x0008,
DECT_HLC_EXTERNAL_HANDOVER = 0x0004,
DECT_HLC_CONNECTION_HANDOVER = 0x0002,
DECT_HLC_RESERVED = 0x0001,
};
enum dect_extended_fixed_part_capabilities {
DECT_EFPC_WRS_MASK = 0x1f80,
DECT_EFPC_WRS_CRFP_HOPS_MASK = 0x1800,
DECT_EFPC_WRS_CRFP_HOPS_1 = 0x0000,
DECT_EFPC_WRS_CRFP_HOPS_2 = 0x0800,
DECT_EFPC_WRS_CRFP_HOPS_3 = 0x1000,
DECT_EFPC_WRS_CRFP_HOPS_NONE = 0x1800,
DECT_EFPC_WRS_CRFP_ENCRYPTION = 0x0400,
DECT_EFPC_WRS_REP_HOPS_MASK = 0x0300,
DECT_EFPC_WRS_REP_HOPS_NONE = 0x0000,
DECT_EFPC_WRS_REP_HOPS_1 = 0x0100,
DECT_EFPC_WRS_REP_HOPS_2 = 0x0200,
DECT_EFPC_WRS_REP_HOPS_3 = 0x0300,
DECT_EFPC_WRS_REP_INTERLACING = 0x0080,
DECT_EFPC_SYNC_MASK = 0x0060,
DECT_EFPC_SYNC_PROLONGED_PREAMBLE = 0x0020,
DECT_EFPC_SYNC_RESERVED1 = 0x0010,
DECT_EFPC_MAC_SUSPEND_RESUME = 0x0008,
DECT_EFPC_MAC_IP_Q_SERVICE = 0x0004,
DECT_EFPC_EXTENDED_FP_INFO2 = 0x0002,
DECT_EFPC_RESERVED2 = 0x0001,
};
enum dect_extended_higher_layer_capabilities {
DECT_EHLC_ISDN_DATA_SERVICE = 0x1,
DECT_EHLC_DATA_SERVICE_PROFILE_A_B = 0x2,
DECT_EHLC_DATA_SERVICE_PROFILE_C = 0x4,
DECT_EHLC_DATA_SERVICE_PROFILE_D = 0x8,
DECT_EHLC_DATA_SERVICE_PROFILE_E = 0x10,
DECT_EHLC_DATA_SERVICE_PROFILE_F = 0x20,
DECT_EHLC_ASYMETRIC_BEARERS = 0x40,
DECT_EHLC_TPUI_LOCATION_REGISTRATION = 0x100,
DECT_EHLC_ISDN_DATA_SERVICE = 0x000001,
DECT_EHLC_DPRS_FREL = 0x000002,
DECT_EHLC_DPRS_STREAM = 0x000004,
DECT_EHLC_DATA_SERVICE_PROFILE_D = 0x000008,
DECT_EHLC_LRMS = 0x000010,
DECT_EHLC_ASYMETRIC_BEARERS = 0x000040,
DECT_EHLC_EMERGENCY_CALLS = 0x000080,
DECT_EHLC_TPUI_LOCATION_REGISTRATION = 0x000100,
DECT_EHLC_GPS_SYNCHRONIZED = 0x000200,
DECT_EHLC_ISDN_INTERMEDIATE_SYSTEM = 0x000400,
DECT_EHLC_RAP_PART_1_PROFILE = 0x000800,
DECT_EHLC_V_24 = 0x004000,
DECT_EHLC_PPP = 0x008000,
DECT_EHLC_IP = 0x010000,
DECT_EHLC_TOKEN_RING = 0x020000,
DECT_EHLC_ETHERNET = 0x040000,
DECT_EHLC_IP_ROAMING = 0x080000,
DECT_EHLC_GENERIC_MEDIA_ENCAPSULATION = 0x100000,
DECT_EHLC_BASIC_ODAP = 0x200000,
DECT_EHLC_F_MMS_INTERWORKING_PROFILE = 0x400000,
};
enum dect_efpc_attrs {
DECTA_EFPC_UNSPEC,
DECTA_EFPC_CRFP_HOPS,
DECTA_EFPC_CRFP_ENCRYPTION,
DECTA_EFPC_REP_HOPS,
DECTA_EFPC_REP_INTERLACING,
DECTA_EFPC_EHLC,
__DECTA_EFPC_MAX
enum dect_extended_fixed_part_capabilities2 {
DECT_EFPC2_LONG_SLOT_J640 = 0x800,
DECT_EFPC2_LONG_SLOT_J672 = 0x400,
DECT_EFPC2_IP_F = 0x200,
DECT_EFPC2_SI_PF = 0x100,
DECT_EFPC2_GF = 0x080,
DECT_EFPC2_NO_EMISSION_CARRIER = 0x001,
};
enum dect_extended_higher_layer_capabilities2 {
DECT_EHLC2_NG_DECT_PERMANENT_CLIR = 0x000100,
DECT_EHLC2_NG_DECT_MULTIPLE_CALLS = 0x000200,
DECT_EHLC2_NG_DECT_MULTIPLE_LINES = 0x000400,
DECT_EHLC2_EASY_PAIRING = 0x000800,
DECT_EHLC2_LIST_ACCESS_FEATURES = 0x001000,
DECT_EHLC2_NO_EMISSION_MODE = 0x002000,
DECT_EHLC2_NG_DECT_CALL_DEFLECTION = 0x004000,
DECT_EHLC2_NG_DECT_INTRUSION_CALL = 0x008000,
DECT_EHLC2_NG_DECT_CONFERENCE_CALL = 0x010000,
DECT_EHLC2_NG_DECT_PARALLEL_CALLS = 0x020000,
DECT_EHLC2_NG_DECT_CALL_TRANSFER = 0x040000,
DECT_EHLC2_NG_DECT_EXTENDED_WIDEBAND = 0x080000,
DECT_EHLC2_PACKET_DATA_CATEGORY_MASK = 0x700000,
DECT_EHLC2_NG_DECT_WIDEBAND = 0x800000,
};
#define DECTA_EFPC_MAX (__DECTA_EFPC_MAX - 1)
enum dect_mac_info_attrs {
DECTA_MAC_INFO_UNSPEC,
@ -237,6 +287,9 @@ enum dect_mac_info_attrs {
DECTA_MAC_INFO_FPC,
DECTA_MAC_INFO_HLC,
DECTA_MAC_INFO_EFPC,
DECTA_MAC_INFO_EHLC,
DECTA_MAC_INFO_EFPC2,
DECTA_MAC_INFO_EHLC2,
__DECTA_MAC_INFO_MAX
};
#define DECTA_MAC_INFO_MAX (__DECTA_MAC_INFO_MAX - 1)
@ -251,6 +304,7 @@ enum dect_llme_ops {
enum dect_llme_msg_types {
DECT_LLME_SCAN,
DECT_LLME_MAC_INFO,
DECT_LLME_MAC_RFP_PRELOAD,
__DECT_LLME_MAX
};
#define DECT_LLME_MAX (__DECT_LLME_MAX - 1)

View File

@ -901,7 +901,10 @@ struct nl_dect_llme_mac_info {
uint8_t mi_rssi;
uint32_t mi_fpc;
uint16_t mi_hlc;
uint16_t mi_ehlc;
uint16_t mi_efpc;
uint32_t mi_ehlc;
uint16_t mi_efpc2;
uint32_t mi_ehlc2;
};
struct nl_dect_llme_mac_con {

View File

@ -56,9 +56,21 @@ extern void nl_dect_llme_mac_info_set_hlc(struct nl_dect_llme_msg *,
uint16_t);
extern uint16_t nl_dect_llme_mac_info_get_hlc(const struct nl_dect_llme_msg *);
extern void nl_dect_llme_mac_info_set_ehlc(struct nl_dect_llme_msg *,
extern void nl_dect_llme_mac_info_set_efpc(struct nl_dect_llme_msg *,
uint16_t);
extern uint16_t nl_dect_llme_mac_info_get_ehlc(const struct nl_dect_llme_msg *);
extern uint16_t nl_dect_llme_mac_info_get_efpc(const struct nl_dect_llme_msg *);
extern void nl_dect_llme_mac_info_set_ehlc(struct nl_dect_llme_msg *,
uint32_t);
extern uint32_t nl_dect_llme_mac_info_get_ehlc(const struct nl_dect_llme_msg *);
extern void nl_dect_llme_mac_info_set_efpc2(struct nl_dect_llme_msg *,
uint16_t);
extern uint16_t nl_dect_llme_mac_info_get_efpc2(const struct nl_dect_llme_msg *);
extern void nl_dect_llme_mac_info_set_ehlc2(struct nl_dect_llme_msg *,
uint32_t);
extern uint32_t nl_dect_llme_mac_info_get_ehlc2(const struct nl_dect_llme_msg *);
extern char * nl_dect_llme_fpc2str(uint32_t, char *, size_t);
extern uint32_t nl_dect_llme_str2fpc(const char *);
@ -66,41 +78,16 @@ extern uint32_t nl_dect_llme_str2fpc(const char *);
extern char * nl_dect_llme_hlc2str(uint16_t, char *, size_t);
extern uint16_t nl_dect_llme_str2hlc(const char *);
extern char * nl_dect_llme_ehlc2str(uint16_t, char *, size_t);
extern uint16_t nl_dect_llme_str2ehlc(const char *);
extern char * nl_dect_llme_efpc2str(uint16_t, char *, size_t);
extern uint16_t nl_dect_llme_str2efpc(const char *);
#if 0
extern void nl_dect_llme_mac_con_set_mcei(struct nl_dect_llme_msg *,
uint32_t);
extern uint32_t nl_dect_llme_mac_con_get_mcei(const struct nl_dect_llme_msg *);
extern char * nl_dect_llme_ehlc2str(uint32_t, char *, size_t);
extern uint32_t nl_dect_llme_str2ehlc(const char *);
extern void nl_dect_llme_mac_con_set_ari(struct nl_dect_llme_msg *,
const struct nl_dect_ari *);
extern const struct nl_dect_ari * nl_dect_llme_mac_con_get_ari(const struct nl_dect_llme_msg *);
extern char * nl_dect_llme_efpc22str(uint16_t, char *, size_t);
extern uint16_t nl_dect_llme_str22efpc(const char *);
extern void nl_dect_llme_mac_con_set_pmid(struct nl_dect_llme_msg *,
uint32_t);
extern uint32_t nl_dect_llme_mac_con_get_pmid(const struct nl_dect_llme_msg *);
extern void nl_dect_llme_mac_con_set_type(struct nl_dect_llme_msg *,
enum nl_dect_mac_con_types);
extern enum nl_dect_mac_con_types nl_dect_llme_mac_con_get_type(const struct nl_dect_llme_msg *);
extern void nl_dect_llme_mac_con_set_ecn(struct nl_dect_llme_msg *,
uint8_t);
extern uint8_t nl_dect_llme_mac_con_get_ecn(const struct nl_dect_llme_msg *);
extern void nl_dect_llme_mac_con_set_service(struct nl_dect_llme_msg *,
enum nl_dect_mac_con_service_types);
extern enum nl_dect_mac_con_service_types nl_dect_llme_mac_con_get_service(const struct nl_dect_llme_msg *);
extern char * nl_dect_llme_contype2str(enum nl_dect_mac_con_types,
char *, size_t);
extern enum nl_dect_mac_con_types nl_dect_llme_str2contype(const char *);
extern char * nl_dect_llme_service2str(enum nl_dect_mac_con_service_types,
char *, size_t);
extern enum nl_dect_mac_con_service_types nl_dect_llme_str2service(const char *);
#endif
extern char * nl_dect_llme_ehlc22str(uint32_t, char *, size_t);
extern uint32_t nl_dect_llme_str22ehlc(const char *);
#endif /* NETLINK_DECT_LLME_H */

View File

@ -28,12 +28,15 @@
static struct nl_object_ops llme_msg_obj_ops;
/** @endcond */
#define MAC_INFO_ATTR_PARI 0x010000
#define MAC_INFO_ATTR_RPN 0x020000
#define MAC_INFO_ATTR_RSSI 0x040000
#define MAC_INFO_ATTR_FPC 0x080000
#define MAC_INFO_ATTR_HLC 0x100000
#define MAC_INFO_ATTR_EHLC 0x200000
#define MAC_INFO_ATTR_PARI 0x0010000
#define MAC_INFO_ATTR_RPN 0x0020000
#define MAC_INFO_ATTR_RSSI 0x0040000
#define MAC_INFO_ATTR_FPC 0x0080000
#define MAC_INFO_ATTR_HLC 0x0100000
#define MAC_INFO_ATTR_EFPC 0x0200000
#define MAC_INFO_ATTR_EHLC 0x0400000
#define MAC_INFO_ATTR_EFPC2 0x0800000
#define MAC_INFO_ATTR_EHLC2 0x1000000
static inline struct nl_dect_llme_mac_info *mac_info(const struct nl_dect_llme_msg *lmsg)
{
@ -98,17 +101,50 @@ uint16_t nl_dect_llme_mac_info_get_hlc(const struct nl_dect_llme_msg *lmsg)
return mac_info(lmsg)->mi_hlc;
}
void nl_dect_llme_mac_info_set_ehlc(struct nl_dect_llme_msg *lmsg, uint16_t ehlc)
void nl_dect_llme_mac_info_set_efpc(struct nl_dect_llme_msg *lmsg, uint16_t efpc)
{
mac_info(lmsg)->mi_efpc = efpc;
lmsg->ce_mask |= MAC_INFO_ATTR_EFPC;
}
uint16_t nl_dect_llme_mac_info_get_efpc(const struct nl_dect_llme_msg *lmsg)
{
return mac_info(lmsg)->mi_efpc;
}
void nl_dect_llme_mac_info_set_ehlc(struct nl_dect_llme_msg *lmsg, uint32_t ehlc)
{
mac_info(lmsg)->mi_ehlc = ehlc;
lmsg->ce_mask |= MAC_INFO_ATTR_EHLC;
}
uint16_t nl_dect_llme_mac_info_get_ehlc(const struct nl_dect_llme_msg *lmsg)
uint32_t nl_dect_llme_mac_info_get_ehlc(const struct nl_dect_llme_msg *lmsg)
{
return mac_info(lmsg)->mi_ehlc;
}
void nl_dect_llme_mac_info_set_efpc2(struct nl_dect_llme_msg *lmsg, uint16_t efpc2)
{
mac_info(lmsg)->mi_efpc2 = efpc2;
lmsg->ce_mask |= MAC_INFO_ATTR_EFPC2;
}
uint16_t nl_dect_llme_mac_info_get_efpc2(const struct nl_dect_llme_msg *lmsg)
{
return mac_info(lmsg)->mi_efpc2;
}
void nl_dect_llme_mac_info_set_ehlc2(struct nl_dect_llme_msg *lmsg, uint32_t ehlc2)
{
mac_info(lmsg)->mi_ehlc2 = ehlc2;
lmsg->ce_mask |= MAC_INFO_ATTR_EHLC2;
}
uint32_t nl_dect_llme_mac_info_get_ehlc2(const struct nl_dect_llme_msg *lmsg)
{
return mac_info(lmsg)->mi_ehlc2;
}
static struct trans_tbl fixed_part_capabilities[] = {
__ADD(DECT_FPC_EXTENDED_FP_INFO, extended_fp_info)
__ADD(DECT_FPC_DOUBLE_DUPLEX_BEARER_CONNECTION, double_duplex_bearer_connection)
@ -175,65 +211,151 @@ uint16_t nl_dect_llme_str2hlc(const char *str)
ARRAY_SIZE(higher_layer_capabilities));
}
static struct trans_tbl extended_higher_layer_capabilities[] = {
__ADD(DECT_EHLC_ISDN_DATA_SERVICE, isdn_data_service)
__ADD(DECT_EHLC_DATA_SERVICE_PROFILE_A_B, data_service_profile_a_b)
__ADD(DECT_EHLC_DATA_SERVICE_PROFILE_C, data_service_profile_c)
__ADD(DECT_EHLC_DATA_SERVICE_PROFILE_D, data_service_profile_d)
__ADD(DECT_EHLC_DATA_SERVICE_PROFILE_E, data_service_profile_e)
__ADD(DECT_EHLC_DATA_SERVICE_PROFILE_F, data_service_profile_f)
__ADD(DECT_EHLC_ASYMETRIC_BEARERS, asymetric_bearers)
__ADD(DECT_EHLC_TPUI_LOCATION_REGISTRATION, tpui_location_registration)
static struct trans_tbl extended_fixed_part_capabilities[] = {
__ADD(DECT_EFPC_SYNC_PROLONGED_PREAMBLE, prolonged_preamble)
__ADD(DECT_EFPC_MAC_SUSPEND_RESUME, suspend_resume)
__ADD(DECT_EFPC_MAC_IP_Q_SERVICE, ip_q_service)
__ADD(DECT_EFPC_EXTENDED_FP_INFO2, extended_fp_info2)
};
char *nl_dect_llme_ehlc2str(uint16_t ehlc, char *buf, size_t len)
char *nl_dect_llme_efpc2str(uint16_t efpc, char *buf, size_t len)
{
return __flags2str(efpc, buf, len, extended_fixed_part_capabilities,
ARRAY_SIZE(extended_fixed_part_capabilities));
}
uint16_t nl_dect_llme_str2efpc(const char *str)
{
return __str2flags(str, extended_fixed_part_capabilities,
ARRAY_SIZE(extended_fixed_part_capabilities));
}
static struct trans_tbl extended_higher_layer_capabilities[] = {
__ADD(DECT_EHLC_ISDN_DATA_SERVICE, isdn_data_service)
__ADD(DECT_EHLC_DPRS_FREL, dprs_frel)
__ADD(DECT_EHLC_DPRS_STREAM, dprs_stream)
__ADD(DECT_EHLC_DATA_SERVICE_PROFILE_D, data_service_profile_d)
__ADD(DECT_EHLC_LRMS, lrms)
__ADD(DECT_EHLC_ASYMETRIC_BEARERS, asymetric_bearers)
__ADD(DECT_EHLC_EMERGENCY_CALLS, emergency_calls)
__ADD(DECT_EHLC_TPUI_LOCATION_REGISTRATION, tpui_location_registration)
__ADD(DECT_EHLC_GPS_SYNCHRONIZED, gps_synchronized)
__ADD(DECT_EHLC_ISDN_INTERMEDIATE_SYSTEM, isdn_intermediate_system)
__ADD(DECT_EHLC_RAP_PART_1_PROFILE, rap_1_profile)
__ADD(DECT_EHLC_V_24, v_24)
__ADD(DECT_EHLC_PPP, ppp)
__ADD(DECT_EHLC_IP, ip)
__ADD(DECT_EHLC_TOKEN_RING, token_ring)
__ADD(DECT_EHLC_ETHERNET, ethernet)
__ADD(DECT_EHLC_IP_ROAMING, ip_roaming)
__ADD(DECT_EHLC_GENERIC_MEDIA_ENCAPSULATION, generic_media_encapsulation)
__ADD(DECT_EHLC_BASIC_ODAP, basic_odap)
__ADD(DECT_EHLC_F_MMS_INTERWORKING_PROFILE, mms_interworking_profile)
};
char *nl_dect_llme_ehlc2str(uint32_t ehlc, char *buf, size_t len)
{
return __flags2str(ehlc, buf, len, extended_higher_layer_capabilities,
ARRAY_SIZE(extended_higher_layer_capabilities));
}
uint16_t nl_dect_llme_str2ehlc(const char *str)
uint32_t nl_dect_llme_str2ehlc(const char *str)
{
return __str2flags(str, extended_higher_layer_capabilities,
ARRAY_SIZE(extended_higher_layer_capabilities));
}
static struct trans_tbl extended_fixed_part_capabilities2[] = {
__ADD(DECT_EFPC2_NO_EMISSION_CARRIER, no_emission_carrier)
__ADD(DECT_EFPC2_GF, gf_channel)
__ADD(DECT_EFPC2_SI_PF, si_pf_channel)
__ADD(DECT_EFPC2_IP_F, ip_f_channel)
__ADD(DECT_EFPC2_LONG_SLOT_J672, long_slot_j672)
__ADD(DECT_EFPC2_LONG_SLOT_J640, long_slot_j640)
};
char *nl_dect_llme_efpc22str(uint16_t efpc2, char *buf, size_t len)
{
return __flags2str(efpc2, buf, len, extended_fixed_part_capabilities2,
ARRAY_SIZE(extended_fixed_part_capabilities2));
}
uint16_t nl_dect_llme_str2efpc2(const char *str)
{
return __str2flags(str, extended_fixed_part_capabilities2,
ARRAY_SIZE(extended_fixed_part_capabilities2));
}
static struct trans_tbl extended_higher_layer_capabilities2[] = {
__ADD(DECT_EHLC2_NG_DECT_PERMANENT_CLIR, permanent_clir)
__ADD(DECT_EHLC2_NG_DECT_MULTIPLE_CALLS, multiple_calls)
__ADD(DECT_EHLC2_NG_DECT_MULTIPLE_LINES, multiple_lines)
__ADD(DECT_EHLC2_EASY_PAIRING, easy_pairing)
__ADD(DECT_EHLC2_LIST_ACCESS_FEATURES, list_access_features)
__ADD(DECT_EHLC2_NO_EMISSION_MODE, no_emission_mode)
__ADD(DECT_EHLC2_NG_DECT_CALL_DEFLECTION, call_deflection)
__ADD(DECT_EHLC2_NG_DECT_INTRUSION_CALL, intrusion_call)
__ADD(DECT_EHLC2_NG_DECT_CONFERENCE_CALL, conference_call)
__ADD(DECT_EHLC2_NG_DECT_PARALLEL_CALLS, parallel_calls)
__ADD(DECT_EHLC2_NG_DECT_CALL_TRANSFER, call_transfer)
__ADD(DECT_EHLC2_NG_DECT_EXTENDED_WIDEBAND, extended_wideband)
__ADD(DECT_EHLC2_PACKET_DATA_CATEGORY_MASK, packet_data)
__ADD(DECT_EHLC2_NG_DECT_WIDEBAND, wideband)
};
char *nl_dect_llme_ehlc22str(uint32_t ehlc2, char *buf, size_t len)
{
return __flags2str(ehlc2, buf, len, extended_higher_layer_capabilities2,
ARRAY_SIZE(extended_higher_layer_capabilities2));
}
uint32_t nl_dect_llme_str22ehlc(const char *str)
{
return __str2flags(str, extended_higher_layer_capabilities2,
ARRAY_SIZE(extended_higher_layer_capabilities2));
}
static void nl_dect_llme_mac_info_dump(const struct nl_dect_llme_msg *lmsg,
struct nl_dump_params *p)
struct nl_dump_params *p)
{
const struct nl_dect_llme_mac_info *mi = mac_info(lmsg);
char buf[256];
if (lmsg->ce_mask & MAC_INFO_ATTR_PARI) {
nl_dump(p, "\tARI: ");
nl_dump(p, "\n\tARI: ");
nl_dect_dump_ari(&mi->mi_pari, p);
}
if (lmsg->ce_mask & MAC_INFO_ATTR_RPN)
nl_dump(p, " RPN: %x", mi->mi_rpn);
if (lmsg->ce_mask & MAC_INFO_ATTR_RSSI)
nl_dump(p, " signal level: %.2fdBm", nl_dect_rssi_to_dbm(mi->mi_rssi));
if (lmsg->ce_mask & MAC_INFO_ATTR_FPC) {
if (lmsg->ce_mask & MAC_INFO_ATTR_FPC && mi->mi_fpc) {
nl_dect_llme_fpc2str(mi->mi_fpc, buf, sizeof(buf));
nl_dump(p, "\n\tMAC layer capabilities: %s", buf);
}
if (lmsg->ce_mask & MAC_INFO_ATTR_HLC) {
if (lmsg->ce_mask & MAC_INFO_ATTR_EFPC && mi->mi_efpc) {
nl_dect_llme_efpc2str(mi->mi_efpc, buf, sizeof(buf));
nl_dump(p, "\n\tExtended MAC layer capabilities: %s", buf);
}
if (lmsg->ce_mask & MAC_INFO_ATTR_EFPC2 && mi->mi_efpc2) {
nl_dect_llme_efpc22str(mi->mi_efpc2, buf, sizeof(buf));
nl_dump(p, "\n\tExtended MAC layer capabilities 2: %s", buf);
}
if (lmsg->ce_mask & MAC_INFO_ATTR_HLC && mi->mi_hlc) {
nl_dect_llme_hlc2str(mi->mi_hlc, buf, sizeof(buf));
nl_dump(p, "\n\tHigher layer capabilities: %s", buf);
}
if (lmsg->ce_mask & MAC_INFO_ATTR_EHLC) {
if (lmsg->ce_mask & MAC_INFO_ATTR_EHLC && mi->mi_ehlc) {
nl_dect_llme_ehlc2str(mi->mi_ehlc, buf, sizeof(buf));
nl_dump(p, "\n\tExtended higher layer capabilities: %s", buf);
}
if (lmsg->ce_mask & MAC_INFO_ATTR_EHLC2 && mi->mi_ehlc2) {
nl_dect_llme_ehlc22str(mi->mi_ehlc2, buf, sizeof(buf));
nl_dump(p, "\n\tExtended higher layer capabilities 2: %s", buf);
}
nl_dump(p, "\n");
}
static struct nla_policy nl_dect_efpc_policy[DECTA_EFPC_MAX + 1] = {
[DECTA_EFPC_CRFP_HOPS] = { .type = NLA_U8 },
[DECTA_EFPC_CRFP_ENCRYPTION] = { },
[DECTA_EFPC_REP_HOPS] = { .type = NLA_U8 },
[DECTA_EFPC_REP_INTERLACING] = { },
[DECTA_EFPC_EHLC] = { .type = NLA_U16 },
};
static struct nla_policy nl_dect_mac_info_policy[DECTA_MAC_INFO_MAX + 1] = {
[DECTA_MAC_INFO_PARI] = { .type = NLA_NESTED },
@ -242,7 +364,10 @@ static struct nla_policy nl_dect_mac_info_policy[DECTA_MAC_INFO_MAX + 1] = {
[DECTA_MAC_INFO_SARI_LIST] = { .type = NLA_NESTED },
[DECTA_MAC_INFO_FPC] = { .type = NLA_U32 },
[DECTA_MAC_INFO_HLC] = { .type = NLA_U16 },
[DECTA_MAC_INFO_EFPC] = { .type = NLA_NESTED },
[DECTA_MAC_INFO_EFPC] = { .type = NLA_U16 },
[DECTA_MAC_INFO_EHLC] = { .type = NLA_U32 },
[DECTA_MAC_INFO_EFPC2] = { .type = NLA_U16 },
[DECTA_MAC_INFO_EHLC2] = { .type = NLA_U32 },
};
static int nl_dect_llme_mac_info_parse(struct nl_dect_llme_msg *lmsg,
@ -265,15 +390,14 @@ static int nl_dect_llme_mac_info_parse(struct nl_dect_llme_msg *lmsg,
nl_dect_llme_mac_info_set_fpc(lmsg, nla_get_u32(tb[DECTA_MAC_INFO_FPC]));
if (tb[DECTA_MAC_INFO_HLC] != NULL)
nl_dect_llme_mac_info_set_hlc(lmsg, nla_get_u16(tb[DECTA_MAC_INFO_HLC]));
if (tb[DECTA_MAC_INFO_EFPC] != NULL) {
struct nlattr *nla[DECTA_EFPC_MAX + 1];
err = nla_parse_nested(nla, DECTA_EFPC_MAX, tb[DECTA_MAC_INFO_EFPC],
nl_dect_efpc_policy);
if (err < 0)
return err;
nl_dect_llme_mac_info_set_ehlc(lmsg, nla_get_u16(nla[DECTA_EFPC_EHLC]));
}
if (tb[DECTA_MAC_INFO_EFPC] != NULL)
nl_dect_llme_mac_info_set_efpc(lmsg, nla_get_u16(tb[DECTA_MAC_INFO_EFPC]));
if (tb[DECTA_MAC_INFO_EHLC] != NULL)
nl_dect_llme_mac_info_set_ehlc(lmsg, nla_get_u32(tb[DECTA_MAC_INFO_EHLC]));
if (tb[DECTA_MAC_INFO_EFPC2] != NULL)
nl_dect_llme_mac_info_set_efpc2(lmsg, nla_get_u16(tb[DECTA_MAC_INFO_EFPC2]));
if (tb[DECTA_MAC_INFO_EHLC2] != NULL)
nl_dect_llme_mac_info_set_ehlc2(lmsg, nla_get_u32(tb[DECTA_MAC_INFO_EHLC2]));
return 0;
}
@ -292,229 +416,20 @@ static int nl_dect_llme_mac_info_build(struct nl_msg *msg,
NLA_PUT_U8(msg, DECTA_MAC_INFO_RPN, mi->mi_rpn);
if (lmsg->ce_mask & MAC_INFO_ATTR_FPC)
NLA_PUT_U32(msg, DECTA_MAC_INFO_FPC, mi->mi_fpc);
#ifdef FIXME
if (lmsg->ce_mask & MAC_INFO_ATTR_EFPC)
NLA_PUT_U16(msg, DECTA_MAC_INFO_EFPC, mi->mi_efpc);
if (lmsg->ce_mask & MAC_INFO_ATTR_EHLC)
NLA_PUT_U16(msg, DECTA_MAC_INFO_EHLC, mi->mi_ehlc);
#endif
NLA_PUT_U32(msg, DECTA_MAC_INFO_EHLC, mi->mi_ehlc);
if (lmsg->ce_mask & MAC_INFO_ATTR_EFPC2)
NLA_PUT_U16(msg, DECTA_MAC_INFO_EFPC2, mi->mi_efpc2);
if (lmsg->ce_mask & MAC_INFO_ATTR_EHLC2)
NLA_PUT_U32(msg, DECTA_MAC_INFO_EHLC2, mi->mi_ehlc2);
return 0;
nla_put_failure:
return -NLE_MSGSIZE;
}
#if 0
#define MAC_CON_ATTR_MCEI 0x010000
#define MAC_CON_ATTR_ARI 0x020000
#define MAC_CON_ATTR_PMID 0x040000
#define MAC_CON_ATTR_TYPE 0x080000
#define MAC_CON_ATTR_ECN 0x100000
#define MAC_CON_ATTR_SERVICE 0x200000
static inline struct nl_dect_llme_mac_con *mac_con(const struct nl_dect_llme_msg *lmsg)
{
return (void *)&lmsg->lm_mc;
}
void nl_dect_llme_mac_con_set_mcei(struct nl_dect_llme_msg *lmsg, uint32_t mcei)
{
mac_con(lmsg)->mc_mcei = mcei;
lmsg->ce_mask |= MAC_CON_ATTR_MCEI;
}
uint32_t nl_dect_llme_mac_con_get_mcei(const struct nl_dect_llme_msg *lmsg)
{
return mac_con(lmsg)->mc_mcei;
}
void nl_dect_llme_mac_con_set_ari(struct nl_dect_llme_msg *lmsg, const struct nl_dect_ari *ari)
{
struct nl_dect_llme_mac_con *mc = mac_con(lmsg);
memcpy(&mc->mc_ari, ari, sizeof(mc->mc_ari));
lmsg->ce_mask |= MAC_CON_ATTR_ARI;
}
const struct nl_dect_ari *nl_dect_llme_mac_con_get_ari(const struct nl_dect_llme_msg *lmsg)
{
return &mac_con(lmsg)->mc_ari;
}
void nl_dect_llme_mac_con_set_pmid(struct nl_dect_llme_msg *lmsg, uint32_t pmid)
{
mac_con(lmsg)->mc_pmid = pmid;
lmsg->ce_mask |= MAC_CON_ATTR_PMID;
}
uint32_t nl_dect_llme_mac_con_get_pmid(const struct nl_dect_llme_msg *lmsg)
{
return mac_con(lmsg)->mc_pmid;
}
void nl_dect_llme_mac_con_set_type(struct nl_dect_llme_msg *lmsg,
enum nl_dect_mac_con_types type)
{
mac_con(lmsg)->mc_type = type;
lmsg->ce_mask |= MAC_CON_ATTR_TYPE;
}
enum nl_dect_mac_con_types nl_dect_llme_mac_con_get_type(const struct nl_dect_llme_msg *lmsg)
{
return mac_con(lmsg)->mc_type;
}
void nl_dect_llme_mac_con_set_ecn(struct nl_dect_llme_msg *lmsg, uint8_t ecn)
{
mac_con(lmsg)->mc_ecn = ecn;
lmsg->ce_mask |= MAC_CON_ATTR_ECN;
}
uint8_t nl_dect_llme_mac_con_get_ecn(const struct nl_dect_llme_msg *lmsg)
{
return mac_con(lmsg)->mc_ecn;
}
void nl_dect_llme_mac_con_set_service(struct nl_dect_llme_msg *lmsg,
enum nl_dect_mac_con_service_types service)
{
mac_con(lmsg)->mc_service = service;
lmsg->ce_mask |= MAC_CON_ATTR_SERVICE;
}
enum nl_dect_mac_con_service_types
nl_dect_llme_mac_con_get_service(const struct nl_dect_llme_msg *lmsg)
{
return mac_con(lmsg)->mc_service;
}
static struct trans_tbl con_types[] = {
__ADD(DECT_MAC_CON_BASIC, basic)
__ADD(DECT_MAC_CON_ADVANCED, advanced)
};
char *nl_dect_llme_contype2str(enum nl_dect_mac_con_types type, char *buf, size_t len)
{
return __type2str(type, buf, len, con_types, ARRAY_SIZE(con_types));
}
enum nl_dect_mac_con_types nl_dect_llme_str2contype(const char *str)
{
return __str2type(str, con_types, ARRAY_SIZE(con_types));
}
static struct trans_tbl service_types[] = {
__ADD(DECT_MAC_CON_IN_MIN_DELAY, I_N_minimal_delay)
__ADD(DECT_MAC_CON_IN_NORM_DELAY, I_N_normal_delay)
__ADD(DECT_MAC_CON_IP_ERROR_DETECTION, I_P_error_detection)
__ADD(DECT_MAC_CON_IP_ERROR_CORRECTION, I_P_error_correction)
__ADD(DECT_MAC_CON_UNKNOWN, unknown)
__ADD(DECT_MAC_CON_C_ONLY, C_only)
};
char *nl_dect_llme_service2str(enum nl_dect_mac_con_service_types service,
char *buf, size_t len)
{
return __type2str(service, buf, len, service_types,
ARRAY_SIZE(service_types));
}
enum nl_dect_mac_con_service_types nl_dect_llme_str2service(const char *str)
{
return __str2type(str, service_types, ARRAY_SIZE(service_types));
}
static void nl_dect_llme_mac_con_dump(const struct nl_dect_llme_msg *lmsg,
struct nl_dump_params *p)
{
const struct nl_dect_llme_mac_con *mc = mac_con(lmsg);
char buf[256];
nl_dump(p, "\t");
if (lmsg->ce_mask & MAC_CON_ATTR_MCEI)
nl_dump(p, "MCEI %x: ", mc->mc_mcei);
if (lmsg->ce_mask & MAC_CON_ATTR_PMID)
nl_dump(p, "PMID: %x ", mc->mc_pmid);
if (lmsg->ce_mask & MAC_CON_ATTR_ARI) {
nl_dump(p, "=> ");
nl_dect_dump_ari(&mc->mc_ari, p);
nl_dump(p, " ");
}
if (lmsg->ce_mask & MAC_CON_ATTR_ECN)
nl_dump(p, "ECN: %x ", mc->mc_ecn);
nl_dump(p, "\n");
if (lmsg->ce_mask & MAC_CON_ATTR_TYPE) {
nl_dect_llme_contype2str(mc->mc_type, buf, sizeof(buf));
nl_dump(p, "\tType: %s\n", buf);
}
if (lmsg->ce_mask & MAC_CON_ATTR_SERVICE) {
nl_dect_llme_service2str(mc->mc_service, buf, sizeof(buf));
nl_dump(p, "\tService: %s\n", buf);
}
nl_dump(p, "\n");
}
static struct nla_policy nl_dect_mac_con_policy[DECTA_MAC_CON_MAX + 1] = {
[DECTA_MAC_CON_MCEI] = { .type = NLA_U32 },
[DECTA_MAC_CON_ARI] = { .type = NLA_NESTED },
[DECTA_MAC_CON_PMID] = { .type = NLA_U32 },
[DECTA_MAC_CON_TYPE] = { .type = NLA_U8 },
[DECTA_MAC_CON_ECN] = { .type = NLA_U8 },
[DECTA_MAC_CON_SERVICE] = { .type = NLA_U8 },
};
static int nl_dect_llme_mac_con_parse(struct nl_dect_llme_msg *lmsg,
struct nlattr *tb[])
{
struct nl_dect_ari ari;
int err;
if (tb[DECTA_MAC_CON_MCEI] != NULL)
nl_dect_llme_mac_con_set_mcei(lmsg, nla_get_u32(tb[DECTA_MAC_CON_MCEI]));
if (tb[DECTA_MAC_CON_ARI] != NULL) {
err = nl_dect_parse_ari(&ari, tb[DECTA_MAC_CON_ARI]);
if (err < 0)
return err;
nl_dect_llme_mac_con_set_ari(lmsg, &ari);
}
if (tb[DECTA_MAC_CON_PMID] != NULL)
nl_dect_llme_mac_con_set_pmid(lmsg, nla_get_u32(tb[DECTA_MAC_CON_PMID]));
if (tb[DECTA_MAC_CON_TYPE] != NULL)
nl_dect_llme_mac_con_set_type(lmsg, nla_get_u8(tb[DECTA_MAC_CON_TYPE]));
if (tb[DECTA_MAC_CON_ECN] != NULL)
nl_dect_llme_mac_con_set_ecn(lmsg, nla_get_u8(tb[DECTA_MAC_CON_ECN]));
if (tb[DECTA_MAC_CON_SERVICE] != NULL)
nl_dect_llme_mac_con_set_service(lmsg, nla_get_u8(tb[DECTA_MAC_CON_SERVICE]));
return 0;
}
static int nl_dect_llme_mac_con_build(struct nl_msg *msg,
struct nl_dect_llme_msg *lmsg)
{
struct nl_dect_llme_mac_con *mc = mac_con(lmsg);
int err;
if (lmsg->ce_mask & MAC_CON_ATTR_MCEI)
NLA_PUT_U32(msg, DECTA_MAC_CON_MCEI, mc->mc_mcei);
if (lmsg->ce_mask & MAC_CON_ATTR_ARI) {
err = nl_dect_fill_ari(msg, &mc->mc_ari, DECTA_MAC_CON_ARI);
if (err < 0)
goto nla_put_failure;
}
if (lmsg->ce_mask & MAC_CON_ATTR_PMID)
NLA_PUT_U32(msg, DECTA_MAC_CON_PMID, mc->mc_pmid);
if (lmsg->ce_mask & MAC_CON_ATTR_TYPE)
NLA_PUT_U8(msg, DECTA_MAC_CON_TYPE, mc->mc_type);
if (lmsg->ce_mask & MAC_CON_ATTR_ECN)
NLA_PUT_U8(msg, DECTA_MAC_CON_ECN, mc->mc_ecn);
if (lmsg->ce_mask & MAC_CON_ATTR_SERVICE)
NLA_PUT_U8(msg, DECTA_MAC_CON_SERVICE, mc->mc_service);
return 0;
nla_put_failure:
return -NLE_MSGSIZE;
}
#endif
static const struct nl_dect_llme_link {
int (*parse)(struct nl_dect_llme_msg *, struct nlattr *[]);
int (*build)(struct nl_msg *, struct nl_dect_llme_msg *);
@ -536,15 +451,6 @@ static const struct nl_dect_llme_link {
.build = nl_dect_llme_mac_info_build,
.dump = nl_dect_llme_mac_info_dump,
},
#if 0
[DECT_LLME_MAC_CON] = {
.policy = nl_dect_mac_con_policy,
.maxtype = DECTA_MAC_CON_MAX,
.parse = nl_dect_llme_mac_con_parse,
.build = nl_dect_llme_mac_con_build,
.dump = nl_dect_llme_mac_con_dump,
},
#endif
};
static void llme_msg_dump(struct nl_object *obj, struct nl_dump_params *p)
@ -555,7 +461,7 @@ static void llme_msg_dump(struct nl_object *obj, struct nl_dump_params *p)
nl_dect_llme_msgtype2str(lmsg->lm_type, buf1, sizeof(buf1));
nl_dect_llme_op2str(lmsg->lm_op, buf2, sizeof(buf2));
nl_dump(p, "%s-%s:\n", buf1, buf2);
nl_dump(p, "%s-%s: ", buf1, buf2);
link = &nl_dect_llme_dispatch[lmsg->lm_type];
link->dump(lmsg, p);
@ -777,9 +683,6 @@ void nl_dect_llme_msg_put(struct nl_dect_llme_msg *lmsg)
static struct trans_tbl llme_types[] = {
__ADD(DECT_LLME_SCAN, SCAN)
__ADD(DECT_LLME_MAC_INFO, MAC_INFO)
#if 0
__ADD(DECT_LLME_MAC_CON, MAC_CON)
#endif
};
char *nl_dect_llme_msgtype2str(enum dect_llme_msg_types type, char *buf, size_t len)

View File

@ -24,7 +24,7 @@ noinst_PROGRAMS = \
dect-transceiver-bind dect-transceiver-list \
dect-cell-add dect-cell-delete dect-cell-list \
dect-cluster-add dect-cluster-delete dect-cluster-list \
dect-llme-mac-con dect-llme-monitor dect-llme-scan
dect-llme-monitor dect-llme-scan
genl_ctrl_list_SOURCES = genl-ctrl-list.c
genl_ctrl_list_LDADD = -lnl-genl -lnl-route
@ -119,8 +119,6 @@ dect_cluster_delete_LDADD = -lnl-dect
dect_cluster_list_SOURCES = dect-cluster-list.c
dect_cluster_list_LDADD = -lnl-dect
dect_llme_mac_con_SOURCES = dect-llme-mac-con.c
dect_llme_mac_con_LDADD = -lnl-dect
dect_llme_monitor_SOURCES = dect-llme-monitor.c
dect_llme_monitor_LDADD = -lnl-dect
dect_llme_scan_SOURCES = dect-llme-scan.c

View File

@ -63,7 +63,7 @@ static int event_input(struct nl_msg *msg, void *arg)
{
if (nl_msg_parse(msg, &obj_input, NULL) < 0)
fprintf(stderr, "Unknown message type\n");
return NL_STOP;
return NL_OK;
}
int main(int argc, char *argv[])