Compare commits

...

41 Commits

Author SHA1 Message Date
Kevin P. Fleming
b13a9798dd Importing files for 1.2.8 release
git-svn-id: https://origsvn.digium.com/svn/libpri/tags/1.2.8@613 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2008-08-05 22:34:18 +00:00
Kevin P. Fleming
82deae0414 Creating tag for the release of libpri-1.2.8
git-svn-id: https://origsvn.digium.com/svn/libpri/tags/1.2.8@612 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2008-08-05 22:33:07 +00:00
Kevin P. Fleming
e044d2f545 clean up license headers, and explicitly grant additional permissions when used with Asterisk
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@610 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2008-08-05 22:16:58 +00:00
Dwayne M. Hubbard
e77a1054a2 While working on issue 3450 I noticed that the information channel selection field in the channel identification IE was displayed incorrectly when using 'pri intense debug'. I wanted another pair of eyes to look at the code because everything looked correct until Shaun Ruffell noticed the missing comma in the msg_chan_sel array.
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@561 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2008-06-04 16:59:04 +00:00
Matthew Fredrickson
c53f63e1c4 Don't send a status error when we receive connect acknowledge during an active state
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@527 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2008-02-20 21:36:04 +00:00
Matthew Fredrickson
268ce63ab8 Improve transmission, receiving, and dumping of bearer capability IE (#11593)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@523 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2008-02-18 20:31:02 +00:00
Matthew Fredrickson
a17ea8d6d5 Revert previous commit 521
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@522 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2008-02-18 20:28:07 +00:00
Matthew Fredrickson
0a095c88f1 Fix for bug #960. Better support for more exotic bearer capabilities
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@521 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2008-02-18 20:25:09 +00:00
Matthew Fredrickson
2e5dd8ec5d We should not be parsing further into the bearer capability IE if the length does not confirm that there actually is data present
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@513 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2008-01-11 16:33:52 +00:00
Kevin P. Fleming
6be94aed97 we need to include stddef.h for 'size_t'
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@478 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2007-10-22 15:09:27 +00:00
Matthew Fredrickson
0e75c28513 Fix user-user IE order in setup message (#10705)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@467 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2007-09-25 21:33:16 +00:00
Matthew Fredrickson
6fb4d0ee4a TBCT now works. It should work for NI2, 4E, and 5E. This code was tested on NI2.
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@460 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2007-09-06 15:06:42 +00:00
Jason Parker
8c5e372f29 Make sure we build both the static and shared modules with -fPIC.
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@445 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2007-08-27 19:20:23 +00:00
Matthew Fredrickson
2fa3049e19 Try to send pending facility messages if we receive alerting (for when we don't get proceeding) (#9651)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@426 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2007-06-19 18:22:33 +00:00
Matthew Fredrickson
165a1190f2 Oops, that should not be on one line
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@423 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2007-06-06 21:57:15 +00:00
Matthew Fredrickson
a3f9429129 Make sure we only send the NFE when we are talking QSIG
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@415 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2007-06-06 13:20:05 +00:00
Matthew Fredrickson
26260008d1 Make sure we send DISCONNECT if we reached the active state and a call is disconnected, regardless of cause code.
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@389 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2007-01-22 22:20:59 +00:00
Joshua Colp
b5feb47e50 Specify full path to restorecon instead of assuming it will be available from what is in $PATH. (issue #8670 reported by djflux)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@385 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-12-30 19:16:17 +00:00
Matthew Fredrickson
7e04dfc279 Make sure we send any pending facilty APDUs after we get proceeding. (#7551)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@368 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-07-28 14:44:15 +00:00
Russell Bryant
0dcd4a1c1e ensure buffer is initialized (issue #7512, klaus3000)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@360 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-07-12 19:08:31 +00:00
Matthew Fredrickson
3963b924b2 Fix for #7378 (namespace collision)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@358 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-07-07 15:36:50 +00:00
Matthew Fredrickson
725b07229a Minor state fix. (#7269)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@347 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-06-02 16:05:55 +00:00
Matthew Fredrickson
f1bf41b9f3 Fix for 7115 (Don't call pri_message multiple times per line)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@345 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-06-02 14:33:50 +00:00
Matthew Fredrickson
7d1f278dbe Fixes to fill in non-filled fields in libpri. (Issue #7241) Thanks flefoll!
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@342 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-06-01 17:57:03 +00:00
Kevin P. Fleming
33e5d26221 set LDCONFIG_FLAGS for GNU/kFreeBSD as well
use the flags during installation


git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@332 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-04-30 15:17:47 +00:00
Matthew Fredrickson
856498556b Make sure we pass the call back in the setup_ack
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@327 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-04-27 16:08:39 +00:00
Matthew Fredrickson
8bf694a4f5 Fix for #6566 (Makefile does not honor DESTDIR)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@323 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-04-04 15:36:04 +00:00
Matthew Fredrickson
ff8098285c Backport of 6480
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@316 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-02-17 18:55:05 +00:00
Matt O'Gorman
67d7e324a1 bug 6500 typo in README.
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@311 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-02-15 17:59:38 +00:00
Kevin P. Fleming
7c66b22563 suppress annoying message about unsupported components in facility messages
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@306 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-02-13 23:06:02 +00:00
Russell Bryant
1626cd29b8 remove old ChangeLog ... it will now only be in the tags
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@296 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-01-18 04:53:47 +00:00
Kevin P. Fleming
cbd9c37c29 ensure that user-user info field in call is properly reset when not needed
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@291 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-01-17 13:43:18 +00:00
Matthew Fredrickson
c3854dede0 Backport of doing correct minor numbers to 1.2 (#6188)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@290 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2006-01-10 20:19:14 +00:00
Matthew Fredrickson
29d1983e4d Fix for issue #6039 backported to 1.2
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@284 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2005-12-27 14:01:34 +00:00
Matthew Fredrickson
8fc524e6e7 Send RR as command instead of response when T200 expires after receiving RNR.
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@280 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2005-12-06 21:35:50 +00:00
Kevin P. Fleming
50e2d23352 Makefile 'update' target now supports Subversion repositories (issue #5875)
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@274 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2005-12-01 23:13:49 +00:00
Matthew Fredrickson
8c424cc4ff Backport of fix from trunk. Fix broken single digit keypad facility code.
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@270 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2005-12-01 02:34:44 +00:00
Kevin P. Fleming
2f6aee20d9 remove extraneous svn:executable properties
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@266 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2005-11-29 18:39:18 +00:00
Kevin P. Fleming
1328ab60de remove CVS ignore list, update SVN ignore list
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@265 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2005-11-29 00:31:21 +00:00
Kevin P. Fleming
f826a6e4ad rename branches
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.2@261 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2005-11-27 04:14:49 +00:00
Admin Commit
4ec90f7435 This commit was manufactured by cvs2svn to create branch 'v1-2'.
git-svn-id: https://origsvn.digium.com/svn/libpri/branches/v1-2@256 2fbb986a-6c06-0410-b554-c9c1f0a7f128
2005-10-25 16:59:59 +00:00
24 changed files with 871 additions and 347 deletions

View File

@@ -1,5 +0,0 @@
.depend
*.lo
libpri.so.1.0
pritest

1
.version Normal file
View File

@@ -0,0 +1 @@
1.2.8

196
ChangeLog Executable file → Normal file
View File

@@ -1,16 +1,186 @@
libpri 0.3.0 2008-08-05 Kevin P. Fleming <kpfleming@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.8 Released
-- Added PRI_DEBUG_Q931_ANOMALY flag so that certain non-error-related
messages would not be output unless specifically desired. 2008-08-05 22:16 +0000 [r610] Kevin P. Fleming <kpfleming@digium.com>
* pritest.c, pri.c, pri_internal.h, q921.c, q931.c, copy_string.c,
prisched.c, pri_q921.h, pri_q931.h, pri_facility.c, compiler.h,
pridump.c, testprilib.c, pri_timers.h, pri_facility.h, libpri.h:
clean up license headers, and explicitly grant additional
permissions when used with Asterisk
2008-06-04 16:59 +0000 [r561] Dwayne M. Hubbard <dhubbard@digium.com>
* q931.c: While working on issue 3450 I noticed that the
information channel selection field in the channel identification
IE was displayed incorrectly when using 'pri intense debug'. I
wanted another pair of eyes to look at the code because
everything looked correct until Shaun Ruffell noticed the missing
comma in the msg_chan_sel array.
2008-02-20 21:36 +0000 [r527] Matthew Fredrickson <creslin@digium.com>
* q931.c: Don't send a status error when we receive connect
acknowledge during an active state
2008-02-18 20:31 +0000 [r521-523] Matthew Fredrickson <creslin@digium.com>
* q931.c, libpri.h: Improve transmission, receiving, and dumping of
bearer capability IE (#11593)
* q931.c, libpri.h: Revert previous commit 521
* q931.c, libpri.h: Fix for bug #960. Better support for more
exotic bearer capabilities
2008-01-11 16:33 +0000 [r513] Matthew Fredrickson <creslin@digium.com>
* q931.c: We should not be parsing further into the bearer
capability IE if the length does not confirm that there actually
is data present
2007-12-13 Russell Bryant <russell@digium.com>
* libpri 1.2.7 Released
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

0
LICENSE Executable file → Normal file
View File

28
Makefile Executable file → Normal file
View 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
View 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
TODO Executable file → Normal file
View File

0
compat.h Executable file → Normal file
View File

19
compiler.h Executable file → Normal file
View File

@@ -4,9 +4,26 @@
* Compiler-specific macros and other items * Compiler-specific macros and other items
* *
* Copyright (C) 2005, Digium, Inc. * Copyright (C) 2005, Digium, Inc.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software, distributed under the terms of * This program is free software, distributed under the terms of
* the GNU General Public License * the GNU General Public License Version 2 as published by the
* Free Software Foundation. See the LICENSE file included with
* this program for more details.
*
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#ifndef _ASTERISK_COMPILER_H #ifndef _ASTERISK_COMPILER_H

33
copy_string.c Executable file → Normal file
View File

@@ -3,23 +3,28 @@
* *
* Written by Mark Spencer <markster@digium.com> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2005, Digium * Copyright (C) 2005, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#include <string.h> #include <string.h>

83
libpri.h Executable file → Normal file
View File

@@ -1,25 +1,30 @@
/* /*
* libpri: An implementation of Primary Rate ISDN * libpri: An implementation of Primary Rate ISDN
* *
* Written by Mark Spencer <markster@linux-support.net> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001, Linux Support Services, Inc. * Copyright (C) 2001, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#ifndef _LIBPRI_H #ifndef _LIBPRI_H
@@ -205,6 +210,52 @@
#define PRI_LAYER_1_V120_RATE_ADAPT 0x28 #define PRI_LAYER_1_V120_RATE_ADAPT 0x28
#define PRI_LAYER_1_X31_RATE_ADAPT 0x29 #define PRI_LAYER_1_X31_RATE_ADAPT 0x29
/* Intermediate rates for V.110 */
#define PRI_INT_RATE_8K 1
#define PRI_INT_RATE_16K 2
#define PRI_INT_RATE_32K 3
/* Rate adaption for bottom 5 bits of rateadaption */
#define PRI_RATE_USER_RATE_MASK 0x1F
#define PRI_RATE_ADAPT_UNSPEC 0x00
#define PRI_RATE_ADAPT_0K6 0x01
#define PRI_RATE_ADAPT_1K2 0x02
#define PRI_RATE_ADAPT_2K4 0x03
#define PRI_RATE_ADAPT_3K6 0x04
#define PRI_RATE_ADAPT_4K8 0x05
#define PRI_RATE_ADAPT_7K2 0x06
#define PRI_RATE_ADAPT_8K 0x07
#define PRI_RATE_ADAPT_9K6 0x08
#define PRI_RATE_ADAPT_14K4 0x09
#define PRI_RATE_ADAPT_16K 0x0A
#define PRI_RATE_ADAPT_19K2 0x0B
#define PRI_RATE_ADAPT_32K 0x0C
#define PRI_RATE_ADAPT_38K4 0x0D
#define PRI_RATE_ADAPT_48K 0x0E
#define PRI_RATE_ADAPT_56K 0x0F
#define PRI_RATE_ADAPT_57K6 0x12
#define PRI_RATE_ADAPT_28K8 0x13
#define PRI_RATE_ADAPT_24K 0x14
#define PRI_RATE_ADAPT_0K1345 0x15
#define PRI_RATE_ADAPT_0K1 0x16
#define PRI_RATE_ADAPT_0K075_1K2 0x17
#define PRI_RATE_ADAPT_1K2_0K075 0x18
#define PRI_RATE_ADAPT_0K05 0x19
#define PRI_RATE_ADAPT_0K075 0x1A
#define PRI_RATE_ADAPT_0K110 0x1B
#define PRI_RATE_ADAPT_0K150 0x1C
#define PRI_RATE_ADAPT_0K200 0x1D
#define PRI_RATE_ADAPT_0K300 0x1E
#define PRI_RATE_ADAPT_12K 0x1F
/* in-band negotiation flag for rateadaption bit 5 */
#define PRI_RATE_ADAPT_NEGOTIATION_POSS 0x20
/* async flag for rateadaption bit 6 */
#define PRI_RATE_ADAPT_ASYNC 0x40
/* Notifications */ /* Notifications */
#define PRI_NOTIFY_USER_SUSPENDED 0x00 /* User suspended */ #define PRI_NOTIFY_USER_SUSPENDED 0x00 /* User suspended */
#define PRI_NOTIFY_USER_RESUMED 0x01 /* User resumed */ #define PRI_NOTIFY_USER_RESUMED 0x01 /* User resumed */
@@ -359,6 +410,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 {
@@ -509,6 +561,7 @@ extern struct timeval *pri_schedule_next(struct pri *pri);
/* Run any pending schedule events */ /* Run any pending schedule events */
extern pri_event *pri_schedule_run(struct pri *pri); extern pri_event *pri_schedule_run(struct pri *pri);
extern pri_event *pri_schedule_run_tv(struct pri *pri, const struct timeval *now);
extern int pri_call(struct pri *pri, q931_call *c, int transmode, int channel, extern int pri_call(struct pri *pri, q931_call *c, int transmode, int channel,
int exclusive, int nonisdn, char *caller, int callerplan, char *callername, int callerpres, int exclusive, int nonisdn, char *caller, int callerplan, char *callername, int callerpres,

59
pri.c Executable file → Normal file
View File

@@ -3,23 +3,28 @@
* *
* Written by Mark Spencer <markster@digium.com> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001-2005, Digium * Copyright (C) 2001-2005, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#include <unistd.h> #include <unistd.h>
@@ -521,24 +526,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;
if (eect_initiate_transfer(call1->pri, call1, call2)) switch (call1->pri->switchtype) {
return -1; case PRI_SWITCH_NI2:
case PRI_SWITCH_LUCENT5E:
return 0; case PRI_SWITCH_ATT4ESS:
if (eect_initiate_transfer(call1->pri, call1, call2))
return -1;
else
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)

77
pri_facility.c Executable file → Normal file
View File

@@ -3,23 +3,28 @@
* *
* Written by Matthew Fredrickson <creslin@digium.com> * Written by Matthew Fredrickson <creslin@digium.com>
* *
* Copyright (C) 2004-2005, Digium * Copyright (C) 2004-2005, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#include "compat.h" #include "compat.h"
@@ -721,11 +726,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 */
ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i); if (pri->switchtype == PRI_SWITCH_QSIG) {
ASN1_PUSH(compstk, compsp, comp); ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i);
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0); ASN1_PUSH(compstk, compsp, comp);
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_2), buffer, i, 0); ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0);
ASN1_FIXUP(compstk, compsp, buffer, i); 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_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, buffer, i, 0);
@@ -762,11 +769,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 */
ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i); if (pri->switchtype == PRI_SWITCH_QSIG) {
ASN1_PUSH(compstk, compsp, comp); ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i);
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0); ASN1_PUSH(compstk, compsp, comp);
ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_2), buffer, i, 0); ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0);
ASN1_FIXUP(compstk, compsp, buffer, i); 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_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, buffer, i, 0);
@@ -855,13 +864,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 +880,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 +1133,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);

20
pri_facility.h Executable file → Normal file
View File

@@ -7,6 +7,26 @@
Copyright (C) Digium, Inc. 2004-2005 Copyright (C) Digium, Inc. 2004-2005
*/ */
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2 as published by the
* Free Software Foundation. See the LICENSE file included with
* this program for more details.
*
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/
#ifndef _PRI_FACILITY_H #ifndef _PRI_FACILITY_H
#define _PRI_FACILITY_H #define _PRI_FACILITY_H

36
pri_internal.h Executable file → Normal file
View File

@@ -1,30 +1,36 @@
/* /*
* libpri: An implementation of Primary Rate ISDN * libpri: An implementation of Primary Rate ISDN
* *
* Written by Mark Spencer <markster@linux-support.net> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001, Linux Support Services, Inc. * Copyright (C) 2001, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#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 {

35
pri_q921.h Executable file → Normal file
View File

@@ -1,25 +1,30 @@
/* /*
* libpri: An implementation of Primary Rate ISDN * libpri: An implementation of Primary Rate ISDN
* *
* Written by Mark Spencer <markster@linux-support.net> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001, Linux Support Services, Inc. * Copyright (C) 2001, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#ifndef _PRI_Q921_H #ifndef _PRI_Q921_H

35
pri_q931.h Executable file → Normal file
View File

@@ -1,25 +1,30 @@
/* /*
* libpri: An implementation of Primary Rate ISDN * libpri: An implementation of Primary Rate ISDN
* *
* Written by Mark Spencer <markster@linux-support.net> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001, Linux Support Services, Inc. * Copyright (C) 2001, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#ifndef _PRI_Q931_H #ifndef _PRI_Q931_H

35
pri_timers.h Executable file → Normal file
View File

@@ -1,25 +1,30 @@
/* /*
* libpri: An implementation of Primary Rate ISDN * libpri: An implementation of Primary Rate ISDN
* *
* Written by Mark Spencer <markster@linux-support.net> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001, Linux Support Services, Inc. * Copyright (C) 2001, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#ifndef _PRI_TIMERS_H #ifndef _PRI_TIMERS_H

33
pridump.c Executable file → Normal file
View File

@@ -3,23 +3,28 @@
* *
* Written by Mark Spencer <markster@digium.com> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001-2005, Digium * Copyright (C) 2001-2005, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
/* /*

33
prisched.c Executable file → Normal file
View File

@@ -3,23 +3,28 @@
* *
* Written by Mark Spencer <markster@digium.com> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001-2005, Digium * Copyright (C) 2001-2005, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#include <stdio.h> #include <stdio.h>

33
pritest.c Executable file → Normal file
View File

@@ -3,23 +3,28 @@
* *
* Written by Mark Spencer <markster@digium.com> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001-2005, Digium * Copyright (C) 2001-2005, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
/* /*

35
q921.c Executable file → Normal file
View File

@@ -3,23 +3,28 @@
* *
* Written by Mark Spencer <markster@digium.com> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001-2005, Digium * Copyright (C) 2001-2005, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#include <stdio.h> #include <stdio.h>
@@ -338,7 +343,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");

374
q931.c Executable file → Normal file
View File

@@ -3,23 +3,28 @@
* *
* Written by Mark Spencer <markster@digium.com> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001-2005, Digium * Copyright (C) 2001-2005, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software, distributed under the terms of
* it under the terms of the GNU General Public License as published by * the GNU General Public License Version 2 as published by the
* the Free Software Foundation; either version 2 of the License, or * Free Software Foundation. See the LICENSE file included with
* (at your option) any later version. * this program for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/ */
#include "compat.h" #include "compat.h"
@@ -43,7 +48,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 +94,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 +141,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" },
@@ -399,7 +404,7 @@ static FUNC_DUMP(dump_channel_id)
int x; int x;
int res = 0; int res = 0;
static const char* msg_chan_sel[] = { static const char* msg_chan_sel[] = {
"No channel selected", "B1 channel", "B2 channel","Any channel selected" "No channel selected", "B1 channel", "B2 channel","Any channel selected",
"No channel selected", "As indicated in following octets", "Reserved","Any channel selected" "No channel selected", "As indicated in following octets", "Reserved","Any channel selected"
}; };
@@ -528,12 +533,12 @@ static char *mode2str(int mode)
static char *l12str(int proto) static char *l12str(int proto)
{ {
static struct msgtype protos[] = { static struct msgtype protos[] = {
{ PRI_LAYER_1_ITU_RATE_ADAPT, "ITU Rate Adaption" }, { PRI_LAYER_1_ITU_RATE_ADAPT, "V.110 Rate Adaption" },
{ PRI_LAYER_1_ULAW, "u-Law" }, { PRI_LAYER_1_ULAW, "u-Law" },
{ PRI_LAYER_1_ALAW, "A-Law" }, { PRI_LAYER_1_ALAW, "A-Law" },
{ PRI_LAYER_1_G721, "G.721 ADPCM" }, { PRI_LAYER_1_G721, "G.721 ADPCM" },
{ PRI_LAYER_1_G722_G725, "G.722/G.725 7kHz Audio" }, { PRI_LAYER_1_G722_G725, "G.722/G.725 7kHz Audio" },
{ PRI_LAYER_1_G7XX_384K, "G.7xx 384k Video" }, { PRI_LAYER_1_G7XX_384K, "H.223/H.245 Multimedia" },
{ PRI_LAYER_1_NON_ITU_ADAPT, "Non-ITU Rate Adaption" }, { PRI_LAYER_1_NON_ITU_ADAPT, "Non-ITU Rate Adaption" },
{ PRI_LAYER_1_V120_RATE_ADAPT, "V.120 Rate Adaption" }, { PRI_LAYER_1_V120_RATE_ADAPT, "V.120 Rate Adaption" },
{ PRI_LAYER_1_X31_RATE_ADAPT, "X.31 Rate Adaption" }, { PRI_LAYER_1_X31_RATE_ADAPT, "X.31 Rate Adaption" },
@@ -544,7 +549,7 @@ static char *l12str(int proto)
static char *ra2str(int proto) static char *ra2str(int proto)
{ {
static struct msgtype protos[] = { static struct msgtype protos[] = {
{ RATE_ADAPT_56K, "from 56kbps" }, { PRI_RATE_ADAPT_9K6, "9.6 kbit/s" },
}; };
return code2str(proto, protos, sizeof(protos) / sizeof(protos[0])); return code2str(proto, protos, sizeof(protos) / sizeof(protos[0]));
} }
@@ -565,31 +570,143 @@ static char *l32str(int proto)
return code2str(proto, protos, sizeof(protos) / sizeof(protos[0])); return code2str(proto, protos, sizeof(protos) / sizeof(protos[0]));
} }
static char *int_rate2str(int proto)
{
static struct msgtype protos[] = {
{ PRI_INT_RATE_8K, "8 kbit/s" },
{ PRI_INT_RATE_16K, "16 kbit/s" },
{ PRI_INT_RATE_32K, "32 kbit/s" },
};
return code2str(proto, protos, sizeof(protos) / sizeof(protos[0]));
}
static FUNC_DUMP(dump_bearer_capability) static FUNC_DUMP(dump_bearer_capability)
{ {
int pos=2; int pos=2;
pri_message(pri, "%c Bearer Capability (len=%2d) [ Ext: %d Q.931 Std: %d Info transfer capability: %s (%d)\n", pri_message(pri, "%c Bearer Capability (len=%2d) [ Ext: %d Q.931 Std: %d Info transfer capability: %s (%d)\n",
prefix, len, (ie->data[0] & 0x80 ) >> 7, (ie->data[0] & 0x60) >> 5, cap2str(ie->data[0] & 0x1f), (ie->data[0] & 0x1f)); prefix, len, (ie->data[0] & 0x80 ) >> 7, (ie->data[0] & 0x60) >> 5, cap2str(ie->data[0] & 0x1f), (ie->data[0] & 0x1f));
pri_message(pri, "%c Ext: %d Trans mode/rate: %s (%d)\n", prefix, (ie->data[1] & 0x80) >> 7, mode2str(ie->data[1] & 0x7f), ie->data[1] & 0x7f); pri_message(pri, "%c Ext: %d Trans mode/rate: %s (%d)\n", prefix, (ie->data[1] & 0x80) >> 7, mode2str(ie->data[1] & 0x7f), ie->data[1] & 0x7f);
/* octet 4.1 exists iff mode/rate is multirate */
if ((ie->data[1] & 0x7f) == 0x18) { if ((ie->data[1] & 0x7f) == 0x18) {
pri_message(pri, "%c Ext: %d Transfer rate multiplier: %d x 64\n", prefix, (ie->data[2] & 0x80) >> 7, ie->data[2] & 0x7f); pri_message(pri, "%c Ext: %d Transfer rate multiplier: %d x 64\n", prefix, (ie->data[2] & 0x80) >> 7, ie->data[2] & 0x7f);
pos++; pos++;
} }
/* Stop here if no more */
if (pos >= len) /* don't count the IE num and length as part of the data */
return; len -= 2;
if ((ie->data[1] & 0x7f) != TRANS_MODE_PACKET) {
/* Look for octets 5 and 5.a if present */ /* Look for octet 5; this is identified by bits 5,6 == 01 */
pri_message(pri, "%c Ext: %d User information layer 1: %s (%d)\n", prefix, (ie->data[pos] >> 7), l12str(ie->data[pos] & 0x7f), ie->data[pos] & 0x7f); if (pos < len &&
if ((ie->data[pos] & 0x7f) == PRI_LAYER_1_ITU_RATE_ADAPT) (ie->data[pos] & 0x60) == 0x20) {
pri_message(pri, "%c Ext: %d Rate adaptatation: %s (%d)\n", prefix, ie->data[pos] >> 7, ra2str(ie->data[pos] & 0x7f), ie->data[pos] & 0x7f);
/* although the layer1 is only the bottom 5 bits of the byte,
previous versions of this library passed bits 5&6 through
too, so we have to do the same for binary compatability */
u_int8_t layer1 = ie->data[pos] & 0x7f;
pri_message(pri, "%c User information layer 1: %s (%d)\n",
prefix, l12str(layer1), layer1);
pos++; pos++;
} else {
/* Look for octets 6 and 7 but not 5 and 5.a */ /* octet 5a? */
pri_message(pri, "%c Ext: %d User information layer 2: %s (%d)\n", prefix, ie->data[pos] >> 7, l22str(ie->data[pos] & 0x7f), ie->data[pos] & 0x7f); if (pos < len && !(ie->data[pos-1] & 0x80)) {
int ra = ie->data[pos] & 0x7f;
pri_message(pri, "%c Async: %d, Negotiation: %d, "
"User rate: %s (%#x)\n",
prefix,
ra & PRI_RATE_ADAPT_ASYNC ? 1 : 0,
ra & PRI_RATE_ADAPT_NEGOTIATION_POSS ? 1 : 0,
ra2str(ra & PRI_RATE_USER_RATE_MASK),
ra & PRI_RATE_USER_RATE_MASK);
pos++;
}
/* octet 5b? */
if (pos < len && !(ie->data[pos-1] & 0x80)) {
u_int8_t data = ie->data[pos];
if (layer1 == PRI_LAYER_1_ITU_RATE_ADAPT) {
pri_message(pri, "%c Intermediate rate: %s (%d), "
"NIC on Tx: %d, NIC on Rx: %d, "
"Flow control on Tx: %d, "
"Flow control on Rx: %d\n",
prefix, int_rate2str((data & 0x60)>>5),
(data & 0x60)>>5,
(data & 0x10)?1:0,
(data & 0x08)?1:0,
(data & 0x04)?1:0,
(data & 0x02)?1:0);
} else if (layer1 == PRI_LAYER_1_V120_RATE_ADAPT) {
pri_message(pri, "%c Hdr: %d, Multiframe: %d, Mode: %d, "
"LLI negot: %d, Assignor: %d, "
"In-band neg: %d\n", prefix,
(data & 0x40)?1:0,
(data & 0x20)?1:0,
(data & 0x10)?1:0,
(data & 0x08)?1:0,
(data & 0x04)?1:0,
(data & 0x02)?1:0);
} else {
pri_message(pri, "%c Unknown octet 5b: 0x%x\n", data );
}
pos++;
}
/* octet 5c? */
if (pos < len && !(ie->data[pos-1] & 0x80)) {
u_int8_t data = ie->data[pos];
const char *stop_bits[] = {"?","1","1.5","2"};
const char *data_bits[] = {"?","5","7","8"};
const char *parity[] = {"Odd","?","Even","None",
"zero","one","?","?"};
pri_message(pri, "%c Stop bits: %s, data bits: %s, "
"parity: %s\n", prefix,
stop_bits[(data & 0x60) >> 5],
data_bits[(data & 0x18) >> 3],
parity[(data & 0x7)]);
pos++;
}
/* octet 5d? */
if (pos < len && !(ie->data[pos-1] & 0x80)) {
u_int8_t data = ie->data[pos];
pri_message(pri, "%c Duplex mode: %d, modem type: %d\n",
prefix, (data & 0x40) ? 1 : 0,data & 0x3F);
pos++;
}
}
/* Look for octet 6; this is identified by bits 5,6 == 10 */
if (pos < len &&
(ie->data[pos] & 0x60) == 0x40) {
pri_message(pri, "%c User information layer 2: %s (%d)\n",
prefix, l22str(ie->data[pos] & 0x1f),
ie->data[pos] & 0x1f);
pos++; pos++;
pri_message(pri, "%c Ext: %d User information layer 3: %s (%d)\n", prefix, ie->data[pos] >> 7, l32str(ie->data[pos] & 0x7f), ie->data[pos] & 0x7f); }
/* Look for octet 7; this is identified by bits 5,6 == 11 */
if (pos < len && (ie->data[pos] & 0x60) == 0x60) {
pri_message(pri, "%c User information layer 3: %s (%d)\n",
prefix, l32str(ie->data[pos] & 0x1f),
ie->data[pos] & 0x1f);
pos++; pos++;
/* octets 7a and 7b? */
if (pos + 1 < len && !(ie->data[pos-1] & 0x80) &&
!(ie->data[pos] & 0x80)) {
unsigned int proto;
proto = ((ie->data[pos] & 0xF) << 4 ) |
(ie->data[pos+1] & 0xF);
pri_message(pri, "%c Network layer: 0x%x\n", prefix,
proto );
pos += 2;
}
} }
} }
@@ -602,18 +719,44 @@ static FUNC_RECV(receive_bearer_capability)
} }
call->transcapability = ie->data[0] & 0x1f; call->transcapability = ie->data[0] & 0x1f;
call->transmoderate = ie->data[1] & 0x7f; call->transmoderate = ie->data[1] & 0x7f;
if (call->transmoderate == PRI_TRANS_CAP_AUDIO_4ESS)
call->transmoderate = PRI_TRANS_CAP_3_1K_AUDIO; /* octet 4.1 exists iff mode/rate is multirate */
if (call->transmoderate != TRANS_MODE_PACKET) { if (call->transmoderate == TRANS_MODE_MULTIRATE) {
call->transmultiple = ie->data[pos++] & 0x7f;
}
/* Look for octet 5; this is identified by bits 5,6 == 01 */
if (pos < len &&
(ie->data[pos] & 0x60) == 0x20 ) {
/* although the layer1 is only the bottom 5 bits of the byte,
previous versions of this library passed bits 5&6 through
too, so we have to do the same for binary compatability */
call->userl1 = ie->data[pos] & 0x7f; call->userl1 = ie->data[pos] & 0x7f;
if (call->userl1 == PRI_LAYER_1_ITU_RATE_ADAPT) {
call->rateadaption = ie->data[++pos] & 0x7f;
}
pos++; pos++;
} else {
/* Get 6 and 7 */ /* octet 5a? */
call->userl2 = ie->data[pos++] & 0x7f; if (pos < len && !(ie->data[pos-1] & 0x80)) {
call->userl3 = ie->data[pos] & 0x7f; call->rateadaption = ie->data[pos] & 0x7f;
pos++;
}
/* octets 5b through 5d? */
while (pos < len && !(ie->data[pos-1] & 0x80)) {
pos++;
}
}
/* Look for octet 6; this is identified by bits 5,6 == 10 */
if (pos < len &&
(ie->data[pos] & 0x60) == 0x40) {
call->userl2 = ie->data[pos++] & 0x1f;
}
/* Look for octet 7; this is identified by bits 5,6 == 11 */
if (pos < len &&
(ie->data[pos] & 0x60) == 0x60) {
call->userl3 = ie->data[pos++] & 0x1f;
} }
return 0; return 0;
} }
@@ -621,6 +764,7 @@ static FUNC_RECV(receive_bearer_capability)
static FUNC_SEND(transmit_bearer_capability) static FUNC_SEND(transmit_bearer_capability)
{ {
int tc; int tc;
int pos;
/* We are ready to transmit single IE only */ /* We are ready to transmit single IE only */
if(order > 1) if(order > 1)
@@ -647,26 +791,39 @@ static FUNC_SEND(transmit_bearer_capability)
} }
ie->data[0] = 0x80 | tc; ie->data[0] = 0x80 | tc;
ie->data[1] = call->transmoderate | 0x80; ie->data[1] = call->transmoderate | 0x80;
if ((tc & PRI_TRANS_CAP_DIGITAL)&&(pri->switchtype == PRI_SWITCH_EUROISDN_E1)) {
/* Apparently EuroISDN switches don't seem to like user layer 2/3 */ pos = 2;
return 4; /* octet 4.1 exists iff mode/rate is multirate */
if (call->transmoderate == TRANS_MODE_MULTIRATE ) {
ie->data[pos++] = call->transmultiple | 0x80;
} }
if (call->transmoderate != TRANS_MODE_PACKET) { if (call->transmoderate != TRANS_MODE_PACKET) {
/* If you have an AT&T 4ESS, you don't send any more info */ /* If you have an AT&T 4ESS, you don't send any more info */
if ((pri->switchtype != PRI_SWITCH_ATT4ESS) && (call->userl1 > -1)) { if ((pri->switchtype != PRI_SWITCH_ATT4ESS) && (call->userl1 > -1)) {
ie->data[2] = call->userl1 | 0x80; /* XXX Ext bit? XXX */ ie->data[pos++] = call->userl1 | 0x80; /* XXX Ext bit? XXX */
if (call->userl1 == PRI_LAYER_1_ITU_RATE_ADAPT) { if (call->userl1 == PRI_LAYER_1_ITU_RATE_ADAPT) {
ie->data[3] = call->rateadaption | 0x80; ie->data[pos++] = call->rateadaption | 0x80;
return 6;
} }
return 5; return pos + 2;
} else }
return 4;
} else { ie->data[pos++] = 0xa0 | (call->userl1 & 0x1f);
ie->data[2] = 0x80 | call->userl2;
ie->data[3] = 0x80 | call->userl3; if (call->userl1 == PRI_LAYER_1_ITU_RATE_ADAPT) {
return 6; ie->data[pos-1] &= ~0x80; /* clear EXT bit in octet 5 */
ie->data[pos++] = call->rateadaption | 0x80;
}
} }
if (call->userl2 != -1)
ie->data[pos++] = 0xc0 | (call->userl2 & 0x1f);
if (call->userl3 != -1)
ie->data[pos++] = 0xe0 | (call->userl3 & 0x1f);
return pos + 2;
} }
char *pri_plan2str(int plan) char *pri_plan2str(int plan)
@@ -736,7 +893,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 +937,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 +1046,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 +1539,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 +1555,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 +2064,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 +2227,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 +2765,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 +2799,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;
c->ourcallstate = Q931_CALL_STATE_CONNECT_REQUEST; if (pri->localtype == PRI_CPE)
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 +2882,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 };
@@ -2733,6 +2900,8 @@ int q931_setup(struct pri *pri, q931_call *c, struct pri_sr *req)
if (!req->userl1) if (!req->userl1)
req->userl1 = PRI_LAYER_1_ULAW; req->userl1 = PRI_LAYER_1_ULAW;
c->userl1 = req->userl1; c->userl1 = req->userl1;
c->userl2 = -1;
c->userl3 = -1;
c->ds1no = (req->channel & 0xff00) >> 8; c->ds1no = (req->channel & 0xff00) >> 8;
c->ds1explicit = (req->channel & 0x10000) >> 16; c->ds1explicit = (req->channel & 0x10000) >> 16;
req->channel &= 0xff; req->channel &= 0xff;
@@ -2796,6 +2965,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 +3072,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 +3085,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 +3253,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;
@@ -3249,9 +3423,9 @@ int q931_receive(struct pri *pri, q931_h *h, int len)
libpri_copy_string(pri->ev.ring.callednum, c->callednum, sizeof(pri->ev.ring.callednum)); libpri_copy_string(pri->ev.ring.callednum, c->callednum, sizeof(pri->ev.ring.callednum));
libpri_copy_string(pri->ev.ring.origcalledname, c->origcalledname, sizeof(pri->ev.ring.origcalledname)); libpri_copy_string(pri->ev.ring.origcalledname, c->origcalledname, sizeof(pri->ev.ring.origcalledname));
libpri_copy_string(pri->ev.ring.origcallednum, c->origcallednum, sizeof(pri->ev.ring.origcallednum)); libpri_copy_string(pri->ev.ring.origcallednum, c->origcallednum, sizeof(pri->ev.ring.origcallednum));
libpri_copy_string(pri->ev.ring.redirectingnum, c->redirectingnum, sizeof(pri->ev.ring.redirectingnum)); libpri_copy_string(pri->ev.ring.redirectingnum, c->redirectingnum, sizeof(pri->ev.ring.redirectingnum));
libpri_copy_string(pri->ev.ring.redirectingname, c->redirectingname, sizeof(pri->ev.ring.redirectingname)); libpri_copy_string(pri->ev.ring.redirectingname, c->redirectingname, sizeof(pri->ev.ring.redirectingname));
libpri_copy_string(pri->ev.ring.useruserinfo, c->useruserinfo, sizeof(pri->ev.ring.useruserinfo)); libpri_copy_string(pri->ev.ring.useruserinfo, c->useruserinfo, sizeof(pri->ev.ring.useruserinfo));
c->useruserinfo[0] = '\0'; c->useruserinfo[0] = '\0';
pri->ev.ring.redirectingreason = c->redirectingreason; pri->ev.ring.redirectingreason = c->redirectingreason;
pri->ev.ring.origredirectingreason = c->origredirectingreason; pri->ev.ring.origredirectingreason = c->origredirectingreason;
@@ -3278,8 +3452,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 +3482,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,13 +3536,23 @@ 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) {
q931_release_complete(pri,c,PRI_CAUSE_INVALID_CALL_REFERENCE); q931_release_complete(pri,c,PRI_CAUSE_INVALID_CALL_REFERENCE);
break; break;
} }
if (c->ourcallstate != Q931_CALL_STATE_CONNECT_REQUEST) { if ((c->ourcallstate != Q931_CALL_STATE_CONNECT_REQUEST) && (c->ourcallstate != Q931_CALL_STATE_ACTIVE)) {
q931_status(pri,c,PRI_CAUSE_WRONG_MESSAGE); q931_status(pri,c,PRI_CAUSE_WRONG_MESSAGE);
break; break;
} }
@@ -3384,9 +3578,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 +3606,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 +3641,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 +3669,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 +3724,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) {

38
testprilib.c Executable file → Normal file
View File

@@ -3,25 +3,31 @@
* *
* Written by Mark Spencer <markster@digium.com> * Written by Mark Spencer <markster@digium.com>
* *
* Copyright (C) 2001-2005, Digium * Copyright (C) 2001-2005, Digium, Inc.
* All Rights Reserved. * All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/ */
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2 as published by the
* Free Software Foundation. See the LICENSE file included with
* this program for more details.
*
* In addition, when this program is distributed with Asterisk in
* any form that would qualify as a 'combined work' or as a
* 'derivative work' (but not mere aggregation), you can redistribute
* and/or modify the combination under the terms of the license
* provided with that copy of Asterisk, instead of the license
* terms granted here.
*/
/* /*
* This program tests libpri call reception using a zaptel interface. * This program tests libpri call reception using a zaptel interface.
* Its state machines are setup for RECEIVING CALLS ONLY, so if you * Its state machines are setup for RECEIVING CALLS ONLY, so if you