[svn-commits] jpeeler: trunk r131868 - /trunk/channels/chan_dahdi.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jul 17 17:40:01 CDT 2008


Author: jpeeler
Date: Thu Jul 17 17:40:00 2008
New Revision: 131868

URL: http://svn.digium.com/view/asterisk?view=rev&rev=131868
Log:
Add configuration option to chan_dahdi.conf to allow buffering policy and number of buffers to be configured per channel. Syntax:

buffers=<num of buffers>,<policy>

Where the number of buffers is some non-negative integer and the policy is either "full", "half", or "immediate".

Modified:
    trunk/channels/chan_dahdi.c

Modified: trunk/channels/chan_dahdi.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_dahdi.c?view=diff&rev=131868&r1=131867&r2=131868
==============================================================================
--- trunk/channels/chan_dahdi.c (original)
+++ trunk/channels/chan_dahdi.c Thu Jul 17 17:40:00 2008
@@ -510,6 +510,8 @@
 	struct dahdi_pvt *master;				/*!< Master to us (we follow their conferencing) */
 	int inconference;				/*!< If our real should be in the conference */
 	
+	int buf_no;					/*!< Number of buffers */
+	int buf_policy;				/*!< Buffer policy */
 	int sig;					/*!< Signalling style */
 	int radio;					/*!< radio type */
 	int outsigmod;					/*!< Outbound Signalling style (modifier) */
@@ -801,7 +803,10 @@
 
 			.polarityonanswerdelay = 600,
 
-			.sendcalleridafter = DEFAULT_CIDRINGS
+			.sendcalleridafter = DEFAULT_CIDRINGS,
+		
+			.buf_policy = DAHDI_POLICY_IMMEDIATE,
+			.buf_no = numbufs
 		},
 		.timing = {
 			.prewinktime = -1,
@@ -1154,9 +1159,9 @@
 
 	res = ioctl(p->subs[x].zfd, DAHDI_GET_BUFINFO, &bi);
 	if (!res) {
-		bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
-		bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
-		bi.numbufs = numbufs;
+		bi.txbufpolicy = p->buf_policy;
+		bi.rxbufpolicy = p->buf_policy;
+		bi.numbufs = p->buf_no;
 		res = ioctl(p->subs[x].zfd, DAHDI_SET_BUFINFO, &bi);
 		if (res < 0) {
 			ast_log(LOG_WARNING, "Unable to set buffer policy on channel %d: %s\n", x, strerror(errno));
@@ -8550,9 +8555,9 @@
 			memset(&bi, 0, sizeof(bi));
 			res = ioctl(tmp->subs[SUB_REAL].zfd, DAHDI_GET_BUFINFO, &bi);
 			if (!res) {
-				bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
-				bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
-				bi.numbufs = numbufs;
+				bi.txbufpolicy = conf->chan.buf_policy;
+				bi.rxbufpolicy = conf->chan.buf_policy;
+				bi.numbufs = conf->chan.buf_no;
 				res = ioctl(tmp->subs[SUB_REAL].zfd, DAHDI_SET_BUFINFO, &bi);
 				if (res < 0) {
 					ast_log(LOG_WARNING, "Unable to set buffer policy on channel %d: %s\n", channel, strerror(errno));
@@ -8906,9 +8911,9 @@
 		}
 		res = ioctl(p->subs[SUB_REAL].zfd, DAHDI_GET_BUFINFO, &bi);
 		if (!res) {
-			bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
-			bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
-			bi.numbufs = numbufs;
+			bi.txbufpolicy = src->buf_policy;
+			bi.rxbufpolicy = src->buf_policy;
+			bi.numbufs = src->buf_no;
 			res = ioctl(p->subs[SUB_REAL].zfd, DAHDI_SET_BUFINFO, &bi);
 			if (res < 0) {
 				ast_log(LOG_WARNING, "Unable to set buffer policy on dup channel: %s\n", strerror(errno));
@@ -13758,7 +13763,7 @@
 static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct ast_variable *v, int reload, int options)
 {
 	struct dahdi_pvt *tmp;
-	const char *ringc; /* temporary string for parsing the dring number. */
+	const char *tempstr; /* temporary string for parsing the dring number, buffers policy */
 	int y;
 	int found_pseudo = 0;
 	char dahdichan[MAX_CHANLIST_LEN] = {};
@@ -13784,6 +13789,19 @@
  			iscrv = !strcasecmp(v->name, "crv");
  			if (build_channels(confp, iscrv, v->value, reload, v->lineno, &found_pseudo))
  					return -1;
+		} else if (!strcasecmp(v->name, "buffers")) {
+			char policy[8];
+			tempstr = v->value;
+			sscanf(tempstr, "%d,%s", &confp->chan.buf_no, policy);
+			if (confp->chan.buf_no < 0)
+				confp->chan.buf_no = numbufs;
+			if (!strcasecmp(policy, "full")) {
+				confp->chan.buf_policy = DAHDI_POLICY_WHEN_FULL;
+			} else if (!strcasecmp(policy, "half")) {
+				confp->chan.buf_policy = DAHDI_POLICY_IMMEDIATE /*HALF_FULL*/;
+			} else {
+				confp->chan.buf_policy = DAHDI_POLICY_IMMEDIATE;
+			}
  		} else if (!strcasecmp(v->name, "dahdichan")) {
  			ast_copy_string(dahdichan, v->value, sizeof(dahdichan));
 		} else if (!strcasecmp(v->name, "usedistinctiveringdetection")) {
@@ -13803,14 +13821,14 @@
 		} else if (!strcasecmp(v->name, "dring3range")) {
 			confp->chan.drings.ringnum[2].range = atoi(v->value);
 		} else if (!strcasecmp(v->name, "dring1")) {
-			ringc = v->value;
-			sscanf(ringc, "%d,%d,%d", &confp->chan.drings.ringnum[0].ring[0], &confp->chan.drings.ringnum[0].ring[1], &confp->chan.drings.ringnum[0].ring[2]);
+			tempstr = v->value;
+			sscanf(tempstr, "%d,%d,%d", &confp->chan.drings.ringnum[0].ring[0], &confp->chan.drings.ringnum[0].ring[1], &confp->chan.drings.ringnum[0].ring[2]);
 		} else if (!strcasecmp(v->name, "dring2")) {
-			ringc = v->value;
-			sscanf(ringc,"%d,%d,%d", &confp->chan.drings.ringnum[1].ring[0], &confp->chan.drings.ringnum[1].ring[1], &confp->chan.drings.ringnum[1].ring[2]);
+			tempstr = v->value;
+			sscanf(tempstr,"%d,%d,%d", &confp->chan.drings.ringnum[1].ring[0], &confp->chan.drings.ringnum[1].ring[1], &confp->chan.drings.ringnum[1].ring[2]);
 		} else if (!strcasecmp(v->name, "dring3")) {
-			ringc = v->value;
-			sscanf(ringc, "%d,%d,%d", &confp->chan.drings.ringnum[2].ring[0], &confp->chan.drings.ringnum[2].ring[1], &confp->chan.drings.ringnum[2].ring[2]);
+			tempstr = v->value;
+			sscanf(tempstr, "%d,%d,%d", &confp->chan.drings.ringnum[2].ring[0], &confp->chan.drings.ringnum[2].ring[1], &confp->chan.drings.ringnum[2].ring[2]);
 		} else if (!strcasecmp(v->name, "usecallerid")) {
 			confp->chan.use_callerid = ast_true(v->value);
 		} else if (!strcasecmp(v->name, "cidsignalling")) {




More information about the svn-commits mailing list