Move v5x_protocol to src/

This commit is contained in:
Andreas Eversberg 2022-12-16 18:30:04 +01:00
parent ff5e1d4947
commit 3cabd7f1a6
2 changed files with 283 additions and 282 deletions

View File

@ -28,48 +28,49 @@
#include <osmocom/core/utils.h>
#include <osmocom/core/msgb.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/gsm/lapd_core.h>
#include "logging.h"
#include "v5x_internal.h"
#include "v5x_protocol.h"
#include "v51_le_ctrl.h"
#include "v51_le_provisioning.h"
#include "v5x_le_pstn_fsm.h"
#include "v52_le_user_port_fsm.h"
#include "lapv5.h"
#include "v5x_le_ctrl_fsm.h"
#include "v5x_le_port_fsm.h"
#include "v5x_le_pstn_fsm.h"
#include "v5x_le_provisioning.h"
const struct tlv_definition v51_ctrl_tlv_def = {
const struct tlv_definition v5x_ctrl_tlv_def = {
.def = {
/* single byte: PSTN / G.964 Table 17 */
[V51_CTRL_IEI_PULSE_NOTIFICATION] = { TLV_TYPE_SINGLE_TV },
[V51_CTRL_IEI_LINE_INFORMATION] = { TLV_TYPE_SINGLE_TV },
[V51_CTRL_IEI_STATE] = { TLV_TYPE_SINGLE_TV },
[V51_CTRL_IEI_AUTONOMOUS_SIG_SEQ] = { TLV_TYPE_SINGLE_TV },
[V51_CTRL_IEI_SEQUENCE_RESPONSE] = { TLV_TYPE_SINGLE_TV },
[V5X_CTRL_IEI_PULSE_NOTIFICATION] = { TLV_TYPE_SINGLE_TV },
[V5X_CTRL_IEI_LINE_INFORMATION] = { TLV_TYPE_SINGLE_TV },
[V5X_CTRL_IEI_STATE] = { TLV_TYPE_SINGLE_TV },
[V5X_CTRL_IEI_AUTONOMOUS_SIG_SEQ] = { TLV_TYPE_SINGLE_TV },
[V5X_CTRL_IEI_SEQUENCE_RESPONSE] = { TLV_TYPE_SINGLE_TV },
/* single byte: ISDN / G.964 Table 53 */
[V51_CTRL_IEI_PERFORMANCE_GRADING] = { TLV_TYPE_SINGLE_TV },
[V51_CTRL_IEI_REJECTION_CAUSE] = { TLV_TYPE_SINGLE_TV },
[V5X_CTRL_IEI_PERFORMANCE_GRADING] = { TLV_TYPE_SINGLE_TV },
[V5X_CTRL_IEI_REJECTION_CAUSE] = { TLV_TYPE_SINGLE_TV },
/* variable length: PSTN / G.964 Table 17 */
[V51_CTRL_IEI_SEQUENCE_NR] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_CADENCED_RINGING] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_PULSED_SIGNAL] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_STEADY_SIGNAL] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_DIGIT_SIGNAL] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_RECOGNITION_TIME] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_ENABLE_AUTONOMOUS_ACK] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_DISABLE_AUTONOMOUS_ACK] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_CAUSE] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_RESOURCE_UNAVAILABLE] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_ENABLE_METERING] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_METERING_REPORT] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_ATTENUATION] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_SEQUENCE_NR] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_CADENCED_RINGING] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_PULSED_SIGNAL] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_STEADY_SIGNAL] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_DIGIT_SIGNAL] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_RECOGNITION_TIME] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_ENABLE_AUTONOMOUS_ACK] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_DISABLE_AUTONOMOUS_ACK] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_CAUSE] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_RESOURCE_UNAVAILABLE] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_ENABLE_METERING] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_METERING_REPORT] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_ATTENUATION] = { TLV_TYPE_TLV },
/* variable length: ISDN / G.964 Table 53 */
[V51_CTRL_IEI_CTRL_F_ELEMENT] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_CTRL_F_ID] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_VARIANT] = { TLV_TYPE_TLV },
[V51_CTRL_IEI_INTERFACE_ID] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_CTRL_F_ELEMENT] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_CTRL_F_ID] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_VARIANT] = { TLV_TYPE_TLV },
[V5X_CTRL_IEI_INTERFACE_ID] = { TLV_TYPE_TLV },
/* variable length: LCP / G.965 Table FIXME */
[V52_CTRL_IEI_LCP_LINK_CTRL_FUNCTION] = { TLV_TYPE_TLV },
@ -91,20 +92,20 @@ const struct tlv_definition v51_ctrl_tlv_def = {
};
const struct value_string v51_ctrl_msg_typ_str[] = {
{ V51_CTRL_MSGT_ESTABLISH, "ESTABLISH" },
{ V51_CTRL_MSGT_ESTABLISH_ACK, "ESTABLISH_ACK" },
{ V51_CTRL_MSGT_SIGNAL, "SIGNAL" },
{ V51_CTRL_MSGT_SIGNAL_ACK, "SIGNAL_ACK" },
{ V51_CTRL_MSGT_DISCONNECT, "DISCONNECT" },
{ V51_CTRL_MSGT_DISCONNECT_COMPLETE, "DISCONNECT_COMPLETE" },
{ V51_CTRL_MSGT_STATUS_ENQUIRY, "STATUS_ENQUIRY" },
{ V51_CTRL_MSGT_STATUS, "STATUS" },
{ V51_CTRL_MSGT_PROTOCOL_PARAMETER, "PROTOCOL_PARAMETER" },
{ V51_CTRL_MSGT_PORT_CTRL, "PORT_CTRL" },
{ V51_CTRL_MSGT_PORT_CTRL_ACK, "PORT_CTRL_ACK" },
{ V51_CTRL_MSGT_COMMON_CTRL, "COMMON_CTRL" },
{ V51_CTRL_MSGT_COMMON_CTRL_ACK, "COMMON_CTRL_ACK" },
const struct value_string v5x_ctrl_msg_typ_str[] = {
{ V5X_CTRL_MSGT_ESTABLISH, "ESTABLISH" },
{ V5X_CTRL_MSGT_ESTABLISH_ACK, "ESTABLISH_ACK" },
{ V5X_CTRL_MSGT_SIGNAL, "SIGNAL" },
{ V5X_CTRL_MSGT_SIGNAL_ACK, "SIGNAL_ACK" },
{ V5X_CTRL_MSGT_DISCONNECT, "DISCONNECT" },
{ V5X_CTRL_MSGT_DISCONNECT_COMPLETE, "DISCONNECT_COMPLETE" },
{ V5X_CTRL_MSGT_STATUS_ENQUIRY, "STATUS_ENQUIRY" },
{ V5X_CTRL_MSGT_STATUS, "STATUS" },
{ V5X_CTRL_MSGT_PROTOCOL_PARAMETER, "PROTOCOL_PARAMETER" },
{ V5X_CTRL_MSGT_PORT_CTRL, "PORT_CTRL" },
{ V5X_CTRL_MSGT_PORT_CTRL_ACK, "PORT_CTRL_ACK" },
{ V5X_CTRL_MSGT_COMMON_CTRL, "COMMON_CTRL" },
{ V5X_CTRL_MSGT_COMMON_CTRL_ACK, "COMMON_CTRL_ACK" },
{ V52_CTRL_MSGT_PP_SWITCH_OVER_REQ, "SWITCH_OVER_REQ" },
{ V52_CTRL_MSGT_PP_SWITCH_OVER_COM, "SWITCH_OVER_COM" },
{ V52_CTRL_MSGT_PP_OS_SWITCH_OVER_COM, "OS_SWITCH_OVER_COM" },
@ -129,31 +130,31 @@ const struct value_string v51_ctrl_msg_typ_str[] = {
{ 0, NULL }
};
const struct value_string v51_ctrl_iei_str[] = {
{ V51_CTRL_IEI_PULSE_NOTIFICATION, "PULSE_NOTIFICATION" },
{ V51_CTRL_IEI_LINE_INFORMATION, "LINE_INFORMATION" },
{ V51_CTRL_IEI_STATE, "STATE" },
{ V51_CTRL_IEI_AUTONOMOUS_SIG_SEQ, "AUTONOMOUS_SIG_SEQ" },
{ V51_CTRL_IEI_SEQUENCE_RESPONSE, "SEQUENCE_RESPONSE" },
{ V51_CTRL_IEI_PERFORMANCE_GRADING, "PERFORMANCE_GRADING" },
{ V51_CTRL_IEI_REJECTION_CAUSE, "REJECTION_CAUSE" },
{ V51_CTRL_IEI_SEQUENCE_NR, "SEQUENCE_NR" },
{ V51_CTRL_IEI_CADENCED_RINGING, "CADENCED_RINGING" },
{ V51_CTRL_IEI_PULSED_SIGNAL, "PULSED_SIGNAL" },
{ V51_CTRL_IEI_STEADY_SIGNAL, "STEADY_SIGNAL" },
{ V51_CTRL_IEI_DIGIT_SIGNAL, "DIGIT_SIGNAL" },
{ V51_CTRL_IEI_RECOGNITION_TIME, "RECOGNITION_TIME" },
{ V51_CTRL_IEI_ENABLE_AUTONOMOUS_ACK, "ENABLE_AUTONOMOUS_ACK" },
{ V51_CTRL_IEI_DISABLE_AUTONOMOUS_ACK, "DISABLE_AUTONOMOUS_ACK" },
{ V51_CTRL_IEI_CAUSE, "CAUSE" },
{ V51_CTRL_IEI_RESOURCE_UNAVAILABLE, "RESOURCE_UNAVAILABLE" },
{ V51_CTRL_IEI_ENABLE_METERING, "ENABLE_METERING" },
{ V51_CTRL_IEI_METERING_REPORT, "METERING_REPORT" },
{ V51_CTRL_IEI_ATTENUATION, "ATTENUATION" },
{ V51_CTRL_IEI_CTRL_F_ELEMENT, "CTRL_F_ELEMENT" },
{ V51_CTRL_IEI_CTRL_F_ID, "CTRL_F_ID" },
{ V51_CTRL_IEI_VARIANT, "VARIANT" },
{ V51_CTRL_IEI_INTERFACE_ID, "INTERFACE_ID" },
const struct value_string v5x_ctrl_iei_str[] = {
{ V5X_CTRL_IEI_PULSE_NOTIFICATION, "PULSE_NOTIFICATION" },
{ V5X_CTRL_IEI_LINE_INFORMATION, "LINE_INFORMATION" },
{ V5X_CTRL_IEI_STATE, "STATE" },
{ V5X_CTRL_IEI_AUTONOMOUS_SIG_SEQ, "AUTONOMOUS_SIG_SEQ" },
{ V5X_CTRL_IEI_SEQUENCE_RESPONSE, "SEQUENCE_RESPONSE" },
{ V5X_CTRL_IEI_PERFORMANCE_GRADING, "PERFORMANCE_GRADING" },
{ V5X_CTRL_IEI_REJECTION_CAUSE, "REJECTION_CAUSE" },
{ V5X_CTRL_IEI_SEQUENCE_NR, "SEQUENCE_NR" },
{ V5X_CTRL_IEI_CADENCED_RINGING, "CADENCED_RINGING" },
{ V5X_CTRL_IEI_PULSED_SIGNAL, "PULSED_SIGNAL" },
{ V5X_CTRL_IEI_STEADY_SIGNAL, "STEADY_SIGNAL" },
{ V5X_CTRL_IEI_DIGIT_SIGNAL, "DIGIT_SIGNAL" },
{ V5X_CTRL_IEI_RECOGNITION_TIME, "RECOGNITION_TIME" },
{ V5X_CTRL_IEI_ENABLE_AUTONOMOUS_ACK, "ENABLE_AUTONOMOUS_ACK" },
{ V5X_CTRL_IEI_DISABLE_AUTONOMOUS_ACK, "DISABLE_AUTONOMOUS_ACK" },
{ V5X_CTRL_IEI_CAUSE, "CAUSE" },
{ V5X_CTRL_IEI_RESOURCE_UNAVAILABLE, "RESOURCE_UNAVAILABLE" },
{ V5X_CTRL_IEI_ENABLE_METERING, "ENABLE_METERING" },
{ V5X_CTRL_IEI_METERING_REPORT, "METERING_REPORT" },
{ V5X_CTRL_IEI_ATTENUATION, "ATTENUATION" },
{ V5X_CTRL_IEI_CTRL_F_ELEMENT, "CTRL_F_ELEMENT" },
{ V5X_CTRL_IEI_CTRL_F_ID, "CTRL_F_ID" },
{ V5X_CTRL_IEI_VARIANT, "VARIANT" },
{ V5X_CTRL_IEI_INTERFACE_ID, "INTERFACE_ID" },
{ V52_CTRL_IEI_LCP_LINK_CTRL_FUNCTION, "LCP_LINK_CTRL_FUNCTION" },
{ V52_CTRL_IEI_BCC_USER_PORT_ID, "BCC_USER_PORT_ID" },
{ V52_CTRL_IEI_BCC_ISDN_PORT_TS_ID, "BCC_ISDN_PORT_TS_ID" },
@ -170,59 +171,59 @@ const struct value_string v51_ctrl_iei_str[] = {
{ 0, NULL }
};
const struct value_string v51_ctrl_func_el_str[] = {
{ V51_CTRL_FE101_ACTIVATE_ACCESS, "FE101_ACTIVATE_ACCESS" },
{ V51_CTRL_FE102_ACT_INIT_BY_USER, "FE102_ACT_INIT_BY_USER" },
{ V51_CTRL_FE103_DS_ACTIVATED, "FE103_DS_ACTIVATED" },
{ V51_CTRL_FE104_ACCESS_ACTIVATED, "FE104_ACCESS_ACTIVATED" },
{ V51_CTRL_FE105_DEACTIVATE_ACCESS, "FE105_DEACTIVATE_ACCESS" },
{ V51_CTRL_FE106_ACCESS_DEACTIVATED, "FE106_ACCESS_DEACTIVATED" },
{ V51_CTRL_FE201_UNBLOCK, "FE201_UNBLOCK" },
{ V51_CTRL_FE203_BLOCK, "FE203_BLOCK" },
{ V51_CTRL_FE205_BLOCK_REQ, "FE205_BLOCK_REQ" },
{ V51_CTRL_FE206_PERFORMANCE_GRADING, "FE206_PERFORMANCE_GRADING" },
{ V51_CTRL_FE207_D_CHANNEL_BLOCK, "FE207_D_CHANNEL_BLOCK" },
{ V51_CTRL_FE208_D_CHANNEL_UNBLOCK, "FE208_D_CHANNEL_UNBLOCK" },
const struct value_string v5x_ctrl_func_el_str[] = {
{ V5X_CTRL_FE101_ACTIVATE_ACCESS, "FE101_ACTIVATE_ACCESS" },
{ V5X_CTRL_FE102_ACT_INIT_BY_USER, "FE102_ACT_INIT_BY_USER" },
{ V5X_CTRL_FE103_DS_ACTIVATED, "FE103_DS_ACTIVATED" },
{ V5X_CTRL_FE104_ACCESS_ACTIVATED, "FE104_ACCESS_ACTIVATED" },
{ V5X_CTRL_FE105_DEACTIVATE_ACCESS, "FE105_DEACTIVATE_ACCESS" },
{ V5X_CTRL_FE106_ACCESS_DEACTIVATED, "FE106_ACCESS_DEACTIVATED" },
{ V5X_CTRL_FE201_UNBLOCK, "FE201_UNBLOCK" },
{ V5X_CTRL_FE203_BLOCK, "FE203_BLOCK" },
{ V5X_CTRL_FE205_BLOCK_REQ, "FE205_BLOCK_REQ" },
{ V5X_CTRL_FE206_PERFORMANCE_GRADING, "FE206_PERFORMANCE_GRADING" },
{ V5X_CTRL_FE207_D_CHANNEL_BLOCK, "FE207_D_CHANNEL_BLOCK" },
{ V5X_CTRL_FE208_D_CHANNEL_UNBLOCK, "FE208_D_CHANNEL_UNBLOCK" },
{ 0, NULL }
};
const struct value_string v51_ctrl_func_id_str[] = {
{ V51_CTRL_ID_VERIFY_RE_PROVISIONING, "VERIFY_RE_PROVISIONING" },
{ V51_CTRL_ID_READY_FOR_RE_PROVISIONING, "READY_FOR_RE_PROVISIONING" },
{ V51_CTRL_ID_NOT_READY_FOR_RE_PROVISIONING, "NOT_READY_FOR_RE_PROVISIONING" },
{ V51_CTRL_ID_SWITCH_OVER_TO_NEW_VARIANT, "SWITCH_OVER_TO_NEW_VARIANT" },
{ V51_CTRL_ID_RE_PROVISIONING_STARTED, "RE_PROVISIONING_STARTED" },
{ V51_CTRL_ID_CANNOT_RE_PROVISION, "CANNOT_RE_PROVISION" },
{ V51_CTRL_ID_REQUEST_VARIANT_AND_INTERFACE_ID, "REQUEST_VARIANT_AND_INTERFACE_ID" },
{ V51_CTRL_ID_VARIANT_AND_INTERFACE_ID, "VARIANT_AND_INTERFACE_ID" },
{ V51_CTRL_ID_BLOCKING_STARTED, "BLOCKING_STARTED" },
{ V51_CTRL_ID_RESTART_REQUEST, "RESTART_REQUEST" },
{ V51_CTRL_ID_RESTART_COMPLETE, "RESTART_COMPLETE" },
const struct value_string v5x_ctrl_func_id_str[] = {
{ V5X_CTRL_ID_VERIFY_RE_PROVISIONING, "VERIFY_RE_PROVISIONING" },
{ V5X_CTRL_ID_READY_FOR_RE_PROVISIONING, "READY_FOR_RE_PROVISIONING" },
{ V5X_CTRL_ID_NOT_READY_FOR_RE_PROVISIONING, "NOT_READY_FOR_RE_PROVISIONING" },
{ V5X_CTRL_ID_SWITCH_OVER_TO_NEW_VARIANT, "SWITCH_OVER_TO_NEW_VARIANT" },
{ V5X_CTRL_ID_RE_PROVISIONING_STARTED, "RE_PROVISIONING_STARTED" },
{ V5X_CTRL_ID_CANNOT_RE_PROVISION, "CANNOT_RE_PROVISION" },
{ V5X_CTRL_ID_REQUEST_VARIANT_AND_INTERFACE_ID, "REQUEST_VARIANT_AND_INTERFACE_ID" },
{ V5X_CTRL_ID_VARIANT_AND_INTERFACE_ID, "VARIANT_AND_INTERFACE_ID" },
{ V5X_CTRL_ID_BLOCKING_STARTED, "BLOCKING_STARTED" },
{ V5X_CTRL_ID_RESTART_REQUEST, "RESTART_REQUEST" },
{ V5X_CTRL_ID_RESTART_COMPLETE, "RESTART_COMPLETE" },
{ 0, NULL }
};
const struct value_string v51_cause_type_str[] = {
{ V51_CTRL_CAUSE_T_RESP_TO_STATUS_ENQ, "RESP_TO_STATUS_ENQ" },
{ V51_CTRL_CAUSE_T_L3_ADDRESS_ERROR, "L3_ADDRESS_ERROR" },
{ V51_CTRL_CAUSE_T_MSG_TYPE_UNRECOGNIZED, "MSG_TYPE_UNRECOGNIZED" },
{ V51_CTRL_CAUSE_T_OUT_OF_SEQUENCE_IE, "OUT_OF_SEQUENCE_IE" },
{ V51_CTRL_CAUSE_T_REPEATED_OPT_IE, "REPEATED_OPT_IE" },
{ V51_CTRL_CAUSE_T_MAND_IE_MISSING, "MAND_IE_MISSING" },
{ V51_CTRL_CAUSE_T_UNRECOGNIZED_IE, "UNRECOGNIZED_IE" },
{ V51_CTRL_CAUSE_T_MAND_IE_CONTENT_ERROR, "MAND_IE_CONTENT_ERROR" },
{ V51_CTRL_CAUSE_T_OPT_IE_CONTENT_ERROR, "OPT_IE_CONTENT_ERROR" },
{ V51_CTRL_CAUSE_T_MSG_INCOMP_PATH_STATE, "MSG_INCOMP_PATH_STATE" },
{ V51_CTRL_CAUSE_T_REPEATED_MAND_IE, "REPEATED_MAND_IE" },
{ V51_CTRL_CAUSE_T_TOO_MANY_IE, "TOO_MANY_IE" },
const struct value_string v5x_cause_type_str[] = {
{ V5X_CTRL_CAUSE_T_RESP_TO_STATUS_ENQ, "RESP_TO_STATUS_ENQ" },
{ V5X_CTRL_CAUSE_T_L3_ADDRESS_ERROR, "L3_ADDRESS_ERROR" },
{ V5X_CTRL_CAUSE_T_MSG_TYPE_UNRECOGNIZED, "MSG_TYPE_UNRECOGNIZED" },
{ V5X_CTRL_CAUSE_T_OUT_OF_SEQUENCE_IE, "OUT_OF_SEQUENCE_IE" },
{ V5X_CTRL_CAUSE_T_REPEATED_OPT_IE, "REPEATED_OPT_IE" },
{ V5X_CTRL_CAUSE_T_MAND_IE_MISSING, "MAND_IE_MISSING" },
{ V5X_CTRL_CAUSE_T_UNRECOGNIZED_IE, "UNRECOGNIZED_IE" },
{ V5X_CTRL_CAUSE_T_MAND_IE_CONTENT_ERROR, "MAND_IE_CONTENT_ERROR" },
{ V5X_CTRL_CAUSE_T_OPT_IE_CONTENT_ERROR, "OPT_IE_CONTENT_ERROR" },
{ V5X_CTRL_CAUSE_T_MSG_INCOMP_PATH_STATE, "MSG_INCOMP_PATH_STATE" },
{ V5X_CTRL_CAUSE_T_REPEATED_MAND_IE, "REPEATED_MAND_IE" },
{ V5X_CTRL_CAUSE_T_TOO_MANY_IE, "TOO_MANY_IE" },
{ 0, NULL }
};
static const uint8_t signal_mand_ies[] = { V51_CTRL_IEI_SEQUENCE_NR };
static const uint8_t signal_ack_mand_ies[] = { V51_CTRL_IEI_SEQUENCE_NR };
static const uint8_t status_mand_ies[] = { V51_CTRL_IEI_STATE, V51_CTRL_IEI_CAUSE };
static const uint8_t prot_par_mand_ies[] = { V51_CTRL_IEI_SEQUENCE_NR };
static const uint8_t port_ctrl_mand_ies[] = { V51_CTRL_IEI_CTRL_F_ELEMENT };
static const uint8_t common_ctrl_mand_ies[] = { V51_CTRL_IEI_CTRL_F_ID };
static const uint8_t signal_mand_ies[] = { V5X_CTRL_IEI_SEQUENCE_NR };
static const uint8_t signal_ack_mand_ies[] = { V5X_CTRL_IEI_SEQUENCE_NR };
static const uint8_t status_mand_ies[] = { V5X_CTRL_IEI_STATE, V5X_CTRL_IEI_CAUSE };
static const uint8_t prot_par_mand_ies[] = { V5X_CTRL_IEI_SEQUENCE_NR };
static const uint8_t port_ctrl_mand_ies[] = { V5X_CTRL_IEI_CTRL_F_ELEMENT };
static const uint8_t common_ctrl_mand_ies[] = { V5X_CTRL_IEI_CTRL_F_ID };
static const uint8_t lcp_mand_ies[] = { V52_CTRL_IEI_LCP_LINK_CTRL_FUNCTION };
static const uint8_t alloc_mand_ies[] = { V52_CTRL_IEI_BCC_USER_PORT_ID };
static const uint8_t alloc_rej_mand_ies[] = { V52_CTRL_IEI_BCC_REJECT_CAUSE };
@ -242,25 +243,25 @@ static const uint8_t pp_perr_mand_ies[] = {
};
const struct osmo_tlv_prot_def v51_ctrl_msg_tlv = {
.name = "V51_CTRL",
.tlv_def = &v51_ctrl_tlv_def,
const struct osmo_tlv_prot_def v5x_ctrl_msg_tlv = {
.name = "V5X_CTRL",
.tlv_def = &v5x_ctrl_tlv_def,
.msg_def = {
/* G.964 Section 13.3 */
[V51_CTRL_MSGT_ESTABLISH] = MSG_DEF("ESTABLISH", NULL, 0),
[V51_CTRL_MSGT_ESTABLISH_ACK] = MSG_DEF("ESTABLISH", NULL, 0),
[V51_CTRL_MSGT_SIGNAL] = MSG_DEF("SIGNAL", signal_mand_ies, 0),
[V51_CTRL_MSGT_SIGNAL_ACK] = MSG_DEF("SIGNAL_ACK", signal_ack_mand_ies, 0),
[V51_CTRL_MSGT_STATUS] = MSG_DEF("STATUS", status_mand_ies, 0),
[V51_CTRL_MSGT_STATUS_ENQUIRY] = MSG_DEF("STATUS_ENQUIRY", NULL, 0),
[V51_CTRL_MSGT_DISCONNECT] = MSG_DEF("DISCONNECT", NULL, 0),
[V51_CTRL_MSGT_DISCONNECT_COMPLETE] = MSG_DEF("DISCONNECT_COMPLETE", NULL, 0),
[V51_CTRL_MSGT_PROTOCOL_PARAMETER] = MSG_DEF("PROTOCOL_PARAMETER", prot_par_mand_ies, 0),
[V5X_CTRL_MSGT_ESTABLISH] = MSG_DEF("ESTABLISH", NULL, 0),
[V5X_CTRL_MSGT_ESTABLISH_ACK] = MSG_DEF("ESTABLISH", NULL, 0),
[V5X_CTRL_MSGT_SIGNAL] = MSG_DEF("SIGNAL", signal_mand_ies, 0),
[V5X_CTRL_MSGT_SIGNAL_ACK] = MSG_DEF("SIGNAL_ACK", signal_ack_mand_ies, 0),
[V5X_CTRL_MSGT_STATUS] = MSG_DEF("STATUS", status_mand_ies, 0),
[V5X_CTRL_MSGT_STATUS_ENQUIRY] = MSG_DEF("STATUS_ENQUIRY", NULL, 0),
[V5X_CTRL_MSGT_DISCONNECT] = MSG_DEF("DISCONNECT", NULL, 0),
[V5X_CTRL_MSGT_DISCONNECT_COMPLETE] = MSG_DEF("DISCONNECT_COMPLETE", NULL, 0),
[V5X_CTRL_MSGT_PROTOCOL_PARAMETER] = MSG_DEF("PROTOCOL_PARAMETER", prot_par_mand_ies, 0),
/* G.964 Section 14.4 */
[V51_CTRL_MSGT_PORT_CTRL] = MSG_DEF("PORT_CTRL", port_ctrl_mand_ies, 0),
[V51_CTRL_MSGT_PORT_CTRL_ACK] = MSG_DEF("PORT_CTRL_ACK", port_ctrl_mand_ies, 0),
[V51_CTRL_MSGT_COMMON_CTRL] = MSG_DEF("COMMON_CTRL", common_ctrl_mand_ies, 0),
[V51_CTRL_MSGT_COMMON_CTRL_ACK] = MSG_DEF("COMMON_CTRL_ACK", common_ctrl_mand_ies, 0),
[V5X_CTRL_MSGT_PORT_CTRL] = MSG_DEF("PORT_CTRL", port_ctrl_mand_ies, 0),
[V5X_CTRL_MSGT_PORT_CTRL_ACK] = MSG_DEF("PORT_CTRL_ACK", port_ctrl_mand_ies, 0),
[V5X_CTRL_MSGT_COMMON_CTRL] = MSG_DEF("COMMON_CTRL", common_ctrl_mand_ies, 0),
[V5X_CTRL_MSGT_COMMON_CTRL_ACK] = MSG_DEF("COMMON_CTRL_ACK", common_ctrl_mand_ies, 0),
/* G.965 Section 16.3 LCP */
[V52_CTRL_MSGT_LCP_LINK_CTRL] = MSG_DEF("LINK_CONTROL", lcp_mand_ies, 0),
[V52_CTRL_MSGT_LCP_LINK_CTRL_ACK] = MSG_DEF("LINK_CONTROL_ACK", lcp_mand_ies, 0),
@ -290,33 +291,33 @@ const struct osmo_tlv_prot_def v51_ctrl_msg_tlv = {
},
.ie_def = {
/* single byte, only upper nibble matches IEI */
[V51_CTRL_IEI_PULSE_NOTIFICATION] = { 0, "PULSE_NOTIFICATION" },
[V51_CTRL_IEI_LINE_INFORMATION] = { 0, "LINE_INFORMATION" },
[V51_CTRL_IEI_STATE] = { 0, "STATE" },
[V51_CTRL_IEI_AUTONOMOUS_SIG_SEQ] = { 0, "AUTONOMOUS_SIG_SEQ" },
[V51_CTRL_IEI_SEQUENCE_RESPONSE] = { 0, "SEQUENCE_RESPONSE" },
[V5X_CTRL_IEI_PULSE_NOTIFICATION] = { 0, "PULSE_NOTIFICATION" },
[V5X_CTRL_IEI_LINE_INFORMATION] = { 0, "LINE_INFORMATION" },
[V5X_CTRL_IEI_STATE] = { 0, "STATE" },
[V5X_CTRL_IEI_AUTONOMOUS_SIG_SEQ] = { 0, "AUTONOMOUS_SIG_SEQ" },
[V5X_CTRL_IEI_SEQUENCE_RESPONSE] = { 0, "SEQUENCE_RESPONSE" },
/* single byte: ISDN */
[V51_CTRL_IEI_PERFORMANCE_GRADING] = { 0, "PERFORMANCE_GRADING" },
[V51_CTRL_IEI_REJECTION_CAUSE] = { 0, "REJECTION_CAUSE" },
[V5X_CTRL_IEI_PERFORMANCE_GRADING] = { 0, "PERFORMANCE_GRADING" },
[V5X_CTRL_IEI_REJECTION_CAUSE] = { 0, "REJECTION_CAUSE" },
/* variable length: PSTN */
[V51_CTRL_IEI_SEQUENCE_NR] = { 1, "SEQUENCE_NR" },
[V51_CTRL_IEI_CADENCED_RINGING] = { 1, "CADENCED_RINGING" },
[V51_CTRL_IEI_PULSED_SIGNAL] = { 2, "PULSED_SIGNAL" },
[V51_CTRL_IEI_STEADY_SIGNAL] = { 1, "STEADY_SIGNAL" },
[V51_CTRL_IEI_DIGIT_SIGNAL] = { 1, "DIGIT_SIGNAL" },
[V51_CTRL_IEI_RECOGNITION_TIME] = { 2, "RECOGNITION_TIME" },
[V51_CTRL_IEI_ENABLE_AUTONOMOUS_ACK] = { 2, "ENABLE_AUTONOMOUS_ACK" },
[V51_CTRL_IEI_DISABLE_AUTONOMOUS_ACK] = { 1, "DISABLE_AUTONOMOUS_ACK" },
[V51_CTRL_IEI_CAUSE] = { 1, "CAUSE" },
[V51_CTRL_IEI_RESOURCE_UNAVAILABLE] = { 1, "RESOURCE_UNAVAILABLE" },
[V51_CTRL_IEI_ENABLE_METERING] = { 1, "ENABLE_METERING" },
[V51_CTRL_IEI_METERING_REPORT] = { 2, "METERING_REPORT" },
[V51_CTRL_IEI_ATTENUATION] = { 1, "ATTENUATION" },
[V5X_CTRL_IEI_SEQUENCE_NR] = { 1, "SEQUENCE_NR" },
[V5X_CTRL_IEI_CADENCED_RINGING] = { 1, "CADENCED_RINGING" },
[V5X_CTRL_IEI_PULSED_SIGNAL] = { 2, "PULSED_SIGNAL" },
[V5X_CTRL_IEI_STEADY_SIGNAL] = { 1, "STEADY_SIGNAL" },
[V5X_CTRL_IEI_DIGIT_SIGNAL] = { 1, "DIGIT_SIGNAL" },
[V5X_CTRL_IEI_RECOGNITION_TIME] = { 2, "RECOGNITION_TIME" },
[V5X_CTRL_IEI_ENABLE_AUTONOMOUS_ACK] = { 2, "ENABLE_AUTONOMOUS_ACK" },
[V5X_CTRL_IEI_DISABLE_AUTONOMOUS_ACK] = { 1, "DISABLE_AUTONOMOUS_ACK" },
[V5X_CTRL_IEI_CAUSE] = { 1, "CAUSE" },
[V5X_CTRL_IEI_RESOURCE_UNAVAILABLE] = { 1, "RESOURCE_UNAVAILABLE" },
[V5X_CTRL_IEI_ENABLE_METERING] = { 1, "ENABLE_METERING" },
[V5X_CTRL_IEI_METERING_REPORT] = { 2, "METERING_REPORT" },
[V5X_CTRL_IEI_ATTENUATION] = { 1, "ATTENUATION" },
/* variable length: ISDN */
[V51_CTRL_IEI_CTRL_F_ELEMENT] = { 1, "CTRL_F_ELEMENT" },
[V51_CTRL_IEI_CTRL_F_ID] = { 1, "CTRL_F_ID" },
[V51_CTRL_IEI_VARIANT] = { 1, "VARIANT" },
[V51_CTRL_IEI_INTERFACE_ID] = { 3, "INTERFACE_ID" },
[V5X_CTRL_IEI_CTRL_F_ELEMENT] = { 1, "CTRL_F_ELEMENT" },
[V5X_CTRL_IEI_CTRL_F_ID] = { 1, "CTRL_F_ID" },
[V5X_CTRL_IEI_VARIANT] = { 1, "VARIANT" },
[V5X_CTRL_IEI_INTERFACE_ID] = { 3, "INTERFACE_ID" },
/* variable length: LCP */
[V52_CTRL_IEI_LCP_LINK_CTRL_FUNCTION] = { 1, "LINK_CTRL_FUNCTION" },
/* variable length: BCC */
@ -334,7 +335,7 @@ const struct osmo_tlv_prot_def v51_ctrl_msg_tlv = {
[V52_CTRL_IEI_PP_REJECTION_CAUSE] = { 1, "REJECTION_CAUSE" },
[V52_CTRL_IEI_PP_PROTOCOL_ERROR_CAUSE] = { 1, "PROTOCOL_ERR_CAUSE" },
},
.msgt_names = v51_ctrl_msg_typ_str,
.msgt_names = v5x_ctrl_msg_typ_str,
};
static int v52_rcv_pp(struct v5x_interface *v5if, uint16_t l3_addr, uint8_t msg_type, const struct tlv_parsed *tp)
@ -358,7 +359,7 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
{
struct v5x_interface *v5if = rx_cbdata;
struct msgb *msg = odp->oph.msg;
struct v51_l3_hdr *l3h;
struct v5x_l3_hdr *l3h;
struct tlv_parsed tp;
uint16_t l3_addr;
bool is_isdn;
@ -372,31 +373,31 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
case PRIM_DL_EST:
LOGP(DV5, LOGL_DEBUG, "DL-EST indication received (ldaddr=%d)\n", dladdr);
switch (dladdr) {
case V51_DLADDR_CTRL:
case V5X_DLADDR_CTRL:
if (v5if->control.established)
break;
v5if->control.established = true;
/* start ctrl protocols */
v51_start_ctrl(v5if->control.ctrl);
v5x_le_ctrl_start(v5if->control.ctrl);
llist_for_each_entry(v5up, &v5if->user_ports, list)
v51_start_ctrl(v5up->ctrl);
v5x_le_ctrl_start(v5up->ctrl);
/* start provisioning */
v51_start_provisioning(v5if);
v5x_le_provisioning_start(v5if);
/* block all ports */
llist_for_each_entry(v5up, &v5if->user_ports, list)
v51_mph_snd(v5up, MPH_BI);
v5x_mph_snd(v5up, MPH_BI);
break;
}
goto out;
case PRIM_DL_REL:
LOGP(DV5, LOGL_DEBUG, "DL-REL indication received (ldaddr=%d)\n", dladdr);
switch (dladdr) {
case V51_DLADDR_CTRL:
case V5X_DLADDR_CTRL:
v5if->control.established = false;
/* stop ctrl protocols */
v51_stop_ctrl(v5if->control.ctrl);
v5x_le_ctrl_stop(v5if->control.ctrl);
llist_for_each_entry(v5up, &v5if->user_ports, list)
v51_stop_ctrl(v5up->ctrl);
v5x_le_ctrl_stop(v5up->ctrl);
break;
}
goto out;
@ -414,61 +415,61 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
goto out;
}
if (l3h->pdisc != V51_CTRL_PDISC) {
if (l3h->pdisc != V5X_CTRL_PDISC) {
LOGP(DV5, LOGL_ERROR, "Received unsupported protocol discriminator 0x%02x\n", l3h->pdisc);
rc = -EINVAL;
goto out;
}
rc = osmo_tlv_prot_parse(&v51_ctrl_msg_tlv, &tp, 1, l3h->msg_type, msgb_l3(msg) + sizeof(*l3h),
rc = osmo_tlv_prot_parse(&v5x_ctrl_msg_tlv, &tp, 1, l3h->msg_type, msgb_l3(msg) + sizeof(*l3h),
msgb_l3len(msg) - sizeof(*l3h), 0, 0, DV5, __func__);
if (rc < 0)
goto out;
l3_addr = v51_l3_addr_dec(ntohs(l3h->l3_addr), &is_isdn);
l3_addr = v5x_l3_addr_dec(ntohs(l3h->l3_addr), &is_isdn);
LOGP(DV5, LOGL_DEBUG, "Received message from AN with l3_addr = %d and msg_type %d\n", l3_addr, l3h->msg_type);
switch (dladdr) {
case V51_DLADDR_PSTN:
case V5X_DLADDR_PSTN:
/* PSTN signaling protocol */
switch (l3h->msg_type) {
case V51_CTRL_MSGT_ESTABLISH:
case V51_CTRL_MSGT_ESTABLISH_ACK:
case V51_CTRL_MSGT_SIGNAL:
case V51_CTRL_MSGT_SIGNAL_ACK:
case V51_CTRL_MSGT_DISCONNECT:
case V51_CTRL_MSGT_DISCONNECT_COMPLETE:
case V51_CTRL_MSGT_STATUS_ENQUIRY:
case V51_CTRL_MSGT_STATUS:
case V51_CTRL_MSGT_PROTOCOL_PARAMETER:
case V5X_CTRL_MSGT_ESTABLISH:
case V5X_CTRL_MSGT_ESTABLISH_ACK:
case V5X_CTRL_MSGT_SIGNAL:
case V5X_CTRL_MSGT_SIGNAL_ACK:
case V5X_CTRL_MSGT_DISCONNECT:
case V5X_CTRL_MSGT_DISCONNECT_COMPLETE:
case V5X_CTRL_MSGT_STATUS_ENQUIRY:
case V5X_CTRL_MSGT_STATUS:
case V5X_CTRL_MSGT_PROTOCOL_PARAMETER:
/* look-up user port based on L3 addr? */
v5up = v5x_user_port_find(v5if, l3_addr, is_isdn);
if (!v5up) {
rc = -ENODEV;
break;
}
rc = v5x_rcv_pstn(v5up, l3_addr, l3h->msg_type, &tp);
rc = v5x_le_pstn_rcv(v5up, l3_addr, l3h->msg_type, &tp);
break;
default:
rc = -ENOTSUP;
LOGP(DV5, LOGL_ERROR, "Received unsupported PSTN message type %s\n",
osmo_tlv_prot_msg_name(&v51_ctrl_msg_tlv, l3h->msg_type));
osmo_tlv_prot_msg_name(&v5x_ctrl_msg_tlv, l3h->msg_type));
}
break;
case V51_DLADDR_CTRL:
case V5X_DLADDR_CTRL:
/* control protocol (Section 14 G.964) */
switch (l3h->msg_type) {
case V51_CTRL_MSGT_PORT_CTRL:
case V51_CTRL_MSGT_PORT_CTRL_ACK:
case V51_CTRL_MSGT_COMMON_CTRL:
case V51_CTRL_MSGT_COMMON_CTRL_ACK:
rc = v51_rcv_ctrl(v5if, l3_addr, is_isdn, l3h->msg_type, &tp);
case V5X_CTRL_MSGT_PORT_CTRL:
case V5X_CTRL_MSGT_PORT_CTRL_ACK:
case V5X_CTRL_MSGT_COMMON_CTRL:
case V5X_CTRL_MSGT_COMMON_CTRL_ACK:
rc = v5x_le_ctrl_rcv(v5if, l3_addr, is_isdn, l3h->msg_type, &tp);
break;
default:
rc = -ENOTSUP;
LOGP(DV5, LOGL_ERROR, "Received unsupported CTRL message type %s\n",
osmo_tlv_prot_msg_name(&v51_ctrl_msg_tlv, l3h->msg_type));
osmo_tlv_prot_msg_name(&v5x_ctrl_msg_tlv, l3h->msg_type));
}
break;
case V52_DLADDR_BCC:
@ -487,7 +488,7 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
default:
rc = -ENOTSUP;
LOGP(DV5, LOGL_ERROR, "Received unsupported BCC message type %s\n",
osmo_tlv_prot_msg_name(&v51_ctrl_msg_tlv, l3h->msg_type));
osmo_tlv_prot_msg_name(&v5x_ctrl_msg_tlv, l3h->msg_type));
}
break;
case V52_DLADDR_PROTECTION:
@ -509,7 +510,7 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
default:
rc = -ENOTSUP;
LOGP(DV5, LOGL_ERROR, "Received unsupported PROTECTION message type %s\n",
osmo_tlv_prot_msg_name(&v51_ctrl_msg_tlv, l3h->msg_type));
osmo_tlv_prot_msg_name(&v5x_ctrl_msg_tlv, l3h->msg_type));
}
break;
case V52_DLADDR_LCP:
@ -522,13 +523,13 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
default:
rc = -ENOTSUP;
LOGP(DV5, LOGL_ERROR, "Received unsupported LCP message type %s\n",
osmo_tlv_prot_msg_name(&v51_ctrl_msg_tlv, l3h->msg_type));
osmo_tlv_prot_msg_name(&v5x_ctrl_msg_tlv, l3h->msg_type));
}
break;
default:
rc = -ENOTSUP;
LOGP(DV5, LOGL_ERROR, "Received unsupported message type %s\n",
osmo_tlv_prot_msg_name(&v51_ctrl_msg_tlv, l3h->msg_type));
osmo_tlv_prot_msg_name(&v5x_ctrl_msg_tlv, l3h->msg_type));
}
out:
@ -544,10 +545,10 @@ int v5x_snd(struct v5x_interface *v5if, uint16_t dladdr, struct msgb *msg)
struct lapv5_instance *li;
switch (dladdr) {
case V51_DLADDR_PSTN:
case V5X_DLADDR_PSTN:
li = v5if->pstn.li;
break;
case V51_DLADDR_CTRL:
case V5X_DLADDR_CTRL:
li = v5if->control.li;
break;
case V52_DLADDR_BCC:

View File

@ -14,17 +14,17 @@
/***********************************************************************/
/* Table 14/G.964 */
#define V51_CTRL_PDISC 0x48
#define V5X_CTRL_PDISC 0x48
/* Table 1/G.965 + Table 1/G.964 */
#define V51_DLADDR_PSTN 8176
#define V51_DLADDR_CTRL 8177
#define V5X_DLADDR_PSTN 8176
#define V5X_DLADDR_CTRL 8177
#define V52_DLADDR_BCC 8178
#define V52_DLADDR_PROTECTION 8179
#define V52_DLADDR_LCP 8180
/* G.965 Section 13.1 */
struct v51_l3_hdr {
struct v5x_l3_hdr {
uint8_t pdisc;
uint16_t l3_addr; /* with C/R and EA bits! */
uint8_t msg_type;
@ -32,7 +32,7 @@ struct v51_l3_hdr {
} __attribute__ ((packed));
/* G.964 Section 14.4.2.3 Figure 33 + 34 */
static inline bool v51_l3_addr_is_isdn(uint16_t in)
static inline bool v5x_l3_addr_is_isdn(uint16_t in)
{
/* extract two bytes */
uint8_t b1 = in >> 8;
@ -44,13 +44,13 @@ static inline bool v51_l3_addr_is_isdn(uint16_t in)
return false;
}
static inline uint16_t v51_l3_addr_dec(uint16_t in, bool *is_isdn)
static inline uint16_t v5x_l3_addr_dec(uint16_t in, bool *is_isdn)
{
/* extract two bytes */
uint8_t b1 = in >> 8;
uint8_t b2 = in & 0xff;
if (v51_l3_addr_is_isdn(in)) {
if (v5x_l3_addr_is_isdn(in)) {
/* remove EA/C/R bits */
uint8_t upper = b1 >> 2;
uint8_t lower = b2 >> 1;
@ -67,7 +67,7 @@ static inline uint16_t v51_l3_addr_dec(uint16_t in, bool *is_isdn)
}
}
static inline uint16_t v51_l3_addr_enc(uint16_t in, bool is_isdn)
static inline uint16_t v5x_l3_addr_enc(uint16_t in, bool is_isdn)
{
uint8_t b1, b2;
if (is_isdn) {
@ -85,22 +85,22 @@ static inline uint16_t v51_l3_addr_enc(uint16_t in, bool is_isdn)
}
/* Table 15 + 52/G.964 */
enum v51_ctrl_msg_type {
enum v5x_ctrl_msg_type {
/* 000xxxx: PSTN protocol message types */
V51_CTRL_MSGT_ESTABLISH = 0x00,
V51_CTRL_MSGT_ESTABLISH_ACK = 0x01,
V51_CTRL_MSGT_SIGNAL = 0x02,
V51_CTRL_MSGT_SIGNAL_ACK = 0x03,
V51_CTRL_MSGT_DISCONNECT = 0x08,
V51_CTRL_MSGT_DISCONNECT_COMPLETE = 0x09,
V51_CTRL_MSGT_STATUS_ENQUIRY = 0x0c,
V51_CTRL_MSGT_STATUS = 0x0d,
V51_CTRL_MSGT_PROTOCOL_PARAMETER = 0x0e,
V5X_CTRL_MSGT_ESTABLISH = 0x00,
V5X_CTRL_MSGT_ESTABLISH_ACK = 0x01,
V5X_CTRL_MSGT_SIGNAL = 0x02,
V5X_CTRL_MSGT_SIGNAL_ACK = 0x03,
V5X_CTRL_MSGT_DISCONNECT = 0x08,
V5X_CTRL_MSGT_DISCONNECT_COMPLETE = 0x09,
V5X_CTRL_MSGT_STATUS_ENQUIRY = 0x0c,
V5X_CTRL_MSGT_STATUS = 0x0d,
V5X_CTRL_MSGT_PROTOCOL_PARAMETER = 0x0e,
/* 0010xxx: Control protocol message types */
V51_CTRL_MSGT_PORT_CTRL = 0x10,
V51_CTRL_MSGT_PORT_CTRL_ACK = 0x11,
V51_CTRL_MSGT_COMMON_CTRL = 0x12,
V51_CTRL_MSGT_COMMON_CTRL_ACK = 0x13,
V5X_CTRL_MSGT_PORT_CTRL = 0x10,
V5X_CTRL_MSGT_PORT_CTRL_ACK = 0x11,
V5X_CTRL_MSGT_COMMON_CTRL = 0x12,
V5X_CTRL_MSGT_COMMON_CTRL_ACK = 0x13,
/* 0011xxx: Protection protocol message types */
V52_CTRL_MSGT_PP_SWITCH_OVER_REQ = 0x18,
V52_CTRL_MSGT_PP_SWITCH_OVER_COM = 0x19,
@ -127,39 +127,39 @@ enum v51_ctrl_msg_type {
V52_CTRL_MSGT_LCP_LINK_CTRL_ACK = 0x31,
};
extern const struct value_string v51_ctrl_msg_typ_str[];
extern const struct value_string v5x_ctrl_msg_typ_str[];
/* Table 17 + 53/G.964 */
enum v51_ctrl_iei {
enum v5x_ctrl_iei {
/* single byte, only upper nibble matches IEI */
V51_CTRL_IEI_PULSE_NOTIFICATION = 0xc0,
V51_CTRL_IEI_LINE_INFORMATION = 0x80,
V51_CTRL_IEI_STATE = 0x90,
V51_CTRL_IEI_AUTONOMOUS_SIG_SEQ = 0xa0,
V51_CTRL_IEI_SEQUENCE_RESPONSE = 0xb0,
V5X_CTRL_IEI_PULSE_NOTIFICATION = 0xc0,
V5X_CTRL_IEI_LINE_INFORMATION = 0x80,
V5X_CTRL_IEI_STATE = 0x90,
V5X_CTRL_IEI_AUTONOMOUS_SIG_SEQ = 0xa0,
V5X_CTRL_IEI_SEQUENCE_RESPONSE = 0xb0,
/* single byte: ISDN */
V51_CTRL_IEI_PERFORMANCE_GRADING = 0xe0,
V51_CTRL_IEI_REJECTION_CAUSE = 0xf0,
V5X_CTRL_IEI_PERFORMANCE_GRADING = 0xe0,
V5X_CTRL_IEI_REJECTION_CAUSE = 0xf0,
/* variable length: PSTN */
V51_CTRL_IEI_SEQUENCE_NR = 0x00,
V51_CTRL_IEI_CADENCED_RINGING = 0x01,
V51_CTRL_IEI_PULSED_SIGNAL = 0x02,
V51_CTRL_IEI_STEADY_SIGNAL = 0x03,
V51_CTRL_IEI_DIGIT_SIGNAL = 0x04,
V51_CTRL_IEI_RECOGNITION_TIME = 0x10,
V51_CTRL_IEI_ENABLE_AUTONOMOUS_ACK = 0x11,
V51_CTRL_IEI_DISABLE_AUTONOMOUS_ACK = 0x12,
V51_CTRL_IEI_CAUSE = 0x13,
V51_CTRL_IEI_RESOURCE_UNAVAILABLE = 0x14,
V51_CTRL_IEI_ENABLE_METERING = 0x32,
V51_CTRL_IEI_METERING_REPORT = 0x33,
V51_CTRL_IEI_ATTENUATION = 0x34,
V5X_CTRL_IEI_SEQUENCE_NR = 0x00,
V5X_CTRL_IEI_CADENCED_RINGING = 0x01,
V5X_CTRL_IEI_PULSED_SIGNAL = 0x02,
V5X_CTRL_IEI_STEADY_SIGNAL = 0x03,
V5X_CTRL_IEI_DIGIT_SIGNAL = 0x04,
V5X_CTRL_IEI_RECOGNITION_TIME = 0x10,
V5X_CTRL_IEI_ENABLE_AUTONOMOUS_ACK = 0x11,
V5X_CTRL_IEI_DISABLE_AUTONOMOUS_ACK = 0x12,
V5X_CTRL_IEI_CAUSE = 0x13,
V5X_CTRL_IEI_RESOURCE_UNAVAILABLE = 0x14,
V5X_CTRL_IEI_ENABLE_METERING = 0x32,
V5X_CTRL_IEI_METERING_REPORT = 0x33,
V5X_CTRL_IEI_ATTENUATION = 0x34,
/* variable length: ISDN */
V51_CTRL_IEI_CTRL_F_ELEMENT = 0x20,
V51_CTRL_IEI_CTRL_F_ID = 0x21,
V51_CTRL_IEI_VARIANT = 0x22,
V51_CTRL_IEI_INTERFACE_ID = 0x23,
V5X_CTRL_IEI_CTRL_F_ELEMENT = 0x20,
V5X_CTRL_IEI_CTRL_F_ID = 0x21,
V5X_CTRL_IEI_VARIANT = 0x22,
V5X_CTRL_IEI_INTERFACE_ID = 0x23,
/* variable length: LCP */
V52_CTRL_IEI_LCP_LINK_CTRL_FUNCTION = 0x30,
/* variable length: BCC */
@ -178,64 +178,64 @@ enum v51_ctrl_iei {
V52_CTRL_IEI_PP_PROTOCOL_ERROR_CAUSE = 0x53,
};
extern const struct value_string v51_ctrl_iei_str[];
extern const struct value_string v5x_ctrl_iei_str[];
extern const struct tlv_definition v51_ctrl_tlv_def;
extern const struct tlv_definition v5x_ctrl_tlv_def;
extern const struct osmo_tlv_prot_def v51_ctrl_msg_tlv;
extern const struct osmo_tlv_prot_def v5x_ctrl_msg_tlv;
/* 14.4.2.5.4 Table 56/G.964 - Coding of Control Function Element */
enum v51_ctrl_func_el {
V51_CTRL_FE101_ACTIVATE_ACCESS = 0x01,
V51_CTRL_FE102_ACT_INIT_BY_USER = 0x02,
V51_CTRL_FE103_DS_ACTIVATED = 0x03,
V51_CTRL_FE104_ACCESS_ACTIVATED = 0x04,
V51_CTRL_FE105_DEACTIVATE_ACCESS = 0x05,
V51_CTRL_FE106_ACCESS_DEACTIVATED = 0x06,
V51_CTRL_FE201_UNBLOCK = 0x11,
V51_CTRL_FE203_BLOCK = 0x13,
V51_CTRL_FE205_BLOCK_REQ = 0x15,
V51_CTRL_FE206_PERFORMANCE_GRADING = 0x16,
V51_CTRL_FE207_D_CHANNEL_BLOCK = 0x17,
V51_CTRL_FE208_D_CHANNEL_UNBLOCK = 0x18,
enum v5x_ctrl_func_el {
V5X_CTRL_FE101_ACTIVATE_ACCESS = 0x01,
V5X_CTRL_FE102_ACT_INIT_BY_USER = 0x02,
V5X_CTRL_FE103_DS_ACTIVATED = 0x03,
V5X_CTRL_FE104_ACCESS_ACTIVATED = 0x04,
V5X_CTRL_FE105_DEACTIVATE_ACCESS = 0x05,
V5X_CTRL_FE106_ACCESS_DEACTIVATED = 0x06,
V5X_CTRL_FE201_UNBLOCK = 0x11,
V5X_CTRL_FE203_BLOCK = 0x13,
V5X_CTRL_FE205_BLOCK_REQ = 0x15,
V5X_CTRL_FE206_PERFORMANCE_GRADING = 0x16,
V5X_CTRL_FE207_D_CHANNEL_BLOCK = 0x17,
V5X_CTRL_FE208_D_CHANNEL_UNBLOCK = 0x18,
};
extern const struct value_string v51_ctrl_func_el_str[];
extern const struct value_string v5x_ctrl_func_el_str[];
/* 14.4.2.5.5 Table 57/G.964 - Coding of Control Function ID */
enum v51_ctrl_func_id {
V51_CTRL_ID_VERIFY_RE_PROVISIONING = 0x00,
V51_CTRL_ID_READY_FOR_RE_PROVISIONING = 0x01,
V51_CTRL_ID_NOT_READY_FOR_RE_PROVISIONING = 0x02,
V51_CTRL_ID_SWITCH_OVER_TO_NEW_VARIANT = 0x03,
V51_CTRL_ID_RE_PROVISIONING_STARTED = 0x04,
V51_CTRL_ID_CANNOT_RE_PROVISION = 0x05,
V51_CTRL_ID_REQUEST_VARIANT_AND_INTERFACE_ID = 0x06,
V51_CTRL_ID_VARIANT_AND_INTERFACE_ID = 0x07,
V51_CTRL_ID_BLOCKING_STARTED = 0x08,
V51_CTRL_ID_RESTART_REQUEST = 0x10,
V51_CTRL_ID_RESTART_COMPLETE = 0x11,
enum v5x_ctrl_func_id {
V5X_CTRL_ID_VERIFY_RE_PROVISIONING = 0x00,
V5X_CTRL_ID_READY_FOR_RE_PROVISIONING = 0x01,
V5X_CTRL_ID_NOT_READY_FOR_RE_PROVISIONING = 0x02,
V5X_CTRL_ID_SWITCH_OVER_TO_NEW_VARIANT = 0x03,
V5X_CTRL_ID_RE_PROVISIONING_STARTED = 0x04,
V5X_CTRL_ID_CANNOT_RE_PROVISION = 0x05,
V5X_CTRL_ID_REQUEST_VARIANT_AND_INTERFACE_ID = 0x06,
V5X_CTRL_ID_VARIANT_AND_INTERFACE_ID = 0x07,
V5X_CTRL_ID_BLOCKING_STARTED = 0x08,
V5X_CTRL_ID_RESTART_REQUEST = 0x10,
V5X_CTRL_ID_RESTART_COMPLETE = 0x11,
};
extern const struct value_string v51_ctrl_func_id_str[];
extern const struct value_string v5x_ctrl_func_id_str[];
/* 13.4.7.9 Cause */
enum v51_cause_type {
V51_CTRL_CAUSE_T_RESP_TO_STATUS_ENQ = 0x00,
V51_CTRL_CAUSE_T_L3_ADDRESS_ERROR = 0x03,
V51_CTRL_CAUSE_T_MSG_TYPE_UNRECOGNIZED = 0x04,
V51_CTRL_CAUSE_T_OUT_OF_SEQUENCE_IE = 0x05,
V51_CTRL_CAUSE_T_REPEATED_OPT_IE = 0x06,
V51_CTRL_CAUSE_T_MAND_IE_MISSING = 0x07,
V51_CTRL_CAUSE_T_UNRECOGNIZED_IE = 0x08,
V51_CTRL_CAUSE_T_MAND_IE_CONTENT_ERROR = 0x09,
V51_CTRL_CAUSE_T_OPT_IE_CONTENT_ERROR = 0x0a,
V51_CTRL_CAUSE_T_MSG_INCOMP_PATH_STATE = 0x0b,
V51_CTRL_CAUSE_T_REPEATED_MAND_IE = 0x0c,
V51_CTRL_CAUSE_T_TOO_MANY_IE = 0x0d,
enum v5x_cause_type {
V5X_CTRL_CAUSE_T_RESP_TO_STATUS_ENQ = 0x00,
V5X_CTRL_CAUSE_T_L3_ADDRESS_ERROR = 0x03,
V5X_CTRL_CAUSE_T_MSG_TYPE_UNRECOGNIZED = 0x04,
V5X_CTRL_CAUSE_T_OUT_OF_SEQUENCE_IE = 0x05,
V5X_CTRL_CAUSE_T_REPEATED_OPT_IE = 0x06,
V5X_CTRL_CAUSE_T_MAND_IE_MISSING = 0x07,
V5X_CTRL_CAUSE_T_UNRECOGNIZED_IE = 0x08,
V5X_CTRL_CAUSE_T_MAND_IE_CONTENT_ERROR = 0x09,
V5X_CTRL_CAUSE_T_OPT_IE_CONTENT_ERROR = 0x0a,
V5X_CTRL_CAUSE_T_MSG_INCOMP_PATH_STATE = 0x0b,
V5X_CTRL_CAUSE_T_REPEATED_MAND_IE = 0x0c,
V5X_CTRL_CAUSE_T_TOO_MANY_IE = 0x0d,
};
extern const struct value_string v51_cause_type_str[];
extern const struct value_string v5x_cause_type_str[];
//const struct osmo_tlv_prot_def v51_ctrl_msg_tlv;