o Remove bundle_LinkLost() and have the modem routines simply
call datalink_Down() where appropriate rather than modem_Hangup(). o Now, when something horrible happens (failed read/write, loss of carrier etc), we go offline and run any hangup scripts etc in a controlled manner - exactly the same as if someone says ``down'' at the prompt or sends us a HUP. o -dedicated links that fail to make the modem raw close it, suffer the redial timeout then try to open it again. o Add a ``carrier lost'' warning diagnostic.
This commit is contained in:
parent
50e5c17d3b
commit
030e4ebba8
@ -23,7 +23,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: bundle.c,v 1.1.2.49 1998/04/16 22:11:46 brian Exp $
|
||||
* $Id: bundle.c,v 1.1.2.50 1998/04/16 23:06:53 brian Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -748,25 +748,6 @@ bundle_SetRoute(struct bundle *bundle, int cmd, struct in_addr dst,
|
||||
close(s);
|
||||
}
|
||||
|
||||
void
|
||||
bundle_LinkLost(struct bundle *bundle, struct physical *p, int staydown)
|
||||
{
|
||||
/*
|
||||
* Locate the appropriate datalink, and Down it.
|
||||
*
|
||||
* The LayerFinish() called from the datalinks LCP will
|
||||
* potentially Down our NCPs (if it's the last link).
|
||||
*
|
||||
* The LinkClosed() called when the datalink is finally in
|
||||
* the CLOSED state MAY cause the entire datalink to be deleted
|
||||
* and MAY cause a program exit.
|
||||
*/
|
||||
|
||||
if (p->type == PHYS_STDIN || bundle->CleaningUp)
|
||||
staydown = 1;
|
||||
datalink_Down(p->dl, staydown);
|
||||
}
|
||||
|
||||
void
|
||||
bundle_LinkClosed(struct bundle *bundle, struct datalink *dl)
|
||||
{
|
||||
|
@ -23,7 +23,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: bundle.h,v 1.1.2.28 1998/04/11 21:50:39 brian Exp $
|
||||
* $Id: bundle.h,v 1.1.2.29 1998/04/16 00:25:50 brian Exp $
|
||||
*/
|
||||
|
||||
#define PHASE_DEAD 0 /* Link is dead */
|
||||
@ -107,7 +107,6 @@ extern void bundle_NewPhase(struct bundle *, u_int);
|
||||
extern int bundle_LinkIsUp(const struct bundle *);
|
||||
extern void bundle_SetRoute(struct bundle *, int, struct in_addr,
|
||||
struct in_addr, struct in_addr, int);
|
||||
extern void bundle_LinkLost(struct bundle *, struct physical *, int);
|
||||
extern void bundle_Close(struct bundle *, const char *, int);
|
||||
extern void bundle_Open(struct bundle *, const char *, int);
|
||||
extern void bundle_LinkClosed(struct bundle *, struct datalink *);
|
||||
|
@ -23,7 +23,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: datalink.c,v 1.1.2.37 1998/04/14 23:17:04 brian Exp $
|
||||
* $Id: datalink.c,v 1.1.2.38 1998/04/16 00:25:56 brian Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -67,6 +67,7 @@
|
||||
#include "datalink.h"
|
||||
|
||||
static const char *datalink_State(struct datalink *);
|
||||
static void datalink_LoginDone(struct datalink *);
|
||||
|
||||
static void
|
||||
datalink_OpenTimeout(void *v)
|
||||
@ -102,6 +103,13 @@ datalink_StartDialTimer(struct datalink *dl, int Timeout)
|
||||
static void
|
||||
datalink_HangupDone(struct datalink *dl)
|
||||
{
|
||||
if (dl->physical->type == PHYS_DEDICATED && !dl->bundle->CleaningUp &&
|
||||
Physical_GetFD(dl->physical) != -1) {
|
||||
/* Don't close our modem if the link is dedicated */
|
||||
datalink_LoginDone(dl);
|
||||
return;
|
||||
}
|
||||
|
||||
modem_Close(dl->physical);
|
||||
dl->phone.chosen = "N/A";
|
||||
|
||||
@ -167,8 +175,12 @@ datalink_LoginDone(struct datalink *dl)
|
||||
dl->state = DATALINK_HANGUP;
|
||||
modem_Offline(dl->physical);
|
||||
chat_Init(&dl->chat, dl->physical, dl->cfg.script.hangup, 1, NULL);
|
||||
} else
|
||||
} else {
|
||||
if (dl->physical->type == PHYS_DEDICATED)
|
||||
/* force a redial timeout */
|
||||
modem_Close(dl->physical);
|
||||
datalink_HangupDone(dl);
|
||||
}
|
||||
} else {
|
||||
dl->dial_tries = -1;
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: modem.c,v 1.77.2.49 1998/04/10 23:51:30 brian Exp $
|
||||
* $Id: modem.c,v 1.77.2.50 1998/04/16 00:26:09 brian Exp $
|
||||
*
|
||||
* TODO:
|
||||
*/
|
||||
@ -79,7 +79,6 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static void modem_Hangup(struct physical *, int);
|
||||
static void modem_DescriptorWrite(struct descriptor *, struct bundle *,
|
||||
const fd_set *);
|
||||
static void modem_DescriptorRead(struct descriptor *, struct bundle *,
|
||||
@ -287,8 +286,7 @@ modem_Timeout(void *data)
|
||||
if (to->modem->fd >= 0) {
|
||||
if (ioctl(to->modem->fd, TIOCMGET, &to->modem->mbits) < 0) {
|
||||
LogPrintf(LogPHASE, "ioctl error (%s)!\n", strerror(errno));
|
||||
modem_Hangup(to->modem, 0);
|
||||
bundle_LinkLost(to->bundle, to->modem, 0);
|
||||
datalink_Down(to->modem->dl, 0);
|
||||
return;
|
||||
}
|
||||
} else
|
||||
@ -303,8 +301,8 @@ modem_Timeout(void *data)
|
||||
*/
|
||||
} else {
|
||||
LogPrintf(LogDEBUG, "modem_Timeout: online -> offline\n");
|
||||
modem_Hangup(to->modem, 0);
|
||||
bundle_LinkLost(to->bundle, to->modem, 0);
|
||||
LogPrintf(LogPHASE, "%s: Carrier lost\n", to->modem->link.name);
|
||||
datalink_Down(to->modem->dl, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -520,22 +518,18 @@ modem_Open(struct physical *modem, struct bundle *bundle)
|
||||
strncpy(tmpDeviceList, modem->cfg.devlist, sizeof tmpDeviceList - 1);
|
||||
tmpDeviceList[sizeof tmpDeviceList - 1] = '\0';
|
||||
|
||||
for(tmpDevice=strtok(tmpDeviceList, ", "); tmpDevice && (modem->fd < 0);
|
||||
for(tmpDevice=strtok(tmpDeviceList, ", "); tmpDevice && modem->fd < 0;
|
||||
tmpDevice=strtok(NULL,", ")) {
|
||||
modem_SetDevice(modem, tmpDevice);
|
||||
|
||||
if (*modem->name.full == '/') {
|
||||
if (modem_lock(modem, bundle->unit) == -1)
|
||||
modem->fd = -1;
|
||||
else {
|
||||
if (modem_lock(modem, bundle->unit) != -1) {
|
||||
modem->fd = ID0open(modem->name.full, O_RDWR | O_NONBLOCK);
|
||||
if (modem->fd < 0) {
|
||||
LogPrintf(LogERROR, "modem_Open failed: %s: %s\n", modem->name.full,
|
||||
strerror(errno));
|
||||
modem_Unlock(modem);
|
||||
modem->fd = -1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
modem_Found(modem, bundle);
|
||||
LogPrintf(LogDEBUG, "modem_Open: Modem is %s\n", modem->name.full);
|
||||
}
|
||||
@ -712,24 +706,12 @@ modem_PhysicalClose(struct physical *modem)
|
||||
LogPrintf(LogDEBUG, "modem_PhysicalClose\n");
|
||||
close(modem->fd);
|
||||
modem->fd = -1;
|
||||
StopTimer(&modem->link.Timer);
|
||||
bundle_SetTtyCommandMode(modem->dl->bundle, modem->dl);
|
||||
throughput_stop(&modem->link.throughput);
|
||||
throughput_log(&modem->link.throughput, LogPHASE, "Modem");
|
||||
}
|
||||
|
||||
static int force_hack;
|
||||
|
||||
static void
|
||||
modem_Hangup(struct physical *modem, int dedicated_force)
|
||||
{
|
||||
/* We're about to close (pre hangup script) */
|
||||
|
||||
force_hack = dedicated_force;
|
||||
if (modem->fd >= 0) {
|
||||
StopTimer(&modem->link.Timer);
|
||||
throughput_stop(&modem->link.throughput);
|
||||
bundle_SetTtyCommandMode(modem->dl->bundle, modem->dl);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
modem_Offline(struct physical *modem)
|
||||
{
|
||||
@ -757,9 +739,6 @@ modem_Close(struct physical *modem)
|
||||
|
||||
LogPrintf(LogDEBUG, "Close modem\n");
|
||||
|
||||
if (modem->link.Timer.load)
|
||||
modem_Hangup(modem, force_hack);
|
||||
|
||||
if (!isatty(modem->fd)) {
|
||||
modem_PhysicalClose(modem);
|
||||
*modem->name.full = '\0';
|
||||
@ -768,18 +747,9 @@ modem_Close(struct physical *modem)
|
||||
}
|
||||
|
||||
if (modem->fd >= 0) {
|
||||
if (force_hack || modem->type != PHYS_DEDICATED) {
|
||||
tcflush(modem->fd, TCIOFLUSH);
|
||||
modem_Unraw(modem);
|
||||
modem_LogicalClose(modem);
|
||||
} else {
|
||||
/*
|
||||
* If we are working as dedicated mode, never close it until we are
|
||||
* directed to quit program.
|
||||
*/
|
||||
modem->mbits |= TIOCM_DTR;
|
||||
ioctl(modem->fd, TIOCMSET, &modem->mbits);
|
||||
}
|
||||
tcflush(modem->fd, TCIOFLUSH);
|
||||
modem_Unraw(modem);
|
||||
modem_LogicalClose(modem);
|
||||
}
|
||||
}
|
||||
|
||||
@ -827,8 +797,7 @@ modem_DescriptorWrite(struct descriptor *d, struct bundle *bundle,
|
||||
if (errno != EAGAIN) {
|
||||
LogPrintf(LogERROR, "modem write (%d): %s\n", modem->fd,
|
||||
strerror(errno));
|
||||
modem_Hangup(modem, 0);
|
||||
bundle_LinkLost(bundle, modem, 0);
|
||||
datalink_Down(modem->dl, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -929,10 +898,9 @@ modem_DescriptorRead(struct descriptor *d, struct bundle *bundle,
|
||||
nointr_usleep(10000);
|
||||
|
||||
n = Physical_Read(p, rbuff, sizeof rbuff);
|
||||
if (p->type == PHYS_STDIN && n <= 0) {
|
||||
modem_Hangup(p, 0);
|
||||
bundle_LinkLost(bundle, p, 1);
|
||||
} else
|
||||
if (p->type == PHYS_STDIN && n <= 0)
|
||||
datalink_Down(p->dl, 0);
|
||||
else
|
||||
LogDumpBuff(LogASYNC, "ReadFromModem", rbuff, n);
|
||||
|
||||
if (p->link.lcp.fsm.state <= ST_CLOSED) {
|
||||
|
@ -17,7 +17,7 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: timer.c,v 1.27.2.3 1998/04/06 09:12:37 brian Exp $
|
||||
* $Id: timer.c,v 1.27.2.4 1998/04/07 00:54:22 brian Exp $
|
||||
*
|
||||
* TODO:
|
||||
*/
|
||||
@ -137,7 +137,7 @@ StopTimerNoBlock(struct pppTimer * tp)
|
||||
if (t->next)
|
||||
t->next->rest += tp->rest;
|
||||
} else
|
||||
LogPrintf(LogERROR, "Oops, timer not found!!\n");
|
||||
LogPrintf(LogERROR, "Oops, %s timer not found!!\n", tp->name);
|
||||
|
||||
tp->next = NULL;
|
||||
tp->state = TIMER_STOPPED;
|
||||
|
Loading…
Reference in New Issue
Block a user