Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fe1704975 | ||
|
|
2b608d3ec8 | ||
|
|
6be94aed97 | ||
|
|
0e75c28513 | ||
|
|
6fb4d0ee4a | ||
|
|
8c5e372f29 | ||
|
|
2fa3049e19 | ||
|
|
165a1190f2 | ||
|
|
a3f9429129 | ||
|
|
26260008d1 | ||
|
|
b5feb47e50 | ||
|
|
7e04dfc279 | ||
|
|
0dcd4a1c1e | ||
|
|
3963b924b2 | ||
|
|
725b07229a | ||
|
|
f1bf41b9f3 | ||
|
|
7d1f278dbe | ||
|
|
33e5d26221 | ||
|
|
856498556b | ||
|
|
8bf694a4f5 | ||
|
|
ff8098285c | ||
|
|
67d7e324a1 | ||
|
|
7c66b22563 | ||
|
|
1626cd29b8 | ||
|
|
cbd9c37c29 | ||
|
|
c3854dede0 | ||
|
|
29d1983e4d | ||
|
|
8fc524e6e7 | ||
|
|
50e2d23352 | ||
|
|
8c424cc4ff | ||
|
|
2f6aee20d9 | ||
|
|
1328ab60de | ||
|
|
f826a6e4ad | ||
|
|
4ec90f7435 |
@@ -1,5 +0,0 @@
|
|||||||
.depend
|
|
||||||
*.lo
|
|
||||||
libpri.so.1.0
|
|
||||||
pritest
|
|
||||||
|
|
||||||
154
ChangeLog
Executable file → Normal file
154
ChangeLog
Executable file → Normal file
@@ -1,16 +1,144 @@
|
|||||||
libpri 0.3.0
|
2007-12-13 Russell Bryant <russell@digium.com>
|
||||||
-- Fix talking to switch
|
|
||||||
-- Add pri dump
|
|
||||||
-- Add test application
|
|
||||||
-- Fix strncpy stuff
|
|
||||||
libpri 0.1.2
|
|
||||||
-- Added PRI_EVENT_HANGUP_ACK so you can know when the disconnect was
|
|
||||||
acknowledged
|
|
||||||
|
|
||||||
libpri 0.1.1
|
* libpri 1.2.7 Released
|
||||||
-- Added PRI_DEBUG_Q931_ANOMALY flag so that certain non-error-related
|
|
||||||
messages would not be output unless specifically desired.
|
2007-10-22 15:09 +0000 [r478] Kevin P. Fleming <kpfleming@digium.com>
|
||||||
|
|
||||||
|
* pri_internal.h: we need to include stddef.h for 'size_t'
|
||||||
|
|
||||||
|
2007-10-16 Matthew Fredrickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* libpri 1.2.6 Released
|
||||||
|
|
||||||
|
2007-09-25 21:33 +0000 [r467] Matthew Fredrickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c: Fix user-user IE order in setup message (#10705)
|
||||||
|
|
||||||
|
2007-09-06 15:06 +0000 [r460] Matthew Fredrickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* pri.c, pri_facility.c: TBCT now works. It should work for NI2,
|
||||||
|
4E, and 5E. This code was tested on NI2.
|
||||||
|
|
||||||
|
2007-08-27 19:20 +0000 [r445] Jason Parker <jparker@digium.com>
|
||||||
|
|
||||||
|
* Makefile: Make sure we build both the static and shared modules
|
||||||
|
with -fPIC.
|
||||||
|
|
||||||
|
2007-07-09 Russell Bryant <russell@digium.com>
|
||||||
|
|
||||||
|
* libpri 1.2.5 Released
|
||||||
|
|
||||||
|
2007-06-19 18:22 +0000 [r426] Matthew Fredrickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c: Try to send pending facility messages if we receive
|
||||||
|
alerting (for when we don't get proceeding) (#9651)
|
||||||
|
|
||||||
|
2007-06-06 21:57 +0000 [r415-423] Matthew Fredrickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* pri_facility.c: Oops, that should not be on one line
|
||||||
|
|
||||||
|
* pri_facility.c: Make sure we only send the NFE when we are
|
||||||
|
talking QSIG
|
||||||
|
|
||||||
|
2007-01-22 22:20 +0000 [r389] Matthew Fredrickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c: Make sure we send DISCONNECT if we reached the active
|
||||||
|
state and a call is disconnected, regardless of cause code.
|
||||||
|
|
||||||
|
2006-12-30 19:16 +0000 [r385] Joshua Colp <jcolp@digium.com>
|
||||||
|
|
||||||
|
* Makefile: Specify full path to restorecon instead of assuming it
|
||||||
|
will be available from what is in $PATH. (issue #8670 reported by
|
||||||
|
djflux)
|
||||||
|
|
||||||
|
2006-10-17 Kevin P. Fleming <kpfleming@digium.com>
|
||||||
|
|
||||||
|
* libpri 1.2.4 Released
|
||||||
|
|
||||||
|
2006-07-28 14:44 +0000 [r368] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c: Make sure we send any pending facilty APDUs after we get
|
||||||
|
proceeding. (#7551)
|
||||||
|
|
||||||
|
2006-07-12 19:08 +0000 [r360] Russell Bryant <russell@digium.com>
|
||||||
|
|
||||||
|
* q931.c: ensure buffer is initialized (issue #7512, klaus3000)
|
||||||
|
|
||||||
|
2006-07-07 15:36 +0000 [r358] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c: Fix for #7378 (namespace collision)
|
||||||
|
|
||||||
|
2006-06-02 16:05 +0000 [r342-347] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c: Minor state fix. (#7269)
|
||||||
|
|
||||||
|
* q931.c: Fix for 7115 (Don't call pri_message multiple times per
|
||||||
|
line)
|
||||||
|
|
||||||
|
* q931.c: Fixes to fill in non-filled fields in libpri. (Issue
|
||||||
|
#7241) Thanks flefoll!
|
||||||
|
|
||||||
|
2006-05-30 Kevin P. Fleming <kpfleming@digium.com>
|
||||||
|
|
||||||
|
* libpri 1.2.3 Released
|
||||||
|
|
||||||
|
2006-04-30 15:17 +0000 [r332] Kevin P. Fleming <kpfleming@digium.com>
|
||||||
|
|
||||||
|
* Makefile: set LDCONFIG_FLAGS for GNU/kFreeBSD as well use the
|
||||||
|
flags during installation
|
||||||
|
|
||||||
|
2006-04-27 16:08 +0000 [r327] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c, libpri.h: Make sure we pass the call back in the
|
||||||
|
setup_ack
|
||||||
|
|
||||||
|
2006-04-04 15:36 +0000 [r323] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* Makefile: Fix for #6566 (Makefile does not honor DESTDIR)
|
||||||
|
|
||||||
|
2006-02-17 18:55 +0000 [r316] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c: Backport of 6480
|
||||||
|
|
||||||
|
2006-02-15 17:59 +0000 [r311] Matt O'Gorman <mogorman@digium.com>
|
||||||
|
|
||||||
|
* README: bug 6500 typo in README.
|
||||||
|
|
||||||
|
2006-02-13 23:06 +0000 [r306] Kevin P. Fleming <kpfleming@digium.com>
|
||||||
|
|
||||||
|
* pri_facility.c: suppress annoying message about unsupported
|
||||||
|
components in facility messages
|
||||||
|
|
||||||
|
2006-01-18 Russell Bryant <russell@digium.com>
|
||||||
|
|
||||||
|
* Libpri 1.2.2 Released
|
||||||
|
|
||||||
|
2006-01-17 13:43 +0000 [r291] Kevin P. Fleming <kpfleming@digium.com>
|
||||||
|
|
||||||
|
* q931.c: ensure that user-user info field in call is properly
|
||||||
|
reset when not needed
|
||||||
|
|
||||||
|
2006-01-10 20:19 +0000 [r290] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* Makefile: Backport of doing correct minor numbers to 1.2 (#6188)
|
||||||
|
|
||||||
|
2005-12-27 14:01 +0000 [r284] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c: Fix for issue #6039 backported to 1.2
|
||||||
|
|
||||||
|
2005-12-06 21:35 +0000 [r280] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q921.c: Send RR as command instead of response when T200 expires
|
||||||
|
after receiving RNR.
|
||||||
|
|
||||||
|
2005-12-01 23:13 +0000 [r274] Kevin P. Fleming <kpfleming@digium.com>
|
||||||
|
|
||||||
|
* Makefile: Makefile 'update' target now supports Subversion
|
||||||
|
repositories (issue #5875)
|
||||||
|
|
||||||
|
2005-12-01 02:34 +0000 [r270] Matt Frederickson <creslin@digium.com>
|
||||||
|
|
||||||
|
* q931.c: Backport of fix from trunk. Fix broken single digit
|
||||||
|
keypad facility code.
|
||||||
|
|
||||||
libpri 0.1.0
|
|
||||||
-- Initial release
|
|
||||||
|
|
||||||
|
|||||||
28
Makefile
Executable file → Normal file
28
Makefile
Executable file → Normal file
@@ -38,12 +38,12 @@ STATIC_LIBRARY=libpri.a
|
|||||||
DYNAMIC_LIBRARY=libpri.so.1.0
|
DYNAMIC_LIBRARY=libpri.so.1.0
|
||||||
STATIC_OBJS=copy_string.o pri.o q921.o prisched.o q931.o pri_facility.o
|
STATIC_OBJS=copy_string.o pri.o q921.o prisched.o q931.o pri_facility.o
|
||||||
DYNAMIC_OBJS=copy_string.lo pri.lo q921.lo prisched.lo q931.lo pri_facility.lo
|
DYNAMIC_OBJS=copy_string.lo pri.lo q921.lo prisched.lo q931.lo pri_facility.lo
|
||||||
CFLAGS=-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -g $(ALERTING) $(LIBPRI_COUNTERS)
|
CFLAGS=-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -g -fPIC $(ALERTING) $(LIBPRI_COUNTERS)
|
||||||
INSTALL_PREFIX?=
|
INSTALL_PREFIX=$(DESTDIR)
|
||||||
INSTALL_BASE=/usr
|
INSTALL_BASE=/usr
|
||||||
SOFLAGS = -Wl,-hlibpri.so.1
|
SOFLAGS = -Wl,-hlibpri.so.1.0
|
||||||
LDCONFIG = /sbin/ldconfig
|
LDCONFIG = /sbin/ldconfig
|
||||||
ifeq (${OSARCH},Linux)
|
ifneq (,$(findstring $(OSARCH), Linux GNU/kFreeBSD))
|
||||||
LDCONFIG_FLAGS=-n
|
LDCONFIG_FLAGS=-n
|
||||||
else
|
else
|
||||||
ifeq (${OSARCH},FreeBSD)
|
ifeq (${OSARCH},FreeBSD)
|
||||||
@@ -70,11 +70,14 @@ endif
|
|||||||
all: depend $(STATIC_LIBRARY) $(DYNAMIC_LIBRARY)
|
all: depend $(STATIC_LIBRARY) $(DYNAMIC_LIBRARY)
|
||||||
|
|
||||||
update:
|
update:
|
||||||
@if [ -d CVS ]; then \
|
@if [ -d .svn ]; then \
|
||||||
|
echo "Updating from Subversion..." ; \
|
||||||
|
svn update -q; \
|
||||||
|
elif [ -d CVS ]; then \
|
||||||
echo "Updating from CVS..." ; \
|
echo "Updating from CVS..." ; \
|
||||||
cvs -q -z3 update -Pd; \
|
cvs -q -z3 update -Pd; \
|
||||||
else \
|
else \
|
||||||
echo "Not CVS"; \
|
echo "Not under version control"; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
install: $(STATIC_LIBRARY) $(DYNAMIC_LIBRARY)
|
install: $(STATIC_LIBRARY) $(DYNAMIC_LIBRARY)
|
||||||
@@ -83,14 +86,14 @@ install: $(STATIC_LIBRARY) $(DYNAMIC_LIBRARY)
|
|||||||
ifneq (${OSARCH},SunOS)
|
ifneq (${OSARCH},SunOS)
|
||||||
install -m 644 libpri.h $(INSTALL_PREFIX)$(INSTALL_BASE)/include
|
install -m 644 libpri.h $(INSTALL_PREFIX)$(INSTALL_BASE)/include
|
||||||
install -m 755 $(DYNAMIC_LIBRARY) $(INSTALL_PREFIX)$(INSTALL_BASE)/lib
|
install -m 755 $(DYNAMIC_LIBRARY) $(INSTALL_PREFIX)$(INSTALL_BASE)/lib
|
||||||
if [ -x /usr/sbin/sestatus ] && ( /usr/sbin/sestatus | grep "SELinux status:" | grep -q "enabled"); then restorecon -v $(INSTALL_PREFIX)$(INSTALL_BASE)/lib/$(DYNAMIC_LIBRARY); fi
|
if [ -x /usr/sbin/sestatus ] && ( /usr/sbin/sestatus | grep "SELinux status:" | grep -q "enabled"); then /sbin/restorecon -v $(INSTALL_PREFIX)$(INSTALL_BASE)/lib/$(DYNAMIC_LIBRARY); fi
|
||||||
( cd $(INSTALL_PREFIX)$(INSTALL_BASE)/lib ; ln -sf libpri.so.1 libpri.so )
|
( cd $(INSTALL_PREFIX)$(INSTALL_BASE)/lib ; ln -sf libpri.so.1.0 libpri.so ; ln -sf libpri.so.1.0 libpri.so.1 )
|
||||||
install -m 644 $(STATIC_LIBRARY) $(INSTALL_PREFIX)$(INSTALL_BASE)/lib
|
install -m 644 $(STATIC_LIBRARY) $(INSTALL_PREFIX)$(INSTALL_BASE)/lib
|
||||||
if test $$(id -u) = 0; then $(LDCONFIG); fi
|
if test $$(id -u) = 0; then $(LDCONFIG) $(LDCONFIG_FLAGS) $(INSTALL_PREFIX)$(INSTALL_BASE)/lib; fi
|
||||||
else
|
else
|
||||||
install -f $(INSTALL_PREFIX)$(INSTALL_BASE)/include -m 644 libpri.h
|
install -f $(INSTALL_PREFIX)$(INSTALL_BASE)/include -m 644 libpri.h
|
||||||
install -f $(INSTALL_PREFIX)$(INSTALL_BASE)/lib -m 755 $(DYNAMIC_LIBRARY)
|
install -f $(INSTALL_PREFIX)$(INSTALL_BASE)/lib -m 755 $(DYNAMIC_LIBRARY)
|
||||||
( cd $(INSTALL_PREFIX)$(INSTALL_BASE)/lib ; ln -sf libpri.so.1 libpri.so ; $(SOSLINK) )
|
( cd $(INSTALL_PREFIX)$(INSTALL_BASE)/lib ; ln -sf libpri.so.1.0 libpri.so ; $(SOSLINK) )
|
||||||
install -f $(INSTALL_PREFIX)$(INSTALL_BASE)/lib -m 644 $(STATIC_LIBRARY)
|
install -f $(INSTALL_PREFIX)$(INSTALL_BASE)/lib -m 644 $(STATIC_LIBRARY)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -119,7 +122,7 @@ include .depend
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
%.lo : %.c
|
%.lo : %.c
|
||||||
$(CC) -fPIC $(CFLAGS) -o $@ -c $<
|
$(CC) $(CFLAGS) -o $@ -c $<
|
||||||
|
|
||||||
$(STATIC_LIBRARY): $(STATIC_OBJS)
|
$(STATIC_LIBRARY): $(STATIC_OBJS)
|
||||||
ar rcs $(STATIC_LIBRARY) $(STATIC_OBJS)
|
ar rcs $(STATIC_LIBRARY) $(STATIC_OBJS)
|
||||||
@@ -128,7 +131,8 @@ $(STATIC_LIBRARY): $(STATIC_OBJS)
|
|||||||
$(DYNAMIC_LIBRARY): $(DYNAMIC_OBJS)
|
$(DYNAMIC_LIBRARY): $(DYNAMIC_OBJS)
|
||||||
$(CC) -shared $(SOFLAGS) -o $@ $(DYNAMIC_OBJS)
|
$(CC) -shared $(SOFLAGS) -o $@ $(DYNAMIC_OBJS)
|
||||||
$(LDCONFIG) $(LDCONFIG_FLAGS) .
|
$(LDCONFIG) $(LDCONFIG_FLAGS) .
|
||||||
ln -sf libpri.so.1 libpri.so
|
ln -sf libpri.so.1.0 libpri.so
|
||||||
|
ln -sf libpri.so.1.0 libpri.so.1
|
||||||
$(SOSLINK)
|
$(SOSLINK)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|||||||
2
README
Executable file → Normal file
2
README
Executable file → Normal file
@@ -1,4 +1,4 @@
|
|||||||
libpri: An implementation of Primate Rate ISDN
|
libpri: An implementation of Primary Rate ISDN
|
||||||
|
|
||||||
Written by Mark Spencer <markster@digium.com>
|
Written by Mark Spencer <markster@digium.com>
|
||||||
|
|
||||||
|
|||||||
0
compiler.h
Executable file → Normal file
0
compiler.h
Executable file → Normal file
0
copy_string.c
Executable file → Normal file
0
copy_string.c
Executable file → Normal file
1
libpri.h
Executable file → Normal file
1
libpri.h
Executable file → Normal file
@@ -359,6 +359,7 @@ typedef struct pri_event_proceeding {
|
|||||||
typedef struct pri_event_setup_ack {
|
typedef struct pri_event_setup_ack {
|
||||||
int e;
|
int e;
|
||||||
int channel;
|
int channel;
|
||||||
|
q931_call *call;
|
||||||
} pri_event_setup_ack;
|
} pri_event_setup_ack;
|
||||||
|
|
||||||
typedef struct pri_event_notify {
|
typedef struct pri_event_notify {
|
||||||
|
|||||||
20
pri.c
Executable file → Normal file
20
pri.c
Executable file → Normal file
@@ -521,24 +521,30 @@ int pri_channel_bridge(q931_call *call1, q931_call *call2)
|
|||||||
if (!call1 || !call2)
|
if (!call1 || !call2)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Check switchtype compatibility */
|
/* Make sure we have compatible switchtypes */
|
||||||
if (call1->pri->switchtype != PRI_SWITCH_LUCENT5E ||
|
if (call1->pri->switchtype != call2->pri->switchtype)
|
||||||
call2->pri->switchtype != PRI_SWITCH_LUCENT5E)
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Check for bearer capability */
|
/* Check for bearer capability */
|
||||||
if (call1->transcapability != call2->transcapability)
|
if (call1->transcapability != call2->transcapability)
|
||||||
return -1;
|
return -1;
|
||||||
/* Check to see if calls are on the same PRI dchannel
|
|
||||||
* Currently only support calls on the same dchannel
|
/* Check to see if we're on the same PRI */
|
||||||
*/
|
|
||||||
if (call1->pri != call2->pri)
|
if (call1->pri != call2->pri)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
switch (call1->pri->switchtype) {
|
||||||
|
case PRI_SWITCH_NI2:
|
||||||
|
case PRI_SWITCH_LUCENT5E:
|
||||||
|
case PRI_SWITCH_ATT4ESS:
|
||||||
if (eect_initiate_transfer(call1->pri, call1, call2))
|
if (eect_initiate_transfer(call1->pri, call1, call2))
|
||||||
return -1;
|
return -1;
|
||||||
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int pri_hangup(struct pri *pri, q931_call *call, int cause)
|
int pri_hangup(struct pri *pri, q931_call *call, int cause)
|
||||||
|
|||||||
24
pri_facility.c
Executable file → Normal file
24
pri_facility.c
Executable file → Normal file
@@ -721,11 +721,13 @@ static int add_callername_facility_ies(struct pri *pri, q931_call *c, int cpe)
|
|||||||
buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS);
|
buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS);
|
||||||
/* Interpretation component */
|
/* Interpretation component */
|
||||||
|
|
||||||
|
if (pri->switchtype == PRI_SWITCH_QSIG) {
|
||||||
ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i);
|
ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i);
|
||||||
ASN1_PUSH(compstk, compsp, comp);
|
ASN1_PUSH(compstk, compsp, comp);
|
||||||
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0);
|
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0);
|
||||||
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_2), buffer, i, 0);
|
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_2), buffer, i, 0);
|
||||||
ASN1_FIXUP(compstk, compsp, buffer, i);
|
ASN1_FIXUP(compstk, compsp, buffer, i);
|
||||||
|
}
|
||||||
|
|
||||||
ASN1_ADD_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, buffer, i, 0);
|
ASN1_ADD_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, buffer, i, 0);
|
||||||
|
|
||||||
@@ -762,11 +764,13 @@ static int add_callername_facility_ies(struct pri *pri, q931_call *c, int cpe)
|
|||||||
buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS);
|
buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS);
|
||||||
/* Interpretation component */
|
/* Interpretation component */
|
||||||
|
|
||||||
|
if (pri->switchtype == PRI_SWITCH_QSIG) {
|
||||||
ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i);
|
ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i);
|
||||||
ASN1_PUSH(compstk, compsp, comp);
|
ASN1_PUSH(compstk, compsp, comp);
|
||||||
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0);
|
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0);
|
||||||
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_2), buffer, i, 0);
|
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_2), buffer, i, 0);
|
||||||
ASN1_FIXUP(compstk, compsp, buffer, i);
|
ASN1_FIXUP(compstk, compsp, buffer, i);
|
||||||
|
}
|
||||||
|
|
||||||
ASN1_ADD_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, buffer, i, 0);
|
ASN1_ADD_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, buffer, i, 0);
|
||||||
|
|
||||||
@@ -855,13 +859,10 @@ extern int mwi_message_send(struct pri* pri, q931_call *call, struct pri_sr *req
|
|||||||
/* EECT functions */
|
/* EECT functions */
|
||||||
extern int eect_initiate_transfer(struct pri *pri, q931_call *c1, q931_call *c2)
|
extern int eect_initiate_transfer(struct pri *pri, q931_call *c1, q931_call *c2)
|
||||||
{
|
{
|
||||||
/* Did all the tests to see if we're on the same PRI and
|
|
||||||
* are on a compatible switchtype */
|
|
||||||
/* TODO */
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
unsigned char buffer[255] = "";
|
unsigned char buffer[255] = "";
|
||||||
unsigned short call_reference = c2->cr;
|
short call_reference = c2->cr ^ 0x8000; /* Let's do the trickery to make sure the flag is correct */
|
||||||
struct rose_component *comp = NULL, *compstk[10];
|
struct rose_component *comp = NULL, *compstk[10];
|
||||||
int compsp = 0;
|
int compsp = 0;
|
||||||
static unsigned char op_tag[] = {
|
static unsigned char op_tag[] = {
|
||||||
@@ -874,16 +875,7 @@ extern int eect_initiate_transfer(struct pri *pri, q931_call *c1, q931_call *c2)
|
|||||||
0x08,
|
0x08,
|
||||||
};
|
};
|
||||||
|
|
||||||
buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS);
|
buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_ROSE);
|
||||||
/* Interpretation component */
|
|
||||||
|
|
||||||
ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i);
|
|
||||||
ASN1_PUSH(compstk, compsp, comp);
|
|
||||||
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0);
|
|
||||||
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_2), buffer, i, 0);
|
|
||||||
ASN1_FIXUP(compstk, compsp, buffer, i);
|
|
||||||
|
|
||||||
ASN1_ADD_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, buffer, i, 0);
|
|
||||||
|
|
||||||
ASN1_ADD_SIMPLE(comp, COMP_TYPE_INVOKE, buffer, i);
|
ASN1_ADD_SIMPLE(comp, COMP_TYPE_INVOKE, buffer, i);
|
||||||
ASN1_PUSH(compstk, compsp, comp);
|
ASN1_PUSH(compstk, compsp, comp);
|
||||||
@@ -1136,13 +1128,17 @@ extern int rose_invoke_decode(struct pri *pri, q931_call *call, unsigned char *d
|
|||||||
do {
|
do {
|
||||||
/* Invoke ID stuff */
|
/* Invoke ID stuff */
|
||||||
GET_COMPONENT(comp, i, vdata, len);
|
GET_COMPONENT(comp, i, vdata, len);
|
||||||
|
#if 0
|
||||||
CHECK_COMPONENT(comp, INVOKE_IDENTIFIER, "Don't know what to do if first ROSE component is of type 0x%x\n");
|
CHECK_COMPONENT(comp, INVOKE_IDENTIFIER, "Don't know what to do if first ROSE component is of type 0x%x\n");
|
||||||
|
#endif
|
||||||
invokeid = comp;
|
invokeid = comp;
|
||||||
NEXT_COMPONENT(comp, i);
|
NEXT_COMPONENT(comp, i);
|
||||||
|
|
||||||
/* Operation Tag */
|
/* Operation Tag */
|
||||||
GET_COMPONENT(comp, i, vdata, len);
|
GET_COMPONENT(comp, i, vdata, len);
|
||||||
|
#if 0
|
||||||
CHECK_COMPONENT(comp, ASN1_INTEGER, "Don't know what to do if second ROSE component is of type 0x%x\n");
|
CHECK_COMPONENT(comp, ASN1_INTEGER, "Don't know what to do if second ROSE component is of type 0x%x\n");
|
||||||
|
#endif
|
||||||
operationid = comp;
|
operationid = comp;
|
||||||
ASN1_GET_INTEGER(comp, operation_tag);
|
ASN1_GET_INTEGER(comp, operation_tag);
|
||||||
NEXT_COMPONENT(comp, i);
|
NEXT_COMPONENT(comp, i);
|
||||||
|
|||||||
0
pri_facility.h
Executable file → Normal file
0
pri_facility.h
Executable file → Normal file
1
pri_internal.h
Executable file → Normal file
1
pri_internal.h
Executable file → Normal file
@@ -25,6 +25,7 @@
|
|||||||
#ifndef _PRI_INTERNAL_H
|
#ifndef _PRI_INTERNAL_H
|
||||||
#define _PRI_INTERNAL_H
|
#define _PRI_INTERNAL_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
struct pri_sched {
|
struct pri_sched {
|
||||||
|
|||||||
0
pri_q921.h
Executable file → Normal file
0
pri_q921.h
Executable file → Normal file
0
pri_q931.h
Executable file → Normal file
0
pri_q931.h
Executable file → Normal file
0
pri_timers.h
Executable file → Normal file
0
pri_timers.h
Executable file → Normal file
0
prisched.c
Executable file → Normal file
0
prisched.c
Executable file → Normal file
2
q921.c
Executable file → Normal file
2
q921.c
Executable file → Normal file
@@ -338,7 +338,7 @@ static void t200_expire(void *vpri)
|
|||||||
if (pri->debug & PRI_DEBUG_Q921_STATE)
|
if (pri->debug & PRI_DEBUG_Q921_STATE)
|
||||||
pri_message(pri, "-- Retransmitting %d bytes\n", pri->txqueue->len);
|
pri_message(pri, "-- Retransmitting %d bytes\n", pri->txqueue->len);
|
||||||
if (pri->busy)
|
if (pri->busy)
|
||||||
q921_rr(pri, 1, 0);
|
q921_rr(pri, 1, 1);
|
||||||
else {
|
else {
|
||||||
if (!pri->txqueue->transmitted)
|
if (!pri->txqueue->transmitted)
|
||||||
pri_error(pri, "!! Not good - head of queue has not been transmitted yet\n");
|
pri_error(pri, "!! Not good - head of queue has not been transmitted yet\n");
|
||||||
|
|||||||
99
q931.c
Executable file → Normal file
99
q931.c
Executable file → Normal file
@@ -43,7 +43,7 @@ struct msgtype {
|
|||||||
int mandies[MAX_MAND_IES];
|
int mandies[MAX_MAND_IES];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct msgtype msgs[] = {
|
static struct msgtype msgs[] = {
|
||||||
/* Call establishment messages */
|
/* Call establishment messages */
|
||||||
{ Q931_ALERTING, "ALERTING" },
|
{ Q931_ALERTING, "ALERTING" },
|
||||||
{ Q931_CALL_PROCEEDING, "CALL PROCEEDING" },
|
{ Q931_CALL_PROCEEDING, "CALL PROCEEDING" },
|
||||||
@@ -89,7 +89,7 @@ struct msgtype msgs[] = {
|
|||||||
{ NATIONAL_SERVICE_ACKNOWLEDGE, "SERVICE ACKNOWLEDGE" },
|
{ NATIONAL_SERVICE_ACKNOWLEDGE, "SERVICE ACKNOWLEDGE" },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct msgtype causes[] = {
|
static struct msgtype causes[] = {
|
||||||
{ PRI_CAUSE_UNALLOCATED, "Unallocated (unassigned) number" },
|
{ PRI_CAUSE_UNALLOCATED, "Unallocated (unassigned) number" },
|
||||||
{ PRI_CAUSE_NO_ROUTE_TRANSIT_NET, "No route to specified transmit network" },
|
{ PRI_CAUSE_NO_ROUTE_TRANSIT_NET, "No route to specified transmit network" },
|
||||||
{ PRI_CAUSE_NO_ROUTE_DESTINATION, "No route to destination" },
|
{ PRI_CAUSE_NO_ROUTE_DESTINATION, "No route to destination" },
|
||||||
@@ -136,7 +136,7 @@ struct msgtype causes[] = {
|
|||||||
{ PRI_CAUSE_INTERWORKING, "Interworking, unspecified" },
|
{ PRI_CAUSE_INTERWORKING, "Interworking, unspecified" },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct msgtype facilities[] = {
|
static struct msgtype facilities[] = {
|
||||||
{ PRI_NSF_SID_PREFERRED, "CPN (SID) preferred" },
|
{ PRI_NSF_SID_PREFERRED, "CPN (SID) preferred" },
|
||||||
{ PRI_NSF_ANI_PREFERRED, "BN (ANI) preferred" },
|
{ PRI_NSF_ANI_PREFERRED, "BN (ANI) preferred" },
|
||||||
{ PRI_NSF_SID_ONLY, "CPN (SID) only" },
|
{ PRI_NSF_SID_ONLY, "CPN (SID) only" },
|
||||||
@@ -736,7 +736,7 @@ char *pri_pres2str(int pres)
|
|||||||
|
|
||||||
static void q931_get_number(unsigned char *num, int maxlen, unsigned char *src, int len)
|
static void q931_get_number(unsigned char *num, int maxlen, unsigned char *src, int len)
|
||||||
{
|
{
|
||||||
if (len > maxlen - 1) {
|
if ((len < 0) || (len > maxlen - 1)) {
|
||||||
num[0] = 0;
|
num[0] = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -780,7 +780,7 @@ static FUNC_DUMP(dump_calling_party_number)
|
|||||||
static FUNC_DUMP(dump_calling_party_subaddr)
|
static FUNC_DUMP(dump_calling_party_subaddr)
|
||||||
{
|
{
|
||||||
unsigned char cnum[256];
|
unsigned char cnum[256];
|
||||||
q931_get_number(cnum, sizeof(cnum), ie->data + 2, len - 4);
|
q931_get_number(cnum, sizeof(cnum), ie->data + 1, len - 3);
|
||||||
pri_message(pri, "%c Calling Sub-Address (len=%2d) [ Ext: %d Type: %s (%d) O: %d '%s' ]\n",
|
pri_message(pri, "%c Calling Sub-Address (len=%2d) [ Ext: %d Type: %s (%d) O: %d '%s' ]\n",
|
||||||
prefix, len, ie->data[0] >> 7,
|
prefix, len, ie->data[0] >> 7,
|
||||||
subaddrtype2str((ie->data[0] & 0x70) >> 4), (ie->data[0] & 0x70) >> 4,
|
subaddrtype2str((ie->data[0] & 0x70) >> 4), (ie->data[0] & 0x70) >> 4,
|
||||||
@@ -889,7 +889,7 @@ static FUNC_DUMP(dump_redirecting_subaddr)
|
|||||||
static FUNC_RECV(receive_calling_party_subaddr)
|
static FUNC_RECV(receive_calling_party_subaddr)
|
||||||
{
|
{
|
||||||
/* copy digits to call->callingsubaddr */
|
/* copy digits to call->callingsubaddr */
|
||||||
q931_get_number((unsigned char *) call->callingsubaddr, sizeof(call->callingsubaddr), ie->data + 2, len - 4);
|
q931_get_number((unsigned char *) call->callingsubaddr, sizeof(call->callingsubaddr), ie->data + 1, len - 3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1382,12 +1382,14 @@ static FUNC_RECV(receive_keypad_facility)
|
|||||||
if (ie->len == 0)
|
if (ie->len == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (ie->len > sizeof(call->digitbuf))
|
if (ie->len > (sizeof(call->digitbuf) - 1))
|
||||||
mylen = sizeof(call->digitbuf);
|
mylen = (sizeof(call->digitbuf) - 1);
|
||||||
else
|
else
|
||||||
mylen = ie->len;
|
mylen = ie->len;
|
||||||
|
|
||||||
libpri_copy_string(call->digitbuf, (char *) ie->data, mylen);
|
memcpy(call->digitbuf, ie->data, mylen);
|
||||||
|
|
||||||
|
call->digitbuf[mylen] = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1396,7 +1398,7 @@ static FUNC_DUMP(dump_display)
|
|||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
char *buf = malloc(len + 1);
|
char *buf = malloc(len + 1);
|
||||||
char tmp[80];
|
char tmp[80] = "";
|
||||||
if (buf) {
|
if (buf) {
|
||||||
x=y=0;
|
x=y=0;
|
||||||
if ((x < ie->len) && (ie->data[x] & 0x80)) {
|
if ((x < ie->len) && (ie->data[x] & 0x80)) {
|
||||||
@@ -1905,7 +1907,7 @@ static FUNC_DUMP(dump_signal)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct ie ies[] = {
|
static struct ie ies[] = {
|
||||||
/* Codeset 0 - Common */
|
/* Codeset 0 - Common */
|
||||||
{ 1, NATIONAL_CHANGE_STATUS, "Change Status" },
|
{ 1, NATIONAL_CHANGE_STATUS, "Change Status" },
|
||||||
{ 0, Q931_LOCKING_SHIFT, "Locking Shift", dump_shift },
|
{ 0, Q931_LOCKING_SHIFT, "Locking Shift", dump_shift },
|
||||||
@@ -2068,15 +2070,17 @@ static inline void q931_dumpie(struct pri *pri, int codeset, q931_ie *ie, char p
|
|||||||
unsigned int x;
|
unsigned int x;
|
||||||
int full_ie = Q931_FULL_IE(codeset, ie->ie);
|
int full_ie = Q931_FULL_IE(codeset, ie->ie);
|
||||||
int base_ie;
|
int base_ie;
|
||||||
|
char *buf = malloc(ielen(ie) * 3 + 1);
|
||||||
|
int buflen = 0;
|
||||||
|
|
||||||
pri_message(NULL, "%c [", prefix);
|
buf[0] = '\0';
|
||||||
pri_message(NULL, "%02x", ie->ie);
|
|
||||||
if (!(ie->ie & 0x80)) {
|
if (!(ie->ie & 0x80)) {
|
||||||
pri_message(NULL, " %02x", ielen(ie)-2);
|
buflen += sprintf(buf, " %02x", ielen(ie)-2);
|
||||||
for (x = 0; x + 2 < ielen(ie); ++x)
|
for (x = 0; x + 2 < ielen(ie); ++x)
|
||||||
pri_message(NULL, " %02x", ie->data[x]);
|
buflen += sprintf(buf + buflen, " %02x", ie->data[x]);
|
||||||
}
|
}
|
||||||
pri_message(NULL, "]\n");
|
pri_message(pri, "%c [%02x%s]\n", prefix, ie->ie, buf);
|
||||||
|
free(buf);
|
||||||
|
|
||||||
/* Special treatment for shifts */
|
/* Special treatment for shifts */
|
||||||
if((full_ie & 0xf0) == Q931_LOCKING_SHIFT)
|
if((full_ie & 0xf0) == Q931_LOCKING_SHIFT)
|
||||||
@@ -2604,9 +2608,11 @@ static void pri_release_finaltimeout(void *data)
|
|||||||
pri->schedev = 1;
|
pri->schedev = 1;
|
||||||
pri->ev.e = PRI_EVENT_HANGUP_ACK;
|
pri->ev.e = PRI_EVENT_HANGUP_ACK;
|
||||||
pri->ev.hangup.channel = c->channelno;
|
pri->ev.hangup.channel = c->channelno;
|
||||||
pri->ev.hangup.cref = c->cr;
|
|
||||||
pri->ev.hangup.cause = c->cause;
|
pri->ev.hangup.cause = c->cause;
|
||||||
|
pri->ev.hangup.cref = c->cr;
|
||||||
pri->ev.hangup.call = c;
|
pri->ev.hangup.call = c;
|
||||||
|
pri->ev.hangup.aoc_units = c->aoc_units;
|
||||||
|
libpri_copy_string(pri->ev.hangup.useruserinfo, c->useruserinfo, sizeof(pri->ev.hangup.useruserinfo));
|
||||||
q931_hangup(pri, c, c->cause);
|
q931_hangup(pri, c, c->cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2636,7 +2642,10 @@ int q931_connect(struct pri *pri, q931_call *c, int channel, int nonisdn)
|
|||||||
c->progressmask = PRI_PROG_CALLED_NOT_ISDN;
|
c->progressmask = PRI_PROG_CALLED_NOT_ISDN;
|
||||||
} else
|
} else
|
||||||
c->progressmask = 0;
|
c->progressmask = 0;
|
||||||
|
if (pri->localtype == PRI_CPE)
|
||||||
c->ourcallstate = Q931_CALL_STATE_CONNECT_REQUEST;
|
c->ourcallstate = Q931_CALL_STATE_CONNECT_REQUEST;
|
||||||
|
else
|
||||||
|
c->ourcallstate = Q931_CALL_STATE_ACTIVE;
|
||||||
c->peercallstate = Q931_CALL_STATE_ACTIVE;
|
c->peercallstate = Q931_CALL_STATE_ACTIVE;
|
||||||
c->alive = 1;
|
c->alive = 1;
|
||||||
/* Setup timer */
|
/* Setup timer */
|
||||||
@@ -2716,8 +2725,9 @@ int q931_disconnect(struct pri *pri, q931_call *c, int cause)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int setup_ies[] = { Q931_BEARER_CAPABILITY, Q931_CHANNEL_IDENT, Q931_IE_FACILITY, Q931_PROGRESS_INDICATOR, Q931_NETWORK_SPEC_FAC, Q931_DISPLAY, Q931_IE_USER_USER,
|
static int setup_ies[] = { Q931_BEARER_CAPABILITY, Q931_CHANNEL_IDENT, Q931_IE_FACILITY, Q931_PROGRESS_INDICATOR, Q931_NETWORK_SPEC_FAC, Q931_DISPLAY,
|
||||||
Q931_CALLING_PARTY_NUMBER, Q931_CALLED_PARTY_NUMBER, Q931_REDIRECTING_NUMBER, Q931_SENDING_COMPLETE, Q931_IE_ORIGINATING_LINE_INFO, Q931_IE_GENERIC_DIGITS, -1 };
|
Q931_CALLING_PARTY_NUMBER, Q931_CALLED_PARTY_NUMBER, Q931_REDIRECTING_NUMBER, Q931_IE_USER_USER, Q931_SENDING_COMPLETE,
|
||||||
|
Q931_IE_ORIGINATING_LINE_INFO, Q931_IE_GENERIC_DIGITS, -1 };
|
||||||
|
|
||||||
static int gr303_setup_ies[] = { Q931_BEARER_CAPABILITY, Q931_CHANNEL_IDENT, -1 };
|
static int gr303_setup_ies[] = { Q931_BEARER_CAPABILITY, Q931_CHANNEL_IDENT, -1 };
|
||||||
|
|
||||||
@@ -2796,6 +2806,8 @@ int q931_setup(struct pri *pri, q931_call *c, struct pri_sr *req)
|
|||||||
|
|
||||||
if (req->useruserinfo)
|
if (req->useruserinfo)
|
||||||
libpri_copy_string(c->useruserinfo, req->useruserinfo, sizeof(c->useruserinfo));
|
libpri_copy_string(c->useruserinfo, req->useruserinfo, sizeof(c->useruserinfo));
|
||||||
|
else
|
||||||
|
c->useruserinfo[0] = '\0';
|
||||||
|
|
||||||
if (req->nonisdn && (pri->switchtype == PRI_SWITCH_NI2))
|
if (req->nonisdn && (pri->switchtype == PRI_SWITCH_NI2))
|
||||||
c->progressmask = PRI_PROG_CALLER_NOT_ISDN;
|
c->progressmask = PRI_PROG_CALLER_NOT_ISDN;
|
||||||
@@ -2901,8 +2913,6 @@ int q931_hangup(struct pri *pri, q931_call *c, int cause)
|
|||||||
/* sent CONNECT */
|
/* sent CONNECT */
|
||||||
case Q931_CALL_STATE_INCOMING_CALL_PROCEEDING:
|
case Q931_CALL_STATE_INCOMING_CALL_PROCEEDING:
|
||||||
/* we sent CALL_PROCEEDING */
|
/* we sent CALL_PROCEEDING */
|
||||||
case Q931_CALL_STATE_ACTIVE:
|
|
||||||
/* received CONNECT */
|
|
||||||
case Q931_CALL_STATE_OVERLAP_RECEIVING:
|
case Q931_CALL_STATE_OVERLAP_RECEIVING:
|
||||||
/* received SETUP_ACKNOWLEDGE */
|
/* received SETUP_ACKNOWLEDGE */
|
||||||
/* send DISCONNECT in general */
|
/* send DISCONNECT in general */
|
||||||
@@ -2916,6 +2926,10 @@ int q931_hangup(struct pri *pri, q931_call *c, int cause)
|
|||||||
} else
|
} else
|
||||||
pri_error(pri, "Wierd, doing nothing but this shouldn't happen, ourstate %s, peerstate %s\n",callstate2str(c->ourcallstate),callstate2str(c->peercallstate));
|
pri_error(pri, "Wierd, doing nothing but this shouldn't happen, ourstate %s, peerstate %s\n",callstate2str(c->ourcallstate),callstate2str(c->peercallstate));
|
||||||
break;
|
break;
|
||||||
|
case Q931_CALL_STATE_ACTIVE:
|
||||||
|
/* received CONNECT */
|
||||||
|
q931_disconnect(pri,c,cause);
|
||||||
|
break;
|
||||||
case Q931_CALL_STATE_DISCONNECT_REQUEST:
|
case Q931_CALL_STATE_DISCONNECT_REQUEST:
|
||||||
/* sent DISCONNECT */
|
/* sent DISCONNECT */
|
||||||
q931_release(pri,c,cause);
|
q931_release(pri,c,cause);
|
||||||
@@ -3080,6 +3094,7 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
|
|||||||
c->channelno = -1;
|
c->channelno = -1;
|
||||||
break;
|
break;
|
||||||
case Q931_INFORMATION:
|
case Q931_INFORMATION:
|
||||||
|
c->callednum[0] = '\0';
|
||||||
break;
|
break;
|
||||||
case Q931_STATUS_ENQUIRY:
|
case Q931_STATUS_ENQUIRY:
|
||||||
break;
|
break;
|
||||||
@@ -3278,8 +3293,18 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
|
|||||||
pri->ev.ringing.call = c;
|
pri->ev.ringing.call = c;
|
||||||
pri->ev.ringing.progress = c->progress;
|
pri->ev.ringing.progress = c->progress;
|
||||||
pri->ev.ringing.progressmask = c->progressmask;
|
pri->ev.ringing.progressmask = c->progressmask;
|
||||||
libpri_copy_string(pri->ev.ringing.useruserinfo, c->useruserinfo, sizeof(pri->ev.ring.useruserinfo));
|
libpri_copy_string(pri->ev.ringing.useruserinfo, c->useruserinfo, sizeof(pri->ev.ringing.useruserinfo));
|
||||||
c->useruserinfo[0] = '\0';
|
c->useruserinfo[0] = '\0';
|
||||||
|
|
||||||
|
cur = c->apdus;
|
||||||
|
while (cur) {
|
||||||
|
if (!cur->sent && cur->message == Q931_FACILITY) {
|
||||||
|
q931_facility(pri, c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
|
||||||
return Q931_RES_HAVEEVENT;
|
return Q931_RES_HAVEEVENT;
|
||||||
case Q931_CONNECT:
|
case Q931_CONNECT:
|
||||||
if (c->newcall) {
|
if (c->newcall) {
|
||||||
@@ -3298,7 +3323,7 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
|
|||||||
pri->ev.answer.call = c;
|
pri->ev.answer.call = c;
|
||||||
pri->ev.answer.progress = c->progress;
|
pri->ev.answer.progress = c->progress;
|
||||||
pri->ev.answer.progressmask = c->progressmask;
|
pri->ev.answer.progressmask = c->progressmask;
|
||||||
libpri_copy_string(pri->ev.answer.useruserinfo, c->useruserinfo, sizeof(pri->ev.ring.useruserinfo));
|
libpri_copy_string(pri->ev.answer.useruserinfo, c->useruserinfo, sizeof(pri->ev.answer.useruserinfo));
|
||||||
c->useruserinfo[0] = '\0';
|
c->useruserinfo[0] = '\0';
|
||||||
q931_connect_acknowledge(pri, c);
|
q931_connect_acknowledge(pri, c);
|
||||||
if (c->justsignalling) { /* Make sure WE release when we initiatie a signalling only connection */
|
if (c->justsignalling) { /* Make sure WE release when we initiatie a signalling only connection */
|
||||||
@@ -3352,6 +3377,16 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
|
|||||||
pri->ev.proceeding.progressmask = c->progressmask;
|
pri->ev.proceeding.progressmask = c->progressmask;
|
||||||
pri->ev.proceeding.cref = c->cr;
|
pri->ev.proceeding.cref = c->cr;
|
||||||
pri->ev.proceeding.call = c;
|
pri->ev.proceeding.call = c;
|
||||||
|
|
||||||
|
cur = c->apdus;
|
||||||
|
while (cur) {
|
||||||
|
if (!cur->sent && cur->message == Q931_FACILITY) {
|
||||||
|
q931_facility(pri, c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
|
||||||
return Q931_RES_HAVEEVENT;
|
return Q931_RES_HAVEEVENT;
|
||||||
case Q931_CONNECT_ACKNOWLEDGE:
|
case Q931_CONNECT_ACKNOWLEDGE:
|
||||||
if (c->newcall) {
|
if (c->newcall) {
|
||||||
@@ -3384,9 +3419,11 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
|
|||||||
/* Workaround for S-12 ver 7.3 - it responds for invalid/non-implemented IEs at SETUP with null call state */
|
/* Workaround for S-12 ver 7.3 - it responds for invalid/non-implemented IEs at SETUP with null call state */
|
||||||
if (!c->sugcallstate && (c->ourcallstate != Q931_CALL_STATE_CALL_INITIATED)) {
|
if (!c->sugcallstate && (c->ourcallstate != Q931_CALL_STATE_CALL_INITIATED)) {
|
||||||
pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
||||||
pri->ev.hangup.cref = c->cr;
|
|
||||||
pri->ev.hangup.cause = c->cause;
|
pri->ev.hangup.cause = c->cause;
|
||||||
|
pri->ev.hangup.cref = c->cr;
|
||||||
pri->ev.hangup.call = c;
|
pri->ev.hangup.call = c;
|
||||||
|
pri->ev.hangup.aoc_units = c->aoc_units;
|
||||||
|
libpri_copy_string(pri->ev.hangup.useruserinfo, c->useruserinfo, sizeof(pri->ev.hangup.useruserinfo));
|
||||||
/* Free resources */
|
/* Free resources */
|
||||||
c->ourcallstate = Q931_CALL_STATE_NULL;
|
c->ourcallstate = Q931_CALL_STATE_NULL;
|
||||||
c->peercallstate = Q931_CALL_STATE_NULL;
|
c->peercallstate = Q931_CALL_STATE_NULL;
|
||||||
@@ -3410,10 +3447,11 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
|
|||||||
c->ourcallstate = Q931_CALL_STATE_NULL;
|
c->ourcallstate = Q931_CALL_STATE_NULL;
|
||||||
c->peercallstate = Q931_CALL_STATE_NULL;
|
c->peercallstate = Q931_CALL_STATE_NULL;
|
||||||
pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
||||||
pri->ev.hangup.cref = c->cr;
|
|
||||||
pri->ev.hangup.cause = c->cause;
|
pri->ev.hangup.cause = c->cause;
|
||||||
|
pri->ev.hangup.cref = c->cr;
|
||||||
pri->ev.hangup.call = c;
|
pri->ev.hangup.call = c;
|
||||||
libpri_copy_string(pri->ev.hangup.useruserinfo, c->useruserinfo, sizeof(pri->ev.ring.useruserinfo));
|
pri->ev.hangup.aoc_units = c->aoc_units;
|
||||||
|
libpri_copy_string(pri->ev.hangup.useruserinfo, c->useruserinfo, sizeof(pri->ev.hangup.useruserinfo));
|
||||||
c->useruserinfo[0] = '\0';
|
c->useruserinfo[0] = '\0';
|
||||||
/* Free resources */
|
/* Free resources */
|
||||||
if (c->alive) {
|
if (c->alive) {
|
||||||
@@ -3444,11 +3482,11 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
|
|||||||
c->ourcallstate = Q931_CALL_STATE_NULL;
|
c->ourcallstate = Q931_CALL_STATE_NULL;
|
||||||
pri->ev.e = PRI_EVENT_HANGUP;
|
pri->ev.e = PRI_EVENT_HANGUP;
|
||||||
pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
||||||
pri->ev.hangup.cref = c->cr;
|
|
||||||
pri->ev.hangup.cause = c->cause;
|
pri->ev.hangup.cause = c->cause;
|
||||||
|
pri->ev.hangup.cref = c->cr;
|
||||||
pri->ev.hangup.call = c;
|
pri->ev.hangup.call = c;
|
||||||
pri->ev.hangup.aoc_units = c->aoc_units;
|
pri->ev.hangup.aoc_units = c->aoc_units;
|
||||||
libpri_copy_string(pri->ev.hangup.useruserinfo, c->useruserinfo, sizeof(pri->ev.ring.useruserinfo));
|
libpri_copy_string(pri->ev.hangup.useruserinfo, c->useruserinfo, sizeof(pri->ev.hangup.useruserinfo));
|
||||||
c->useruserinfo[0] = '\0';
|
c->useruserinfo[0] = '\0';
|
||||||
/* Don't send release complete if they send us release
|
/* Don't send release complete if they send us release
|
||||||
while we sent it, assume a NULL state */
|
while we sent it, assume a NULL state */
|
||||||
@@ -3472,10 +3510,12 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
|
|||||||
/* Return such an event */
|
/* Return such an event */
|
||||||
pri->ev.e = PRI_EVENT_HANGUP_REQ;
|
pri->ev.e = PRI_EVENT_HANGUP_REQ;
|
||||||
pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
pri->ev.hangup.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
||||||
pri->ev.hangup.cref = c->cr;
|
|
||||||
pri->ev.hangup.cause = c->cause;
|
pri->ev.hangup.cause = c->cause;
|
||||||
|
pri->ev.hangup.cref = c->cr;
|
||||||
pri->ev.hangup.call = c;
|
pri->ev.hangup.call = c;
|
||||||
pri->ev.hangup.aoc_units = c->aoc_units;
|
pri->ev.hangup.aoc_units = c->aoc_units;
|
||||||
|
libpri_copy_string(pri->ev.hangup.useruserinfo, c->useruserinfo, sizeof(pri->ev.hangup.useruserinfo));
|
||||||
|
c->useruserinfo[0] = '\0';
|
||||||
if (c->alive)
|
if (c->alive)
|
||||||
return Q931_RES_HAVEEVENT;
|
return Q931_RES_HAVEEVENT;
|
||||||
else
|
else
|
||||||
@@ -3525,6 +3565,7 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
|
|||||||
c->peercallstate = Q931_CALL_STATE_OVERLAP_RECEIVING;
|
c->peercallstate = Q931_CALL_STATE_OVERLAP_RECEIVING;
|
||||||
pri->ev.e = PRI_EVENT_SETUP_ACK;
|
pri->ev.e = PRI_EVENT_SETUP_ACK;
|
||||||
pri->ev.setup_ack.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
pri->ev.setup_ack.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
|
||||||
|
pri->ev.setup_ack.call = c;
|
||||||
|
|
||||||
cur = c->apdus;
|
cur = c->apdus;
|
||||||
while (cur) {
|
while (cur) {
|
||||||
|
|||||||
0
testprilib.c
Executable file → Normal file
0
testprilib.c
Executable file → Normal file
Reference in New Issue
Block a user