[libpri-commits] mattf: branch mattf/libpri-1.4-q921-rewrite r1341 - /team/mattf/libpri-1.4-q9...

SVN commits to the libpri project libpri-commits at lists.digium.com
Thu Nov 19 17:22:01 CST 2009


Author: mattf
Date: Thu Nov 19 17:21:59 2009
New Revision: 1341

URL: http://svnview.digium.com/svn/libpri?view=rev&rev=1341
Log:
Add support for DM and RNR messages

Modified:
    team/mattf/libpri-1.4-q921-rewrite/q921.c

Modified: team/mattf/libpri-1.4-q921-rewrite/q921.c
URL: http://svnview.digium.com/svn/libpri/team/mattf/libpri-1.4-q921-rewrite/q921.c?view=diff&rev=1341&r1=1340&r2=1341
==============================================================================
--- team/mattf/libpri-1.4-q921-rewrite/q921.c (original)
+++ team/mattf/libpri-1.4-q921-rewrite/q921.c Thu Nov 19 17:21:59 2009
@@ -1868,6 +1868,132 @@
 	return eres;
 }
 
+static pri_event *q921_dm_rx(struct pri *pri, q921_h *h)
+{
+	pri_event * res = NULL;
+
+	switch (pri->q921_state) {
+	case Q921_TEI_ASSIGNED:
+		if (h->u.p_f)
+			break;
+		/* else */
+		q921_establish_data_link(pri);
+		pri->l3initiated = 1;
+		q921_setstate(pri, Q921_AWAITING_ESTABLISHMENT);
+		break;
+	case Q921_AWAITING_ESTABLISHMENT:
+		if (!h->u.p_f)
+			break;
+
+		q921_discard_iqueue(pri);
+		/* DL-RELEASE indication */
+		stop_t200(pri);
+		q921_setstate(pri, Q921_TEI_ASSIGNED);
+		break;
+	case Q921_AWAITING_RELEASE:
+		if (!h->u.p_f)
+			break;
+		/* DL-RELEASE confirm */
+		stop_t200(pri);
+		q921_setstate(pri, Q921_TEI_ASSIGNED);
+		break;
+	case Q921_MULTI_FRAME_ESTABLISHED:
+		if (h->u.p_f) {
+			/* MDL-ERROR (B) indication */
+			pri_error(pri, "MDL-ERROR (B)\n");
+			break;
+		}
+
+		/* MDL-ERROR (E) indication */
+		q921_establish_data_link(pri);
+		pri->l3initiated = 0;
+		q921_setstate(pri, Q921_AWAITING_ESTABLISHMENT);
+		break;
+	case Q921_TIMER_RECOVERY:
+		if (h->u.p_f) {
+			/* MDL-ERROR (B) indication */
+			pri_error(pri, "MDL-ERROR (B)\n");
+		} else {
+			/* MDL-ERROR (E) indication */
+			pri_error(pri, "MDL-ERROR (E)\n");
+		}
+		q921_establish_data_link(pri);
+		pri->l3initiated = 0;
+		q921_setstate(pri, Q921_AWAITING_ESTABLISHMENT);
+		break;
+	default:
+		pri_error(pri, "Don't know what to do with DM frame in state %d\n", pri->q921_state);
+		break;
+	}
+
+	return res;
+}
+
+static pri_event *q921_rnr_rx(struct pri *pri, q921_h *h)
+{
+	pri_event * res = NULL;
+
+	switch (pri->q921_state) {
+	case Q921_MULTI_FRAME_ESTABLISHED:
+		pri->peer_rx_busy = 1;
+		if (!is_command(pri, h)) {
+			if (h->s.p_f) {
+				/* MDL-ERROR (A) indication */
+				pri_error(pri, "MDL-ERROR(A)\n");
+			}
+		} else {
+			if (h->s.p_f) {
+				q921_enquiry_response(pri);
+			}
+		}
+
+		if (!n_r_is_valid(pri, h->s.n_r)) {
+			n_r_error_recovery(pri);
+			q921_setstate(pri, Q921_AWAITING_ESTABLISHMENT);
+		} else {
+			update_v_a(pri, h->s.n_r);
+			stop_t203(pri);
+			restart_t200(pri);
+		}
+		break;
+	case Q921_TIMER_RECOVERY:
+		pri->peer_rx_busy = 1;
+		if (is_command(pri, h)) {
+			if (h->s.p_f) {
+				q921_enquiry_response(pri);
+				if (n_r_is_valid(pri, h->s.n_r)) {
+					update_v_a(pri, h->s.n_r);
+					break;
+				} else {
+					n_r_error_recovery(pri);
+					q921_setstate(pri, Q921_AWAITING_ESTABLISHMENT);
+					break;
+				}
+			}
+		} else {
+			if (h->s.p_f) {
+				if (n_r_is_valid(pri, h->s.n_r)) {
+					update_v_a(pri, h->s.n_r);
+					restart_t200(pri);
+					q921_invoke_retransmission(pri, h->s.n_r);
+					q921_setstate(pri, Q921_MULTI_FRAME_ESTABLISHED);
+					break;
+				} else {
+					n_r_error_recovery(pri);
+					q921_setstate(pri, Q921_AWAITING_ESTABLISHMENT);
+					break;
+				}
+			}
+		}
+		break;
+	default:
+		pri_error(pri, "Don't know what to do with RNR in state %d\n", pri->q921_state);
+		break;
+	}
+
+	return res;
+}
+
 static void q921_acknowledge_pending_check(struct pri *pri)
 {
 	if (pri->acknowledge_pending) {
@@ -1900,6 +2026,7 @@
 			break;
  		case 1:
 			pri_error(pri, "%s:%d FIXME!!!\n", __FUNCTION__, __LINE__);
+			ev = q921_rnr_rx(pri, h);
 
 			break;
 
@@ -1945,30 +2072,8 @@
 		switch(h->u.m3) {
 		case 0:
 			if (h->u.m2 == 3) {
-				pri_error(pri, "%s:%d FIXME!!!\n", __FUNCTION__, __LINE__);
-				return NULL;
-
-#if 0
-				if (h->u.p_f) {
-					/* Section 5.7.1 says we should restart on receiving a DM response with the f-bit set to
-					   one, but we wait T200 first */
-					if (pri->debug & (PRI_DEBUG_Q921_STATE | PRI_DEBUG_Q921_DUMP))
-						pri_message(pri, "-- Got DM Mode from peer.\n");
-					/* Disconnected mode, try again after T200 */
-					ev = q921_dchannel_down(pri);
-					q921_restart(pri, 0);
-					return ev;
-						
-				} else {
-					if (pri->debug & PRI_DEBUG_Q921_DUMP)
-						pri_message(pri, "-- Ignoring unsolicited DM with p/f set to 0\n");
-#if 0
-					/* Requesting that we start */
-					q921_restart(pri, 0);
-#endif					
-				}
+				ev = q921_dm_rx(pri, h);
 				break;
-#endif
 			} else if (!h->u.m2) {
 				if ((pri->sapi == Q921_SAPI_LAYER2_MANAGEMENT) && (pri->tei == Q921_TEI_GROUP)) {
 




More information about the libpri-commits mailing list