[libss7-commits] rmudgett: trunk r323 - /trunk/

SVN commits to the libss7 project libss7-commits at lists.digium.com
Mon Jun 9 14:48:55 CDT 2014


Author: rmudgett
Date: Mon Jun  9 14:48:47 2014
New Revision: 323

URL: http://svnview.digium.com/svn/libss7?view=rev&rev=323
Log:
libss7: Dual seizure improvements.

* Dual seizure - check for IAM pending in addition to IAM sent.

* ISUP_RSC - we should still respond to RSC.

* Ignore unexpected messages when relevant timers are active and we are
waiting for RLC.  - Thanks to Pavel Troller for discovering and suggested
fix.

* Check both DPC and OPC when receiving a message to confirm it is for us.
- Thanks to Pavel Troller and Gustavo Marsico for discovering.

* Fixed handling of got_sent_msg flags on RSC/REL/RLC - no more stale
channels or missed blocking messages.

* Check for DPC only for signalling messages in mtp3_receive().

* Minor FAR message fixes, added FRJ message support.

* Improve SS7 debug message decoding to know about more fields.

SS7-27
Reported by: adomjan
Patches:
      SS7-27_libss7_trunk2_v13.diff (license #5506) patch uploaded by Kaloyan Kovachev

Review: https://reviewboard.asterisk.org/r/2150/

Modified:
    trunk/isup.c
    trunk/isup.h
    trunk/libss7.h
    trunk/mtp3.c
    trunk/ss7_internal.h
    trunk/ss7linktest.c

Modified: trunk/isup.c
URL: http://svnview.digium.com/svn/libss7/trunk/isup.c?view=diff&rev=323&r1=322&r2=323
==============================================================================
--- trunk/isup.c (original)
+++ trunk/isup.c Mon Jun  9 14:48:47 2014
@@ -77,6 +77,8 @@
 
 
 static int acm_params[] = {ISUP_PARM_BACKWARD_CALL_IND, -1};
+
+static int frj_params[] = {ISUP_PARM_FACILITY_IND, ISUP_PARM_CALL_REF, -1};
 
 static int faa_params[] = {ISUP_PARM_FACILITY_IND, ISUP_PARM_CALL_REF, -1};
 
@@ -142,6 +144,7 @@
 	{ISUP_UCIC, 0, 0, 0, 1, empty_params},
 	{ISUP_CQM, 0, 1, 0, 0, greset_params},
 	{ISUP_CQR, 0, 2, 0, 0, cqr_params},
+	{ISUP_FRJ, 1, 0, 1, -1, frj_params},
 	{ISUP_FAA, 1, 0, 1, -1, faa_params},
 	{ISUP_FAR, 1, 0, 1, -1, far_params},
 	{ISUP_CFN, 0, 1, 1, 0, rel_params},
@@ -2656,56 +2659,114 @@
 }
 
 static struct parm_func parms[] = {
+	{ISUP_PARM_CALL_REF, "Call Reference", call_ref_dump, call_ref_receive, call_ref_transmit},
+	{ISUP_PARM_TRANSMISSION_MEDIUM_REQS, "Transmission Medium Requirements", transmission_medium_reqs_dump, transmission_medium_reqs_receive, transmission_medium_reqs_transmit},
+	{ISUP_PARM_ACCESS_TRANS, "Access Transport", access_transport_dump, access_transport_receive, access_transport_transmit},
+	{ISUP_PARM_CALLED_PARTY_NUM, "Called Party Number", called_party_num_dump, called_party_num_receive, called_party_num_transmit},
+	{ISUP_PARM_SUBSEQUENT_NUMBER, "Subsequent Number", subs_num_dump, subs_num_receive, subs_num_transmit},
 	{ISUP_PARM_NATURE_OF_CONNECTION_IND, "Nature of Connection Indicator", nature_of_connection_ind_dump, nature_of_connection_ind_receive, nature_of_connection_ind_transmit },
 	{ISUP_PARM_FORWARD_CALL_IND, "Forward Call Indicators", forward_call_ind_dump, forward_call_ind_receive, forward_call_ind_transmit },
+	{ISUP_PARM_OPT_FORWARD_CALL_INDICATOR, "Optional forward call indicator", opt_forward_call_ind_dump, opt_forward_call_ind_receive, opt_forward_call_ind_transmit},
 	{ISUP_PARM_CALLING_PARTY_CAT, "Calling Party's Category", calling_party_cat_dump, calling_party_cat_receive, calling_party_cat_transmit},
-	{ISUP_PARM_TRANSMISSION_MEDIUM_REQS, "Transmission Medium Requirements", transmission_medium_reqs_dump, transmission_medium_reqs_receive, transmission_medium_reqs_transmit},
+	{ISUP_PARM_CALLING_PARTY_NUM, "Calling Party Number", calling_party_num_dump, calling_party_num_receive, calling_party_num_transmit},
+	{ISUP_PARM_REDIRECTING_NUMBER, "Redirecting Number", redirecting_number_dump, redirecting_number_receive, redirecting_number_transmit},
+	{ISUP_PARM_REDIRECTION_NUMBER, "Redirection Number"},
+	{ISUP_PARM_CONNECTION_REQ, "Connection Request"},
+	{ISUP_PARM_INR_IND, "Information Request Indicators", inr_ind_dump, inr_ind_receive, inr_ind_transmit},
+	{ISUP_PARM_INF_IND, "Information Indicators", inf_ind_dump, inf_ind_receive, inf_ind_transmit},
+	{ISUP_PARM_CONTINUITY_IND, "Continuity Indicator", continuity_ind_dump, continuity_ind_receive, continuity_ind_transmit},
+	{ISUP_PARM_BACKWARD_CALL_IND, "Backward Call Indicator", backward_call_ind_dump, backward_call_ind_receive, backward_call_ind_transmit},
+	{ISUP_PARM_CAUSE, "Cause Indicator", cause_dump, cause_receive, cause_transmit},
+	{ISUP_PARM_REDIRECTION_INFO, "Redirection Information", redirection_info_dump, redirection_info_receive, redirection_info_transmit},
+	{ISUP_PARM_CIRCUIT_GROUP_SUPERVISION_IND, "Circuit Group Supervision Indicator", circuit_group_supervision_dump, circuit_group_supervision_receive, circuit_group_supervision_transmit},
+	{ISUP_PARM_RANGE_AND_STATUS, "Range and status", range_and_status_dump, range_and_status_receive, range_and_status_transmit},
+	{ISUP_PARM_CALL_MODIFICATION_IND, "Call modification indicators"},
+	{ISUP_PARM_FACILITY_IND, "Facility Indicator", facility_ind_dump, facility_ind_receive, facility_ind_transmit},
+	{ISUP_PARM_CUG_INTERLOCK_CODE, "CUG Interlock Code", cug_interlock_code_dump, cug_interlock_code_receive, cug_interlock_code_transmit},
 	{ISUP_PARM_USER_SERVICE_INFO, "User Service Information", NULL, user_service_info_receive, user_service_info_transmit},
-	{ISUP_PARM_CALLED_PARTY_NUM, "Called Party Number", called_party_num_dump, called_party_num_receive, called_party_num_transmit},
-	{ISUP_PARM_CAUSE, "Cause Indicator", cause_dump, cause_receive, cause_transmit},
-	{ISUP_PARM_CONTINUITY_IND, "Continuity Indicator", continuity_ind_dump, continuity_ind_receive, continuity_ind_transmit},
-	{ISUP_PARM_ACCESS_TRANS, "Access Transport", access_transport_dump, access_transport_receive, access_transport_transmit},
-	{ISUP_PARM_BUSINESS_GRP, "Business Group"},
-	{ISUP_PARM_CALL_REF, "Call Reference", call_ref_dump, call_ref_receive, call_ref_transmit},
-	{ISUP_PARM_CALLING_PARTY_NUM, "Calling Party Number", calling_party_num_dump, calling_party_num_receive, calling_party_num_transmit},
-	{ISUP_PARM_CARRIER_ID, "Carrier Identification", carrier_identification_dump, carrier_identification_receive, carrier_identification_transmit},
-	{ISUP_PARM_SELECTION_INFO, "Selection Information"},
-	{ISUP_PARM_CHARGE_NUMBER, "Charge Number", charge_number_dump, charge_number_receive, charge_number_transmit},
+	{ISUP_PARM_SIGNALLING_PC, "Signalling point code"},
+	{ISUP_PARM_USER_TO_USER_INFO, "User to user information"},
+	{ISUP_CONNECTED_NUMBER, "Connected Number", connected_num_dump, connected_num_receive, connected_num_transmit},
+	{ISUP_PARM_SUSPEND_RESUME_IND, "Suspend/Resume Indicators", suspend_resume_ind_dump, suspend_resume_ind_receive, suspend_resume_ind_transmit},
+	{ISUP_PARM_TRANSIT_NETWORK_SELECTION, "Transit Network Selection", tns_dump, tns_receive, tns_transmit},
+	{ISUP_PARM_EVENT_INFO, "Event Information", event_info_dump, event_info_receive, event_info_transmit},
 	{ISUP_PARM_CIRCUIT_ASSIGNMENT_MAP, "Circuit Assignment Map"},
-	{ISUP_PARM_CONNECTION_REQ, "Connection Request"},
-	{ISUP_PARM_CUG_INTERLOCK_CODE, "Interlock Code", cug_interlock_code_dump, cug_interlock_code_receive, cug_interlock_code_transmit},
-	{ISUP_PARM_EGRESS_SERV, "Egress Service"},
+	{ISUP_PARM_CIRCUIT_STATE_IND, "Circuit State Indicator", circuit_state_ind_dump, NULL, circuit_state_ind_transmit},
+	{ISUP_PARAM_AUTOMATIC_CONGESTION_LEVEL, "Automatic congestion level"},
+	{ISUP_PARM_ORIGINAL_CALLED_NUM, "Original called number", original_called_num_dump, original_called_num_receive, original_called_num_transmit},
+	{ISUP_PARM_OPT_BACKWARD_CALL_IND, "Optional Backward Call Indicator", opt_backward_call_ind_dump, opt_backward_call_ind_receive, NULL},
+	{ISUP_PARM_USER_TO_USER_IND, "User to user indicators"},
+	{ISUP_PARM_ORIGINATION_ISC_PC, "Origination ISC point code"},
+	{ISUP_PARM_GENERIC_NOTIFICATION_IND, "Generic Notification Indication", generic_notification_ind_dump, generic_notification_ind_receive, generic_notification_ind_transmit},
+	{ISUP_PARM_CALL_HISTORY_INFO, "Call history information"},
+	{ISUP_PARM_ACCESS_DELIVERY_INFO, "Access Delivery Information", },
+	{ISUP_PARM_NETWORK_SPECIFIC_FACILITY, "Network specific facility"},
+	{ISUP_PARM_USER_SERVICE_INFO_PRIME, "User service information prime"},
+	{ISUP_PARM_PROPAGATION_DELAY, "Propagation Delay Counter", propagation_delay_cntr_dump},
+	{ISUP_PARM_REMOTE_OPERATIONS, "Remote operations"},
+	{ISUP_PARM_SERVICE_ACTIVATION, "Service activation"},
+	{ISUP_PARM_USER_TELESERVICE_INFO, "User teleservice information"},
+	{ISUP_PARM_TRANSMISSION_MEDIUM_USED, "Transmission medium used"},
+	{ISUP_PARM_CALL_DIVERSION_INFO, "Call diversion information"},
+	{ISUP_PARM_ECHO_CONTROL_INFO, "Echo Control Information", echo_control_info_dump, NULL, NULL},
+	{ISUP_PARM_MESSAGE_COMPAT_INFO, "Message compatibility information"},
+	{ISUP_PARM_PARAMETER_COMPAT_INFO, "Parameter Compatibility Information", parameter_compat_info_dump, NULL, NULL},
+	{ISUP_PARM_MLPP_PRECEDENCE, "MLPP precedence"},
+	{ISUP_PARM_MCID_REQUEST_IND, "MCID request indicators"},
+	{ISUP_PARM_MCID_RESPONSE_IND, "MCID response indicators"},
+	{ISUP_PARM_HOP_COUNTER, "Hop Counter", hop_counter_dump, hop_counter_receive, hop_counter_transmit},
+	{ISUP_PARM_TRANSMISSION_MEDIUM_REQ_PRIME, "Transmission medium requirement prime"},
+	{ISUP_PARM_LOCATION_NUMBER, "Location Number"},
+	{ISUP_PARM_REDIRECTION_NUM_RESTRICTION, "Redirection number restriction"},
+	{ISUP_PARM_CALL_TRANSFER_REFERENCE, "Call transfer reference"},
+	{ISUP_PARM_LOOP_PREVENTION_IND, "Loop prevention indicators"},
+	{ISUP_PARM_CALL_TRANSFER_NUMBER, "Call transfer number"},
+	{ISUP_PARM_CCSS, "CCSS"},
+	{ISUP_PARM_FORWARD_GVNS, "Forward GVNS"},
+	{ISUP_PARM_BACKWARD_GVNS, "Backward GVNS"},
+	{ISUP_PARM_REDIRECT_CAPABILITY, "Redirect capability"},
+	{ISUP_PARM_NETWORK_MANAGEMENT_CONTROL, "Network management controls"},
+	{ISUP_PARM_CORRELATION_ID, "Correlation id"},
+	{ISUP_PARM_SCF_ID, "SCF id"},
+	{ISUP_PARM_CALL_DIVERSION_TREATMENT_IND, "Call diversion treatment indicators"},
+	{ISUP_PARM_CALLED_IN_NUMBER, "Called IN number"},
+	{ISUP_PARM_CALL_OFFERING_TREATMENT_IND, "Call offering treatment indicators"},
+	{ISUP_PARM_CHARGED_PARTY_IDENT, "Charged party identification"},
+	{ISUP_PARM_CONFERENCE_TREATMENT_IND, "Conference treatment indicators"},
+	{ISUP_PARM_DISPLAY_INFO, "Display information"},
+	{ISUP_PARM_UID_ACTION_IND, "UID action indicators"},
+	{ISUP_PARM_UID_CAPABILITY_IND, "UID capability indicators"},
+	{ISUP_PARM_REDIRECT_COUNTER, "Redirect Counter", redirect_counter_dump, redirect_counter_receive, redirect_counter_transmit},
+	{ISUP_PARM_APPLICATION_TRANSPORT, "Application transport"},
+	{ISUP_PARM_COLLECT_CALL_REQUEST, "Collect call request"},
+	{ISUP_PARM_CCNR_POSSIBLE_IND, "CCNR possible indicator"},
+	{ISUP_PARM_PIVOT_CAPABILITY, "Pivot capability"},
+	{ISUP_PARM_PIVOT_ROUTING_IND, "Pivot routing indicators"},
+	{ISUP_PARM_CALLED_DIRECTORY_NUMBER, "Called directory number"},
+	{ISUP_PARM_ORIGINAL_CALLED_IN_NUM, "Original called IN number"},
+	{ISUP_PARM_CALLING_GEODETIC_LOCATION, "Calling geodetic location"},
+	{ISUP_PARM_HTR_INFO, "HTR information"},
+	{ISUP_PARM_NETWORK_ROUTING_NUMBER, "Network routing number"},
+	{ISUP_PARM_QUERY_ON_RELEASE_CAPABILITY, "Query on release capability"},
+	{ISUP_PARM_PIVOT_STATUS, "Pivot status"},
+	{ISUP_PARM_PIVOT_COUNTER, "Pivot counter"},
+	{ISUP_PARM_PIVOT_ROUTING_FORWARD_IND, "Pivot routing forward information"},
+	{ISUP_PARM_PIVOT_ROUTING_BACKWARD_IND, "Pivot routing backward information"},
+	{ISUP_PARM_REDIRECT_STATUS, "Redirect status"},
+	{ISUP_PARM_REDIRECT_FORWARD_INFO, "Redirect forward information"},
+	{ISUP_PARM_REDIRECT_BACKWARD_INFO, "Redirect backward information"},
+	{ISUP_PARM_NUM_PORTABILITY_FORWARD_INFO, "Number portability forward information"},
 	{ISUP_PARM_GENERIC_ADDR, "Generic Address", generic_address_dump, generic_address_receive, generic_address_transmit},
 	{ISUP_PARM_GENERIC_DIGITS, "Generic Digits", generic_digits_dump, generic_digits_receive, generic_digits_transmit},
+	{ISUP_PARM_EGRESS_SERV, "Egress Service"},
+	{ISUP_PARM_JIP, "Jurisdiction Information Parameter", jip_dump, jip_receive, jip_transmit},
+	{ISUP_PARM_CARRIER_ID, "Carrier Identification", carrier_identification_dump, carrier_identification_receive, carrier_identification_transmit},
+	{ISUP_PARM_BUSINESS_GRP, "Business Group"},
 	{ISUP_PARM_GENERIC_NAME, "Generic Name", generic_name_dump, generic_name_receive, generic_name_transmit},
-	{ISUP_PARM_TRANSIT_NETWORK_SELECTION, "Transit Network Selection", tns_dump, tns_receive, tns_transmit},
-	{ISUP_PARM_GENERIC_NOTIFICATION_IND, "Generic Notification Indication", generic_notification_ind_dump, generic_notification_ind_receive, generic_notification_ind_transmit},
-	{ISUP_PARM_PROPAGATION_DELAY, "Propagation Delay Counter", propagation_delay_cntr_dump},
-	{ISUP_PARM_HOP_COUNTER, "Hop Counter", hop_counter_dump, hop_counter_receive, hop_counter_transmit},
-	{ISUP_PARM_BACKWARD_CALL_IND, "Backward Call Indicator", backward_call_ind_dump, backward_call_ind_receive, backward_call_ind_transmit},
-	{ISUP_PARM_OPT_BACKWARD_CALL_IND, "Optional Backward Call Indicator", opt_backward_call_ind_dump, opt_backward_call_ind_receive, NULL},
-	{ISUP_PARM_CIRCUIT_GROUP_SUPERVISION_IND, "Circuit Group Supervision Indicator", circuit_group_supervision_dump, circuit_group_supervision_receive, circuit_group_supervision_transmit},
-	{ISUP_PARM_RANGE_AND_STATUS, "Range and status", range_and_status_dump, range_and_status_receive, range_and_status_transmit},
-	{ISUP_PARM_EVENT_INFO, "Event Information", event_info_dump, event_info_receive, event_info_transmit},
-	{ISUP_PARM_OPT_FORWARD_CALL_INDICATOR, "Optional forward call indicator", opt_forward_call_ind_dump, opt_forward_call_ind_receive, opt_forward_call_ind_transmit},
-	{ISUP_PARM_LOCATION_NUMBER, "Location Number"},
+	{ISUP_PARM_LOCAL_SERVICE_PROVIDER_IDENTIFICATION, "Local Service Provider ID", lspi_dump, lspi_receive, lspi_transmit},
 	{ISUP_PARM_ORIG_LINE_INFO, "Originating line information", originating_line_information_dump, originating_line_information_receive, originating_line_information_transmit},
-	{ISUP_PARM_REDIRECTION_INFO, "Redirection Information", redirection_info_dump, redirection_info_receive, redirection_info_transmit},
-	{ISUP_PARM_ORIGINAL_CALLED_NUM, "Original called number", original_called_num_dump, original_called_num_receive, original_called_num_transmit},
-	{ISUP_PARM_JIP, "Jurisdiction Information Parameter", jip_dump, jip_receive, jip_transmit},
-	{ISUP_PARM_ECHO_CONTROL_INFO, "Echo Control Information", echo_control_info_dump, NULL, NULL},
-	{ISUP_PARM_PARAMETER_COMPAT_INFO, "Parameter Compatibility Information", parameter_compat_info_dump, NULL, NULL},
-	{ISUP_PARM_CIRCUIT_STATE_IND, "Circuit State Indicator", circuit_state_ind_dump, NULL, circuit_state_ind_transmit},
-	{ISUP_PARM_LOCAL_SERVICE_PROVIDER_IDENTIFICATION, "Local Service Provider ID", lspi_dump, lspi_receive, lspi_transmit},
-	{ISUP_PARM_FACILITY_IND, "Facility Indicator", facility_ind_dump, facility_ind_receive, facility_ind_transmit},
-	{ISUP_PARM_REDIRECTING_NUMBER, "Redirecting Number", redirecting_number_dump, redirecting_number_receive, redirecting_number_transmit},
-	{ISUP_PARM_ACCESS_DELIVERY_INFO, "Access Delivery Information", },
-	{ISUP_PARM_REDIRECT_COUNTER, "Redirect Counter", redirect_counter_dump, redirect_counter_receive, redirect_counter_transmit},
-	{ISUP_PARM_SUSPEND_RESUME_IND, "Suspend/Resume Indicators", suspend_resume_ind_dump, suspend_resume_ind_receive, suspend_resume_ind_transmit},
-	{ISUP_PARM_INR_IND, "Information Request Indicators", inr_ind_dump, inr_ind_receive, inr_ind_transmit},
-	{ISUP_PARM_INF_IND, "Information Indicators", inf_ind_dump, inf_ind_receive, inf_ind_transmit},
-	{ISUP_PARM_SUBSEQUENT_NUMBER, "Subsequent Number", subs_num_dump, subs_num_receive, subs_num_transmit},
-	{ISUP_CONNECTED_NUMBER, "Connected Number", connected_num_dump, connected_num_receive, connected_num_transmit}
+	{ISUP_PARM_CHARGE_NUMBER, "Charge Number", charge_number_dump, charge_number_receive, charge_number_transmit},
+	{ISUP_PARM_SELECTION_INFO, "Selection Information"}
 };
 
 static char * param2str(int parm)
@@ -2732,6 +2793,17 @@
 	c->calling_party_cat = 0x0a;	/* Default to Ordinary calling subscriber */
 }
 
+static void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc)
+{
+	c->cic = cic;
+	c->dpc = dpc;
+	if (ss7->switchtype == SS7_ANSI) {
+		c->sls = ansi_sls_next(ss7);
+	} else {
+		c->sls = cic & 0xf;
+	}
+}
+
 static struct isup_call * __isup_new_call(struct ss7 *ss7, int nolink)
 {
 	struct isup_call *c, *cur;
@@ -2760,9 +2832,17 @@
 	return c;
 }
 
-struct isup_call * isup_new_call(struct ss7 *ss7)
-{
-	return __isup_new_call(ss7, 0);
+struct isup_call * isup_new_call(struct ss7 *ss7, int cic, unsigned int dpc, int outgoing)
+{
+	struct isup_call *c = __isup_new_call(ss7, 0);
+
+	if (c) {
+		isup_init_call(ss7, c, cic, dpc);
+		if (outgoing) {
+			c->got_sent_msg |= ISUP_PENDING_IAM;
+		}
+	}
+	return c;
 }
 
 void isup_set_call_dpc(struct isup_call *c, unsigned int dpc)
@@ -2948,17 +3028,6 @@
 void isup_set_calling_party_category(struct isup_call *c, unsigned int category)
 {
 	c->calling_party_cat = category;
-}
-
-void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc)
-{
-	c->cic = cic;
-	c->dpc = dpc;
-	if (ss7->switchtype == SS7_ANSI) {
-		c->sls = ansi_sls_next(ss7);
-	} else {
-		c->sls = cic & 0xf;
-	}
 }
 
 static struct isup_call * isup_find_call(struct ss7 *ss7, struct routing_label *rl, int cic)
@@ -3410,7 +3479,10 @@
 {
 	int res;
 
-	if (c->got_sent_msg & (ISUP_CALL_CONNECTED)) {
+	if ((c->got_sent_msg & (ISUP_CALL_CONNECTED)) ||
+			(c->got_sent_msg & (ISUP_SENT_REL | ISUP_SENT_RSC) &&
+			(ss7->isup_timers[ISUP_TIMER_T1] && ss7->isup_timers[ISUP_TIMER_T5]
+			&& ss7->isup_timers[ISUP_TIMER_T16] && ss7->isup_timers[ISUP_TIMER_T17]))) {
 		ss7_message(ss7, "ignoring... \n");
 	} else {
 		ss7_message(ss7, "reseting the cic\n");
@@ -3676,8 +3748,8 @@
 			return 0;
 		case ISUP_RSC:
 			if (c->got_sent_msg & ISUP_SENT_RSC) {
-				ss7_message(ss7, "Got RSC on CIC %d DPC %d, but we have sent RSC too. Ignoring!!!\n", c->cic, opc);
-				return 0;
+				ss7_debug_msg(ss7, SS7_DEBUG_ISUP, "Got RSC on CIC %d DPC %d, but we have sent RSC too.\n", c->cic, opc);
+				return isup_send_message(ss7, c, ISUP_RLC, empty_params);
 			}
 			e = ss7_next_empty_event(ss7);
 			if (!e) {
@@ -3707,7 +3779,7 @@
 			isup_stop_timer(ss7, c, ISUP_TIMER_T6);
 			isup_stop_timer(ss7, c, ISUP_TIMER_T35);
 			isup_stop_timer(ss7, c, ISUP_TIMER_T10);
-			c->got_sent_msg &= ~(ISUP_CALL_CONNECTED | ISUP_SENT_IAM | ISUP_GOT_IAM | ISUP_GOT_CCR | ISUP_SENT_INR);
+			c->got_sent_msg &= ~(ISUP_CALL_CONNECTED | ISUP_CALL_PENDING);
 			e->e = ISUP_EVENT_REL;
 			e->rel.cic = c->cic;
 			e->rel.call = c;
@@ -3809,7 +3881,11 @@
 			e->rlc.opc = opc;	/* keep OPC information */
 			e->rlc.call = c;
 			e->rlc.got_sent_msg = c->got_sent_msg;
-			c->got_sent_msg &= ~(ISUP_SENT_REL | ISUP_SENT_RSC);
+			if (c->got_sent_msg & ISUP_SENT_RSC) {
+				c->got_sent_msg &= ~(ISUP_SENT_REL | ISUP_SENT_RSC | ISUP_CALL_CONNECTED | ISUP_CALL_PENDING);
+			} else {
+				c->got_sent_msg &= ~(ISUP_SENT_REL | ISUP_SENT_RSC);
+			}
 			isup_stop_timer(ss7, c, ISUP_TIMER_T1);
 			isup_stop_timer(ss7, c, ISUP_TIMER_T2);
 			isup_stop_timer(ss7, c, ISUP_TIMER_T5);
@@ -4037,6 +4113,21 @@
 			e->ucic.opc = opc;	/* keep OPC information */
 			e->ucic.call = c;
 			return 0;
+		case ISUP_FRJ:
+			e = ss7_next_empty_event(ss7);
+			if (!e) {
+				ss7_call_null(ss7, c, 1);
+				isup_free_call(ss7, c);
+				return -1;
+			}
+
+			e->e = ISUP_EVENT_FRJ;
+			e->frj.cic = c->cic;
+			e->frj.call_ref_ident = c->call_ref_ident;
+			e->frj.call_ref_pc = c->call_ref_pc;
+			e->frj.opc = opc;	/* keep OPC information */
+			e->frj.call = c;
+			return 0;
 		case ISUP_FAA:
 			e = ss7_next_empty_event(ss7);
 			if (!e) {
@@ -4064,7 +4155,7 @@
 			e->far.cic = c->cic;
 			e->far.call_ref_ident = c->call_ref_ident;
 			e->far.call_ref_pc = c->call_ref_pc;
-			e->ucic.opc = opc;	/* keep OPC information */
+			e->far.opc = opc;	/* keep OPC information */
 			e->far.call = c;
 			return 0;
 		case ISUP_CGBA:
@@ -4135,13 +4226,13 @@
 			isup_clear_callflags(ss7, c, ISUP_SENT_CGU);
 			return 0;
 		case ISUP_SUS:
+			if (c->got_sent_msg & (ISUP_SENT_RSC | ISUP_SENT_REL)) {
+				return 0;	/* ignoring SUS we are in hangup now */
+			}
+
 			if (!(c->got_sent_msg & (ISUP_GOT_IAM | ISUP_SENT_IAM))) {
 				ss7_message(ss7, "Got SUS but no call on CIC %d PC %d ", c->cic, opc);
 				return isup_handle_unexpected(ss7, c, opc);
-			}
-
-			if (c->got_sent_msg & (ISUP_SENT_RSC | ISUP_SENT_REL)) {
-				return 0;	/* ignoring SUS we are in hangup now */
 			}
 
 			e = ss7_next_empty_event(ss7);
@@ -4202,7 +4293,7 @@
 	ss7_event *e;
 
 	/* Checking dual seizure Q.764 2.9.1.4 */
-	if (c->got_sent_msg & ISUP_SENT_IAM) {
+	if (c->got_sent_msg & (ISUP_SENT_IAM | ISUP_PENDING_IAM)) {
 		if ((ss7->pc > opc) ? (~c->cic & 1) : (c->cic & 1)) {
 			ss7_message(ss7, "Dual seizure on CIC %d DPC %d we are the controlling, ignore IAM\n", c->cic, opc);
 			return 0;
@@ -4543,6 +4634,7 @@
 	if (res > -1) {
 		isup_start_timer(ss7, c, ISUP_TIMER_T7);
 		c->got_sent_msg |= ISUP_SENT_IAM;
+		c->got_sent_msg &= ~ISUP_PENDING_IAM;
 	} else {
 		ss7_call_null(ss7, c, 0);
 		isup_free_call(ss7, c);
@@ -4570,6 +4662,25 @@
 		ss7_call_null(ss7, c, 0);
 		isup_free_call(ss7, c);
 		ss7_error(ss7, "Unable to send ACM to DPC: %d\n", c->dpc);
+	}
+
+	return res;
+}
+
+int isup_frj(struct ss7 *ss7, struct isup_call *c)
+{
+	int res;
+
+	if (!ss7 || !c) {
+		return -1;
+	}
+
+	res = isup_send_message(ss7, c, ISUP_FRJ, frj_params);
+
+	if (res == -1) {
+		ss7_call_null(ss7, c, 0);
+		isup_free_call(ss7, c);
+		ss7_error(ss7, "Unable to send FRJ to DPC: %d\n", c->dpc);
 	}
 
 	return res;
@@ -4693,7 +4804,7 @@
 		isup_start_timer(ss7, c, ISUP_TIMER_T5);
 
 		c->got_sent_msg |= ISUP_SENT_REL;
-		c->got_sent_msg &= ~(ISUP_SENT_IAM | ISUP_CALL_CONNECTED | ISUP_GOT_IAM | ISUP_GOT_CCR | ISUP_SENT_INR);
+		c->got_sent_msg &= ~(ISUP_CALL_PENDING | ISUP_CALL_CONNECTED);
 	} else {
 		ss7_call_null(ss7, c, 0);
 		isup_free_call(ss7, c);
@@ -5051,6 +5162,7 @@
 	while (c) {
 		buf_used = 0;
 		tmp_used = 0;
+		tmp_buf[0] = '\0';
 		if (c->got_sent_msg & ISUP_SENT_RSC) {
 			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "RSC ");
 		}
@@ -5072,6 +5184,9 @@
 		if (c->got_sent_msg & ISUP_SENT_GRS) {
 			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "GRS ");
 		}
+		if (c->got_sent_msg & ISUP_SENT_GRS2) {
+			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "GRS2 ");
+		}
 		if (c->got_sent_msg & ISUP_SENT_CGB) {
 			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "CGB ");
 		}
@@ -5086,6 +5201,9 @@
 		}
 		if (c->got_sent_msg & ISUP_SENT_INR) {
 			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "INR ");
+		}
+		if (c->got_sent_msg & ISUP_SENT_FAR) {
+			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "FAR ");
 		}
 		buf_used = ss7_snprintf(buf, buf_used, buf_size, "%5i %5i %3i  %-24s", c->cic, c->dpc, c->sls, tmp_buf);
 
@@ -5093,6 +5211,9 @@
 		if (c->got_sent_msg & ISUP_GOT_CCR) {
 			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "CCR ");
 		}
+		if (c->got_sent_msg & ISUP_PENDING_IAM) {
+			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "-IAM ");
+		}
 		if (c->got_sent_msg & ISUP_GOT_IAM) {
 			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "IAM ");
 		}
@@ -5104,6 +5225,12 @@
 		}
 		if (c->got_sent_msg & ISUP_GOT_CON) {
 			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "CON ");
+		}
+		if (c->got_sent_msg & ISUP_GOT_CGB) {
+			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "CGB ");
+		}
+		if (c->got_sent_msg & ISUP_GOT_CGU) {
+			tmp_used = ss7_snprintf(tmp_buf, tmp_used, buf_size, "CGU ");
 		}
 		buf_used = ss7_snprintf(buf, buf_used, buf_size, "  %-16s  ", tmp_buf);
 

Modified: trunk/isup.h
URL: http://svnview.digium.com/svn/libss7/trunk/isup.h?view=diff&rev=323&r1=322&r2=323
==============================================================================
--- trunk/isup.h (original)
+++ trunk/isup.h Mon Jun  9 14:48:47 2014
@@ -88,57 +88,137 @@
 #define ISUP_CVT	0xec	/*!< ???Used??? */
 #define ISUP_EXM	0xed	/*!< ??? */
 
-/* ISUP Parameters */
+
+/* ISUP Parameters ITU-T Q.763 */
+#define ISUP_PARM_CALL_REF						0x01
+#define ISUP_PARM_TRANSMISSION_MEDIUM_REQS		0x02
+#define ISUP_PARM_ACCESS_TRANS					0x03
+#define ISUP_PARM_CALLED_PARTY_NUM				0x04
+#define ISUP_PARM_SUBSEQUENT_NUMBER				0x05
 #define ISUP_PARM_NATURE_OF_CONNECTION_IND		0x06
-#define ISUP_PARM_FORWARD_CALL_IND			0x07
-#define ISUP_PARM_CALLING_PARTY_CAT			0x09
-#define ISUP_PARM_USER_SERVICE_INFO			0x1d
-#define ISUP_PARM_TRANSMISSION_MEDIUM_REQS		0x02
-#define ISUP_PARM_CALLED_PARTY_NUM			0x04
-#define ISUP_PARM_ACCESS_TRANS				0x03
-#define ISUP_PARM_BUSINESS_GRP				0xc6
-#define ISUP_PARM_CALL_REF				0x01
-#define ISUP_PARM_CALLING_PARTY_NUM			0x0a
-#define ISUP_PARM_CARRIER_ID				0xc5
-#define ISUP_PARM_SELECTION_INFO			0xee
-#define ISUP_PARM_CHARGE_NUMBER				0xeb
+#define ISUP_PARM_FORWARD_CALL_IND				0x07
+#define ISUP_PARM_OPT_FORWARD_CALL_INDICATOR	0x08
+#define ISUP_PARM_CALLING_PARTY_CAT				0x09
+#define ISUP_PARM_CALLING_PARTY_NUM				0x0a
+#define ISUP_PARM_REDIRECTING_NUMBER			0x0b
+#define ISUP_PARM_REDIRECTION_NUMBER			0x0c
+#define ISUP_PARM_CONNECTION_REQ				0x0d
+#define ISUP_PARM_INR_IND						0x0e
+#define ISUP_PARM_INF_IND						0x0f
+#define ISUP_PARM_CONTINUITY_IND				0x10
+#define ISUP_PARM_BACKWARD_CALL_IND				0x11
+#define ISUP_PARM_CAUSE							0x12
+#define ISUP_PARM_REDIRECTION_INFO				0x13
+/* 0x14 is Reserved / Event information */
+#define ISUP_PARM_CIRCUIT_GROUP_SUPERVISION_IND	0x15
+#define ISUP_PARM_RANGE_AND_STATUS				0x16
+#define ISUP_PARM_CALL_MODIFICATION_IND			0x17
+#define ISUP_PARM_FACILITY_IND					0x18
+/* 0x19 is Reserved */
+#define ISUP_PARM_CUG_INTERLOCK_CODE			0x1a
+/* 0x1b is Reserved */
+/* 0x1c is Reserved */
+#define ISUP_PARM_USER_SERVICE_INFO				0x1d
+#define ISUP_PARM_SIGNALLING_PC					0x1e
+/* 0x1f is Reserved */
+#define ISUP_PARM_USER_TO_USER_INFO				0x20
+#define ISUP_CONNECTED_NUMBER					0x21
+#define ISUP_PARM_SUSPEND_RESUME_IND			0x22
+#define ISUP_PARM_TRANSIT_NETWORK_SELECTION		0x23
+#define ISUP_PARM_EVENT_INFO					0x24
 #define ISUP_PARM_CIRCUIT_ASSIGNMENT_MAP		0x25
+#define ISUP_PARM_CIRCUIT_STATE_IND				0x26
+#define ISUP_PARAM_AUTOMATIC_CONGESTION_LEVEL	0x27
+#define ISUP_PARM_ORIGINAL_CALLED_NUM			0x28
 #define ISUP_PARM_OPT_BACKWARD_CALL_IND			0x29
-#define ISUP_PARM_CONNECTION_REQ			0x0d
-#define ISUP_PARM_CONTINUITY_IND			0x10
-#define ISUP_PARM_CUG_INTERLOCK_CODE			0x1a
-#define ISUP_PARM_EGRESS_SERV				0xc3
-#define ISUP_PARM_GENERIC_ADDR				0xc0
-#define ISUP_PARM_GENERIC_DIGITS			0xc1
-#define ISUP_PARM_GENERIC_NAME				0xc7
+#define ISUP_PARM_USER_TO_USER_IND				0x2a
+#define ISUP_PARM_ORIGINATION_ISC_PC			0x2b
 #define ISUP_PARM_GENERIC_NOTIFICATION_IND		0x2c
-#define ISUP_PARM_BACKWARD_CALL_IND			0x11
-#define ISUP_PARM_CAUSE					0x12
-#define ISUP_PARM_CIRCUIT_GROUP_SUPERVISION_IND		0x15
-#define ISUP_PARM_RANGE_AND_STATUS			0x16
-#define ISUP_PARM_PROPAGATION_DELAY			0x31
-#define ISUP_PARM_EVENT_INFO				0x24
-#define ISUP_PARM_HOP_COUNTER				0x3d
-#define ISUP_PARM_OPT_FORWARD_CALL_INDICATOR		0x08
-#define ISUP_PARM_LOCATION_NUMBER			0x3f
-#define ISUP_PARM_ORIG_LINE_INFO			0xea
-#define ISUP_PARM_REDIRECTION_INFO			0x13
-#define ISUP_PARM_ORIGINAL_CALLED_NUM			0x28
-#define ISUP_PARM_JIP					0xc4
-#define ISUP_PARM_ECHO_CONTROL_INFO			0x37
+#define ISUP_PARM_CALL_HISTORY_INFO				0x2d
+#define ISUP_PARM_ACCESS_DELIVERY_INFO			0x2e
+#define ISUP_PARM_NETWORK_SPECIFIC_FACILITY		0x2f
+#define ISUP_PARM_USER_SERVICE_INFO_PRIME		0x30
+#define ISUP_PARM_PROPAGATION_DELAY				0x31
+#define ISUP_PARM_REMOTE_OPERATIONS				0x32
+#define ISUP_PARM_SERVICE_ACTIVATION			0x33
+#define ISUP_PARM_USER_TELESERVICE_INFO			0x34
+#define ISUP_PARM_TRANSMISSION_MEDIUM_USED		0x35
+#define ISUP_PARM_CALL_DIVERSION_INFO			0x36
+#define ISUP_PARM_ECHO_CONTROL_INFO				0x37
+#define ISUP_PARM_MESSAGE_COMPAT_INFO			0x38
 #define ISUP_PARM_PARAMETER_COMPAT_INFO			0x39
-#define ISUP_PARM_CIRCUIT_STATE_IND			0x26
-#define ISUP_PARM_TRANSIT_NETWORK_SELECTION		0x23
+#define ISUP_PARM_MLPP_PRECEDENCE				0x3a
+#define ISUP_PARM_MCID_REQUEST_IND				0x3b
+#define ISUP_PARM_MCID_RESPONSE_IND				0x3c
+#define ISUP_PARM_HOP_COUNTER					0x3d
+#define ISUP_PARM_TRANSMISSION_MEDIUM_REQ_PRIME	0x3e
+#define ISUP_PARM_LOCATION_NUMBER				0x3f
+
+#define ISUP_PARM_REDIRECTION_NUM_RESTRICTION	0x40
+
+#define ISUP_PARM_CALL_TRANSFER_REFERENCE		0x43
+#define ISUP_PARM_LOOP_PREVENTION_IND			0x44
+#define ISUP_PARM_CALL_TRANSFER_NUMBER			0x45
+
+#define ISUP_PARM_CCSS							0x4b
+#define ISUP_PARM_FORWARD_GVNS					0x4c
+#define ISUP_PARM_BACKWARD_GVNS					0x4d
+#define ISUP_PARM_REDIRECT_CAPABILITY			0x4e
+
+#define ISUP_PARM_NETWORK_MANAGEMENT_CONTROL	0x5b
+
+#define ISUP_PARM_CORRELATION_ID				0x65
+#define ISUP_PARM_SCF_ID						0x66
+
+#define ISUP_PARM_CALL_DIVERSION_TREATMENT_IND	0x6e
+#define ISUP_PARM_CALLED_IN_NUMBER				0x6f
+#define ISUP_PARM_CALL_OFFERING_TREATMENT_IND	0x70
+#define ISUP_PARM_CHARGED_PARTY_IDENT			0x71
+#define ISUP_PARM_CONFERENCE_TREATMENT_IND		0x72
+#define ISUP_PARM_DISPLAY_INFO					0x73
+#define ISUP_PARM_UID_ACTION_IND				0x74
+#define ISUP_PARM_UID_CAPABILITY_IND			0x75
+
+#define ISUP_PARM_REDIRECT_COUNTER				0x77
+#define ISUP_PARM_APPLICATION_TRANSPORT			0x78
+#define ISUP_PARM_COLLECT_CALL_REQUEST			0x79
+#define ISUP_PARM_CCNR_POSSIBLE_IND				0x7a
+#define ISUP_PARM_PIVOT_CAPABILITY				0x7b
+#define ISUP_PARM_PIVOT_ROUTING_IND				0x7c
+#define ISUP_PARM_CALLED_DIRECTORY_NUMBER		0x7d
+
+#define ISUP_PARM_ORIGINAL_CALLED_IN_NUM		0x7f
+/* 0x80 reserved for future extension */
+#define ISUP_PARM_CALLING_GEODETIC_LOCATION		0x81
+#define ISUP_PARM_HTR_INFO						0x82
+
+#define ISUP_PARM_NETWORK_ROUTING_NUMBER		0x84
+#define ISUP_PARM_QUERY_ON_RELEASE_CAPABILITY	0x85
+#define ISUP_PARM_PIVOT_STATUS					0x86
+#define ISUP_PARM_PIVOT_COUNTER					0x87
+#define ISUP_PARM_PIVOT_ROUTING_FORWARD_IND		0x88
+#define ISUP_PARM_PIVOT_ROUTING_BACKWARD_IND	0x89
+#define ISUP_PARM_REDIRECT_STATUS				0x8a
+#define ISUP_PARM_REDIRECT_FORWARD_INFO			0x8b
+#define ISUP_PARM_REDIRECT_BACKWARD_INFO		0x8c
+#define ISUP_PARM_NUM_PORTABILITY_FORWARD_INFO	0x8d
+
+#define ISUP_PARM_GENERIC_ADDR					0xc0
+#define ISUP_PARM_GENERIC_DIGITS				0xc1
+
+#define ISUP_PARM_EGRESS_SERV					0xc3
+#define ISUP_PARM_JIP							0xc4
+#define ISUP_PARM_CARRIER_ID					0xc5
+#define ISUP_PARM_BUSINESS_GRP					0xc6
+#define ISUP_PARM_GENERIC_NAME					0xc7
+
 #define ISUP_PARM_LOCAL_SERVICE_PROVIDER_IDENTIFICATION	0xe4
-#define ISUP_PARM_FACILITY_IND				0x18
-#define ISUP_PARM_REDIRECTING_NUMBER			0x0b
-#define ISUP_PARM_ACCESS_DELIVERY_INFO			0x2e
-#define ISUP_PARM_REDIRECT_COUNTER			0x77
-#define ISUP_PARM_SUSPEND_RESUME_IND			0x22
-#define ISUP_PARM_INF_IND				0x0f
-#define ISUP_PARM_INR_IND				0x0e
-#define ISUP_PARM_SUBSEQUENT_NUMBER			0x05
-#define ISUP_CONNECTED_NUMBER				0x21
+
+#define ISUP_PARM_ORIG_LINE_INFO				0xea
+#define ISUP_PARM_CHARGE_NUMBER					0xeb
+
+#define ISUP_PARM_SELECTION_INFO				0xee
+
 
 /* ISUP TIMERS  */
 #define ISUP_TIMER_T1	1

Modified: trunk/libss7.h
URL: http://svnview.digium.com/svn/libss7/trunk/libss7.h?view=diff&rev=323&r1=322&r2=323
==============================================================================
--- trunk/libss7.h (original)
+++ trunk/libss7.h Mon Jun  9 14:48:47 2014
@@ -77,6 +77,7 @@
 #define ISUP_EVENT_CGUA		33	/*!< Circuit group unblocking acknowledgement */
 #define ISUP_EVENT_SAM		34	/*!< Subsequent address */
 #define ISUP_EVENT_DIGITTIMEOUT	35	/*!< ISUP T10 expired */
+#define ISUP_EVENT_FRJ		36	/*!< Facility rejected */
 
 /* ISUP MSG Flags */
 #define ISUP_SENT_GRS	(1 << 0)
@@ -100,8 +101,10 @@
 #define ISUP_SENT_ANM	(1 << 18)
 #define ISUP_SENT_INR	(1 << 19)
 #define ISUP_SENT_GRS2	(1 << 20)
+#define ISUP_PENDING_IAM	(1 << 21)
 
 #define ISUP_CALL_CONNECTED	(ISUP_GOT_ACM | ISUP_GOT_ANM | ISUP_GOT_CON |  ISUP_SENT_CON | ISUP_SENT_ACM | ISUP_SENT_ANM)
+#define ISUP_CALL_PENDING	(ISUP_GOT_IAM | ISUP_SENT_IAM | ISUP_PENDING_IAM | ISUP_GOT_CCR | ISUP_SENT_INR | ISUP_SENT_FAR)
 
 /* Different SS7 types */
 #define SS7_ITU		(1 << 0)
@@ -370,6 +373,15 @@
 	unsigned int call_ref_pc;
 	unsigned int opc;
 	struct isup_call *call;
+} ss7_event_frj;
+
+typedef struct {
+	int e;
+	int cic;
+	unsigned int call_ref_ident;
+	unsigned int call_ref_pc;
+	unsigned int opc;
+	struct isup_call *call;
 } ss7_event_faa;
 
 typedef struct {
@@ -430,6 +442,7 @@
 	ss7_event_cic rlc;
 	ss7_event_anm anm;
 	ss7_event_acm acm;
+	ss7_event_frj frj;
 	ss7_event_faa faa;
 	ss7_event_far far;
 	ss7_event_con con;
@@ -525,10 +538,12 @@
 
 int isup_con(struct ss7 *ss7, struct isup_call *c);
 
-struct isup_call * isup_new_call(struct ss7 *ss7);
+struct isup_call * isup_new_call(struct ss7 *ss7, int cic, unsigned int dpc, int outgoing);
 
 int isup_acm(struct ss7 *ss7, struct isup_call *c);
 
+int isup_frj(struct ss7 *ss7, struct isup_call *c);
+
 int isup_faa(struct ss7 *ss7, struct isup_call *c);
 
 int isup_far(struct ss7 *ss7, struct isup_call *c);
@@ -580,8 +595,6 @@
 void isup_clear_callflags(struct ss7 *ss7, struct isup_call *c, unsigned long flags);
 
 /* Various call related sets */
-void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc);
-
 void isup_free_call(struct ss7 *ss7, struct isup_call *c);
 
 void isup_set_call_dpc(struct isup_call *c, unsigned int dpc);

Modified: trunk/mtp3.c
URL: http://svnview.digium.com/svn/libss7/trunk/mtp3.c?view=diff&rev=323&r1=322&r2=323
==============================================================================
--- trunk/mtp3.c (original)
+++ trunk/mtp3.c Mon Jun  9 14:48:47 2014
@@ -1651,38 +1651,19 @@
 	mtp3_check(link->adj_sp);
 }
 
-static int std_test_receive(struct ss7 *ss7, struct mtp2 *mtp2, unsigned char *buf, int len)
-{
-	unsigned char *sif = buf;
+static int std_test_receive(struct ss7 *ss7, struct mtp2 *mtp2, struct routing_label rl, unsigned char *buf, int len)
+{
 	unsigned char *headerptr = buf + rl_size(ss7);
 	unsigned char h1, h0;
 	int testpatsize = 0;
-	struct routing_label rl;
 	struct routing_label drl;
 
-	get_routinglabel(ss7->switchtype, sif, &rl);
-
-	if (rl.dpc != ss7->pc) {
-		goto fail;
-	}
-
-	drl.type = ss7->switchtype;
+	/* just reverse the routing label - mtp3_receive() have checked it is correct */
+	drl.type = rl.type;
 	drl.dpc = rl.opc;
-	drl.opc = ss7->pc;
-#if 0
-	drl.sls = mtp2->slc;
-#else
-	/*
-	 * I hate that we would have to do this, but it would seem that
-	 * some telcos set things up stupid enough that we have to
-	 */
-
-	/*
-	 * The numbering of the sls have to restart on every STP!!!
-	 */
-
+	drl.opc = rl.dpc;
 	drl.sls = rl.sls;
-#endif
+
 	h1 = h0 = *headerptr;
 
 	h1 = get_h1(headerptr);
@@ -1877,8 +1858,18 @@
 	rlsize = get_routinglabel(ss7->switchtype, sif, &rl);
 
 	if (ss7->pc != rl.dpc) {
-		ss7_error(ss7, "Received message destined for point code 0x%x but we're 0x%x.  Dropping\n", rl.dpc, ss7->pc);
+		ss7_error(ss7, "Received message destined for point code 0x%x, but we are 0x%x.  Dropping\n", rl.dpc, ss7->pc);
 		return -1;
+	} else if (userpart == SIG_STD_TEST || userpart == SIG_SPEC_TEST || userpart == SIG_NET_MNG) {
+		if (link->dpc != rl.opc) {
+			ss7_error(ss7, "Received message from point code 0x%x but we are connected to DPC 0x%x.  Dropping\n", rl.opc, link->dpc);
+			return -1;
+		}
+
+		if (link->slc != rl.sls) {
+			ss7_error(ss7, "Received message for slc 0x%x, but we are 0x%x.  Dropping\n", rl.sls, link->slc);
+			return -1;
+		}
 	}
 
 	/* TODO: find out what to do with the priority in ANSI networks */
@@ -1887,7 +1878,7 @@
 	switch (userpart) {
 		case SIG_STD_TEST:
 		case SIG_SPEC_TEST:
-			return std_test_receive(ss7, link, sif, siflen);
+			return std_test_receive(ss7, link, rl, sif, siflen);
 		case SIG_ISUP:
 			/* Skip the routing label */
 			if (link->adj_sp->state == MTP3_UP) {

Modified: trunk/ss7_internal.h
URL: http://svnview.digium.com/svn/libss7/trunk/ss7_internal.h?view=diff&rev=323&r1=322&r2=323
==============================================================================
--- trunk/ss7_internal.h (original)
+++ trunk/ss7_internal.h Mon Jun  9 14:48:47 2014
@@ -55,8 +55,8 @@
 
 #define MAX_EVENTS			16
 #define MAX_SCHED			512	/* need a lot cause of isup timers... */
-#define SS7_MAX_LINKS		4
-#define SS7_MAX_ADJSPS		4
+#define SS7_MAX_LINKS		8
+#define SS7_MAX_ADJSPS		8
 
 #define SS7_STATE_DOWN		0
 #define SS7_STATE_UP		1

Modified: trunk/ss7linktest.c
URL: http://svnview.digium.com/svn/libss7/trunk/ss7linktest.c?view=diff&rev=323&r1=322&r2=323
==============================================================================
--- trunk/ss7linktest.c (original)
+++ trunk/ss7linktest.c Mon Jun  9 14:48:47 2014
@@ -61,12 +61,11 @@
 {
 	struct isup_call *c;
 
-	c = isup_new_call(ss7);
+	c = isup_new_call(ss7, (callcount % 12) + 1, dpc, 0);
 
 	if (c) {
 		isup_set_called(c, "12345", SS7_NAI_NATIONAL, ss7);
 		isup_set_calling(c, "7654321", SS7_NAI_NATIONAL, SS7_PRESENTATION_ALLOWED, SS7_SCREENING_USER_PROVIDED);
-		isup_init_call(ss7, c, (callcount % 12) + 1, dpc);
 		isup_iam(ss7, c);
 		printf("Callcount = %d\n ", ++callcount);
 	}
@@ -168,8 +167,7 @@
 				switch (e->e) {
 					case SS7_EVENT_UP:
 						printf("[%d] --- SS7 Up ---\n", linkset->linkno);
-						c = isup_new_call(ss7);
-						isup_init_call(ss7, c, 1, dpc);
+						c = isup_new_call(ss7, 1, dpc, 0);
 						isup_grs(ss7, c, 24);
 						break;
 					case MTP2_LINK_UP:




More information about the libss7-commits mailing list