Work on v5x_protocol.c

This commit is contained in:
Andreas Eversberg 2022-12-26 14:47:18 +01:00
parent 11c87bdea7
commit 3aff22f309
2 changed files with 267 additions and 118 deletions

View File

@ -37,57 +37,59 @@
#include "v5x_le_ctrl_fsm.h"
#include "v5x_le_port_fsm.h"
#include "v5x_le_pstn_fsm.h"
#include "v5x_le_provisioning.h"
#include "v52_le_bcc_fsm.h"
#include "v52_le_pp_fsm.h"
#include "v5x_le_management.h"
const struct tlv_definition v5x_ctrl_tlv_def = {
.def = {
/* single byte: PSTN / G.964 Table 17 */
[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 },
[V5X_CTRL_IEI_PULSE_NOTIFICATION] = { TLV_TYPE_SINGLE_TV, 0 },
[V5X_CTRL_IEI_LINE_INFORMATION] = { TLV_TYPE_SINGLE_TV, 0 },
[V5X_CTRL_IEI_STATE] = { TLV_TYPE_SINGLE_TV, 0 },
[V5X_CTRL_IEI_AUTONOMOUS_SIG_SEQ] = { TLV_TYPE_SINGLE_TV, 0 },
[V5X_CTRL_IEI_SEQUENCE_RESPONSE] = { TLV_TYPE_SINGLE_TV, 0 },
/* single byte: ISDN / G.964 Table 53 */
[V5X_CTRL_IEI_PERFORMANCE_GRADING] = { TLV_TYPE_SINGLE_TV },
[V5X_CTRL_IEI_REJECTION_CAUSE] = { TLV_TYPE_SINGLE_TV },
[V5X_CTRL_IEI_PERFORMANCE_GRADING] = { TLV_TYPE_SINGLE_TV, 0 },
[V5X_CTRL_IEI_REJECTION_CAUSE] = { TLV_TYPE_SINGLE_TV, 0 },
/* variable length: PSTN / G.964 Table 17 */
[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 },
[V5X_CTRL_IEI_SEQUENCE_NR] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_CADENCED_RINGING] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_PULSED_SIGNAL] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_STEADY_SIGNAL] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_DIGIT_SIGNAL] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_RECOGNITION_TIME] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_ENABLE_AUTONOMOUS_ACK] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_DISABLE_AUTONOMOUS_ACK] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_CAUSE] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_RESOURCE_UNAVAILABLE] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_ENABLE_METERING] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_METERING_REPORT] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_ATTENUATION] = { TLV_TYPE_TLV, 0 },
/* variable length: ISDN / G.964 Table 53 */
[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 },
[V5X_CTRL_IEI_CTRL_F_ELEMENT] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_CTRL_F_ID] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_VARIANT] = { TLV_TYPE_TLV, 0 },
[V5X_CTRL_IEI_INTERFACE_ID] = { TLV_TYPE_TLV, 0 },
/* variable length: LCP / G.965 Table FIXME */
[V52_CTRL_IEI_LCP_LINK_CTRL_FUNCTION] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_LCP_LINK_CTRL_FUNCTION] = { TLV_TYPE_TLV, 0 },
/* variable length: BCC */
[V52_CTRL_IEI_BCC_USER_PORT_ID] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_BCC_ISDN_PORT_TS_ID] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_BCC_V5_TS_ID] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_BCC_MULTI_TS_MAP] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_BCC_REJECT_CAUSE] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_BCC_PROTOCOL_ERROR_CAUSE] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_BCC_CONNECTION_INCOMPLETE] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_BCC_INFO_TRANSFER_CAPABILITY] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_BCC_USER_PORT_ID] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_BCC_ISDN_PORT_TS_ID] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_BCC_V5_TS_ID] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_BCC_MULTI_TS_MAP] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_BCC_REJECT_CAUSE] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_BCC_PROTOCOL_ERROR_CAUSE] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_BCC_CONNECTION_INCOMPLETE] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_BCC_INFO_TRANSFER_CAPABILITY] = { TLV_TYPE_TLV, 0 },
/* variable-length: Protection */
[V52_CTRL_IEI_PP_SEQUENCE_NR] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_PP_PHYSICAL_C_CHAN_ID] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_PP_REJECTION_CAUSE] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_PP_PROTOCOL_ERROR_CAUSE] = { TLV_TYPE_TLV },
[V52_CTRL_IEI_PP_SEQUENCE_NR] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_PP_PHYSICAL_C_CHAN_ID] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_PP_REJECTION_CAUSE] = { TLV_TYPE_TLV, 0 },
[V52_CTRL_IEI_PP_PROTOCOL_ERROR_CAUSE] = { TLV_TYPE_TLV, 0 },
},
};
@ -203,21 +205,63 @@ const struct value_string v5x_ctrl_func_id_str[] = {
};
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" },
{ V5X_CAUSE_T_RESP_TO_STATUS_ENQ, "Response to status enquiry" },
{ V5X_CAUSE_T_PROTOCOL_DISC_ERROR, "Protocol discriminator error" },
{ V5X_CAUSE_T_MSG_TYPE_UNRECOGNIZED, "Message type unrecognized" },
{ V5X_CAUSE_T_OUT_OF_SEQUENCE_IE, "Out of sequence information element" },
{ V5X_CAUSE_T_REPEATED_OPT_IE, "Repeated optional information element" },
{ V5X_CAUSE_T_MAND_IE_MISSING, "Mandatory information element missing" },
{ V5X_CAUSE_T_UNRECOGNIZED_IE, "Unrecognized information element" },
{ V5X_CAUSE_T_MAND_IE_CONTENT_ERROR, "Mandatory information element content error" },
{ V5X_CAUSE_T_OPT_IE_CONTENT_ERROR, "Optional information element content error" },
{ V5X_CAUSE_T_MSG_INCOMP_STATE, "Message not compatible with protocol state" },
{ V5X_CAUSE_T_REPEATED_MAND_IE, "Repeated mandatory information element" },
{ V5X_CAUSE_T_TOO_MANY_IE, "Too many information elements" },
{ V5X_CAUSE_T_REF_NR_CODING_ERROR, "Reference Number coding error" },
{ 0, NULL }
};
const struct value_string v52_bcc_reject_cause_type_str[] = {
{ V52_BCC_REJECT_CAUSE_T_UNSPECIFIED, "Unspecified" },
{ V52_BCC_REJECT_CAUSE_T_ACCESS_NET_FAUL, "Access network fault" },
{ V52_BCC_REJECT_CAUSE_T_ACCESS_NET_BLOCKED, "Access network blocked (internally)" },
{ V52_BCC_REJECT_CAUSE_T_CONN_PRESENT_PSTN,
"Connection already present at the PSTN user port to a different V5-time slot" },
{ V52_BCC_REJECT_CAUSE_T_CONN_PRESENT_V5_TS,
"Connection already present at the V5-time slot(s) to a different port or ISDN user port time slot" },
{ V52_BCC_REJECT_CAUSE_T_CONN_PRESENT_ISDN,
"Connection already present at the ISDN user port time slot(s) to a different V5-time slot(s)" },
{ V52_BCC_REJECT_CAUSE_T_USER_PORT_UNAVAILABLE, "User port unavailable (blocked)" },
{ V52_BCC_REJECT_CAUSE_T_DEALLOC_INCOMPAT_DATA,
"De-allocation cannot be completed due to incompatible data content" },
{ V52_BCC_REJECT_CAUSE_T_DEALLOC_V5_TS_DATA,
"De-allocation cannot be completed due to V5-time slot(s) data incompatibility" },
{ V52_BCC_REJECT_CAUSE_T_DEALLOC_PORT_DATA,
"De-allocation cannot be completed due to port data incompatibility" },
{ V52_BCC_REJECT_CAUSE_T_DEALLOC_USER_TS_DATA,
"De-allocation cannot be completed due to user port time slot(s) data incompatibility" },
{ V52_BCC_REJECT_CAUSE_T_USER_NOT_PROVISIONED, "User port not provisioned" },
{ V52_BCC_REJECT_CAUSE_T_INVALID_V5_TS_IDENT, "Invalid V5-time slot(s) identification(s)" },
{ V52_BCC_REJECT_CAUSE_T_INVALID_V5_LINK_IDENT, "Invalid V5 2048 kbit/s link identification" },
{ V52_BCC_REJECT_CAUSE_T_INVALID_USER_TS_IDENT, "Invalid user port time slot(s) identification(s)" },
{ V52_BCC_REJECT_CAUSE_T_V5_TS_USED_CCHANNEL, "V5-time slot(s) being used as physical C-channel(s)" },
{ V52_BCC_REJECT_CAUSE_T_V5_LINK_UNAVAILABLE, "V5-link unavailable (blocked)" },
{ 0, NULL }
};
const struct value_string v52_pp_reject_cause_type_str[] = {
{ V52_PP_REJECT_CAUSE_T_NO_STANDBY_CC_AVAILABLE,"No standby C-channel available" },
{ V52_PP_REJECT_CAUSE_T_TARGET_CC_NOT_OPER, "Target physical C-channel not operational" },
{ V52_PP_REJECT_CAUSE_T_TARGET_CC_NOT_PROV, "Target physical C-channel not provisioned" },
{ V52_PP_REJECT_CAUSE_T_PROT_SWITCHING_IMPOSS, "Protection switching impossible (AN/LE failure)" },
{ V52_PP_REJECT_CAUSE_T_PROT_GROUP_MISMATCH, "Protection group mismatch" },
{ V52_PP_REJECT_CAUSE_T_ALLOC_EXISTS_ALREADY, "Requested allocation exists already" },
{ V52_PP_REJECT_CAUSE_T_TARGET_CC_ALREADY_CC, "Target physical C-channel already has logical C-channel" },
{ 0, NULL }
};
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 };
@ -338,26 +382,11 @@ const struct osmo_tlv_prot_def v5x_ctrl_msg_tlv = {
.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)
{
return 0;
}
static int v52_rcv_bcc(struct v5x_interface *v5if, uint16_t l3_addr, uint8_t msg_type, const struct tlv_parsed *tp)
{
return 0;
}
static int v52_rcv_lcp(struct v5x_interface *v5if, uint16_t l3_addr, uint8_t msg_type, const struct tlv_parsed *tp)
{
return 0;
}
/* main entry point for received V5 messages */
int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
int v5x_dl_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
{
struct v5x_interface *v5if = rx_cbdata;
struct v5x_link *v5l = rx_cbdata;
struct msgb *msg = odp->oph.msg;
struct v5x_l3_hdr *l3h;
struct tlv_parsed tp;
@ -383,9 +412,42 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
v5x_le_ctrl_start(v5up->ctrl);
/* start provisioning */
v5x_le_provisioning_start(v5if);
/* block all ports */
llist_for_each_entry(v5up, &v5if->user_ports, list)
v5x_mph_snd(v5up, MPH_BI);
v5l = NULL;
break;
case V5X_DLADDR_PSTN:
if (v5if->pstn.established)
break;
v5if->pstn.established = true;
v5l = NULL;
break;
case V52_DLADDR_LCP:
if (v5if->lcp.established)
break;
v5if->lcp.established = true;
/* start ctrl protocols */
llist_for_each_entry(v5l, &v5if->links, list)
v5x_le_ctrl_start(v5l->ctrl);
v5l = NULL;
break;
case V52_DLADDR_BCC:
if (v5if->bcc.established)
break;
v5if->bcc.established = true;
v5l = NULL;
break;
case V52_DLADDR_PROTECTION:
v5if = v5l->interface;
if (v5l == v5if->primary_link) {
if (v5if->protection.established[0])
break;
v5if->protection.established[0] = true;
}
if (v5l == v5if->secondary_link) {
if (v5if->protection.established[1])
break;
v5if->protection.established[1] = true;
}
v5if = NULL;
break;
}
goto out;
@ -398,6 +460,30 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
v5x_le_ctrl_stop(v5if->control.ctrl);
llist_for_each_entry(v5up, &v5if->user_ports, list)
v5x_le_ctrl_stop(v5up->ctrl);
v5l = NULL;
break;
case V5X_DLADDR_PSTN:
v5if->pstn.established = false;
v5l = NULL;
break;
case V52_DLADDR_LCP:
v5if->lcp.established = false;
/* stop ctrl protocols */
llist_for_each_entry(v5l, &v5if->links, list)
v5x_le_ctrl_stop(v5l->ctrl);
v5l = NULL;
break;
case V52_DLADDR_BCC:
v5if->bcc.established = false;
v5l = NULL;
break;
case V52_DLADDR_PROTECTION:
v5if = v5l->interface;
if (v5l == v5if->primary_link)
v5if->protection.established[0] = false;
if (v5l == v5if->secondary_link)
v5if->protection.established[1] = false;
v5if = NULL;
break;
}
goto out;
@ -426,9 +512,7 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
if (rc < 0)
goto out;
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);
LOGP(DV5, LOGL_DEBUG, "Received message from AN with msg_type %d\n", l3h->msg_type);
switch (dladdr) {
case V5X_DLADDR_PSTN:
@ -443,13 +527,14 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
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? */
/* look-up user port based on L3 addr */
l3_addr = v5x_l3_addr_dec(ntohs(l3h->l3_addr), &is_isdn);
v5up = v5x_user_port_find(v5if, l3_addr, is_isdn);
if (!v5up) {
rc = -ENODEV;
break;
}
rc = v5x_le_pstn_rcv(v5up, l3_addr, l3h->msg_type, &tp);
rc = v5x_le_pstn_dl_rcv(v5up, l3h->msg_type, &tp);
break;
default:
rc = -ENOTSUP;
@ -464,7 +549,9 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
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);
/* look-up user port based on L3 addr */
l3_addr = v5x_l3_addr_dec(ntohs(l3h->l3_addr), &is_isdn);
rc = v5x_le_ctrl_dl_rcv(v5if, l3_addr, is_isdn, l3h->msg_type, &tp);
break;
default:
rc = -ENOTSUP;
@ -475,25 +562,6 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
case V52_DLADDR_BCC:
/* protection protocol (Section 18 G.965) */
switch (l3h->msg_type) {
case V52_CTRL_MSGT_PP_SWITCH_OVER_REQ:
case V52_CTRL_MSGT_PP_SWITCH_OVER_COM:
case V52_CTRL_MSGT_PP_OS_SWITCH_OVER_COM:
case V52_CTRL_MSGT_PP_SWITCH_OVER_ACK:
case V52_CTRL_MSGT_PP_SWITCH_OVER_REJECT:
case V52_CTRL_MSGT_PP_PROTOCOL_ERROR:
case V52_CTRL_MSGT_PP_RESET_SN_COM:
case V52_CTRL_MSGT_PP_RESET_SN_ACK:
rc = v52_rcv_pp(v5if, l3_addr, l3h->msg_type, &tp);
break;
default:
rc = -ENOTSUP;
LOGP(DV5, LOGL_ERROR, "Received unsupported BCC message type %s\n",
osmo_tlv_prot_msg_name(&v5x_ctrl_msg_tlv, l3h->msg_type));
}
break;
case V52_DLADDR_PROTECTION:
/* BCC protocol (Section 17 G.965) */
switch (l3h->msg_type) {
case V52_CTRL_MSGT_ALLOCATION:
case V52_CTRL_MSGT_ALLOCATION_COMPLETE:
case V52_CTRL_MSGT_ALLOCATION_REJECT:
@ -505,7 +573,26 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
case V52_CTRL_MSGT_AN_FAULT:
case V52_CTRL_MSGT_AN_FAULT_ACK:
case V52_CTRL_MSGT_PROTOCOL_ERROR:
rc = v52_rcv_bcc(v5if, l3_addr, l3h->msg_type, &tp);
rc = v52_le_bcc_dl_rcv(v5if, ntohs(l3h->l3_addr), l3h->msg_type, &tp);
break;
default:
rc = -ENOTSUP;
LOGP(DV5, LOGL_ERROR, "Received unsupported BCC message type %s\n",
osmo_tlv_prot_msg_name(&v5x_ctrl_msg_tlv, l3h->msg_type));
}
break;
case V52_DLADDR_PROTECTION:
/* BCC protocol (Section 17 G.965) */
switch (l3h->msg_type) {
case V52_CTRL_MSGT_PP_SWITCH_OVER_REQ:
case V52_CTRL_MSGT_PP_SWITCH_OVER_COM:
case V52_CTRL_MSGT_PP_OS_SWITCH_OVER_COM:
case V52_CTRL_MSGT_PP_SWITCH_OVER_ACK:
case V52_CTRL_MSGT_PP_SWITCH_OVER_REJECT:
case V52_CTRL_MSGT_PP_PROTOCOL_ERROR:
case V52_CTRL_MSGT_PP_RESET_SN_COM:
case V52_CTRL_MSGT_PP_RESET_SN_ACK:
rc = v52_le_pp_dl_rcv(v5l, ntohs(l3h->l3_addr), l3h->msg_type, &tp);
break;
default:
rc = -ENOTSUP;
@ -518,7 +605,7 @@ int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata)
switch (l3h->msg_type) {
case V52_CTRL_MSGT_LCP_LINK_CTRL:
case V52_CTRL_MSGT_LCP_LINK_CTRL_ACK:
rc = v52_rcv_lcp(v5if, l3_addr, l3h->msg_type, &tp);
rc = v5x_le_ctrl_dl_rcv(v5if, ntohs(l3h->l3_addr), 0, l3h->msg_type, &tp);
break;
default:
rc = -ENOTSUP;
@ -540,9 +627,9 @@ out:
}
/* send V5 messages to DL instance, given by dladdr */
int v5x_snd(struct v5x_interface *v5if, uint16_t dladdr, struct msgb *msg)
int v5x_dl_snd(struct v5x_interface *v5if, uint16_t dladdr, struct msgb *msg)
{
struct lapv5_instance *li;
struct lapv5_instance *li = NULL, *li2 = NULL;
switch (dladdr) {
case V5X_DLADDR_PSTN:
@ -555,7 +642,8 @@ int v5x_snd(struct v5x_interface *v5if, uint16_t dladdr, struct msgb *msg)
li = v5if->bcc.li;
break;
case V52_DLADDR_PROTECTION:
li = v5if->protection[0].li;
li = v5if->protection.li[0];
li2 = v5if->protection.li[1];
break;
case V52_DLADDR_LCP:
li = v5if->lcp.li;
@ -568,6 +656,9 @@ int v5x_snd(struct v5x_interface *v5if, uint16_t dladdr, struct msgb *msg)
return -EINVAL;
}
if (li2)
lapv5_dl_data_req(li2, dladdr, msgb_copy(msg, "V5 MSG clone"));
return lapv5_dl_data_req(li, dladdr, msg);
}

View File

@ -202,8 +202,8 @@ enum v5x_ctrl_func_el {
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 v5x_ctrl_func_id {
/* 14.4.2.5.5 Table 57/G.964 - Coding of Control Function 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,
@ -215,29 +215,87 @@ enum v5x_ctrl_func_id {
V5X_CTRL_ID_BLOCKING_STARTED = 0x08,
V5X_CTRL_ID_RESTART_REQUEST = 0x10,
V5X_CTRL_ID_RESTART_COMPLETE = 0x11,
/* 15.4.2 Table 9a/G.965 - Coding of Control Function ID */
V5X_CTRL_ID_UNBLK_ALL_REL_PSTN_ISDN_REQUEST = 0x12,
V5X_CTRL_ID_UNBLK_ALL_REL_PSTN_ISDN_ACCEPTED = 0x13,
V5X_CTRL_ID_UNBLK_ALL_REL_PSTN_ISDN_REJECTED = 0x14,
V5X_CTRL_ID_UNBLK_ALL_REL_PSTN_ISDN_COMPLETED = 0x15,
V5X_CTRL_ID_UNBLK_ALL_REL_PSTN_REQUEST = 0x16,
V5X_CTRL_ID_UNBLK_ALL_REL_PSTN_ACCEPTED = 0x17,
V5X_CTRL_ID_UNBLK_ALL_REL_PSTN_REJECTED = 0x18,
V5X_CTRL_ID_UNBLK_ALL_REL_PSTN_COMPLETED = 0x19,
V5X_CTRL_ID_UNBLK_ALL_REL_ISDN_REQUEST = 0x1a,
V5X_CTRL_ID_UNBLK_ALL_REL_ISDN_ACCEPTED = 0x1b,
V5X_CTRL_ID_UNBLK_ALL_REL_ISDN_REJECTED = 0x1c,
V5X_CTRL_ID_UNBLK_ALL_REL_ISDN_COMPLETED = 0x1d,
V5X_CTRL_ID_BLK_ALL_PSTN_REQUEST = 0x1e,
V5X_CTRL_ID_BLK_ALL_PSTN_ACCEPTED = 0x1f,
V5X_CTRL_ID_BLK_ALL_PSTN_REJECTED = 0x20,
V5X_CTRL_ID_BLK_ALL_PSTN_COMPLETED = 0x21,
V5X_CTRL_ID_BLK_ALL_ISDN_REQUEST = 0x22,
V5X_CTRL_ID_BLK_ALL_ISDN_ACCEPTED = 0x23,
V5X_CTRL_ID_BLK_ALL_ISDN_REJECTED = 0x24,
V5X_CTRL_ID_BLK_ALL_ISDN_COMPLETED = 0x25,
};
extern const struct value_string v5x_ctrl_func_id_str[];
/* 13.4.7.9 Cause */
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,
/* 13.4.7.9 Cause / 17.4.2.6 Table 43/G.965 / 18.5.5 Table 62/G.965 */
enum v5x_ctrl_cause_type {
V5X_CAUSE_T_RESP_TO_STATUS_ENQ = 0x00,
V5X_CAUSE_T_PROTOCOL_DISC_ERROR = 0x01,
V5X_CAUSE_T_L3_ADDRESS_ERROR = 0x03,
V5X_CAUSE_T_MSG_TYPE_UNRECOGNIZED = 0x04,
V5X_CAUSE_T_OUT_OF_SEQUENCE_IE = 0x05,
V5X_CAUSE_T_REPEATED_OPT_IE = 0x06,
V5X_CAUSE_T_MAND_IE_MISSING = 0x07,
V5X_CAUSE_T_UNRECOGNIZED_IE = 0x08,
V5X_CAUSE_T_MAND_IE_CONTENT_ERROR = 0x09,
V5X_CAUSE_T_OPT_IE_CONTENT_ERROR = 0x0a,
V5X_CAUSE_T_MSG_INCOMP_STATE = 0x0b,
V5X_CAUSE_T_REPEATED_MAND_IE = 0x0c,
V5X_CAUSE_T_TOO_MANY_IE = 0x0d,
V5X_CAUSE_T_REF_NR_CODING_ERROR = 0x0f,
};
/* 17.4.2.5 Table 41/G.965 - Reject cause type */
enum v52_bcc_reject_cause_type {
V52_BCC_REJECT_CAUSE_T_UNSPECIFIED = 0x00,
V52_BCC_REJECT_CAUSE_T_ACCESS_NET_FAUL = 0x01,
V52_BCC_REJECT_CAUSE_T_ACCESS_NET_BLOCKED = 0x02,
V52_BCC_REJECT_CAUSE_T_CONN_PRESENT_PSTN = 0x03,
V52_BCC_REJECT_CAUSE_T_CONN_PRESENT_V5_TS = 0x04,
V52_BCC_REJECT_CAUSE_T_CONN_PRESENT_ISDN = 0x05,
V52_BCC_REJECT_CAUSE_T_USER_PORT_UNAVAILABLE = 0x06,
V52_BCC_REJECT_CAUSE_T_DEALLOC_INCOMPAT_DATA = 0x07,
V52_BCC_REJECT_CAUSE_T_DEALLOC_V5_TS_DATA = 0x08,
V52_BCC_REJECT_CAUSE_T_DEALLOC_PORT_DATA = 0x09,
V52_BCC_REJECT_CAUSE_T_DEALLOC_USER_TS_DATA = 0x0a,
V52_BCC_REJECT_CAUSE_T_USER_NOT_PROVISIONED = 0x0b,
V52_BCC_REJECT_CAUSE_T_INVALID_V5_TS_IDENT = 0x0c,
V52_BCC_REJECT_CAUSE_T_INVALID_V5_LINK_IDENT = 0x0d,
V52_BCC_REJECT_CAUSE_T_INVALID_USER_TS_IDENT = 0x0e,
V52_BCC_REJECT_CAUSE_T_V5_TS_USED_CCHANNEL = 0x0f,
V52_BCC_REJECT_CAUSE_T_V5_LINK_UNAVAILABLE = 0x10,
};
/* 18.5.4 Table 61/G.965 - Reject cause type */
enum v52_pp_reject_cause_type {
V52_PP_REJECT_CAUSE_T_NO_STANDBY_CC_AVAILABLE = 0x00,
V52_PP_REJECT_CAUSE_T_TARGET_CC_NOT_OPER = 0x01,
V52_PP_REJECT_CAUSE_T_TARGET_CC_NOT_PROV = 0x02,
V52_PP_REJECT_CAUSE_T_PROT_SWITCHING_IMPOSS = 0x03,
V52_PP_REJECT_CAUSE_T_PROT_GROUP_MISMATCH = 0x04,
V52_PP_REJECT_CAUSE_T_ALLOC_EXISTS_ALREADY = 0x05,
V52_PP_REJECT_CAUSE_T_TARGET_CC_ALREADY_CC = 0x06,
};
extern const struct value_string v5x_cause_type_str[];
extern const struct value_string v52_bcc_reject_cause_type_str[];
extern const struct value_string v52_pp_reject_cause_type_str[];
//const struct osmo_tlv_prot_def v51_ctrl_msg_tlv;
//extern const struct osmo_tlv_prot_def v51_ctrl_msg_tlv;
/* 16.3.2.2 Table 22/G.965 */
enum v52_link_ctrl_func {
@ -251,6 +309,6 @@ enum v52_link_ctrl_func {
V52_LCP_FE_306_NON_DEF_LINK_BLOCK_REQ = 7,
};
int v5x_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata);
int v5x_snd(struct v5x_interface *v5if, uint16_t dladdr, struct msgb *msg);
int v5x_dl_rcv(struct osmo_dlsap_prim *odp, uint16_t dladdr, void *rx_cbdata);
int v5x_dl_snd(struct v5x_interface *v5if, uint16_t dladdr, struct msgb *msg);
struct msgb *msgb_alloc_v5x(void);