summaryrefslogtreecommitdiff
path: root/main/callerid.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2011-03-14 16:55:30 +0000
committerRichard Mudgett <rmudgett@digium.com>2011-03-14 16:55:30 +0000
commitde7280fc7dcb003ef5b4aedcb8f81e1cbdc44c9f (patch)
treebd222c984eab8847c4f368d9c59df6c67652e851 /main/callerid.c
parent1c1c9c2bd4bbf369ef66fdc599ede10597383d4d (diff)
Merged revisions 310636 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ................ r310636 | rmudgett | 2011-03-14 11:50:59 -0500 (Mon, 14 Mar 2011) | 39 lines Merged revisions 310635 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.6.2 ................ r310635 | rmudgett | 2011-03-14 11:47:54 -0500 (Mon, 14 Mar 2011) | 32 lines Merged revisions 310633 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r310633 | rmudgett | 2011-03-14 11:38:24 -0500 (Mon, 14 Mar 2011) | 25 lines "Caller*ID failed checksum" on Wildcard TDM2400P and TDM410 The last character in the caller id message is getting a framing error. The checksum is the last character in the message. A framing error in the checksum could be because: 1) The sender did not send a full stop bit. 2) The sender cut off the FSK carrier too soon. 3) The sender opted to send zero of the specified zero to 10 trailing mark bits and round-off errors in the code resulted in the code not being where it thought it was in the demodulated bit stream. Bit 8 of 'b' is set when parity error. Bit 9 of 'b' is set when framing error. Made ignore the framing and parity error bits if the errored character is the checksum. We can tolerate a framing/parity error there. The checksum character validates the message. (closes issue #18474) Reported by: nivek Patches: callerid.c.1.patch uploaded by nivek (license 636) (with modifications) Tested by: nivek ........ ................ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@310637 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/callerid.c')
-rw-r--r--main/callerid.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/main/callerid.c b/main/callerid.c
index aa53eb83e..ee169c389 100644
--- a/main/callerid.c
+++ b/main/callerid.c
@@ -568,9 +568,22 @@ int callerid_feed(struct callerid_state *cid, unsigned char *ubuf, int len, stru
return -1;
}
if (res == 1) {
- /* Ignore invalid bytes */
- if (b > 0xff)
- continue;
+ if (b > 0xff) {
+ if (cid->sawflag != 5) {
+ /* Ignore invalid bytes */
+ continue;
+ }
+ /*
+ * We can tollerate an error on the checksum character since the
+ * checksum character is the last character in the message and
+ * it validates the message.
+ *
+ * Remove character error flags.
+ * Bit 8 : Parity error
+ * Bit 9 : Framing error
+ */
+ b &= 0xff;
+ }
switch (cid->sawflag) {
case 0: /* Look for flag */
if (b == 'U')