Date: Fri, 19 Dec 1997 08:09:13 -0600 From: Derek Inksetter <derek@saidev.com> To: freebsd-hackers@freebsd.org Subject: ppp multi-device? Message-ID: <19971219080913.17939@saidev.com>
next in thread | raw e-mail | index | archive | help
How much interest is there in making user-mode ppp handle multiple devices
for dial-out? My company uses ppp with "ip aliasing" and some
modifications to deal with multiple modems. basically our ppp.conf has a
line that looks like this:
set device /dev/cuaa0,/dev/cuaa1,...
A setup like this, coupled with setting the box up as a gateway, allows our
office to support several customers (accessible only through PPP) with a
limited number of dial-out modems. My company's been using this for close
to a year, and I can attest to its stability, at least in our case.
Let me know what you think.
Derek
(Here's a patch to the -current ppp. Caveat: This is a re-write for
current. My office is running on 2.1.5)
diff -c ./command.c ../ppp/command.c
*** ./command.c Wed Dec 17 22:47:41 1997
--- ../ppp/command.c Fri Dec 19 07:46:01 1997
***************
*** 1347,1356 ****
LogPrintf(LogWARN, "Cannot change device to \"%s\" when \"%s\" is open\n",
argp, VarDevice);
else {
! strncpy(VarDevice, argp, sizeof(VarDevice) - 1);
! VarDevice[sizeof(VarDevice) - 1] = '\0';
! VarBaseDevice = strrchr(VarDevice, '/');
! VarBaseDevice = VarBaseDevice ? VarBaseDevice + 1 : "";
}
break;
case VAR_ACCMAP:
--- 1347,1354 ----
LogPrintf(LogWARN, "Cannot change device to \"%s\" when \"%s\" is open\n",
argp, VarDevice);
else {
! strncpy(VarDeviceList, argp, sizeof(VarDeviceList) - 1);
! VarDeviceList[sizeof(VarDeviceList) - 1] = '\0';
}
break;
case VAR_ACCMAP:
***************
*** 1421,1427 ****
{"ctsrts", NULL, SetCtsRts, LOCAL_AUTH,
"Use CTS/RTS modem signalling", "set ctsrts [on|off]"},
{"device", "line", SetVariable, LOCAL_AUTH, "Set modem device name",
! "set device|line device-name", (const void *) VAR_DEVICE},
{"dfilter", NULL, SetDfilter, LOCAL_AUTH,
"Set demand filter", "set dfilter ..."},
{"dial", NULL, SetVariable, LOCAL_AUTH,
--- 1419,1425 ----
{"ctsrts", NULL, SetCtsRts, LOCAL_AUTH,
"Use CTS/RTS modem signalling", "set ctsrts [on|off]"},
{"device", "line", SetVariable, LOCAL_AUTH, "Set modem device name",
! "set device|line device-name[,device-name]", (const void *) VAR_DEVICE},
{"dfilter", NULL, SetDfilter, LOCAL_AUTH,
"Set demand filter", "set dfilter ..."},
{"dial", NULL, SetVariable, LOCAL_AUTH,
diff -c ./modem.c ../ppp/modem.c
*** ./modem.c Wed Dec 17 22:47:42 1997
--- ../ppp/modem.c Thu Dec 18 20:33:24 1997
***************
*** 434,439 ****
--- 434,441 ----
int oldflag;
char *host, *port;
char *cp;
+ char tmpDeviceList[sizeof(VarDeviceList)];
+ char *tmpDevice;
if (modem >= 0)
LogPrintf(LogDEBUG, "OpenModem: Modem is already open!\n");
***************
*** 464,507 ****
return modem = 0;
}
} else {
! if (strncmp(VarDevice, "/dev/", 5) == 0) {
! if (LockModem() == -1)
! return (-1);
! modem = ID0open(VarDevice, O_RDWR | O_NONBLOCK);
! if (modem < 0) {
! LogPrintf(LogERROR, "OpenModem failed: %s: %s\n", VarDevice,
! strerror(errno));
! UnlockModem();
! return (-1);
! }
! HaveModem();
! LogPrintf(LogDEBUG, "OpenModem: Modem is %s\n", VarDevice);
! } else {
! /* PPP over TCP */
! cp = strchr(VarDevice, ':');
! if (cp) {
! *cp = '\0';
! host = VarDevice;
! port = cp + 1;
! if (*host && *port) {
! modem = OpenConnection(host, port);
! *cp = ':'; /* Don't destroy VarDevice */
! if (modem < 0)
return (-1);
! HaveModem();
! LogPrintf(LogDEBUG, "OpenModem: Modem is socket %s\n", VarDevice);
} else {
! *cp = ':'; /* Don't destroy VarDevice */
! LogPrintf(LogERROR, "Invalid host:port: \"%s\"\n", VarDevice);
return (-1);
}
- } else {
- LogPrintf(LogERROR,
- "Device (%s) must be in /dev or be a host:port pair\n",
- VarDevice);
- return (-1);
}
}
}
/*
--- 466,527 ----
return modem = 0;
}
} else {
! strncpy(tmpDeviceList, VarDeviceList, sizeof(tmpDeviceList));
! tmpDeviceList[sizeof(tmpDeviceList)-1] = '\0';
!
! for(tmpDevice=strtok(tmpDeviceList, ","); tmpDevice && (modem < 0);
! tmpDevice=strtok(NULL,",")) {
! strncpy(VarDevice, tmpDevice, sizeof(VarDevice));
! VarDevice[sizeof(VarDevice)-1]= '\0';
! VarBaseDevice = strrchr(VarDevice, '/');
! VarBaseDevice = VarBaseDevice ? VarBaseDevice + 1 : "";
!
! if (strncmp(VarDevice, "/dev/", 5) == 0) {
! if (LockModem() == -1) {
! modem = -1;
! }
! else {
! modem = ID0open(VarDevice, O_RDWR | O_NONBLOCK);
! if (modem < 0) {
! LogPrintf(LogERROR, "OpenModem failed: %s: %s\n", VarDevice,
! strerror(errno));
! UnlockModem();
! modem = -1;
! }
! else {
! HaveModem();
! LogPrintf(LogDEBUG, "OpenModem: Modem is %s\n", VarDevice);
! }
! }
! } else {
! /* PPP over TCP */
! cp = strchr(VarDevice, ':');
! if (cp) {
! *cp = '\0';
! host = VarDevice;
! port = cp + 1;
! if (*host && *port) {
! modem = OpenConnection(host, port);
! *cp = ':'; /* Don't destroy VarDevice */
! if (modem < 0)
! return (-1);
! HaveModem();
! LogPrintf(LogDEBUG, "OpenModem: Modem is socket %s\n", VarDevice);
! } else {
! *cp = ':'; /* Don't destroy VarDevice */
! LogPrintf(LogERROR, "Invalid host:port: \"%s\"\n", VarDevice);
return (-1);
! }
} else {
! LogPrintf(LogERROR,
! "Device (%s) must be in /dev or be a host:port pair\n",
! VarDevice);
return (-1);
}
}
}
+
+ if (modem < 0) return modem;
}
/*
diff -c ./ppp.8 ../ppp/ppp.8
*** ./ppp.8 Wed Dec 17 22:47:42 1997
--- ../ppp/ppp.8 Fri Dec 19 07:45:04 1997
***************
*** 2077,2084 ****
.It set ctsrts
This sets hardware flow control and is the default.
! .It set device|line value
! This sets the device to which
.Nm
will talk to the given
.Dq value .
--- 2077,2084 ----
.It set ctsrts
This sets hardware flow control and is the default.
! .It set device|line value[,value...]
! This sets the device(s) to which
.Nm
will talk to the given
.Dq value .
***************
*** 2098,2104 ****
.Dq port .
Refer to the section on
.Em PPP OVER TCP
! above for further details.
.It set dial chat-script
This specifies the chat script that will be used to dial the other
--- 2098,2109 ----
.Dq port .
Refer to the section on
.Em PPP OVER TCP
! above for further details. If multiple
! .Dq values
! are specified,
! .Nm
! will attempt to open each one in turn until it succeeds or runs out of
! devices.
.It set dial chat-script
This specifies the chat script that will be used to dial the other
diff -c ./vars.c ../ppp/vars.c
*** ./vars.c Fri Dec 12 18:47:01 1997
--- ../ppp/vars.c Thu Dec 18 22:28:13 1997
***************
*** 73,79 ****
struct pppvars pppVars = {
DEF_MRU, DEF_MTU, 0, MODEM_SPEED, CS8, MODEM_CTSRTS, 180, 30, 3,
RECONNECT_TIMER, RECONNECT_TRIES, REDIAL_PERIOD,
! NEXT_REDIAL_PERIOD, 1, 1, MODEM_DEV, BASE_MODEM_DEV,
OPEN_ACTIVE, LOCAL_NO_AUTH, 0
};
--- 73,79 ----
struct pppvars pppVars = {
DEF_MRU, DEF_MTU, 0, MODEM_SPEED, CS8, MODEM_CTSRTS, 180, 30, 3,
RECONNECT_TIMER, RECONNECT_TRIES, REDIAL_PERIOD,
! NEXT_REDIAL_PERIOD, 1, 1, MODEM_DEV, "", BASE_MODEM_DEV,
OPEN_ACTIVE, LOCAL_NO_AUTH, 0
};
diff -c ./vars.h ../ppp/vars.h
*** ./vars.h Wed Dec 3 17:28:02 1997
--- ../ppp/vars.h Thu Dec 18 20:49:45 1997
***************
*** 70,75 ****
--- 70,76 ----
int redial_next_timeout; /* Redial next timeout value */
int dial_tries; /* Dial attempts before giving up, 0 == inf */
int loopback; /* Turn around packets addressed to me */
+ char modem_devlist[500]; /* Comma-separated list of devices */
char modem_dev[40]; /* Name of device / host:port */
const char *base_modem_dev; /* Pointer to base of modem_dev */
int open_mode; /* LCP open mode */
***************
*** 102,107 ****
--- 103,109 ----
#define VarMRU pppVars.var_mru
#define VarPrefMTU pppVars.pref_mtu
#define VarDevice pppVars.modem_dev
+ #define VarDeviceList pppVars.modem_devlist
#define VarBaseDevice pppVars.base_modem_dev
#define VarSpeed pppVars.modem_speed
#define VarParity pppVars.modem_parity
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19971219080913.17939>
