[svn-commits] rmudgett: branch group/issue14068 r816 - /team/group/issue14068/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed May 27 10:16:28 CDT 2009


Author: rmudgett
Date: Wed May 27 10:16:25 2009
New Revision: 816

URL: http://svn.asterisk.org/svn-view/libpri?view=rev&rev=816
Log:
Adjusted COLP API to reduce the amount of memory and copying needed.

Modified:
    team/group/issue14068/libpri.h
    team/group/issue14068/pri_internal.h
    team/group/issue14068/q931.c

Modified: team/group/issue14068/libpri.h
URL: http://svn.asterisk.org/svn-view/libpri/team/group/issue14068/libpri.h?view=diff&rev=816&r1=815&r2=816
==============================================================================
--- team/group/issue14068/libpri.h (original)
+++ team/group/issue14068/libpri.h Wed May 27 10:16:25 2009
@@ -359,9 +359,9 @@
 /*! \brief Information needed to identify an endpoint in a call. */
 struct pri_party_id {
 	/*! Subscriber phone number */
-	char number[256];
+	char number[64];
 	/*! Subscriber name */
-	char name[256];
+	char name[64];
 	/*! Q.931 encoded "type of number" and "numbering plan identification" */
 	int number_type;
 	/*! Q.931 encoded "presentation indicator" and "screening indicator" */
@@ -416,14 +416,14 @@
 	int cmd;
 	union {
 		/*! Reserve room for possible expansion to maintain ABI compatibility. */
-		char reserve_space[2048];
+		char reserve_space[512];
 		struct pri_subcmd_connected_line connected_line;
 		struct pri_subcmd_redirecting redirecting;
 	};
 };
 
 /* Max number of subcommands per event message */
-#define PRI_MAX_SUBCOMMANDS	4
+#define PRI_MAX_SUBCOMMANDS	6
 
 struct pri_subcommands {
 	int counter_subcmd;
@@ -458,7 +458,7 @@
 	char callednum[256];
 	int calledpres;
 	int calledplan;
-	struct pri_subcommands subcmds;
+	struct pri_subcommands *subcmds;
 } pri_event_ringing;
 
 typedef struct pri_event_answer {
@@ -474,7 +474,7 @@
 	int connectedpres;
 	int connectedplan;
 	int source;
-	struct pri_subcommands subcmds;
+	struct pri_subcommands *subcmds;
 } pri_event_answer;
 
 /*! Deprecated replaced by struct pri_event_facility. */
@@ -498,7 +498,7 @@
 	q931_call *call;
 	int callingpres;			/*!< Presentation of Calling CallerID (Deprecated, preserved for struct pri_event_facname compatibility) */
 	int callingplan;			/*!< Dialing plan of Calling entity (Deprecated, preserved for struct pri_event_facname compatibility) */
-	struct pri_subcommands subcmds;
+	struct pri_subcommands *subcmds;
 };
 
 #define PRI_CALLINGPLANANI
@@ -535,7 +535,7 @@
 	int origredirectingreason;
 	int redirectingpres;
 	int redirectingcount;
-	struct pri_subcommands subcmds;
+	struct pri_subcommands *subcmds;
 } pri_event_ring;
 
 typedef struct pri_event_hangup {
@@ -546,7 +546,7 @@
 	q931_call *call;			/* Opaque call pointer */
 	long aoc_units;				/* Advise of Charge number of charged units */
 	char useruserinfo[260];		/* User->User info */
-	struct pri_subcommands subcmds;
+	struct pri_subcommands *subcmds;
 } pri_event_hangup;	
 
 typedef struct pri_event_restart_ack {
@@ -563,20 +563,21 @@
 	int progressmask;
 	int cause;
 	q931_call *call;
-	struct pri_subcommands subcmds;
+	struct pri_subcommands *subcmds;
 } pri_event_proceeding;
  
 typedef struct pri_event_setup_ack {
 	int e;
 	int channel;
 	q931_call *call;
-	struct pri_subcommands subcmds;
+	struct pri_subcommands *subcmds;
 } pri_event_setup_ack;
 
 typedef struct pri_event_notify {
 	int e;
 	int channel;
 	int info;
+	struct pri_subcommands *subcmds;
 } pri_event_notify;
 
 typedef struct pri_event_keypad_digit {
@@ -584,7 +585,7 @@
 	int channel;
 	q931_call *call;
 	char digits[64];
-	struct pri_subcommands subcmds;
+	struct pri_subcommands *subcmds;
 } pri_event_keypad_digit;
 
 typedef struct pri_event_service {

Modified: team/group/issue14068/pri_internal.h
URL: http://svn.asterisk.org/svn-view/libpri/team/group/issue14068/pri_internal.h?view=diff&rev=816&r1=815&r2=816
==============================================================================
--- team/group/issue14068/pri_internal.h (original)
+++ team/group/issue14068/pri_internal.h Wed May 27 10:16:25 2009
@@ -113,6 +113,8 @@
 	struct timeval tv;
 	int schedev;
 	pri_event ev;		/* Static event thingy */
+	/*! Subcommands for static event thingy. */
+	struct pri_subcommands subcmds;
 	
 	/* Q.921 Re-transmission queue */
 	struct q921_frame *txqueue;
@@ -423,4 +425,6 @@
 void q931_party_redirecting_init(struct q931_party_redirecting *redirecting);
 int q931_party_id_presentation(const struct q931_party_id *id);
 
+struct pri_subcommand *q931_alloc_subcommand(struct pri *ctrl);
+
 #endif

Modified: team/group/issue14068/q931.c
URL: http://svn.asterisk.org/svn-view/libpri/team/group/issue14068/q931.c?view=diff&rev=816&r1=815&r2=816
==============================================================================
--- team/group/issue14068/q931.c (original)
+++ team/group/issue14068/q931.c Wed May 27 10:16:25 2009
@@ -3626,17 +3626,15 @@
 	return 0;
 }
 
-static void clr_subcommands(struct pri_subcommands *sub)
-{
-	sub->counter_subcmd = 0;
-}
-
-static struct pri_subcommand *get_ptr_subcommand(struct pri_subcommands *sub)
-{
-	if (sub->counter_subcmd < PRI_MAX_SUBCOMMANDS) {
-		int count = sub->counter_subcmd;
-		sub->counter_subcmd++;
-		return &sub->subcmd[count];
+static void q931_clr_subcommands(struct pri *ctrl)
+{
+	ctrl->subcmds.counter_subcmd = 0;
+}
+
+struct pri_subcommand *q931_alloc_subcommand(struct pri *ctrl)
+{
+	if (ctrl->subcmds.counter_subcmd < PRI_MAX_SUBCOMMANDS) {
+		return &ctrl->subcmds.subcmd[ctrl->subcmds.counter_subcmd++];
 	}
 
 	return NULL;
@@ -3859,6 +3857,7 @@
 	} else {
 		prepare_to_handle_q931_message(pri, mh, c);
 	}
+	q931_clr_subcommands(pri);
 	
 	/* Handle IEs */
 	memset(mandies, 0, sizeof(mandies));
@@ -4050,6 +4049,7 @@
 			break;
 		}
 		pri->ev.e = PRI_EVENT_RING;
+		pri->ev.ring.subcmds = &pri->subcmds;
 		pri->ev.ring.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 		pri->ev.ring.callingpres = q931_party_id_presentation(&c->caller_id);
 		pri->ev.ring.callingplan = c->caller_id.number.plan;
@@ -4096,6 +4096,7 @@
 		UPDATE_OURCALLSTATE(pri, c, Q931_CALL_STATE_CALL_DELIVERED);
 		c->peercallstate = Q931_CALL_STATE_CALL_RECEIVED;
 		pri->ev.e = PRI_EVENT_RINGING;
+		pri->ev.ringing.subcmds = &pri->subcmds;
 		pri->ev.ringing.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 		pri->ev.ringing.cref = c->cr;
 		pri->ev.ringing.call = c;
@@ -4139,6 +4140,7 @@
 		UPDATE_OURCALLSTATE(pri, c, Q931_CALL_STATE_ACTIVE);
 		c->peercallstate = Q931_CALL_STATE_CONNECT_REQUEST;
 		pri->ev.e = PRI_EVENT_ANSWER;
+		pri->ev.answer.subcmds = &pri->subcmds;
 		pri->ev.answer.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 		pri->ev.answer.cref = c->cr;
 		pri->ev.answer.call = c;
@@ -4162,8 +4164,6 @@
 			int haveevent = 0;
 			struct pri_subcommand *subcmd;
 
-			clr_subcommands(&pri->ev.facility.subcmds);
-
 			if (c->newcall) {
 				q931_release_complete(pri,c,PRI_CAUSE_INVALID_CALL_REFERENCE);
 				break;
@@ -4175,7 +4175,7 @@
 					/* answered(0) */
 					pri_message(pri, "Got CT-Complete, callStatus = answered(0)\n");
 
-					subcmd = get_ptr_subcommand(&pri->ev.facility.subcmds);
+					subcmd = q931_alloc_subcommand(pri);
 					if (subcmd) {
 						struct pri_subcmd_connected_line *cmdcl = &subcmd->connected_line;
 
@@ -4192,7 +4192,7 @@
 					/* alerting(1) */
 					pri_message(pri, "Got CT-Complete, callStatus = alerting(1)\n");
 
-					subcmd = get_ptr_subcommand(&pri->ev.facility.subcmds);
+					subcmd = q931_alloc_subcommand(pri);
 					if (subcmd) {
 						struct pri_subcmd_redirecting *cmdr = &subcmd->redirecting;
 
@@ -4218,7 +4218,7 @@
 
 				pri_message(pri, "Got CT-Active\n");
 
-				subcmd = get_ptr_subcommand(&pri->ev.facility.subcmds);
+				subcmd = q931_alloc_subcommand(pri);
 				if (subcmd) {
 					struct pri_subcmd_connected_line *cmdcl = &subcmd->connected_line;
 
@@ -4236,7 +4236,7 @@
 
 				pri_message(pri, "Got DivertingLegInformation1\n");
 
-				subcmd = get_ptr_subcommand(&pri->ev.facility.subcmds);
+				subcmd = q931_alloc_subcommand(pri);
 				if (subcmd) {
 					struct pri_subcmd_redirecting *cmdr = &subcmd->redirecting;
 
@@ -4258,6 +4258,7 @@
 
 			if (haveevent) {
 				pri->ev.e = PRI_EVENT_FACILITY;
+				pri->ev.facility.subcmds = &pri->subcmds;
 				pri->ev.facility.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 				pri->ev.facility.cref = c->cr;
 				pri->ev.facility.call = c;
@@ -4282,6 +4283,7 @@
 		pri->ev.proceeding.cause = c->cause;
 		/* Fall through */
 	case Q931_CALL_PROCEEDING:
+		pri->ev.proceeding.subcmds = &pri->subcmds;
 		if (c->newcall) {
 			q931_release_complete(pri,c,PRI_CAUSE_INVALID_CALL_REFERENCE);
 			break;
@@ -4353,6 +4355,7 @@
 
 		if (!c->sugcallstate) {
 #endif
+			pri->ev.hangup.subcmds = &pri->subcmds;
 			pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 			pri->ev.hangup.cause = c->cause;
 			pri->ev.hangup.cref = c->cr;
@@ -4381,6 +4384,7 @@
 	case Q931_RELEASE_COMPLETE:
 		UPDATE_OURCALLSTATE(pri, c, Q931_CALL_STATE_NULL);
 		c->peercallstate = Q931_CALL_STATE_NULL;
+		pri->ev.hangup.subcmds = &pri->subcmds;
 		pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 		pri->ev.hangup.cause = c->cause;
 		pri->ev.hangup.cref = c->cr;
@@ -4416,6 +4420,7 @@
 		}
 		UPDATE_OURCALLSTATE(pri, c, Q931_CALL_STATE_NULL);
 		pri->ev.e = PRI_EVENT_HANGUP;
+		pri->ev.hangup.subcmds = &pri->subcmds;
 		pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 		pri->ev.hangup.cause = c->cause;
 		pri->ev.hangup.cref = c->cr;
@@ -4450,6 +4455,7 @@
 
 		/* Return such an event */
 		pri->ev.e = PRI_EVENT_HANGUP_REQ;
+		pri->ev.hangup.subcmds = &pri->subcmds;
 		pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 		pri->ev.hangup.cause = c->cause;
 		pri->ev.hangup.cref = c->cr;
@@ -4479,12 +4485,14 @@
 		}
 		if (c->ourcallstate != Q931_CALL_STATE_OVERLAP_RECEIVING) {
 			pri->ev.e = PRI_EVENT_KEYPAD_DIGIT;
+			pri->ev.digit.subcmds = &pri->subcmds;
 			pri->ev.digit.call = c;
 			pri->ev.digit.channel = c->channelno | (c->ds1no << 8);
 			libpri_copy_string(pri->ev.digit.digits, c->keypad_digits, sizeof(pri->ev.digit.digits));
 			return Q931_RES_HAVEEVENT;
 		}
 		pri->ev.e = PRI_EVENT_INFO_RECEIVED;
+		pri->ev.ring.subcmds = &pri->subcmds;
 		pri->ev.ring.call = c;
 		pri->ev.ring.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 		libpri_copy_string(pri->ev.ring.callednum, c->overlap_digits, sizeof(pri->ev.ring.callednum));
@@ -4505,6 +4513,7 @@
 		UPDATE_OURCALLSTATE(pri, c, Q931_CALL_STATE_OVERLAP_SENDING);
 		c->peercallstate = Q931_CALL_STATE_OVERLAP_RECEIVING;
 		pri->ev.e = PRI_EVENT_SETUP_ACK;
+		pri->ev.setup_ack.subcmds = &pri->subcmds;
 		pri->ev.setup_ack.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 		pri->ev.setup_ack.call = c;
 
@@ -4520,6 +4529,7 @@
 		return Q931_RES_HAVEEVENT;
 	case Q931_NOTIFY:
 		pri->ev.e = PRI_EVENT_NOTIFY;
+		pri->ev.notify.subcmds = &pri->subcmds;
 		pri->ev.notify.channel = c->channelno;
 		pri->ev.notify.info = c->notify;
 		return Q931_RES_HAVEEVENT;
@@ -4570,6 +4580,7 @@
 
 	UPDATE_OURCALLSTATE(pri, c, Q931_CALL_STATE_NULL);
 	c->peercallstate = Q931_CALL_STATE_NULL;
+	pri->ev.hangup.subcmds = &pri->subcmds;
 	pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 	pri->ev.hangup.cause = c->cause;      		
 	pri->ev.hangup.cref = c->cr;          		




More information about the svn-commits mailing list