summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrian <brian@cvs.openbsd.org>2000-06-13 09:57:52 +0000
committerbrian <brian@cvs.openbsd.org>2000-06-13 09:57:52 +0000
commitf43a60883364695d1eb6ee3d262e4313aa44ff4f (patch)
treecc0f153d853b9b29a8988a2ac013bf01d27b3429
parent4cc7616c6c16198a9ddb858b8baa00860928aa25 (diff)
Add ``set ifqueue'' to adjust the number of packets ppp buffers.
Handle an ``open'' correctly from state DATALINK_READY. Don't disable the autoload timer when bringing down the second last auto link or bringing up the last auto link. Allow ``set urgent none'' to disable IPTOS_LOWDELAY prioritisation. Honour ``set speed sync'' for ``!program'' links and use a udp socketpair between ppp and ``program''. HUP ``program'' when a ``!program'' link comes down. Don't complain about valid padded ppp frames, but complain and drop the data if the length claims to be more than the payload. Correct the umask when creating a new /etc/resolv.conf (when dns is enabled), and don't segfault when trying to rewrite the previous (non-existent) contents. Be more verbose about ``inappropriate peer'' messages in MP mode. Allow ``nat target MYADDR'' (to redirect incoming connections to the gateway). Pass everything through the NAT engine - let it decide if it wants it. Fix the return code when failing to create a tcp link
-rw-r--r--usr.sbin/ppp/ppp/README.changes2
-rw-r--r--usr.sbin/ppp/ppp/bundle.c24
-rw-r--r--usr.sbin/ppp/ppp/bundle.h3
-rw-r--r--usr.sbin/ppp/ppp/command.c18
-rw-r--r--usr.sbin/ppp/ppp/datalink.c8
-rw-r--r--usr.sbin/ppp/ppp/defs.h3
-rw-r--r--usr.sbin/ppp/ppp/exec.c47
-rw-r--r--usr.sbin/ppp/ppp/fsm.c13
-rw-r--r--usr.sbin/ppp/ppp/ip.c6
-rw-r--r--usr.sbin/ppp/ppp/ipcp.c11
-rw-r--r--usr.sbin/ppp/ppp/ipcp.h5
-rw-r--r--usr.sbin/ppp/ppp/mp.c8
-rw-r--r--usr.sbin/ppp/ppp/nat_cmd.c26
-rw-r--r--usr.sbin/ppp/ppp/physical.c4
-rw-r--r--usr.sbin/ppp/ppp/ppp.848
-rw-r--r--usr.sbin/ppp/ppp/server.c4
-rw-r--r--usr.sbin/ppp/ppp/tcp.c10
17 files changed, 166 insertions, 74 deletions
diff --git a/usr.sbin/ppp/ppp/README.changes b/usr.sbin/ppp/ppp/README.changes
index b8df2019beb..c0bd06da70e 100644
--- a/usr.sbin/ppp/ppp/README.changes
+++ b/usr.sbin/ppp/ppp/README.changes
@@ -1,3 +1,5 @@
+$OpenBSD: README.changes,v 1.15 2000/06/13 09:57:50 brian Exp $
+
This file summarises changes made to ppp that effect
its configuration.
diff --git a/usr.sbin/ppp/ppp/bundle.c b/usr.sbin/ppp/ppp/bundle.c
index c53c6109fb1..1c499911da6 100644
--- a/usr.sbin/ppp/ppp/bundle.c
+++ b/usr.sbin/ppp/ppp/bundle.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $OpenBSD: bundle.c,v 1.36 2000/04/07 23:46:39 brian Exp $
+ * $OpenBSD: bundle.c,v 1.37 2000/06/13 09:57:50 brian Exp $
*/
#include <sys/param.h>
@@ -440,6 +440,7 @@ bundle_UpdateSet(struct fdescriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n)
struct bundle *bundle = descriptor2bundle(d);
struct datalink *dl;
int result, nlinks;
+ u_short ifqueue;
size_t queued;
result = 0;
@@ -454,7 +455,8 @@ bundle_UpdateSet(struct fdescriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n)
if (r && (bundle->phase == PHASE_NETWORK ||
bundle->phys_type.all & PHYS_AUTO)) {
/* enough surplus so that we can tell if we're getting swamped */
- if (queued < 30) {
+ ifqueue = nlinks > bundle->cfg.ifqueue ? nlinks : bundle->cfg.ifqueue;
+ if (queued < ifqueue) {
/* Not enough - select() for more */
if (bundle->choked.timer.state == TIMER_RUNNING)
timer_Stop(&bundle->choked.timer); /* Not needed any more */
@@ -806,6 +808,7 @@ bundle_Create(const char *prefix, int type, int unit)
OPT_THROUGHPUT | OPT_UTMP;
*bundle.cfg.label = '\0';
bundle.cfg.mtu = DEF_MTU;
+ bundle.cfg.ifqueue = DEF_IFQUEUE;
bundle.cfg.choked.timeout = CHOKED_TIMEOUT;
bundle.phys_type.all = type;
bundle.phys_type.open = 0;
@@ -1076,13 +1079,12 @@ bundle_Open(struct bundle *bundle, const char *name, int mask, int force)
if ((mask & dl->physical->type) &&
(dl->state == DATALINK_CLOSED ||
(force && dl->state == DATALINK_OPENING &&
- dl->dial.timer.state == TIMER_RUNNING))) {
- if (force) /* Ignore redial timeout ? */
- timer_Stop(&dl->dial.timer);
+ dl->dial.timer.state == TIMER_RUNNING) ||
+ dl->state == DATALINK_READY)) {
+ timer_Stop(&dl->dial.timer); /* We're finished with this */
datalink_Up(dl, 1, 1);
if (mask & PHYS_AUTO)
- /* Only one AUTO link at a time */
- break;
+ break; /* Only one AUTO link at a time */
}
if (name != NULL)
break;
@@ -1157,8 +1159,10 @@ bundle_ShowStatus(struct cmdargs const *arg)
prompt_Printf(arg->prompt, ", up time %d:%02d:%02d", secs / 3600,
(secs / 60) % 60, secs % 60);
}
+ prompt_Printf(arg->prompt, "\n Queued: %u of %u\n",
+ ip_QueueLen(&arg->bundle->ncp.ipcp), arg->bundle->cfg.ifqueue);
- prompt_Printf(arg->prompt, "\n\nDefaults:\n");
+ prompt_Printf(arg->prompt, "\nDefaults:\n");
prompt_Printf(arg->prompt, " Label: %s\n", arg->bundle->cfg.label);
prompt_Printf(arg->prompt, " Auth name: %s\n",
arg->bundle->cfg.auth.name);
@@ -1968,12 +1972,12 @@ bundle_AutoAdjust(struct bundle *bundle, int percent, int what)
log_Printf(LogPHASE, "%d%% saturation -> Opening link ``%s''\n",
percent, choice->name);
datalink_Up(choice, 1, 1);
- mp_StopAutoloadTimer(&bundle->ncp.mp);
+ mp_CheckAutoloadTimer(&bundle->ncp.mp);
} else if (otherlinkup) { /* Only bring the second-last link down */
log_Printf(LogPHASE, "%d%% saturation -> Closing link ``%s''\n",
percent, choice->name);
datalink_Close(choice, CLOSE_STAYDOWN);
- mp_StopAutoloadTimer(&bundle->ncp.mp);
+ mp_CheckAutoloadTimer(&bundle->ncp.mp);
}
}
}
diff --git a/usr.sbin/ppp/ppp/bundle.h b/usr.sbin/ppp/ppp/bundle.h
index 9ce9b311e49..d426269dbeb 100644
--- a/usr.sbin/ppp/ppp/bundle.h
+++ b/usr.sbin/ppp/ppp/bundle.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $OpenBSD: bundle.h,v 1.14 2000/04/07 23:46:39 brian Exp $
+ * $OpenBSD: bundle.h,v 1.15 2000/06/13 09:57:50 brian Exp $
*/
#define PHASE_DEAD 0 /* Link is dead */
@@ -101,6 +101,7 @@ struct bundle {
unsigned opt; /* Uses OPT_ bits from above */
char label[50]; /* last thing `load'ed */
u_short mtu; /* Interface mtu */
+ u_short ifqueue; /* Interface queue size */
struct {
int timeout; /* How long to leave the output queue choked */
diff --git a/usr.sbin/ppp/ppp/command.c b/usr.sbin/ppp/ppp/command.c
index fa862fa0eff..3e27a1243ef 100644
--- a/usr.sbin/ppp/ppp/command.c
+++ b/usr.sbin/ppp/ppp/command.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $OpenBSD: command.c,v 1.41 2000/04/02 01:36:25 brian Exp $
+ * $OpenBSD: command.c,v 1.42 2000/06/13 09:57:50 brian Exp $
*
*/
#include <sys/param.h>
@@ -131,6 +131,7 @@
#define VAR_CRTSCTS 32
#define VAR_URGENTPORTS 33
#define VAR_LOGOUT 34
+#define VAR_IFQUEUE 35
/* ``accept|deny|disable|enable'' masks */
#define NEG_HISMASK (1)
@@ -1646,6 +1647,11 @@ SetVariable(struct cmdargs const *arg)
cx->cfg.script.hangup[sizeof cx->cfg.script.hangup - 1] = '\0';
break;
+ case VAR_IFQUEUE:
+ long_val = atol(argp);
+ arg->bundle->cfg.ifqueue = long_val < 0 ? 0 : long_val;
+ break;
+
case VAR_LOGOUT:
strncpy(cx->cfg.script.logout, argp, sizeof cx->cfg.script.logout - 1);
cx->cfg.script.logout[sizeof cx->cfg.script.logout - 1] = '\0';
@@ -1855,9 +1861,11 @@ SetVariable(struct cmdargs const *arg)
case VAR_URGENTPORTS:
if (arg->argn == arg->argc) {
+ ipcp_SetUrgentTOS(&arg->bundle->ncp.ipcp);
ipcp_ClearUrgentTcpPorts(&arg->bundle->ncp.ipcp);
ipcp_ClearUrgentUdpPorts(&arg->bundle->ncp.ipcp);
} else if (!strcasecmp(arg->argv[arg->argn], "udp")) {
+ ipcp_SetUrgentTOS(&arg->bundle->ncp.ipcp);
if (arg->argn == arg->argc - 1)
ipcp_ClearUrgentUdpPorts(&arg->bundle->ncp.ipcp);
else for (f = arg->argn + 1; f < arg->argc; f++)
@@ -1871,7 +1879,13 @@ SetVariable(struct cmdargs const *arg)
ipcp_ClearUrgentUdpPorts(&arg->bundle->ncp.ipcp);
ipcp_AddUrgentUdpPort(&arg->bundle->ncp.ipcp, atoi(arg->argv[f]));
}
+ } else if (arg->argn == arg->argc - 1 &&
+ !strcasecmp(arg->argv[arg->argn], "none")) {
+ ipcp_ClearUrgentTcpPorts(&arg->bundle->ncp.ipcp);
+ ipcp_ClearUrgentUdpPorts(&arg->bundle->ncp.ipcp);
+ ipcp_ClearUrgentTOS(&arg->bundle->ncp.ipcp);
} else {
+ ipcp_SetUrgentTOS(&arg->bundle->ncp.ipcp);
first = arg->argn;
if (!strcasecmp(arg->argv[first], "tcp") && ++first == arg->argc)
ipcp_ClearUrgentTcpPorts(&arg->bundle->ncp.ipcp);
@@ -1946,6 +1960,8 @@ static struct cmdtab const SetCommands[] = {
"hangup script", "set hangup chat-script", (const void *) VAR_HANGUP},
{"ifaddr", NULL, SetInterfaceAddr, LOCAL_AUTH, "destination address",
"set ifaddr [src-addr [dst-addr [netmask [trg-addr]]]]"},
+ {"ifqueue", NULL, SetVariable, LOCAL_AUTH, "interface queue",
+ "set ifqueue packets", (const void *)VAR_IFQUEUE},
{"ipcpretry", "ipcpretries", SetVariable, LOCAL_AUTH, "IPCP retries",
"set ipcpretry value [attempts]", (const void *)VAR_IPCPRETRY},
{"lcpretry", "lcpretries", SetVariable, LOCAL_AUTH | LOCAL_CX, "LCP retries",
diff --git a/usr.sbin/ppp/ppp/datalink.c b/usr.sbin/ppp/ppp/datalink.c
index a3c00c41f92..f97d71848da 100644
--- a/usr.sbin/ppp/ppp/datalink.c
+++ b/usr.sbin/ppp/ppp/datalink.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $OpenBSD: datalink.c,v 1.30 2000/04/07 23:46:39 brian Exp $
+ * $OpenBSD: datalink.c,v 1.31 2000/06/13 09:57:51 brian Exp $
*/
#include <sys/param.h>
@@ -969,8 +969,10 @@ datalink_Up(struct datalink *dl, int runscripts, int packetmode)
case DATALINK_READY:
if (!dl->script.packetmode && packetmode) {
dl->script.packetmode = 1;
- if (dl->state == DATALINK_READY)
- datalink_LoginDone(dl);
+ if (dl->state == DATALINK_READY) {
+ dl->script.run = 0;
+ datalink_NewState(dl, DATALINK_CARRIER);
+ }
}
break;
}
diff --git a/usr.sbin/ppp/ppp/defs.h b/usr.sbin/ppp/ppp/defs.h
index 0c1cd70c241..a351ef3004c 100644
--- a/usr.sbin/ppp/ppp/defs.h
+++ b/usr.sbin/ppp/ppp/defs.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $OpenBSD: defs.h,v 1.14 2000/04/07 23:46:39 brian Exp $
+ * $OpenBSD: defs.h,v 1.15 2000/06/13 09:57:51 brian Exp $
*
* TODO:
*/
@@ -59,6 +59,7 @@
#define DEF_FSMRETRY 3 /* FSM retry frequency */
#define DEF_FSMTRIES 5 /* Default max retries */
#define DEF_FSMAUTHTRIES 3 /* Default max auth retries */
+#define DEF_IFQUEUE 30 /* Default interface queue size */
#define CONFFILE "ppp.conf"
#define LINKUPFILE "ppp.linkup"
diff --git a/usr.sbin/ppp/ppp/exec.c b/usr.sbin/ppp/ppp/exec.c
index 233cea903b3..ef739038a92 100644
--- a/usr.sbin/ppp/ppp/exec.c
+++ b/usr.sbin/ppp/ppp/exec.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $OpenBSD: exec.c,v 1.12 2000/04/02 01:36:26 brian Exp $
+ * $OpenBSD: exec.c,v 1.13 2000/06/13 09:57:51 brian Exp $
*/
#include <sys/param.h>
@@ -100,16 +100,17 @@ struct device *
exec_Create(struct physical *p)
{
if (p->fd < 0 && *p->name.full == '!') {
- int fids[2];
+ int fids[2], type;
p->fd--; /* We own the device but maybe can't use it - change fd */
+ type = physical_IsSync(p) ? SOCK_DGRAM : SOCK_STREAM;
- if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, fids) < 0)
+ if (socketpair(AF_UNIX, type, PF_UNSPEC, fids) < 0)
log_Printf(LogPHASE, "Unable to create pipe for line exec: %s\n",
- strerror(errno));
+ strerror(errno));
else {
- static int child_status;
- int stat, argc, i, ret, wret;
+ static int child_status; /* This variable is abused ! */
+ int stat, argc, i, ret, wret, pidpipe[2];
pid_t pid, realpid;
char *argv[MAXARGS];
@@ -119,31 +120,41 @@ exec_Create(struct physical *p)
fcntl(fids[0], F_SETFL, stat);
}
realpid = getpid();
- switch ((pid = fork())) {
+ if (pipe(pidpipe) == -1) {
+ log_Printf(LogPHASE, "Unable to pipe for line exec: %s\n",
+ strerror(errno));
+ close(fids[1]);
+ } else switch ((pid = fork())) {
case -1:
- log_Printf(LogPHASE, "Unable to create pipe for line exec: %s\n",
- strerror(errno));
+ log_Printf(LogPHASE, "Unable to fork for line exec: %s\n",
+ strerror(errno));
+ close(pidpipe[0]);
+ close(pidpipe[1]);
close(fids[1]);
break;
case 0:
+ close(pidpipe[0]);
close(fids[0]);
timer_TermService();
setuid(ID0realuid());
child_status = 0;
- switch (vfork()) {
+ switch ((pid = vfork())) {
case 0:
+ close(pidpipe[1]);
break;
case -1:
ret = errno;
- log_Printf(LogPHASE, "Unable to fork to drop parent: %s\n",
- strerror(errno));
+ log_Printf(LogPHASE, "Unable to vfork to drop parent: %s\n",
+ strerror(errno));
+ close(pidpipe[1]);
_exit(ret);
- break;
default:
+ write(pidpipe[1], &pid, sizeof pid);
+ close(pidpipe[1]);
_exit(child_status); /* The error from exec() ! */
}
@@ -171,18 +182,25 @@ exec_Create(struct physical *p)
break;
default:
+ close(pidpipe[1]);
close(fids[1]);
+ if (read(pidpipe[0], &p->session_owner, sizeof p->session_owner) !=
+ sizeof p->session_owner)
+ p->session_owner = (pid_t)-1;
+ close(pidpipe[0]);
while ((wret = waitpid(pid, &stat, 0)) == -1 && errno == EINTR)
;
if (wret == -1) {
log_Printf(LogWARN, "Waiting for child process: %s\n",
strerror(errno));
close(fids[0]);
+ p->session_owner = (pid_t)-1;
break;
} else if (WIFSIGNALED(stat)) {
log_Printf(LogWARN, "Child process received sig %d !\n",
WTERMSIG(stat));
close(fids[0]);
+ p->session_owner = (pid_t)-1;
break;
} else if (WIFSTOPPED(stat)) {
log_Printf(LogWARN, "Child process received stop sig %d !\n",
@@ -192,11 +210,12 @@ exec_Create(struct physical *p)
log_Printf(LogWARN, "Cannot exec \"%s\": %s\n", p->name.base,
strerror(ret));
close(fids[0]);
+ p->session_owner = (pid_t)-1;
break;
}
p->fd = fids[0];
log_Printf(LogDEBUG, "Using descriptor %d for child\n", p->fd);
- physical_SetupStack(p, execdevice.name, PHYSICAL_FORCE_ASYNC);
+ physical_SetupStack(p, execdevice.name, PHYSICAL_NOFORCE);
if (p->cfg.cd.necessity != CD_DEFAULT)
log_Printf(LogWARN, "Carrier settings ignored\n");
return &execdevice;
diff --git a/usr.sbin/ppp/ppp/fsm.c b/usr.sbin/ppp/ppp/fsm.c
index b9dd2dd88cb..7949f2f6d36 100644
--- a/usr.sbin/ppp/ppp/fsm.c
+++ b/usr.sbin/ppp/ppp/fsm.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $OpenBSD: fsm.c,v 1.13 2000/02/27 01:38:26 brian Exp $
+ * $OpenBSD: fsm.c,v 1.14 2000/06/13 09:57:51 brian Exp $
*
* TODO:
*/
@@ -976,9 +976,14 @@ fsm_Input(struct fsm *fp, struct mbuf *bp)
}
bp = mbuf_Read(bp, &lh, sizeof lh);
- if (ntohs(lh.length) != len)
- log_Printf(LogWARN, "%s: Oops: Got %d bytes but %d byte payload\n",
- fp->link->name, len, (int)ntohs(lh.length));
+ if (ntohs(lh.length) != len) {
+ if (ntohs(lh.length) > len) {
+ log_Printf(LogWARN, "%s: Oops: Got %d bytes but %d byte payload "
+ "- dropped\n", fp->link->name, len, (int)ntohs(lh.length));
+ m_freem(bp);
+ return;
+ }
+ }
if (lh.code < fp->min_code || lh.code > fp->max_code ||
lh.code > sizeof FsmCodes / sizeof *FsmCodes) {
diff --git a/usr.sbin/ppp/ppp/ip.c b/usr.sbin/ppp/ppp/ip.c
index 5a50a51d5c7..2974122d09c 100644
--- a/usr.sbin/ppp/ppp/ip.c
+++ b/usr.sbin/ppp/ppp/ip.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $OpenBSD: ip.c,v 1.22 2000/03/29 09:32:37 brian Exp $
+ * $OpenBSD: ip.c,v 1.23 2000/06/13 09:57:51 brian Exp $
*
* TODO:
* o Return ICMP message for filterd packet
@@ -475,7 +475,7 @@ PacketCheck(struct bundle *bundle, char *cp, int nb, struct filter *filter)
case IPPROTO_UDP:
uh = (struct udphdr *) ptop;
- if (pip->ip_tos == IPTOS_LOWDELAY)
+ if (pip->ip_tos == IPTOS_LOWDELAY && bundle->ncp.ipcp.cfg.urgent.tos)
pri++;
if ((ntohs(pip->ip_off) & IP_OFFMASK) == 0 &&
@@ -545,7 +545,7 @@ PacketCheck(struct bundle *bundle, char *cp, int nb, struct filter *filter)
case IPPROTO_TCP:
th = (struct tcphdr *) ptop;
- if (pip->ip_tos == IPTOS_LOWDELAY)
+ if (pip->ip_tos == IPTOS_LOWDELAY && bundle->ncp.ipcp.cfg.urgent.tos)
pri++;
if ((ntohs(pip->ip_off) & IP_OFFMASK) == 0 &&
diff --git a/usr.sbin/ppp/ppp/ipcp.c b/usr.sbin/ppp/ppp/ipcp.c
index a25717230d9..85cc8228d0e 100644
--- a/usr.sbin/ppp/ppp/ipcp.c
+++ b/usr.sbin/ppp/ppp/ipcp.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $OpenBSD: ipcp.c,v 1.23 2000/03/19 10:33:33 brian Exp $
+ * $OpenBSD: ipcp.c,v 1.24 2000/06/13 09:57:51 brian Exp $
*
* TODO:
* o Support IPADDRS properly
@@ -367,10 +367,11 @@ ipcp_WriteDNS(struct ipcp *ipcp)
ipcp->ns.dns[1].s_addr = INADDR_ANY;
}
- mask = umask(0644);
+ mask = umask(022);
if ((fp = ID0fopen(_PATH_RESCONF, "w")) != NULL) {
umask(mask);
- fputs(ipcp->ns.resolv_nons, fp);
+ if (ipcp->ns.resolv_nons)
+ fputs(ipcp->ns.resolv_nons, fp);
paddr = inet_ntoa(ipcp->ns.dns[0]);
log_Printf(LogIPCP, "Primary nameserver set to %s\n", paddr);
fprintf(fp, "\nnameserver %s\n", paddr);
@@ -502,8 +503,9 @@ ipcp_Show(struct cmdargs const *arg)
prompt_Printf(arg->prompt, ", ");
prompt_Printf(arg->prompt, "%u", ipcp->cfg.urgent.udp.port[p]);
}
+ prompt_Printf(arg->prompt, "\n TOS: %s\n\n",
+ ipcp->cfg.urgent.tos ? "yes" : "no");
- prompt_Printf(arg->prompt, "\n\n");
throughput_disp(&ipcp->throughput, arg->prompt);
return 0;
@@ -570,6 +572,7 @@ ipcp_Init(struct ipcp *ipcp, struct bundle *bundle, struct link *l,
ipcp->cfg.urgent.tcp.port = (u_short *)malloc(NDEFTCPPORTS * sizeof(u_short));
memcpy(ipcp->cfg.urgent.tcp.port, default_urgent_tcp_ports,
NDEFTCPPORTS * sizeof(u_short));
+ ipcp->cfg.urgent.tos = 1;
ipcp->cfg.urgent.udp.nports = ipcp->cfg.urgent.udp.maxports = NDEFUDPPORTS;
ipcp->cfg.urgent.udp.port = (u_short *)malloc(NDEFUDPPORTS * sizeof(u_short));
diff --git a/usr.sbin/ppp/ppp/ipcp.h b/usr.sbin/ppp/ppp/ipcp.h
index 17a3f04ab04..299fb7bfdf8 100644
--- a/usr.sbin/ppp/ppp/ipcp.h
+++ b/usr.sbin/ppp/ppp/ipcp.h
@@ -15,7 +15,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $OpenBSD: ipcp.h,v 1.9 2000/03/19 10:33:33 brian Exp $
+ * $OpenBSD: ipcp.h,v 1.10 2000/06/13 09:57:51 brian Exp $
*
* TODO:
*/
@@ -77,6 +77,7 @@ struct ipcp {
struct {
struct port_range tcp, udp; /* The range of urgent ports */
+ unsigned tos : 1; /* Urgent IPTOS_LOWDELAY packets ? */
} urgent;
struct fsm_retry fsm; /* How often/frequently to resend requests */
@@ -163,3 +164,5 @@ extern void ipcp_LoadDNS(struct ipcp *);
ipcp_ClearUrgentPorts(&(ipcp)->cfg.urgent.tcp)
#define ipcp_ClearUrgentUdpPorts(ipcp) \
ipcp_ClearUrgentPorts(&(ipcp)->cfg.urgent.udp)
+#define ipcp_ClearUrgentTOS(ipcp) (ipcp)->cfg.urgent.tos = 0;
+#define ipcp_SetUrgentTOS(ipcp) (ipcp)->cfg.urgent.tos = 1;
diff --git a/usr.sbin/ppp/ppp/mp.c b/usr.sbin/ppp/ppp/mp.c
index f137ada4915..292fe7f68b2 100644
--- a/usr.sbin/ppp/ppp/mp.c
+++ b/usr.sbin/ppp/ppp/mp.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $OpenBSD: mp.c,v 1.15 2000/02/27 01:38:27 brian Exp $
+ * $OpenBSD: mp.c,v 1.16 2000/06/13 09:57:51 brian Exp $
*/
#include <sys/param.h>
@@ -292,6 +292,12 @@ mp_Up(struct mp *mp, struct datalink *dl)
/* We're adding a link - do a last validation on our parameters */
if (!peerid_Equal(&dl->peer, &mp->peer)) {
log_Printf(LogPHASE, "%s: Inappropriate peer !\n", dl->name);
+ log_Printf(LogPHASE, " Attached to peer %s/%s\n", mp->peer.authname,
+ mp_Enddisc(mp->peer.enddisc.class, mp->peer.enddisc.address,
+ mp->peer.enddisc.len));
+ log_Printf(LogPHASE, " New link is peer %s/%s\n", dl->peer.authname,
+ mp_Enddisc(dl->peer.enddisc.class, dl->peer.enddisc.address,
+ dl->peer.enddisc.len));
return MP_FAILED;
}
if (mp->local_mrru != lcp->want_mrru ||
diff --git a/usr.sbin/ppp/ppp/nat_cmd.c b/usr.sbin/ppp/ppp/nat_cmd.c
index 204e5a0b78b..1671bec7561 100644
--- a/usr.sbin/ppp/ppp/nat_cmd.c
+++ b/usr.sbin/ppp/ppp/nat_cmd.c
@@ -2,7 +2,7 @@
* The code in this file was written by Eivind Eklund <perhaps@yes.no>,
* who places it in the public domain without restriction.
*
- * $OpenBSD: nat_cmd.c,v 1.10 2000/04/02 01:36:20 brian Exp $
+ * $OpenBSD: nat_cmd.c,v 1.11 2000/06/13 09:57:51 brian Exp $
*/
#include <sys/param.h>
@@ -345,7 +345,7 @@ nat_SetTarget(struct cmdargs const *arg)
struct in_addr addr;
if (arg->argc == arg->argn) {
- addr.s_addr = INADDR_NONE;
+ addr.s_addr = INADDR_ANY;
PacketAliasSetTarget(addr);
return 0;
}
@@ -353,6 +353,12 @@ nat_SetTarget(struct cmdargs const *arg)
if (arg->argc != arg->argn + 1)
return -1;
+ if (!strcasecmp(arg->argv[arg->argn], "MYADDR")) {
+ addr.s_addr = INADDR_ANY;
+ PacketAliasSetTarget(addr);
+ return 0;
+ }
+
addr = GetIpAddr(arg->argv[arg->argn]);
if (addr.s_addr == INADDR_NONE) {
log_Printf(LogWARN, "%s: invalid address\n", arg->argv[arg->argn]);
@@ -385,7 +391,6 @@ nat_LayerPull(struct bundle *bundle, struct link *l, struct mbuf *bp,
u_short *proto)
{
static int gfrags;
- struct ip *pip, *piip;
int ret, len, nfrags;
struct mbuf **last;
char *fptr;
@@ -395,20 +400,11 @@ nat_LayerPull(struct bundle *bundle, struct link *l, struct mbuf *bp,
log_Printf(LogDEBUG, "nat_LayerPull: PROTO_IP -> PROTO_IP\n");
m_settype(bp, MB_NATIN);
- bp = m_pullup(bp);
- pip = (struct ip *)MBUF_CTOP(bp);
- piip = (struct ip *)((char *)pip + (pip->ip_hl << 2));
-
- if (pip->ip_p == IPPROTO_IGMP ||
- (pip->ip_p == IPPROTO_IPIP && IN_CLASSD(ntohl(piip->ip_dst.s_addr))))
- return bp;
-
/* Ensure there's a bit of extra buffer for the NAT code... */
bp = m_pullup(m_append(bp, NULL, NAT_EXTRABUF));
ret = PacketAliasIn(MBUF_CTOP(bp), bp->m_len);
- pip = (struct ip *)MBUF_CTOP(bp);
- bp->m_len = ntohs(pip->ip_len);
+ bp->m_len = ntohs(((struct ip *)MBUF_CTOP(bp))->ip_len);
if (bp->m_len > MAX_MRU) {
log_Printf(LogWARN, "nat_LayerPull: Problem with IP header length (%lu)\n",
(unsigned long)bp->m_len);
@@ -451,10 +447,8 @@ nat_LayerPull(struct bundle *bundle, struct link *l, struct mbuf *bp,
case PKT_ALIAS_IGNORED:
if (log_IsKept(LogTCPIP)) {
log_Printf(LogTCPIP, "NAT engine ignored data:\n");
- PacketCheck(bundle, (char *)pip, ntohs(pip->ip_len), NULL);
+ PacketCheck(bundle, MBUF_CTOP(bp), bp->m_len, NULL);
}
- m_freem(bp);
- bp = NULL;
break;
default:
diff --git a/usr.sbin/ppp/ppp/physical.c b/usr.sbin/ppp/ppp/physical.c
index 5a64533d0e3..219b133119c 100644
--- a/usr.sbin/ppp/ppp/physical.c
+++ b/usr.sbin/ppp/ppp/physical.c
@@ -16,7 +16,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $OpenBSD: physical.c,v 1.21 2000/03/03 21:52:57 brian Exp $
+ * $OpenBSD: physical.c,v 1.22 2000/06/13 09:57:51 brian Exp $
*
*/
@@ -340,6 +340,8 @@ physical_Close(struct physical *p)
throughput_log(&p->link.throughput, LogPHASE, p->link.name);
if (p->session_owner != (pid_t)-1) {
+ log_Printf(LogPHASE, "%s: HUPing %d\n", p->link.name,
+ (int)p->session_owner);
ID0kill(p->session_owner, SIGHUP);
p->session_owner = (pid_t)-1;
}
diff --git a/usr.sbin/ppp/ppp/ppp.8 b/usr.sbin/ppp/ppp/ppp.8
index e4d1e3b1c94..18def374806 100644
--- a/usr.sbin/ppp/ppp/ppp.8
+++ b/usr.sbin/ppp/ppp/ppp.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: ppp.8,v 1.83 2000/04/12 21:47:56 aaron Exp $
+.\" $OpenBSD: ppp.8,v 1.84 2000/06/13 09:57:51 brian Exp $
.Dd 20 September 1995
.nr XX \w'\fC00'
.Dt PPP 8
@@ -2823,6 +2823,8 @@ and the
address of the local network in which
.Dv HISADDR
appears.
+This allows other machines connecteed to the LAN to talk to
+the peer as if the peer itself was connected to the LAN.
The proxy entry cannot be made unless
.Dv HISADDR
is an address from a LAN.
@@ -3101,7 +3103,6 @@ This command gives a summary of available nat commands.
This option causes various NAT statistics and information to
be logged to the file
.Pa /var/log/alias.log .
-This file name is likely to change in the near future.
.It nat port Ar proto Ar targetIP Ns Xo
.No : Ns Ar targetPort Ns
.Oo
@@ -3184,10 +3185,17 @@ This is useful
if you want to support protocols such as RPC and LPD which require
connections to come from a well known port.
.It nat target Op Ar address
-Set the given target address or clear it if no address is given. The target
-address is used by libalias to specify how to NAT incoming packets by default.
-If a target address is not set, the alias address (that of the tun interface)
-is used.
+Set the given target address or clear it if no address is given.
+The target address is used by libalias to specify how to NAT incoming
+packets by default.
+If a target address is not set or if
+.Dq default
+is given, packets are not altered and are allowed to route to the internal
+network.
+.Pp
+The target address may be set to
+.Dq MYADDR ,
+in which case libalias will redirect all packets to the interface address.
.It nat use_sockets yes|no
When enabled, this option tells the network address translation engine to
create a socket so that it can guarantee a correct incoming ftp data or
@@ -4523,6 +4531,26 @@ In all cases, if the interface is already configured,
.Nm
will try to maintain the interface IP numbers so that any existing
bound sockets will remain valid.
+.It set ifqueue Ar packets
+Set the maximum number of packets that
+.Nm
+will read from the tunnel interface while data cannot be sent to any of
+the available links.
+This queue limit is necessary to flow control outgoing data as the tunnel
+interface is likely to be far faster than the combined links available to
+.Nm ppp .
+.Pp
+If
+.Ar packets
+is set to a value less than the number of links,
+.Nm
+will read up to that value regardless.
+This prevents any possible latency problems.
+.Pp
+The default value for
+.Ar packets
+is
+.Dq 30 .
.It set ccpretry|ccpretries Oo Ar timeout
.Op Ar reqtries Op Ar trmtries
.Oc
@@ -5004,7 +5032,7 @@ is specified,
will never idle out before the link has been up for at least that number
of seconds.
.It set urgent Xo
-.Op tcp|udp
+.Op tcp|udp|none
.Oo Op +|- Ns
.Ar port
.Oc No ...
@@ -5046,6 +5074,12 @@ the current list is adjusted, otherwise the list is reassigned.
prefixed with a plus or not prefixed at all are added to the list and
.Ar port Ns No s
prefixed with a minus are removed from the list.
+.Pp
+If
+.Dq none
+is specified, all priority port lists are disabled and even
+.Dv IPTOS_LOWDELAY
+packets are not prioritised.
.It set vj slotcomp on|off
This command tells
.Nm
diff --git a/usr.sbin/ppp/ppp/server.c b/usr.sbin/ppp/ppp/server.c
index 831596a8451..99075bcc65a 100644
--- a/usr.sbin/ppp/ppp/server.c
+++ b/usr.sbin/ppp/ppp/server.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $OpenBSD: server.c,v 1.6 2000/02/27 01:38:28 brian Exp $
+ * $OpenBSD: server.c,v 1.7 2000/06/13 09:57:51 brian Exp $
*/
#include <sys/types.h>
@@ -186,7 +186,7 @@ server_LocalOpen(struct bundle *bundle, const char *name, mode_t mask)
int s;
if (server.rm && !strcmp(server.rm, name)) {
- if (chmod(server.rm, mask))
+ if (chmod(server.rm, 0777 & ~mask))
log_Printf(LogERROR, "Local: chmod: %s\n", strerror(errno));
return 0;
}
diff --git a/usr.sbin/ppp/ppp/tcp.c b/usr.sbin/ppp/ppp/tcp.c
index 7d1836daf11..57ac5ea3034 100644
--- a/usr.sbin/ppp/ppp/tcp.c
+++ b/usr.sbin/ppp/ppp/tcp.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $OpenBSD: tcp.c,v 1.8 2000/02/27 01:38:29 brian Exp $
+ * $OpenBSD: tcp.c,v 1.9 2000/06/13 09:57:51 brian Exp $
*/
#include <sys/types.h>
@@ -69,7 +69,7 @@ tcp_OpenConnection(const char *name, char *host, char *port)
dest.sin_addr = GetIpAddr(host);
if (dest.sin_addr.s_addr == INADDR_NONE) {
log_Printf(LogWARN, "%s: %s: unknown host\n", name, host);
- return -1;
+ return -2;
}
dest.sin_port = htons(atoi(port));
if (dest.sin_port == 0) {
@@ -78,19 +78,19 @@ tcp_OpenConnection(const char *name, char *host, char *port)
dest.sin_port = sp->s_port;
else {
log_Printf(LogWARN, "%s: %s: unknown service\n", name, port);
- return -1;
+ return -2;
}
}
log_Printf(LogPHASE, "%s: Connecting to %s:%s/tcp\n", name, host, port);
sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock < 0)
- return sock;
+ return -2;
if (connect(sock, (struct sockaddr *)&dest, sizeof dest) < 0) {
log_Printf(LogWARN, "%s: connect: %s\n", name, strerror(errno));
close(sock);
- return -1;
+ return -2;
}
return sock;