[libpri-commits] mattf: branch mattf/libpri-1.4-ntptmp r941 - /team/mattf/libpri-1.4-ntptmp/
SVN commits to the libpri project
libpri-commits at lists.digium.com
Fri Jul 17 16:49:05 CDT 2009
Author: mattf
Date: Fri Jul 17 16:49:00 2009
New Revision: 941
URL: http://svn.asterisk.org/svn-view/libpri?view=rev&rev=941
Log:
Add support for checking mode validity when receiving TEI management messages
Modified:
team/mattf/libpri-1.4-ntptmp/pri.c
team/mattf/libpri-1.4-ntptmp/pri_internal.h
team/mattf/libpri-1.4-ntptmp/q921.c
team/mattf/libpri-1.4-ntptmp/q931.c
Modified: team/mattf/libpri-1.4-ntptmp/pri.c
URL: http://svn.asterisk.org/svn-view/libpri/team/mattf/libpri-1.4-ntptmp/pri.c?view=diff&rev=941&r1=940&r2=941
==============================================================================
--- team/mattf/libpri-1.4-ntptmp/pri.c (original)
+++ team/mattf/libpri-1.4-ntptmp/pri.c Fri Jul 17 16:49:00 2009
@@ -223,7 +223,7 @@
/* Pass in the master for this function */
void __pri_free_tei(struct pri * p)
{
- free (p);
+ free(p);
}
struct pri *__pri_new_tei(int fd, int node, int switchtype, struct pri *master, pri_io_cb rd, pri_io_cb wr, void *userdata, int tei, int bri)
Modified: team/mattf/libpri-1.4-ntptmp/pri_internal.h
URL: http://svn.asterisk.org/svn-view/libpri/team/mattf/libpri-1.4-ntptmp/pri_internal.h?view=diff&rev=941&r1=940&r2=941
==============================================================================
--- team/mattf/libpri-1.4-ntptmp/pri_internal.h (original)
+++ team/mattf/libpri-1.4-ntptmp/pri_internal.h Fri Jul 17 16:49:00 2009
@@ -32,6 +32,7 @@
#include <stddef.h>
#include <sys/time.h>
+#include "pri_q921.h"
#define ARRAY_LEN(arr) (sizeof(arr) / sizeof((arr)[0]))
@@ -294,4 +295,21 @@
void __pri_free_tei(struct pri *p);
+static inline int BRI_NT_PTMP(struct pri *ctrl)
+{
+ while (ctrl->master)
+ ctrl = ctrl->master;
+
+ return ctrl->bri && (((ctrl)->localtype == PRI_NETWORK) && ((ctrl)->tei == Q921_TEI_GROUP));
+}
+
+static inline int BRI_TE_PTMP(struct pri *ctrl)
+{
+ while (ctrl->master)
+ ctrl = ctrl->master;
+
+ return ctrl->bri && (((ctrl)->localtype == PRI_CPE) && ((ctrl)->tei == Q921_TEI_GROUP));
+}
+
+
#endif
Modified: team/mattf/libpri-1.4-ntptmp/q921.c
URL: http://svn.asterisk.org/svn-view/libpri/team/mattf/libpri-1.4-ntptmp/q921.c?view=diff&rev=941&r1=940&r2=941
==============================================================================
--- team/mattf/libpri-1.4-ntptmp/q921.c (original)
+++ team/mattf/libpri-1.4-ntptmp/q921.c Fri Jul 17 16:49:00 2009
@@ -912,6 +912,12 @@
int ri;
struct pri *sub;
int tei;
+
+ if (!BRI_NT_PTMP(pri) && !BRI_TE_PTMP(pri)) {
+ pri_error(pri, "Received MDL/TEI managemement message, but configured for mode other than PTMP!\n");
+ return NULL;
+ }
+
if (pri->debug & PRI_DEBUG_Q921_STATE)
pri_message(pri, "Received MDL message\n");
if (h->data[0] != 0x0f) {
@@ -926,17 +932,19 @@
tei = (h->data[4] >> 1);
switch(h->data[3]) {
case Q921_TEI_IDENTITY_REQUEST:
+ if (!BRI_NT_PTMP(pri)) {
+ return NULL;
+ }
+
if (tei != 127) {
pri_error(pri, "Received TEI identity request with invalid TEI %d\n", tei);
q921_send_tei(pri, Q921_TEI_IDENTITY_DENIED, ri, tei, 1);
}
- /* Go to master */
- for (sub = pri; sub->master; sub = sub->master);
tei = 64;
-/*! \todo XXX Error: The following loop never terminates! */
- while(sub->subchannel) {
- if(sub->subchannel->tei == tei)
+ while (sub->subchannel) {
+ if (sub->subchannel->tei == tei)
++tei;
+ sub = sub->subchannel;
}
sub->subchannel = __pri_new_tei(-1, pri->localtype, pri->switchtype, pri, NULL, NULL, NULL, tei, 1);
if (!sub->subchannel) {
@@ -946,6 +954,9 @@
q921_send_tei(pri, Q921_TEI_IDENTITY_ASSIGNED, ri, tei, 1);
break;
case Q921_TEI_IDENTITY_ASSIGNED:
+ if (!BRI_TE_PTMP(pri))
+ return NULL;
+
if (ri != pri->ri) {
pri_message(pri, "TEI assignment received for invalid Ri %02x (our is %02x)\n", ri, pri->ri);
return NULL;
@@ -969,6 +980,8 @@
pri->q921_state = Q921_TEI_ASSIGNED;
break;
case Q921_TEI_IDENTITY_CHECK_REQUEST:
+ if (!BRI_TE_PTMP(pri))
+ return NULL;
/* We're assuming one TEI per PRI in TE PTMP mode */
/* If no subchannel (TEI) ignore */
@@ -981,6 +994,8 @@
break;
case Q921_TEI_IDENTITY_REMOVE:
+ if (!BRI_TE_PTMP(pri))
+ return NULL;
/* XXX: Assuming multiframe mode has been disconnected already */
if (!pri->subchannel)
return NULL;
@@ -1243,6 +1258,28 @@
return NULL;
}
+#if 0
+static pri_event *q921_handle_unmatched_frame(struct pri *pri, q921_h *h, int len)
+{
+ pri_error(pri, "Could not find candidate subchannel for received frame with SAPI/TEI of %d/%d.\n", h->h.sapi, h->h.tei);
+ if (h->h.tei < 64) {
+ pri_error(pri, "Do not support manual TEI range. Discarding\n");
+ return NULL;
+ }
+
+ if (h->h.sapi != Q921_CALL_CTRL) {
+ pri_error(pri, "Message with SAPI other than CALL CTRL is discarded\n");
+ return NULL;
+ }
+
+ pri_message(pri, "Sending TEI release, in order to re-establish TEI state\n");
+
+ /* TODO: Send TEI release message here */
+
+ return NULL;
+}
+#endif
+
static pri_event *__q921_receive(struct pri *pri, q921_h *h, int len)
{
pri_event *ev;
@@ -1268,7 +1305,17 @@
if (pri->subchannel)
return q921_receive(pri->subchannel, h, len + 2);
else {
+ /* This means we couldn't find a candidate subchannel for it...
+ * Time for some corrective action */
+
+#if 0
+ if (pri->master)
+ return q921_handle_unmatched_frame(pri->master, h, len);
+ else
+ return NULL;
+#else
return NULL;
+#endif
}
}
Modified: team/mattf/libpri-1.4-ntptmp/q931.c
URL: http://svn.asterisk.org/svn-view/libpri/team/mattf/libpri-1.4-ntptmp/q931.c?view=diff&rev=941&r1=940&r2=941
==============================================================================
--- team/mattf/libpri-1.4-ntptmp/q931.c (original)
+++ team/mattf/libpri-1.4-ntptmp/q931.c Fri Jul 17 16:49:00 2009
@@ -2675,11 +2675,6 @@
*mhb = mh;
}
-static int inline PRI_NT_PTMP(struct pri *ctrl)
-{
- return (((ctrl)->localtype == PRI_NETWORK) && ((ctrl)->tei == Q921_TEI_GROUP));
-}
-
static int q931_xmit(struct pri *ctrl, q931_h *h, int len, int cr)
{
/*
@@ -2690,7 +2685,7 @@
* If those are true, we need to send the SETUP in a UI frame
* instead of an I-frame.
*/
- if (PRI_NT_PTMP(ctrl))
+ if (BRI_NT_PTMP(ctrl))
q921_transmit_uiframe(ctrl, h, len);
else
q921_transmit_iframe(ctrl, h, len, cr);
More information about the libpri-commits
mailing list