Common subdirectories: libpri/CVS and libpri.new/CVS diff -u libpri/pri_q931.h libpri.new/pri_q931.h --- libpri/pri_q931.h 2004-06-05 02:50:55.000000000 -0400 +++ libpri.new/pri_q931.h 2004-06-11 23:56:47.000000000 -0400 @@ -98,13 +98,7 @@ /* Information element format */ typedef struct q931_ie { -#if __BYTE_ORDER == __BIG_ENDIAN - u_int8_t f:1; - u_int8_t ie:7; -#else - u_int8_t ie:7; - u_int8_t f:1; -#endif + u_int8_t ie; u_int8_t len; u_int8_t data[0]; } q931_ie; @@ -165,7 +159,22 @@ #define NATIONAL_CHANGE_STATUS 0x1 /* Q.931 / National ISDN Information Elements */ -#define Q931_LOCKING_SHIFT 0x90 +#define Q931_LOCKING_SHIFT_0 0x90 +#define Q931_LOCKING_SHIFT_1 0x91 +#define Q931_LOCKING_SHIFT_2 0x92 +#define Q931_LOCKING_SHIFT_3 0x93 +#define Q931_LOCKING_SHIFT_4 0x94 +#define Q931_LOCKING_SHIFT_5 0x95 +#define Q931_LOCKING_SHIFT_6 0x96 +#define Q931_LOCKING_SHIFT_7 0x97 +#define Q931_NON_LOCKING_SHIFT_0 0x98 +#define Q931_NON_LOCKING_SHIFT_1 0x99 +#define Q931_NON_LOCKING_SHIFT_2 0x9a +#define Q931_NON_LOCKING_SHIFT_3 0x9b +#define Q931_NON_LOCKING_SHIFT_4 0x9c +#define Q931_NON_LOCKING_SHIFT_5 0x9d +#define Q931_NON_LOCKING_SHIFT_6 0x9e +#define Q931_NON_LOCKING_SHIFT_7 0x9f #define Q931_BEARER_CAPABILITY 0x04 #define Q931_CAUSE 0x08 #define Q931_CALL_STATE 0x14 @@ -194,6 +203,7 @@ #define Q931_DISPLAY 0x28 #define Q931_IE_SEGMENTED_MSG 0x00 #define Q931_IE_CHANGE_STATUS 0x01 +#define Q931_IE_ORIGINATING_LINE_INFO 0x01 #define Q931_IE_CONNECTED_NUM 0x0C #define Q931_IE_CALL_IDENTITY 0x10 #define Q931_IE_FACILITY 0x1c diff -u libpri/q931.c libpri.new/q931.c --- libpri/q931.c 2004-06-10 15:28:14.000000000 -0400 +++ libpri.new/q931.c 2004-06-12 00:28:19.000000000 -0400 @@ -37,7 +37,7 @@ struct msgtype { int msgnum; unsigned char *name; - int mandies[MAX_MAND_IES]; + int mandies[MAX_MAND_IES][2]; }; struct msgtype msgs[] = { @@ -46,26 +46,26 @@ { Q931_CALL_PROCEEDING, "CALL PROCEEDING" }, { Q931_CONNECT, "CONNECT" }, { Q931_CONNECT_ACKNOWLEDGE, "CONNECT ACKNOWLEDGE" }, - { Q931_PROGRESS, "PROGRESS", { Q931_PROGRESS_INDICATOR } }, - { Q931_SETUP, "SETUP", { Q931_BEARER_CAPABILITY, Q931_CHANNEL_IDENT } }, + { Q931_PROGRESS, "PROGRESS", { {0, Q931_PROGRESS_INDICATOR} } }, + { Q931_SETUP, "SETUP", { {0, Q931_BEARER_CAPABILITY}, {0, Q931_CHANNEL_IDENT} } }, { Q931_SETUP_ACKNOWLEDGE, "SETUP ACKNOWLEDGE" }, /* Call disestablishment messages */ - { Q931_DISCONNECT, "DISCONNECT", { Q931_CAUSE } }, + { Q931_DISCONNECT, "DISCONNECT", { {0, Q931_CAUSE} } }, { Q931_RELEASE, "RELEASE" }, { Q931_RELEASE_COMPLETE, "RELEASE COMPLETE" }, - { Q931_RESTART, "RESTART", { Q931_RESTART_INDICATOR } }, - { Q931_RESTART_ACKNOWLEDGE, "RESTART ACKNOWLEDGE", { Q931_RESTART_INDICATOR } }, + { Q931_RESTART, "RESTART", { {0, Q931_RESTART_INDICATOR} } }, + { Q931_RESTART_ACKNOWLEDGE, "RESTART ACKNOWLEDGE", { {0, Q931_RESTART_INDICATOR} } }, /* Miscellaneous */ - { Q931_STATUS, "STATUS", { Q931_CAUSE, Q931_CALL_STATE } }, + { Q931_STATUS, "STATUS", { {0, Q931_CAUSE}, {0, Q931_CALL_STATE} } }, { Q931_STATUS_ENQUIRY, "STATUS ENQUIRY" }, { Q931_USER_INFORMATION, "USER_INFORMATION" }, { Q931_SEGMENT, "SEGMENT" }, { Q931_CONGESTION_CONTROL, "CONGESTION CONTROL" }, { Q931_INFORMATION, "INFORMATION" }, { Q931_FACILITY, "FACILITY" }, - { Q931_NOTIFY, "NOTIFY", { Q931_IE_NOTIFY_IND } }, + { Q931_NOTIFY, "NOTIFY", { {0, Q931_IE_NOTIFY_IND} } }, /* Call Management */ { Q931_HOLD, "HOLD" }, @@ -75,8 +75,8 @@ { Q931_RETRIEVE_ACKNOWLEDGE, "RETRIEVE ACKNOWLEDGE" }, { Q931_RETRIEVE_REJECT, "RETRIEVE REJECT" }, { Q931_RESUME, "RESUME" }, - { Q931_RESUME_ACKNOWLEDGE, "RESUME ACKNOWLEDGE", { Q931_CHANNEL_IDENT } }, - { Q931_RESUME_REJECT, "RESUME REJECT", { Q931_CAUSE } }, + { Q931_RESUME_ACKNOWLEDGE, "RESUME ACKNOWLEDGE", { {0, Q931_CHANNEL_IDENT} } }, + { Q931_RESUME_REJECT, "RESUME REJECT", { {0, Q931_CAUSE} } }, { Q931_SUSPEND, "SUSPEND" }, { Q931_SUSPEND_ACKNOWLEDGE, "SUSPEND ACKNOWLEDGE" }, { Q931_SUSPEND_REJECT, "SUSPEND REJECT" }, @@ -253,6 +253,7 @@ }; struct ie { + int codeset; int ie; char *name; /* Dump an IE for debugging (preceed all lines by prefix) */ @@ -1183,77 +1184,206 @@ { if (!pri->overlapdial && ((pri->switchtype == PRI_SWITCH_EUROISDN_E1) || (pri->switchtype == PRI_SWITCH_EUROISDN_T1))) { /* Include this single-byte IE */ - ie->f = 1; + ie->ie |= 0x80; return 1; } return 0; } -struct ie ies[] = { - { NATIONAL_CHANGE_STATUS, "Change Status" }, - { Q931_LOCKING_SHIFT, "Locking Shift" }, - { Q931_BEARER_CAPABILITY, "Bearer Capability", dump_bearer_capability, receive_bearer_capability, transmit_bearer_capability }, - { Q931_CAUSE, "Cause", dump_cause, receive_cause, transmit_cause }, - { Q931_CALL_STATE, "Call State", dump_call_state, receive_call_state, transmit_call_state }, - { Q931_CHANNEL_IDENT, "Channel Identification", dump_channel_id, receive_channel_id, transmit_channel_id }, - { Q931_PROGRESS_INDICATOR, "Progress Indicator", dump_progress_indicator, receive_progress_indicator, transmit_progress_indicator }, - { Q931_NETWORK_SPEC_FAC, "Network-Specific Facilities" }, - { Q931_INFORMATION_RATE, "Information Rate" }, - { Q931_TRANSIT_DELAY, "End-to-End Transit Delay" }, - { Q931_TRANS_DELAY_SELECT, "Transmit Delay Selection and Indication" }, - { Q931_BINARY_PARAMETERS, "Packet-layer Binary Parameters" }, - { Q931_WINDOW_SIZE, "Packet-layer Window Size" }, - { Q931_CLOSED_USER_GROUP, "Closed User Group" }, - { Q931_REVERSE_CHARGE_INDIC, "Reverse Charging Indication" }, - { Q931_CALLING_PARTY_NUMBER, "Calling Party Number", dump_calling_party_number, receive_calling_party_number, transmit_calling_party_number }, - { Q931_CALLING_PARTY_SUBADDR, "Calling Party Subaddress", dump_calling_party_subaddr }, - { Q931_CALLED_PARTY_NUMBER, "Called Party Number", dump_called_party_number, receive_called_party_number, transmit_called_party_number }, - { Q931_CALLED_PARTY_SUBADDR, "Called Party Subaddress", dump_called_party_subaddr }, - { Q931_REDIRECTING_NUMBER, "Redirecting Number", dump_redirecting_number, receive_redirecting_number }, - { Q931_REDIRECTING_SUBADDR, "Redirecting Subaddress", dump_redirecting_subaddr }, - { Q931_TRANSIT_NET_SELECT, "Transit Network Selection" }, - { Q931_RESTART_INDICATOR, "Restart Indicator", dump_restart_indicator, receive_restart_indicator, transmit_restart_indicator }, - { Q931_LOW_LAYER_COMPAT, "Low-layer Compatibility" }, - { Q931_HIGH_LAYER_COMPAT, "High-layer Compatibility" }, - { Q931_PACKET_SIZE, "Packet Size" }, - { Q931_IE_FACILITY, "Facility" , dump_facility, receive_facility }, - { Q931_IE_REDIRECTION_NUMBER, "Redirection Number" }, - { Q931_IE_REDIRECTION_SUBADDR, "Redirection Subaddress" }, - { Q931_IE_FEATURE_ACTIVATE, "Feature Activation" }, - { Q931_IE_INFO_REQUEST, "Feature Request" }, - { Q931_IE_FEATURE_IND, "Feature Indication" }, - { Q931_IE_SEGMENTED_MSG, "Segmented Message" }, - { Q931_IE_CALL_IDENTITY, "Call Identity", dump_call_identity }, - { Q931_IE_ENDPOINT_ID, "Endpoint Identification" }, - { Q931_IE_NOTIFY_IND, "Notification Indicator" }, - { Q931_DISPLAY, "Display", dump_display, receive_display, transmit_display }, - { Q931_IE_TIME_DATE, "Date/Time", dump_time_date }, - { Q931_IE_KEYPAD_FACILITY, "Keypad Facility" }, - { Q931_IE_SIGNAL, "Signal" }, - { Q931_IE_SWITCHHOOK, "Switch-hook" }, - { Q931_IE_USER_USER, "User-User", dump_user_user, receive_user_user }, - { Q931_IE_ESCAPE_FOR_EXT, "Escape for Extension" }, - { Q931_IE_CALL_STATUS, "Call Status" }, - { Q931_IE_CHANGE_STATUS, "Change Status" }, - { Q931_IE_CONNECTED_NUM, "Connected Number" }, - { Q931_IE_ORIGINAL_CALLED_NUMBER, "Original Called Number" }, - { Q931_IE_USER_USER_FACILITY, "User-User Facility" }, - { Q931_IE_UPDATE, "Update" }, - { Q931_SENDING_COMPLETE, "Sending Complete", dump_sending_complete, receive_sending_complete, transmit_sending_complete }, + +struct ie ies[] = { + { 0, NATIONAL_CHANGE_STATUS, "Change Status" }, + { 0, Q931_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 0, Q931_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 0, Q931_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 0, Q931_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 0, Q931_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 0, Q931_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 0, Q931_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 0, Q931_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 0, Q931_NON_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 0, Q931_NON_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 0, Q931_NON_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 0, Q931_NON_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 0, Q931_NON_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 0, Q931_NON_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 0, Q931_NON_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 0, Q931_NON_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 0, Q931_BEARER_CAPABILITY, "Bearer Capability", dump_bearer_capability, receive_bearer_capability, transmit_bearer_capability }, + { 0, Q931_CAUSE, "Cause", dump_cause, receive_cause, transmit_cause }, + { 0, Q931_CALL_STATE, "Call State", dump_call_state, receive_call_state, transmit_call_state }, + { 0, Q931_CHANNEL_IDENT, "Channel Identification", dump_channel_id, receive_channel_id, transmit_channel_id }, + { 0, Q931_PROGRESS_INDICATOR, "Progress Indicator", dump_progress_indicator, receive_progress_indicator, transmit_progress_indicator }, + { 0, Q931_NETWORK_SPEC_FAC, "Network-Specific Facilities" }, + { 0, Q931_INFORMATION_RATE, "Information Rate" }, + { 0, Q931_TRANSIT_DELAY, "End-to-End Transit Delay" }, + { 0, Q931_TRANS_DELAY_SELECT, "Transmit Delay Selection and Indication" }, + { 0, Q931_BINARY_PARAMETERS, "Packet-layer Binary Parameters" }, + { 0, Q931_WINDOW_SIZE, "Packet-layer Window Size" }, + { 0, Q931_CLOSED_USER_GROUP, "Closed User Group" }, + { 0, Q931_REVERSE_CHARGE_INDIC, "Reverse Charging Indication" }, + { 0, Q931_CALLING_PARTY_NUMBER, "Calling Party Number", dump_calling_party_number, receive_calling_party_number, transmit_calling_party_number }, + { 0, Q931_CALLING_PARTY_SUBADDR, "Calling Party Subaddress", dump_calling_party_subaddr }, + { 0, Q931_CALLED_PARTY_NUMBER, "Called Party Number", dump_called_party_number, receive_called_party_number, transmit_called_party_number }, + { 0, Q931_CALLED_PARTY_SUBADDR, "Called Party Subaddress", dump_called_party_subaddr }, + { 0, Q931_REDIRECTING_NUMBER, "Redirecting Number", dump_redirecting_number, receive_redirecting_number }, + { 0, Q931_REDIRECTING_SUBADDR, "Redirecting Subaddress", dump_redirecting_subaddr }, + { 0, Q931_TRANSIT_NET_SELECT, "Transit Network Selection" }, + { 0, Q931_RESTART_INDICATOR, "Restart Indicator", dump_restart_indicator, receive_restart_indicator, transmit_restart_indicator }, + { 0, Q931_LOW_LAYER_COMPAT, "Low-layer Compatibility" }, + { 0, Q931_HIGH_LAYER_COMPAT, "High-layer Compatibility" }, + { 0, Q931_PACKET_SIZE, "Packet Size" }, + { 0, Q931_IE_REDIRECTION_NUMBER, "Redirection Number" }, + { 0, Q931_IE_REDIRECTION_SUBADDR, "Redirection Subaddress" }, + { 0, Q931_IE_FEATURE_ACTIVATE, "Feature Activation" }, + { 0, Q931_IE_INFO_REQUEST, "Feature Request" }, + { 0, Q931_IE_FEATURE_IND, "Feature Indication" }, + { 0, Q931_IE_SEGMENTED_MSG, "Segmented Message" }, + { 0, Q931_IE_CALL_IDENTITY, "Call Identity", dump_call_identity }, + { 0, Q931_IE_ENDPOINT_ID, "Endpoint Identification" }, + { 0, Q931_IE_NOTIFY_IND, "Notification Indicator" }, + { 0, Q931_DISPLAY, "Display", dump_display, receive_display, transmit_display }, + { 0, Q931_IE_TIME_DATE, "Date/Time", dump_time_date }, + { 0, Q931_IE_KEYPAD_FACILITY, "Keypad Facility" }, + { 0, Q931_IE_SIGNAL, "Signal" }, + { 0, Q931_IE_SWITCHHOOK, "Switch-hook" }, + { 0, Q931_IE_USER_USER, "User-User", dump_user_user, receive_user_user }, + { 0, Q931_IE_ESCAPE_FOR_EXT, "Escape for Extension" }, + { 0, Q931_IE_CALL_STATUS, "Call Status" }, + { 0, Q931_IE_CHANGE_STATUS, "Change Status" }, + { 0, Q931_IE_CONNECTED_NUM, "Connected Number" }, + { 0, Q931_IE_ORIGINAL_CALLED_NUMBER, "Original Called Number" }, + { 0, Q931_IE_USER_USER_FACILITY, "User-User Facility" }, + { 0, Q931_IE_UPDATE, "Update" }, + { 0, Q931_SENDING_COMPLETE, "Sending Complete", dump_sending_complete, receive_sending_complete, transmit_sending_complete }, + { 1, Q931_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 1, Q931_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 1, Q931_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 1, Q931_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 1, Q931_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 1, Q931_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 1, Q931_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 1, Q931_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 1, Q931_NON_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 1, Q931_NON_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 1, Q931_NON_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 1, Q931_NON_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 1, Q931_NON_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 1, Q931_NON_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 1, Q931_NON_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 1, Q931_NON_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 2, Q931_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 2, Q931_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 2, Q931_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 2, Q931_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 2, Q931_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 2, Q931_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 2, Q931_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 2, Q931_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 2, Q931_NON_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 2, Q931_NON_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 2, Q931_NON_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 2, Q931_NON_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 2, Q931_NON_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 2, Q931_NON_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 2, Q931_NON_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 2, Q931_NON_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 3, Q931_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 3, Q931_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 3, Q931_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 3, Q931_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 3, Q931_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 3, Q931_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 3, Q931_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 3, Q931_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 3, Q931_NON_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 3, Q931_NON_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 3, Q931_NON_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 3, Q931_NON_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 3, Q931_NON_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 3, Q931_NON_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 3, Q931_NON_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 3, Q931_NON_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 4, Q931_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 4, Q931_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 4, Q931_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 4, Q931_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 4, Q931_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 4, Q931_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 4, Q931_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 4, Q931_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 4, Q931_NON_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 4, Q931_NON_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 4, Q931_NON_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 4, Q931_NON_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 4, Q931_NON_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 4, Q931_NON_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 4, Q931_NON_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 4, Q931_NON_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 5, Q931_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 5, Q931_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 5, Q931_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 5, Q931_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 5, Q931_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 5, Q931_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 5, Q931_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 5, Q931_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 5, Q931_NON_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 5, Q931_NON_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 5, Q931_NON_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 5, Q931_NON_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 5, Q931_NON_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 5, Q931_NON_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 5, Q931_NON_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 5, Q931_NON_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 6, Q931_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 6, Q931_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 6, Q931_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 6, Q931_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 6, Q931_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 6, Q931_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 6, Q931_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 6, Q931_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 6, Q931_NON_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 6, Q931_NON_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 6, Q931_NON_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 6, Q931_NON_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 6, Q931_NON_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 6, Q931_NON_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 6, Q931_NON_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 6, Q931_NON_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 6, Q931_IE_ORIGINATING_LINE_INFO, "Originating Line Information" }, + { 6, Q931_IE_FACILITY, "Facility" , dump_facility, receive_facility }, + { 7, Q931_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 7, Q931_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 7, Q931_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 7, Q931_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 7, Q931_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 7, Q931_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 7, Q931_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 7, Q931_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, + { 7, Q931_NON_LOCKING_SHIFT_0, "Locking Shift To Codeset 0" }, + { 7, Q931_NON_LOCKING_SHIFT_1, "Locking Shift To Codeset 1" }, + { 7, Q931_NON_LOCKING_SHIFT_2, "Locking Shift To Codeset 2" }, + { 7, Q931_NON_LOCKING_SHIFT_3, "Locking Shift To Codeset 3" }, + { 7, Q931_NON_LOCKING_SHIFT_4, "Locking Shift To Codeset 4" }, + { 7, Q931_NON_LOCKING_SHIFT_5, "Locking Shift To Codeset 5" }, + { 7, Q931_NON_LOCKING_SHIFT_6, "Locking Shift To Codeset 6" }, + { 7, Q931_NON_LOCKING_SHIFT_7, "Locking Shift To Codeset 7" }, }; -static char *ie2str(int ie) +static char *ie2str(int codeset, int ie) { unsigned int x; for (x=0;xf) + if (ie->ie & 0x80) return 1; else return 2 + ie->len; @@ -1296,19 +1426,19 @@ return cr; } -static inline void q931_dumpie(q931_ie *ie, char prefix) +static inline void q931_dumpie(int codeset, q931_ie *ie, char prefix) { unsigned int x; for (x=0;xie) { + if (ies[x].codeset == codeset && ies[x].ie == ie->ie) { if (ies[x].dump) ies[x].dump(ie, ielen(ie), prefix); else - pri_message("%c IE: %s (len = %d)\n", prefix, ies[x].name, ielen(ie)); + pri_message("%c IE: %s (len = %d) (codeset = %d)\n", prefix, ies[x].name, ielen(ie), codeset); return; } - pri_error("!! %c Unknown IE %d (len = %d)\n", prefix, ie->ie, ielen(ie)); + pri_error("!! %c Unknown IE %d (len = %d) (codeset = %d)\n", prefix, ie->ie, ielen(ie),codeset); } static q931_call *q931_getcall(struct pri *pri, int cr) @@ -1394,29 +1524,28 @@ return; } -static int add_ie(struct pri *pri, q931_call *call, int msgtype, int ie, q931_ie *iet, int maxlen) +static int add_ie(struct pri *pri, q931_call *call, int msgtype, int codeset, int ie, q931_ie *iet, int maxlen) { unsigned int x; int res; for (x=0;xf = 0; iet->ie = ie; if (ies[x].transmit) { res = ies[x].transmit(pri, call, msgtype, iet, maxlen); if (res < 0) return res; - if (!iet->f) + if (!(iet->ie&0x80)) iet->len = res - 2; return res; } else { - pri_error("!! Don't know how to add an IE %s (%d)\n", ie2str(ie), ie); + pri_error("!! Don't know how to add an IE %s (%d)\n", ie2str(codeset,ie), ie); return -1; } } } - pri_error("!! Unknown IE %d (%s)\n", ie, ie2str(ie)); + pri_error("!! Unknown IE %d (%s)\n", ie, ie2str(codeset,ie)); return -1; @@ -1438,6 +1567,7 @@ q931_mh *mh; char c; int x=0, r; + int codeset = 0; c = txrx ? '>' : '<'; pri_message("%c Protocol Discriminator: %s (%d) len=%d\n", c, disc2str(h->pd), h->pd, len); pri_message("%c Call Ref: len=%2d (reference %d/0x%X) (%s)\n", c, h->crlen, q931_cr(h), q931_cr(h), (h->crv[0] & 0x80) ? "Terminator" : "Originator"); @@ -1448,30 +1578,32 @@ len -= (h->crlen + 3); while(x < len) { r = ielen((q931_ie *)(mh->data + x)); - q931_dumpie((q931_ie *)(mh->data + x), c); + q931_dumpie(codeset,(q931_ie *)(mh->data + x), c); + if ((((q931_ie *)(mh->data +x))->ie & 0xF8) == Q931_LOCKING_SHIFT_0) + codeset = ((q931_ie *)(mh->data +x))->ie & 0x07; x += r; } if (x > len) pri_error("XXX Message longer than it should be?? XXX\n"); } -static int q931_handle_ie(struct pri *pri, q931_call *c, int msg, q931_ie *ie) +static int q931_handle_ie(struct pri *pri, q931_call *c, int msg, int codeset, q931_ie *ie) { unsigned int x; if (pri->debug & PRI_DEBUG_Q931_STATE) - pri_message("-- Processing IE %d (%s)\n", ie->ie, ie2str(ie->ie)); + pri_message("-- Processing IE %d (%s)\n", ie->ie, ie2str(codeset, ie->ie)); for (x=0;xie == ies[x].ie) { + if (codeset == ies[x].codeset && ie->ie == ies[x].ie) { if (ies[x].receive) return ies[x].receive(pri, c, msg, ie, ielen(ie)); else { if (pri->debug & PRI_DEBUG_Q931_ANOMALY) - pri_error("!! No handler for IE %d (%s)\n", ie->ie, ie2str(ie->ie)); + pri_error("!! No handler for IE %d (%s)\n", ie->ie, ie2str(codeset,ie->ie)); return -1; } } } - pri_message("!! Unknown IE %d (%s)\n", ie->ie, ie2str(ie->ie)); + pri_message("!! Unknown IE %d (%s)\n", ie->ie, ie2str(codeset,ie->ie)); return -1; } @@ -1516,7 +1648,7 @@ return 0; } -static int send_message(struct pri *pri, q931_call *c, int msgtype, int ies[]) +static int send_message(struct pri *pri, q931_call *c, int msgtype, int ies[][2]) { unsigned char buf[1024]; q931_h *h; @@ -1530,10 +1662,10 @@ init_header(pri, c, buf, &h, &mh, &len); mh->msg = msgtype; x=0; - while(ies[x] > -1) { - res = add_ie(pri, c, mh->msg, ies[x], (q931_ie *)(mh->data + offset), len); + while(ies[x][0] > -1) { + res = add_ie(pri, c, mh->msg, ies[x][0], ies[x][1], (q931_ie *)(mh->data + offset), len); if (res < 0) { - pri_error("!! Unable to add IE '%s'\n", ie2str(ies[x])); + pri_error("!! Unable to add Codeset %n : IE '%s'\n", ies[x][0], ie2str(ies[x][0],ies[x][1])); return -1; } offset += res; @@ -1547,7 +1679,7 @@ return 0; } -static int status_ies[] = { Q931_CAUSE, Q931_CALL_STATE, -1 }; +static int status_ies[][2] = { {0,Q931_CAUSE}, {0,Q931_CALL_STATE}, {-1,-1} }; static int q931_status(struct pri *pri, q931_call *c, int cause) { @@ -1575,7 +1707,7 @@ return send_message(pri, cur, Q931_STATUS, status_ies); } -static int information_ies[] = { Q931_CALLED_PARTY_NUMBER, -1 }; +static int information_ies[][2] = { {0,Q931_CALLED_PARTY_NUMBER}, {-1,-1} }; int q931_information(struct pri *pri, q931_call *c, char digit) { @@ -1584,7 +1716,7 @@ return send_message(pri, c, Q931_INFORMATION, information_ies); } -static int restart_ack_ies[] = { Q931_CHANNEL_IDENT, Q931_RESTART_INDICATOR, -1 }; +static int restart_ack_ies[][2] = { {0,Q931_CHANNEL_IDENT}, {0,Q931_RESTART_INDICATOR}, {-1,-1} }; static int restart_ack(struct pri *pri, q931_call *c) { @@ -1594,9 +1726,9 @@ } #ifdef ALERTING_NO_PROGRESS -static int call_progress_ies[] = { -1 }; +static int call_progress_ies[][2] = { {-1,-1} }; #else -static int call_progress_ies[] = { Q931_PROGRESS_INDICATOR, -1 }; +static int call_progress_ies[][2] = { {0,Q931_PROGRESS_INDICATOR}, {-1,-1} }; #endif int q931_call_progress(struct pri *pri, q931_call *c, int channel, int info) @@ -1617,9 +1749,9 @@ } #ifdef ALERTING_NO_PROGRESS -static int call_proceeding_ies[] = { Q931_CHANNEL_IDENT, -1 }; +static int call_proceeding_ies[][2] = { {0,Q931_CHANNEL_IDENT}, {-1,-1} }; #else -static int call_proceeding_ies[] = { Q931_CHANNEL_IDENT, Q931_PROGRESS_INDICATOR, -1 }; +static int call_proceeding_ies[][2] = { {0,Q931_CHANNEL_IDENT}, {0,Q931_PROGRESS_INDICATOR}, {-1,-1} }; #endif int q931_call_proceeding(struct pri *pri, q931_call *c, int channel, int info) @@ -1644,9 +1776,9 @@ return send_message(pri, c, Q931_CALL_PROCEEDING, call_proceeding_ies); } #ifndef ALERTING_NO_PROGRESS -static int alerting_ies[] = { Q931_PROGRESS_INDICATOR, -1 }; +static int alerting_ies[][2] = { {0,Q931_PROGRESS_INDICATOR}, {-1,-1} }; #else -static int alerting_ies[] = { -1 }; +static int alerting_ies[][2] = { {-1,-1} }; #endif int q931_alerting(struct pri *pri, q931_call *c, int channel, int info) @@ -1665,7 +1797,7 @@ return send_message(pri, c, Q931_ALERTING, alerting_ies); } -static int connect_ies[] = { Q931_CHANNEL_IDENT, Q931_PROGRESS_INDICATOR, -1 }; +static int connect_ies[][2] = { {0,Q931_CHANNEL_IDENT}, {0,Q931_PROGRESS_INDICATOR}, {-1,-1} }; int q931_setup_ack(struct pri *pri, q931_call *c, int channel, int nonisdn) { @@ -1764,7 +1896,7 @@ return send_message(pri, c, Q931_CONNECT, connect_ies); } -static int release_ies[] = { Q931_CAUSE, -1 }; +static int release_ies[][2] = { {0,Q931_CAUSE}, {-1,-1} }; int q931_release(struct pri *pri, q931_call *c, int cause) { @@ -1790,7 +1922,7 @@ return 0; } -static int restart_ies[] = { Q931_CHANNEL_IDENT, Q931_RESTART_INDICATOR, -1 }; +static int restart_ies[][2] = { {0,Q931_CHANNEL_IDENT}, {0,Q931_RESTART_INDICATOR}, {-1,-1} }; int q931_restart(struct pri *pri, int channel) { @@ -1811,7 +1943,7 @@ return send_message(pri, c, Q931_RESTART, restart_ies); } -static int disconnect_ies[] = { Q931_CAUSE, -1 }; +static int disconnect_ies[][2] = { {0,Q931_CAUSE}, {-1,-1} }; int q931_disconnect(struct pri *pri, q931_call *c, int cause) { @@ -1831,10 +1963,10 @@ return 0; } -static int setup_ies[] = { Q931_BEARER_CAPABILITY, Q931_CHANNEL_IDENT, Q931_DISPLAY, Q931_PROGRESS_INDICATOR, - Q931_CALLING_PARTY_NUMBER, Q931_CALLED_PARTY_NUMBER, Q931_SENDING_COMPLETE, -1 }; +static int setup_ies[][2] = { {0,Q931_BEARER_CAPABILITY}, {0,Q931_CHANNEL_IDENT}, {0,Q931_DISPLAY}, {0,Q931_PROGRESS_INDICATOR}, + {0,Q931_CALLING_PARTY_NUMBER}, {0,Q931_CALLED_PARTY_NUMBER}, {0,Q931_SENDING_COMPLETE}, {-1,-1} }; -static int gr303_setup_ies[] = { Q931_BEARER_CAPABILITY, Q931_CHANNEL_IDENT, -1 }; +static int gr303_setup_ies[][2] = { {0,Q931_BEARER_CAPABILITY}, {0,Q931_CHANNEL_IDENT}, {-1,-1} }; int q931_setup(struct pri *pri, q931_call *c, int transmode, int channel, int exclusive, int nonisdn, char *caller, int callerplan, char *callername, int callerpres, char *called, @@ -1905,7 +2037,7 @@ } -static int release_complete_ies[] = { -1 }; +static int release_complete_ies[][2] = { {-1,-1} }; static int q931_release_complete(struct pri *pri, q931_call *c, int cause) { @@ -1926,9 +2058,9 @@ return res; } -static int connect_acknowledge_ies[] = { -1 }; +static int connect_acknowledge_ies[][2] = { {-1,-1} }; -static int gr303_connect_acknowledge_ies[] = { Q931_CHANNEL_IDENT, -1 }; +static int gr303_connect_acknowledge_ies[][2] = { {0,Q931_CHANNEL_IDENT}, {-1,-1} }; static int q931_connect_acknowledge(struct pri *pri, q931_call *c) { @@ -2031,10 +2163,11 @@ q931_call *c; q931_ie *ie; unsigned int x; + int codeset = 0; int y; int res; int r; - int mandies[MAX_MAND_IES]; + int mandies[MAX_MAND_IES][2]; int missingmand; if (pri->debug & PRI_DEBUG_Q931_DUMP) q931_dump(h, len, 0); @@ -2182,26 +2315,30 @@ while(len) { ie = (q931_ie *)(mh->data + x); for (y=0;yie) - mandies[y] = 0; + if (mandies[y][1] == ie->ie) + mandies[y][1] = 0; } r = ielen(ie); if (r > len) { pri_error("XXX Message longer than it should be?? XXX\n"); return -1; } - y = q931_handle_ie(pri, c, mh->msg, ie); - if (!(ie->ie & 0xf0) && (y < 0)) - mandies[MAX_MAND_IES - 1] = ie->ie; + y = q931_handle_ie(pri, c, mh->msg, codeset, ie); + if (!(ie->ie & 0xf0) && (y < 0) && codeset == 0) { + mandies[MAX_MAND_IES - 1][1] = ie->ie; + mandies[MAX_MAND_IES - 1][0] = codeset; + } + if ((ie->ie & 0xF8) == Q931_LOCKING_SHIFT_0) + codeset = ie->ie & 0x07; x += r; len -= r; } missingmand = 0; for (x=0;x that's not an error */ - if ((pri->localtype != PRI_NETWORK) || (mh->msg != Q931_SETUP) || (mandies[x] != Q931_CHANNEL_IDENT)) { - pri_error("XXX Missing mandatory IE %d/%s XXX\n", mandies[x], ie2str(mandies[x])); + if ((pri->localtype != PRI_NETWORK) || (mh->msg != Q931_SETUP) || (mandies[x][1] != Q931_CHANNEL_IDENT)) { + pri_error("XXX Missing mandatory IE %d/%s XXX\n", mandies[x][1], ie2str(mandies[x][0],mandies[x][1])); missingmand++; } }