- Write pid file if filename is set

- Add startup script and monitor script from Yuri
- Some logging correctness fixes from Iain Wade
- Combined LCP patches from Iain and Yuri. This should allow Windows 2k/XP
  clients to connect, as well Linksys DSL modems.
This commit is contained in:
fred_nerk 2004-08-02 03:38:01 +00:00
parent 1aa6a3a96d
commit 8c861521ae
7 changed files with 185 additions and 20 deletions

View file

@ -1,8 +1,14 @@
* ??? 2.0.2 * ??? 2.0.2
- Combined LCP patches from Iain and Yuri. This should allow Windows 2k/XP
clients to connect, as well Linksys DSL modems.
- Apply patch to fix -v option from Juergen Kammer. - Apply patch to fix -v option from Juergen Kammer.
- Makefile fix from Juergen Kammer to not overwrite existing config files on - Makefile fix from Juergen Kammer to not overwrite existing config files on
make install make install
- Configurable radius port patch from Juergen Kammer. - Configurable radius port patch from Juergen Kammer.
- Send my_address if no bind_address when doing IPCP
- Write pid file if filename is set
- Add startup script and monitor script from Yuri
- Some logging correctness fixes from Iain Wade
* Tue Jul 13 2004 Brendan O'Dea <bod@optusnet.com.au> 2.0.1 * Tue Jul 13 2004 Brendan O'Dea <bod@optusnet.com.au> 2.0.1
- Update INSTALL, Docs/manual.html documentation. - Update INSTALL, Docs/manual.html documentation.

View file

@ -173,6 +173,12 @@ is any one of the syslog logging facilities, such as local5.
<P> <P>
</LI> </LI>
<LI><B>pid_file</B> (string)<BR>
If this is set, the process id will be written to this file. The filename must
contain an absolute path.
<P>
</LI>
<LI><B>l2tp_secret</B> (string)<BR> <LI><B>l2tp_secret</B> (string)<BR>
This sets the string that l2tpns will use for authenticating tunnel request. This sets the string that l2tpns will use for authenticating tunnel request.
This must be the same as the LAC, or authentication will fail. This will This must be the same as the LAC, or authentication will fail. This will

View file

@ -4,7 +4,7 @@
// Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
// vim: sw=8 ts=8 // vim: sw=8 ts=8
char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.18 2004/07/28 06:12:30 fred_nerk Exp $"; char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.19 2004/08/02 03:38:01 fred_nerk Exp $";
#include <arpa/inet.h> #include <arpa/inet.h>
#include <assert.h> #include <assert.h>
@ -94,6 +94,7 @@ int bgp_configured = 0;
struct config_descriptt config_values[] = { struct config_descriptt config_values[] = {
CONFIG("debug", debug, INT), CONFIG("debug", debug, INT),
CONFIG("log_file", log_filename, STRING), CONFIG("log_file", log_filename, STRING),
CONFIG("pid_file", pid_file, STRING),
CONFIG("l2tp_secret", l2tpsecret, STRING), CONFIG("l2tp_secret", l2tpsecret, STRING),
CONFIG("primary_dns", default_dns1, IP), CONFIG("primary_dns", default_dns1, IP),
CONFIG("secondary_dns", default_dns2, IP), CONFIG("secondary_dns", default_dns2, IP),
@ -2995,6 +2996,10 @@ int main(int argc, char *argv[])
/* remove plugins (so cleanup code gets run) */ /* remove plugins (so cleanup code gets run) */
plugins_done(); plugins_done();
// Remove the PID file if we wrote it
if (config->wrote_pid && *config->pid_file == '/')
unlink(config->pid_file);
/* kill CLI children */ /* kill CLI children */
signal(SIGTERM, SIG_IGN); signal(SIGTERM, SIG_IGN);
kill(0, SIGTERM); kill(0, SIGTERM);
@ -3401,6 +3406,22 @@ void update_config()
timeout = config->cluster_hb_timeout; timeout = config->cluster_hb_timeout;
} }
// Write PID file
if (*config->pid_file == '/' && !config->wrote_pid)
{
FILE *f;
if ((f = fopen(config->pid_file, "w")))
{
fprintf(f, "%d\n", getpid());
fclose(f);
config->wrote_pid = 1;
}
else
{
log(0, 0, 0, 0, "Can't write to PID file %s: %s\n", config->pid_file, strerror(errno));
}
}
config->reload_config = 0; config->reload_config = 0;
} }

View file

@ -1,5 +1,5 @@
// L2TPNS Global Stuff // L2TPNS Global Stuff
// $Id: l2tpns.h,v 1.13 2004/07/26 00:20:41 fred_nerk Exp $ // $Id: l2tpns.h,v 1.14 2004/08/02 03:38:01 fred_nerk Exp $
#ifndef __L2TPNS_H__ #ifndef __L2TPNS_H__
#define __L2TPNS_H__ #define __L2TPNS_H__
@ -195,6 +195,7 @@ typedef struct {
#define SESSIONPFC 1 // PFC negotiated flags #define SESSIONPFC 1 // PFC negotiated flags
#define SESSIONACFC 2 // ACFC negotiated flags #define SESSIONACFC 2 // ACFC negotiated flags
#define SESSIONLCPACK 4 // LCP negotiated
// 168 bytes per tunnel // 168 bytes per tunnel
typedef struct tunnels typedef struct tunnels
@ -379,6 +380,8 @@ struct configt
int debug; // debugging level int debug; // debugging level
time_t start_time; // time when l2tpns was started time_t start_time; // time when l2tpns was started
char bandwidth[256]; // current bandwidth char bandwidth[256]; // current bandwidth
char pid_file[256]; // file to write PID to on startup
int wrote_pid;
clockt current_time; // 1/10ths of a second since the process started. clockt current_time; // 1/10ths of a second since the process started.
// means that we can only run a given process // means that we can only run a given process
// for 13 years without re-starting! // for 13 years without re-starting!

42
ppp.c
View file

@ -1,6 +1,6 @@
// L2TPNS PPP Stuff // L2TPNS PPP Stuff
char const *cvs_id_ppp = "$Id: ppp.c,v 1.8 2004/07/11 07:57:35 bodea Exp $"; char const *cvs_id_ppp = "$Id: ppp.c,v 1.9 2004/08/02 03:38:01 fred_nerk Exp $";
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -230,9 +230,9 @@ void dumplcp(u8 *p, int l)
{ {
int type = o[0]; int type = o[0];
int length = o[1]; int length = o[1];
if (length == 0) if (length < 2)
{ {
log(4, 0, 0, 0, " Option length is 0...\n"); log(4, 0, 0, 0, " Option length is %d...\n", length);
break; break;
} }
if (type == 0) if (type == 0)
@ -245,13 +245,22 @@ void dumplcp(u8 *p, int l)
switch (type) switch (type)
{ {
case 1: // Maximum-Receive-Unit case 1: // Maximum-Receive-Unit
if (length == 4)
log(4, 0, 0, 0, " %s %d\n", lcp_types[type], ntohs(*(u16 *)(o + 2))); log(4, 0, 0, 0, " %s %d\n", lcp_types[type], ntohs(*(u16 *)(o + 2)));
else
log(4, 0, 0, 0, " %s odd length %d\n", lcp_types[type], length);
break; break;
case 3: // Authentication-Protocol case 3: // Authentication-Protocol
{
if (length == 4)
{ {
int proto = ntohs(*(u16 *)(o + 2)); int proto = ntohs(*(u16 *)(o + 2));
log(4, 0, 0, 0, " %s %s\n", lcp_types[type], log(4, 0, 0, 0, " %s 0x%x (%s)\n", lcp_types[type], proto,
proto == 0xC223 ? "CHAP" : "PAP"); proto == 0xC223 ? "CHAP" :
proto == 0xC023 ? "PAP" : "UNKNOWN");
}
else
log(4, 0, 0, 0, " %s odd length %d\n", lcp_types[type], length);
break; break;
} }
case 4: // Quality-Protocol case 4: // Quality-Protocol
@ -261,21 +270,24 @@ void dumplcp(u8 *p, int l)
break; break;
} }
case 5: // Magic-Number case 5: // Magic-Number
{
if (length == 6)
{ {
u32 magicno = ntohl(*(u32 *)(o + 2)); u32 magicno = ntohl(*(u32 *)(o + 2));
log(4, 0, 0, 0, " %s %x\n", lcp_types[type], magicno); log(4, 0, 0, 0, " %s %x\n", lcp_types[type], magicno);
}
else
log(4, 0, 0, 0, " %s odd length %d\n", lcp_types[type], length);
break; break;
} }
case 7: // Protocol-Field-Compression case 7: // Protocol-Field-Compression
{ {
u32 pfc = ntohl(*(u32 *)(o + 2)); log(4, 0, 0, 0, " %s\n", lcp_types[type]);
log(4, 0, 0, 0, " %s %x\n", lcp_types[type], pfc);
break; break;
} }
case 8: // Address-And-Control-Field-Compression case 8: // Address-And-Control-Field-Compression
{ {
u32 afc = ntohl(*(u32 *)(o + 2)); log(4, 0, 0, 0, " %s\n", lcp_types[type]);
log(4, 0, 0, 0, " %s %x\n", lcp_types[type], afc);
break; break;
} }
default: default:
@ -306,6 +318,7 @@ void processlcp(tunnelidt t, sessionidt s, u8 * p, u16 l)
if (*p == ConfigAck) if (*p == ConfigAck)
{ {
log(3, session[s].ip, s, t, "LCP: Discarding ConfigAck\n"); log(3, session[s].ip, s, t, "LCP: Discarding ConfigAck\n");
session[s].flags |= SESSIONLCPACK;
} }
else if (*p == ConfigReq) else if (*p == ConfigReq)
{ {
@ -392,15 +405,10 @@ void processlcp(tunnelidt t, sessionidt s, u8 * p, u16 l)
// Already built a ConfigNak... send it // Already built a ConfigNak... send it
log(3, session[s].ip, s, t, "Sending ConfigNak\n"); log(3, session[s].ip, s, t, "Sending ConfigNak\n");
tunnelsend(b, l + (q - b), t); tunnelsend(b, l + (q - b), t);
log(3, session[s].ip, s, t, "Sending ConfigReq, requesting PAP login\n");
q = makeppp(b, sizeof(b), NULL, 0, t, s, PPPLCP);
*q++ = ConfigReq;
*(u8 *)(q++) = 3;
*(u8 *)(q++) = 4;
*(u16 *)(q += 2) = htons(0xC023);
tunnelsend(b, l + (q - b), t);
} }
if (!(session[s].flags & SESSIONLCPACK))
initlcp(t, s);
} }
else if (*p == ConfigNak) else if (*p == ConfigNak)
{ {

28
scripts/l2tpns-monitor Normal file
View file

@ -0,0 +1,28 @@
#!/bin/sh
stopfile=/tmp/l2tpns.stop
first=`date +%s`
min_first_time=3
restart_delay=5
prog=${0##*/}
while :
do
echo "`date`: Starting l2tpns $@"
start=`date +%s`
/usr/sbin/l2tpns ${1+"$@"}
RETVAL=$?
stop=`date +%s`
t=$(($stop - $start));
first=$(($stop - $first));
echo "`date`: l2tpns exited after $t seconds, status $RETVAL"
if [ $first -lt $min_first_time ]; then
echo "`date`: l2tpns exited immediately, $prog exiting"
exit $RETVAL
fi
if [ -f $stopfile ]; then
ls -l $stopfile
echo "`date`: stop file found, $prog exiting"
exit
fi
sleep $restart_delay
done >>/var/log/$prog 2>&1 & # execute in background

93
scripts/l2tpns.script Normal file
View file

@ -0,0 +1,93 @@
#!/bin/bash
#
# Startup script for l2tpns
#
# chkconfig: 2345 83 25
# description: l2tpns.
# processname: l2tpns
# pidfile: /var/run/l2tpns.pid
# config: /etc/l2tpns
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/lt2pns ]; then
. /etc/sysconfig/lt2pns
fi
# Path to the l2tpns-monitor script, server binary, and short-form for messages.
l2tpns_monitor=/usr/sbin/l2tpns-monitor
l2tpns=/usr/sbin/l2tpns
prog=${l2tpns##*/}
RETVAL=0
start() {
echo -n $"Starting $prog: "
rm -f /tmp/l2tpns.stop
daemon --check=$prog $l2tpns_monitor $OPTIONS
RETVAL=$?
echo
sleep 5
pid=`pidofproc $l2tpns_monitor`
if [ -z "$pid" ] || [ "$pid" -eq 0 ]; then
echo -n "Error starting $prog"
echo_failure
echo
return 99
fi
[ $RETVAL = 0 ] && touch /var/lock/subsys/l2tpns
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
echo >/tmp/l2tpns.stop
killproc $l2tpns
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/l2tpns /var/run/l2tpns.pid
}
reload() {
echo -n $"Reloading $prog: "
killproc $l2tpns -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $l2tpns
RETVAL=$?
;;
restart)
stop
sleep 5
start
;;
condrestart)
if [ -f /var/run/l2tpns.pid ] ; then
stop
start
fi
;;
reload)
reload
;;
coldrestart)
stop
sleep 10
rm -f /tmp/l2tpns.dump
start
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|coldrestart}"
exit 1
esac
exit $RETVAL