Changed handshake and EMSI timers
This commit is contained in:
parent
c519afe9dc
commit
4bd3c7dcde
15
ChangeLog
15
ChangeLog
@ -3,7 +3,15 @@ $Id$
|
|||||||
WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!
|
WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!
|
||||||
|
|
||||||
Inbound file handling is changed, this version is under test and should NOT
|
Inbound file handling is changed, this version is under test and should NOT
|
||||||
be used on production systems
|
be used on production systems if you don't want to help debugging.
|
||||||
|
Handshake and EMSI is changed, please run this version with debugging on,
|
||||||
|
mbsetup 1.14.1 turn 5, 11 and 18 on at least. Report any problems and include
|
||||||
|
a piece of the logfile.
|
||||||
|
|
||||||
|
Before installing, make a copy of /opt/mbse/bin/mbcico so you can go back
|
||||||
|
if you experience any problems.
|
||||||
|
|
||||||
|
As far as I have tested, there should be no problems with this version.
|
||||||
|
|
||||||
WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!
|
WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!
|
||||||
|
|
||||||
@ -29,6 +37,11 @@ v0.37.6 10-Aug-2003
|
|||||||
systems.
|
systems.
|
||||||
Fixed the binkp escape sequence which is wrong in the FSP.
|
Fixed the binkp escape sequence which is wrong in the FSP.
|
||||||
A light improvement in session handshake setup timers.
|
A light improvement in session handshake setup timers.
|
||||||
|
Added EMSI handshake timers, this gives a more relaxed EMSI
|
||||||
|
handshake.
|
||||||
|
Set the EMSI receive failure count to 20 instead of 6, we can
|
||||||
|
now even accept buggy maindoor sessions and still display a
|
||||||
|
banner.
|
||||||
|
|
||||||
|
|
||||||
v0.37.5 12-Jul-2003 - 10-Aug-2003
|
v0.37.5 12-Jul-2003 - 10-Aug-2003
|
||||||
|
507
mbcico/emsi.c
507
mbcico/emsi.c
@ -271,196 +271,222 @@ int tx_emsi(char *data)
|
|||||||
|
|
||||||
SM_DECL(rxemsi,(char *)"rxemsi")
|
SM_DECL(rxemsi,(char *)"rxemsi")
|
||||||
SM_STATES
|
SM_STATES
|
||||||
waitpkt,
|
init,
|
||||||
waitchar,
|
waitpkt,
|
||||||
checkemsi,
|
waitchar,
|
||||||
getdat,
|
checkemsi,
|
||||||
checkpkt,
|
getdat,
|
||||||
checkdat,
|
checkpkt,
|
||||||
sendnak,
|
checkdat,
|
||||||
sendack
|
sendnak,
|
||||||
|
sendack
|
||||||
SM_NAMES
|
SM_NAMES
|
||||||
(char *)"waitpkt",
|
(char *)"init",
|
||||||
(char *)"waitchar",
|
(char *)"waitpkt",
|
||||||
(char *)"checkemsi",
|
(char *)"waitchar",
|
||||||
(char *)"getdat",
|
(char *)"checkemsi",
|
||||||
(char *)"checkpkt",
|
(char *)"getdat",
|
||||||
(char *)"checkdat",
|
(char *)"checkpkt",
|
||||||
(char *)"sendnak",
|
(char *)"checkdat",
|
||||||
(char *)"sendack"
|
(char *)"sendnak",
|
||||||
|
(char *)"sendack"
|
||||||
SM_EDECL
|
SM_EDECL
|
||||||
|
|
||||||
int c = 0;
|
int c = 0;
|
||||||
unsigned short lcrc, rcrc;
|
unsigned short lcrc, rcrc;
|
||||||
int len;
|
int len;
|
||||||
int standby = 0, tries = 0;
|
int standby = 0, tries = 0;
|
||||||
char buf[13], *p;
|
char buf[13], *p;
|
||||||
char *databuf = NULL;
|
char *databuf = NULL;
|
||||||
|
|
||||||
p = buf;
|
p = buf;
|
||||||
databuf = xstrcpy(intro);
|
databuf = xstrcpy(intro);
|
||||||
|
|
||||||
SM_START(checkpkt)
|
SM_START(init)
|
||||||
Syslog('i', "RXEMSI: start");
|
|
||||||
|
SM_STATE(init)
|
||||||
|
|
||||||
|
Syslog('i', "RXEMSI: init");
|
||||||
|
RESETTIMERS();
|
||||||
|
SETTIMER(0, 60);
|
||||||
|
SETTIMER(1, 20);
|
||||||
|
SM_PROCEED(checkpkt);
|
||||||
|
|
||||||
SM_STATE(waitpkt)
|
SM_STATE(waitpkt)
|
||||||
|
|
||||||
standby = 0;
|
Syslog('i', "RXEMSI: waitpkt");
|
||||||
SM_PROCEED(waitchar);
|
standby = 0;
|
||||||
|
SETTIMER(1, 20);
|
||||||
|
SM_PROCEED(waitchar);
|
||||||
|
|
||||||
SM_STATE(waitchar)
|
SM_STATE(waitchar)
|
||||||
|
|
||||||
c = GETCHAR(5);
|
Syslog('i', "RXEMSI: waitchar, tries=%d", tries);
|
||||||
if (c == TIMEOUT) {
|
|
||||||
if (++tries > 9) {
|
|
||||||
Syslog('+', "Too many tries waiting EMSI handshake");
|
|
||||||
SM_ERROR;
|
|
||||||
} else {
|
|
||||||
SM_PROCEED(sendnak);
|
|
||||||
}
|
|
||||||
} else if (c < 0) {
|
|
||||||
SM_ERROR;
|
|
||||||
} else if ((c >= ' ') && (c <= '~')) {
|
|
||||||
if (c == '*') {
|
|
||||||
standby = 1;
|
|
||||||
p = buf;
|
|
||||||
*p = '\0';
|
|
||||||
} else if (standby) {
|
|
||||||
if ((p - buf) < (sizeof(buf) - 1)) {
|
|
||||||
*p++ = c;
|
|
||||||
*p = '\0';
|
|
||||||
} if ((p - buf) >= (sizeof(buf) - 1)) {
|
|
||||||
standby = 0;
|
|
||||||
SM_PROCEED(checkemsi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else switch(c) {
|
|
||||||
case DC1: break;
|
|
||||||
case '\n':
|
|
||||||
case '\r': standby = 0;
|
|
||||||
break;
|
|
||||||
default: standby = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (EXPIRED(0)) {
|
||||||
|
Syslog('+', "EMSI receive 60 seconds timeout");
|
||||||
|
SM_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EXPIRED(1)) {
|
||||||
|
Syslog('s', "20 sec timeout");
|
||||||
|
SM_PROCEED(sendnak);
|
||||||
|
}
|
||||||
|
|
||||||
|
c = GETCHAR(1);
|
||||||
|
if (c == TIMEOUT) {
|
||||||
SM_PROCEED(waitchar);
|
SM_PROCEED(waitchar);
|
||||||
|
} else if (c < 0) {
|
||||||
|
SM_ERROR;
|
||||||
|
} else if ((c >= ' ') && (c <= '~')) {
|
||||||
|
if (c == '*') {
|
||||||
|
standby = 1;
|
||||||
|
p = buf;
|
||||||
|
*p = '\0';
|
||||||
|
} else if (standby) {
|
||||||
|
if ((p - buf) < (sizeof(buf) - 1)) {
|
||||||
|
*p++ = c;
|
||||||
|
*p = '\0';
|
||||||
|
} if ((p - buf) >= (sizeof(buf) - 1)) {
|
||||||
|
standby = 0;
|
||||||
|
SM_PROCEED(checkemsi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch(c) {
|
||||||
|
case DC1: break;
|
||||||
|
case '\n':
|
||||||
|
case '\r': standby = 0;
|
||||||
|
break;
|
||||||
|
default: standby = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SM_PROCEED(waitchar);
|
||||||
|
|
||||||
SM_STATE(checkemsi)
|
SM_STATE(checkemsi)
|
||||||
|
|
||||||
Syslog('i', "RXEMSI: rcvd %s", printable(buf, 0));
|
Syslog('i', "RXEMSI: rcvd %s", printable(buf, 0));
|
||||||
|
|
||||||
if (strncasecmp(buf, "EMSI_DAT",8) == 0) {
|
if (strncasecmp(buf, "EMSI_DAT",8) == 0) {
|
||||||
SM_PROCEED(getdat);
|
SM_PROCEED(getdat);
|
||||||
} else if (strncasecmp(buf, "EMSI_",5) == 0) {
|
} else if (strncasecmp(buf, "EMSI_",5) == 0) {
|
||||||
if (databuf)
|
if (databuf)
|
||||||
free(databuf);
|
free(databuf);
|
||||||
databuf = xstrcpy(buf);
|
databuf = xstrcpy(buf);
|
||||||
SM_PROCEED(checkpkt);
|
SM_PROCEED(checkpkt);
|
||||||
} else {
|
} else {
|
||||||
SM_PROCEED(waitpkt);
|
SM_PROCEED(waitpkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
SM_STATE(getdat)
|
SM_STATE(getdat)
|
||||||
|
|
||||||
if (sscanf(buf+8,"%04x",&len) != 1) {
|
if (sscanf(buf+8,"%04x",&len) != 1) {
|
||||||
SM_PROCEED(sendnak);
|
SM_PROCEED(sendnak);
|
||||||
}
|
}
|
||||||
|
|
||||||
len += 16; /* strlen("EMSI_DATxxxxyyyy"), include CRC */
|
len += 16; /* strlen("EMSI_DATxxxxyyyy"), include CRC */
|
||||||
if (databuf)
|
if (databuf)
|
||||||
free(databuf);
|
free(databuf);
|
||||||
databuf = malloc(len + 1);
|
databuf = malloc(len + 1);
|
||||||
strcpy(databuf, buf);
|
strcpy(databuf, buf);
|
||||||
p = databuf + strlen(databuf);
|
p = databuf + strlen(databuf);
|
||||||
|
|
||||||
while (((p-databuf) < len) && ((c=GETCHAR(8)) >= 0)) {
|
while (((p-databuf) < len) && ((c=GETCHAR(8)) >= 0)) {
|
||||||
*p++ = c;
|
*p++ = c;
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
Syslog('i', "RXEMSI: rcvd %s (%d bytes)", databuf, len);
|
Syslog('i', "RXEMSI: rcvd %s (%d bytes)", databuf, len);
|
||||||
|
|
||||||
if (c == TIMEOUT) {
|
if (c == TIMEOUT) {
|
||||||
SM_PROCEED(sendnak);
|
SM_PROCEED(sendnak);
|
||||||
} else if (c < 0) {
|
} else if (c < 0) {
|
||||||
Syslog('+', "Error while reading EMSI_DAT packet");
|
Syslog('+', "Error while reading EMSI_DAT packet");
|
||||||
SM_ERROR;
|
SM_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
SM_PROCEED(checkdat);
|
SM_PROCEED(checkdat);
|
||||||
|
|
||||||
SM_STATE(checkpkt)
|
SM_STATE(checkpkt)
|
||||||
|
|
||||||
if (strncasecmp(databuf,"EMSI_DAT",8) == 0) {
|
Syslog('i', "RXEMSI: checkpkt");
|
||||||
SM_PROCEED(checkdat);
|
|
||||||
}
|
|
||||||
|
|
||||||
lcrc = crc16xmodem(databuf, 8);
|
if (strncasecmp(databuf,"EMSI_DAT",8) == 0) {
|
||||||
sscanf(databuf + 8, "%04hx", &rcrc);
|
SM_PROCEED(checkdat);
|
||||||
if (lcrc != rcrc) {
|
}
|
||||||
Syslog('+', "Got EMSI packet \"%s\" with bad crc: %04x/%04x", printable(databuf, 0), lcrc, rcrc);
|
|
||||||
SM_PROCEED(sendnak);
|
lcrc = crc16xmodem(databuf, 8);
|
||||||
} if (strncasecmp(databuf, "EMSI_HBT", 8) == 0) {
|
sscanf(databuf + 8, "%04hx", &rcrc);
|
||||||
tries = 0;
|
if (lcrc != rcrc) {
|
||||||
SM_PROCEED(waitpkt);
|
Syslog('+', "Got EMSI packet \"%s\" with bad crc: %04x/%04x", printable(databuf, 0), lcrc, rcrc);
|
||||||
} else if (strncasecmp(databuf, "EMSI_INQ", 8) == 0) {
|
SM_PROCEED(sendnak);
|
||||||
SM_PROCEED(sendnak);
|
} if (strncasecmp(databuf, "EMSI_HBT", 8) == 0) {
|
||||||
} else {
|
tries = 0;
|
||||||
SM_PROCEED(waitpkt);
|
SM_PROCEED(waitpkt);
|
||||||
}
|
} else if (strncasecmp(databuf, "EMSI_INQ", 8) == 0) {
|
||||||
|
SM_PROCEED(sendnak);
|
||||||
|
} else {
|
||||||
|
SM_PROCEED(waitpkt);
|
||||||
|
}
|
||||||
|
|
||||||
SM_STATE(checkdat)
|
SM_STATE(checkdat)
|
||||||
|
|
||||||
sscanf(databuf + 8, "%04x", &len);
|
sscanf(databuf + 8, "%04x", &len);
|
||||||
if (len != (strlen(databuf) - 16)) {
|
if (len != (strlen(databuf) - 16)) {
|
||||||
Syslog('+', "Bad EMSI_DAT length: %d/%d", len, strlen(databuf));
|
Syslog('+', "Bad EMSI_DAT length: %d/%d", len, strlen(databuf));
|
||||||
SM_PROCEED(sendnak);
|
SM_PROCEED(sendnak);
|
||||||
}
|
}
|
||||||
/* Some FD versions send length of the packet including the
|
/* Some FD versions send length of the packet including the
|
||||||
trailing CR. Arrrgh! Dirty overwork follows: */
|
trailing CR. Arrrgh! Dirty overwork follows: */
|
||||||
if (*(p = databuf + strlen(databuf) - 1) == '\r')
|
if (*(p = databuf + strlen(databuf) - 1) == '\r')
|
||||||
*p='\0';
|
*p='\0';
|
||||||
sscanf(databuf + strlen(databuf) - 4, "%04hx", &rcrc);
|
sscanf(databuf + strlen(databuf) - 4, "%04hx", &rcrc);
|
||||||
*(databuf + strlen(databuf) - 4) = '\0';
|
*(databuf + strlen(databuf) - 4) = '\0';
|
||||||
lcrc = crc16xmodem(databuf, strlen(databuf));
|
lcrc = crc16xmodem(databuf, strlen(databuf));
|
||||||
if (lcrc != rcrc) {
|
if (lcrc != rcrc) {
|
||||||
Syslog('+', "Got EMSI_DAT packet \"%s\" with bad crc: %04x/%04x", printable(databuf, 0), lcrc, rcrc);
|
Syslog('+', "Got EMSI_DAT packet \"%s\" with bad crc: %04x/%04x", printable(databuf, 0), lcrc, rcrc);
|
||||||
SM_PROCEED(sendnak);
|
SM_PROCEED(sendnak);
|
||||||
} if (scanemsidat(databuf + 12) == 0) {
|
} if (scanemsidat(databuf + 12) == 0) {
|
||||||
SM_PROCEED(sendack);
|
SM_PROCEED(sendack);
|
||||||
} else {
|
} else {
|
||||||
Syslog('+', "Could not parse EMSI_DAT packet \"%s\"",databuf);
|
Syslog('+', "Could not parse EMSI_DAT packet \"%s\"",databuf);
|
||||||
SM_ERROR;
|
SM_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
SM_STATE(sendnak)
|
SM_STATE(sendnak)
|
||||||
|
|
||||||
if (++tries > 9) {
|
/*
|
||||||
Syslog('+', "Too many tries getting EMSI_DAT");
|
* The FSC-0059 says 6 attempts, but to accept maindoor sessions
|
||||||
SM_ERROR;
|
* we seem to need about 11, we set it to 20 since we also have
|
||||||
} if (caller) {
|
* a global 60 seconds timer running.
|
||||||
PUTSTR((char *)"**EMSI_NAKEEC3\r\021");
|
*/
|
||||||
Syslog('i', "RXEMSI: send **EMSI_NAKEEC3");
|
if (++tries > 19) {
|
||||||
} else {
|
Syslog('+', "Too many tries getting EMSI_DAT");
|
||||||
PUTSTR((char *)"**EMSI_REQA77E\r\021");
|
SM_ERROR;
|
||||||
Syslog('i', "RXEMSI: send **EMSI_REQA77E");
|
} if (caller) {
|
||||||
if (tries > 1) {
|
PUTSTR((char *)"**EMSI_NAKEEC3\r\021");
|
||||||
PUTSTR((char *)"**EMSI_NAKEEC3\r\021");
|
Syslog('i', "RXEMSI: send **EMSI_NAKEEC3");
|
||||||
Syslog('i', "RXEMSI: send **EMSI_NAKEEC3");
|
} else {
|
||||||
}
|
PUTSTR((char *)"**EMSI_REQA77E\r\021");
|
||||||
|
Syslog('i', "RXEMSI: send **EMSI_REQA77E");
|
||||||
|
if (tries > 1) {
|
||||||
|
PUTSTR((char *)"**EMSI_NAKEEC3\r\021");
|
||||||
|
Syslog('i', "RXEMSI: send **EMSI_NAKEEC3");
|
||||||
}
|
}
|
||||||
SM_PROCEED(waitpkt);
|
}
|
||||||
|
SM_PROCEED(waitpkt);
|
||||||
|
|
||||||
SM_STATE(sendack)
|
SM_STATE(sendack)
|
||||||
|
|
||||||
Syslog('i', "RXEMSI: send **EMSI_ACKA490 (2 times)");
|
Syslog('i', "RXEMSI: send **EMSI_ACKA490 (2 times)");
|
||||||
PUTSTR((char *)"**EMSI_ACKA490\r\021");
|
PUTSTR((char *)"**EMSI_ACKA490\r\021");
|
||||||
PUTSTR((char *)"**EMSI_ACKA490\r\021");
|
PUTSTR((char *)"**EMSI_ACKA490\r\021");
|
||||||
SM_SUCCESS;
|
SM_SUCCESS;
|
||||||
|
|
||||||
SM_END
|
SM_END
|
||||||
Syslog('i', "RXEMSI: end");
|
Syslog('i', "RXEMSI: end");
|
||||||
free(databuf);
|
free(databuf);
|
||||||
|
|
||||||
SM_RETURN
|
SM_RETURN
|
||||||
|
|
||||||
@ -469,117 +495,132 @@ SM_RETURN
|
|||||||
|
|
||||||
SM_DECL(txemsi,(char *)"txemsi")
|
SM_DECL(txemsi,(char *)"txemsi")
|
||||||
SM_STATES
|
SM_STATES
|
||||||
senddata,
|
senddata,
|
||||||
waitpkt,
|
waitpkt,
|
||||||
waitchar,
|
waitchar,
|
||||||
checkpkt,
|
checkpkt,
|
||||||
sendack
|
sendack
|
||||||
SM_NAMES
|
SM_NAMES
|
||||||
(char *)"senddata",
|
(char *)"senddata",
|
||||||
(char *)"waitpkt",
|
(char *)"waitpkt",
|
||||||
(char *)"waitchar",
|
(char *)"waitchar",
|
||||||
(char *)"checkpkt",
|
(char *)"checkpkt",
|
||||||
(char *)"sendack"
|
(char *)"sendack"
|
||||||
SM_EDECL
|
SM_EDECL
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
unsigned short lcrc, rcrc;
|
unsigned short lcrc, rcrc;
|
||||||
int standby = 0, tries = 0;
|
int standby = 0, tries = 0;
|
||||||
char buf[13], *p;
|
char buf[13], *p;
|
||||||
char trailer[8];
|
char trailer[8];
|
||||||
|
|
||||||
p = buf;
|
p = buf;
|
||||||
memset(&buf, 0, sizeof(buf));
|
memset(&buf, 0, sizeof(buf));
|
||||||
strncpy(buf, intro, sizeof(buf) - 1);
|
strncpy(buf, intro, sizeof(buf) - 1);
|
||||||
|
RESETTIMERS();
|
||||||
|
SETTIMER(0, 60);
|
||||||
|
Syslog('i', "TXEMSI: 60 seconds timer set");
|
||||||
|
|
||||||
SM_START(senddata)
|
SM_START(senddata)
|
||||||
Syslog('i', "TXEMSI: start");
|
Syslog('i', "TXEMSI: start");
|
||||||
|
|
||||||
SM_STATE(senddata)
|
SM_STATE(senddata)
|
||||||
|
|
||||||
p = mkemsidat(caller);
|
p = mkemsidat(caller);
|
||||||
PUTCHAR('*');
|
PUTCHAR('*');
|
||||||
PUTCHAR('*');
|
PUTCHAR('*');
|
||||||
PUTSTR(p);
|
PUTSTR(p);
|
||||||
sprintf(trailer, "%04X\r\021", crc16xmodem(p, strlen(p)));
|
sprintf(trailer, "%04X\r\021", crc16xmodem(p, strlen(p)));
|
||||||
PUTSTR(trailer);
|
PUTSTR(trailer);
|
||||||
Syslog('i', "TXEMSI: send **%s%04X", p, crc16xmodem(p, strlen(p)));
|
Syslog('i', "TXEMSI: send **%s%04X", p, crc16xmodem(p, strlen(p)));
|
||||||
free(p);
|
free(p);
|
||||||
SM_PROCEED(waitpkt);
|
SETTIMER(1, 20);
|
||||||
|
SM_PROCEED(waitpkt);
|
||||||
|
|
||||||
SM_STATE(waitpkt)
|
SM_STATE(waitpkt)
|
||||||
|
|
||||||
standby = 0;
|
standby = 0;
|
||||||
SM_PROCEED(waitchar);
|
SM_PROCEED(waitchar);
|
||||||
|
|
||||||
SM_STATE(waitchar)
|
SM_STATE(waitchar)
|
||||||
|
|
||||||
c = GETCHAR(8);
|
if (EXPIRED(0)) {
|
||||||
if (c == TIMEOUT) {
|
Syslog('+', "EMSI transmit 60 seconds timeout");
|
||||||
if (++tries > 9) {
|
SM_ERROR;
|
||||||
Syslog('+', "too many tries sending EMSI");
|
}
|
||||||
SM_ERROR;
|
|
||||||
} else {
|
if (EXPIRED(1)) {
|
||||||
SM_PROCEED(senddata);
|
Syslog('i', "TXEMSI: 20 seconds timeout");
|
||||||
}
|
if (++tries > 19) {
|
||||||
} else if (c < 0) {
|
Syslog('+', "too many tries sending EMSI");
|
||||||
SM_ERROR;
|
SM_ERROR;
|
||||||
} else if ((c >= ' ') && (c <= '~')) {
|
} else {
|
||||||
if (c == '*') {
|
SM_PROCEED(senddata);
|
||||||
standby = 1;
|
|
||||||
p = buf;
|
|
||||||
*p = '\0';
|
|
||||||
} else if (standby) {
|
|
||||||
if ((p - buf) < (sizeof(buf) - 1)) {
|
|
||||||
*p++ = c;
|
|
||||||
*p = '\0';
|
|
||||||
} if ((p - buf) >= (sizeof(buf) - 1)) {
|
|
||||||
standby = 0;
|
|
||||||
SM_PROCEED(checkpkt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else switch(c) {
|
|
||||||
case DC1: SM_PROCEED(waitchar);
|
|
||||||
break;
|
|
||||||
case '\n':
|
|
||||||
case '\r': standby = 0;
|
|
||||||
break;
|
|
||||||
default: standby = 0;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c = GETCHAR(1);
|
||||||
|
if (c == TIMEOUT) {
|
||||||
SM_PROCEED(waitchar);
|
SM_PROCEED(waitchar);
|
||||||
|
} else if (c < 0) {
|
||||||
|
SM_ERROR;
|
||||||
|
} else if ((c >= ' ') && (c <= '~')) {
|
||||||
|
if (c == '*') {
|
||||||
|
standby = 1;
|
||||||
|
p = buf;
|
||||||
|
*p = '\0';
|
||||||
|
} else if (standby) {
|
||||||
|
if ((p - buf) < (sizeof(buf) - 1)) {
|
||||||
|
*p++ = c;
|
||||||
|
*p = '\0';
|
||||||
|
} if ((p - buf) >= (sizeof(buf) - 1)) {
|
||||||
|
standby = 0;
|
||||||
|
SM_PROCEED(checkpkt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
switch(c) {
|
||||||
|
case DC1: SM_PROCEED(waitchar);
|
||||||
|
break;
|
||||||
|
case '\n':
|
||||||
|
case '\r': standby = 0;
|
||||||
|
break;
|
||||||
|
default: standby = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
SM_PROCEED(waitchar);
|
||||||
|
|
||||||
SM_STATE(checkpkt)
|
SM_STATE(checkpkt)
|
||||||
|
|
||||||
Syslog('i', "TXEMSI: rcvd %s", buf);
|
Syslog('i', "TXEMSI: rcvd %s", buf);
|
||||||
if (strncasecmp(buf, "EMSI_DAT", 8) == 0) {
|
if (strncasecmp(buf, "EMSI_DAT", 8) == 0) {
|
||||||
SM_PROCEED(sendack);
|
SM_PROCEED(sendack);
|
||||||
} else if (strncasecmp(buf, "EMSI_", 5) == 0) {
|
} else if (strncasecmp(buf, "EMSI_", 5) == 0) {
|
||||||
lcrc = crc16xmodem(buf, 8);
|
lcrc = crc16xmodem(buf, 8);
|
||||||
sscanf(buf + 8, "%04hx", &rcrc);
|
sscanf(buf + 8, "%04hx", &rcrc);
|
||||||
if (lcrc != rcrc) {
|
if (lcrc != rcrc) {
|
||||||
Syslog('+', "Got EMSI packet \"%s\" with bad crc: %04x/%04x", printable(buf, 0), lcrc, rcrc);
|
Syslog('+', "Got EMSI packet \"%s\" with bad crc: %04x/%04x", printable(buf, 0), lcrc, rcrc);
|
||||||
SM_PROCEED(senddata);
|
SM_PROCEED(senddata);
|
||||||
} if (strncasecmp(buf, "EMSI_REQ", 8) == 0) {
|
} if (strncasecmp(buf, "EMSI_REQ", 8) == 0) {
|
||||||
SM_PROCEED(waitpkt);
|
SM_PROCEED(waitpkt);
|
||||||
} if (strncasecmp(buf, "EMSI_ACK", 8) == 0) {
|
} if (strncasecmp(buf, "EMSI_ACK", 8) == 0) {
|
||||||
SM_SUCCESS;
|
SM_SUCCESS;
|
||||||
} else {
|
|
||||||
SM_PROCEED(senddata);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
SM_PROCEED(waitpkt);
|
SM_PROCEED(senddata);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
SM_PROCEED(waitpkt);
|
||||||
|
}
|
||||||
|
|
||||||
SM_STATE(sendack)
|
SM_STATE(sendack)
|
||||||
|
|
||||||
Syslog('i', "TXEMSI: send **EMSI_ACKA490 (2 times)");
|
Syslog('i', "TXEMSI: send **EMSI_ACKA490 (2 times)");
|
||||||
PUTSTR((char *)"**EMSI_ACKA490\r\021");
|
PUTSTR((char *)"**EMSI_ACKA490\r\021");
|
||||||
PUTSTR((char *)"**EMSI_ACKA490\r\021");
|
PUTSTR((char *)"**EMSI_ACKA490\r\021");
|
||||||
SM_PROCEED(waitpkt);
|
SM_PROCEED(waitpkt);
|
||||||
|
|
||||||
SM_END
|
SM_END
|
||||||
Syslog('i', "TXEMSI: end");
|
Syslog('i', "TXEMSI: end");
|
||||||
|
|
||||||
SM_RETURN
|
SM_RETURN
|
||||||
|
|
||||||
|
@ -388,12 +388,14 @@ SM_RETURN
|
|||||||
SM_DECL(rx_define_type,(char *)"rx_define_type")
|
SM_DECL(rx_define_type,(char *)"rx_define_type")
|
||||||
SM_STATES
|
SM_STATES
|
||||||
sendintro,
|
sendintro,
|
||||||
|
settimer,
|
||||||
waitchar,
|
waitchar,
|
||||||
nextchar,
|
nextchar,
|
||||||
checkemsi,
|
checkemsi,
|
||||||
getdat
|
getdat
|
||||||
SM_NAMES
|
SM_NAMES
|
||||||
(char *)"sendintro",
|
(char *)"sendintro",
|
||||||
|
(char *)"settimer",
|
||||||
(char *)"waitchar",
|
(char *)"waitchar",
|
||||||
(char *)"nextchar",
|
(char *)"nextchar",
|
||||||
(char *)"checkemsi",
|
(char *)"checkemsi",
|
||||||
@ -413,17 +415,19 @@ SM_EDECL
|
|||||||
ep=ebuf;
|
ep=ebuf;
|
||||||
RESETTIMERS();
|
RESETTIMERS();
|
||||||
SETTIMER(0, 60);
|
SETTIMER(0, 60);
|
||||||
|
SETTIMER(1, 20);
|
||||||
|
|
||||||
SM_START(sendintro)
|
SM_START(sendintro)
|
||||||
|
|
||||||
SM_STATE(sendintro)
|
SM_STATE(sendintro)
|
||||||
|
|
||||||
Syslog('s', "rxdefine_type SENDINTRO count=%d", count);
|
|
||||||
if (count++ > 6) {
|
if (count++ > 6) {
|
||||||
Syslog('+', "Too many tries to get anything from the caller");
|
Syslog('+', "Too many tries to get anything from the caller");
|
||||||
SM_ERROR;
|
SM_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Syslog('s', "rxdefine_type SENDINTRO count=%d", count);
|
||||||
|
|
||||||
standby = 0;
|
standby = 0;
|
||||||
ep = ebuf;
|
ep = ebuf;
|
||||||
ebuf[0] = '\0';
|
ebuf[0] = '\0';
|
||||||
@ -447,9 +451,15 @@ SM_STATE(sendintro)
|
|||||||
if (STATUS) {
|
if (STATUS) {
|
||||||
SM_ERROR;
|
SM_ERROR;
|
||||||
} else {
|
} else {
|
||||||
SM_PROCEED(waitchar);
|
SM_PROCEED(settimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SM_STATE(settimer)
|
||||||
|
|
||||||
|
Syslog('s', "Set 20 secs timer");
|
||||||
|
SETTIMER(1, 20);
|
||||||
|
SM_PROCEED(waitchar);
|
||||||
|
|
||||||
SM_STATE(waitchar)
|
SM_STATE(waitchar)
|
||||||
|
|
||||||
if (EXPIRED(0)) {
|
if (EXPIRED(0)) {
|
||||||
@ -457,8 +467,13 @@ SM_STATE(waitchar)
|
|||||||
SM_ERROR;
|
SM_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((c = GETCHAR(20)) == TIMEOUT) {
|
if (EXPIRED(1)) {
|
||||||
|
Syslog('s', "20 sec timer timeout");
|
||||||
SM_PROCEED(sendintro);
|
SM_PROCEED(sendintro);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((c = GETCHAR(1)) == TIMEOUT) {
|
||||||
|
SM_PROCEED(waitchar);
|
||||||
} else if (c < 0) {
|
} else if (c < 0) {
|
||||||
Syslog('+', "Session setup error");
|
Syslog('+', "Session setup error");
|
||||||
SM_ERROR;
|
SM_ERROR;
|
||||||
@ -515,7 +530,18 @@ SM_STATE(nextchar)
|
|||||||
if (ebuf[0]) {
|
if (ebuf[0]) {
|
||||||
SM_PROCEED(checkemsi);
|
SM_PROCEED(checkemsi);
|
||||||
} else {
|
} else {
|
||||||
SM_PROCEED(sendintro);
|
/*
|
||||||
|
* If the 20 second timer is expired or after the
|
||||||
|
* first sendintro, send the intro again. After
|
||||||
|
* that take it easy.
|
||||||
|
*/
|
||||||
|
if (EXPIRED(1) || (count == 1)) {
|
||||||
|
Syslog('s', "sendintro after eol char");
|
||||||
|
SM_PROCEED(sendintro);
|
||||||
|
} else {
|
||||||
|
Syslog('s', "waitchar after eol char");
|
||||||
|
SM_PROCEED(waitchar);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: standby = 0;
|
default: standby = 0;
|
||||||
@ -532,6 +558,7 @@ SM_STATE(checkemsi)
|
|||||||
Syslog('i', "check \"%s\" for being EMSI inquery or data",ebuf);
|
Syslog('i', "check \"%s\" for being EMSI inquery or data",ebuf);
|
||||||
|
|
||||||
if (localoptions & NOEMSI) {
|
if (localoptions & NOEMSI) {
|
||||||
|
Syslog('s', "Force sendintro");
|
||||||
SM_PROCEED(sendintro);
|
SM_PROCEED(sendintro);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -543,11 +570,11 @@ SM_STATE(checkemsi)
|
|||||||
standby = 0;
|
standby = 0;
|
||||||
ep = ebuf;
|
ep = ebuf;
|
||||||
ebuf[0] = '\0';
|
ebuf[0] = '\0';
|
||||||
SM_PROCEED(waitchar);
|
SM_PROCEED(settimer);
|
||||||
} else if (strncasecmp(ebuf, "EMSI_DAT", 8) == 0) {
|
} else if (strncasecmp(ebuf, "EMSI_DAT", 8) == 0) {
|
||||||
SM_PROCEED(getdat);
|
SM_PROCEED(getdat);
|
||||||
} else {
|
} else {
|
||||||
SM_PROCEED(sendintro);
|
SM_PROCEED(settimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
SM_STATE(getdat)
|
SM_STATE(getdat)
|
||||||
@ -569,6 +596,7 @@ SM_STATE(getdat)
|
|||||||
*p= '\0';
|
*p= '\0';
|
||||||
}
|
}
|
||||||
if (c == TIMEOUT) {
|
if (c == TIMEOUT) {
|
||||||
|
Syslog('s', "c = TIMEOUT -> sendintro");
|
||||||
SM_PROCEED(sendintro);
|
SM_PROCEED(sendintro);
|
||||||
} else if (c < 0) {
|
} else if (c < 0) {
|
||||||
Syslog('+', "Error while reading EMSI_DAT from the caller");
|
Syslog('+', "Error while reading EMSI_DAT from the caller");
|
||||||
|
Reference in New Issue
Block a user