Hello,
I have tried to make sense of our patches and distill a description for them, which you can find below. Since the patch file itself is about 45k, I will just post the URL where you can find it:
http://www.14v.de/l2tpd/
Regards / Mit freundlichen Gruessen Matthias Ferdinand -- one4vision GmbH Goethestrasse 3-5 D-66121 Saarbrücken Tel: +49 681 96727 60 [EMAIL PROTECTED] Fax: +49 681 96727 69 http://www.one4vision.de
--------------------------------------------------
Description of l2tpd-diffs-14v-20040706.txt
BUGFIXES:
* network.c:network_thread() re-alloc buf after handle_special() has toss()ed it
when receiving a packet on a valid tunnel but on a non-existent call, handle_special() would toss() our buf, but the loop would continue using it, sometimes completely messing up malloc's internal data structures and segfaulting in many interesting places
* call.c:new_call(struct tunnel *parent) initialize ourcid to 0 if parent->self is not set (value used in log messages and valgrind complained)
* control.c:control_finish() added missing malloc for challenge data (macro "MALLOC_CHALLENGE")
* l2tpd.c:destroy_tunnel() use new variable for walking through the list of calls c->next should not be used after c has been free()'d (valgrind complained)
* l2tpd.c:new_tunnel() initialize "self" to NULL (valgrind complained)
* l2tpd.c:daemonize() reading previous pid file: fixed typo; use return value from read() instead of from open()
* control.c:expand_payload() ??? is this correct now ??? new_header->Ns compared to c->data_rec_seq_num (before: comparison with c->data_seq_num)
* scheduler.c:alarm_handler() added decrement cnt before return()ing when re-entrance is detected. seems to happen only when running with valgrind
* misc.c:log() call openlog() only on first invocation if running as daemon, don't log to stdout; would be received and dismissed by pppd, increasing error counters avoid re-entering call to syslog() (not reentrant); strangely this only shows up when running with valgrind
* Makefile object files depend on header files, too
FEATURES/IMPROVEMENTS/WORKAROUNDS:
* call.c:read_packet() if read() returns EBADF (Bad File Descriptor), don't retry, return immediately (pppd has died)
* l2tpd.c:daemonize() start up when pid file exists but is empty (pid==0)
* l2tpd.c:start_pppd() delay parent execution for 300ms after fork() this is workaround for tty echo (?) until pppd is started some remote ppp clients will think they are looped when they see their own packets coming back and will fail even before our local pppd is finished loading
* l2tp.h/l2tpd.c/Makefile added Macro SPECIAL_VERSION to distinguish between different builds can be an argument to make from our build script: SNAPSHOT=20040504 export SPECIAL_VERSION="'\""-$SNAPSHOT"\"'" if ! make ; then ...
shell + C escaping is ugly, but can be done somehow...
* control.c:control_finish() use configured hostname from l2tpd.conf in AVP (add hostname parameter to add_hostname_avp() )
* l2tpd.h:struct tunnel added char *tunneltag to struct tunnel used in log messages to associate log events with tunnels control.c:get_tunneltag(struct tunnel *t) returns string representation of a tunnel, e.g. 80.131.23.17:1701/rt=5/lt=49803 host:port/rt=<remote tunnel id>/lt=<local tunnel id> control.c:control_finish(), ... case SCCRP: set tunneltag of current tunnel l2tpd.c:destroy_tunnel() free memory of t->tunneltag l2tpd.c:new_tunnel() initialize tunneltag to NULL
* set "ipparam" argument for pppd can be used e.g. in ip-up script
file.c:struct keywords words[] add keywords "ipparam" (string), "ipparam_tunneltag" (bool) file.c:set_ipparam() file.c:set_ipparam_tunneltag()
control.c:control_finish(), ... case ICCN: if "ipparam" is set in l2tpd.conf, this value is copied verbatim as "ipparam <value>" as argument to pppd. if "ipparam_tunneltag" is set in l2tpd.conf, the string "l2gw=<tunneltag>" is appended to above <value> for the ipparam argument Note: <value> is statically configured, <tunneltag> may vary with every connection
* configurable output file for l2tpd status reports (SIGUSR1)
file.c:struct keywords words[] add keyword "statusfile" (default: /var/run/l2tpd.status) char *l2tpdstatusfile; set_statusfile() l2tpd.c:status_handler() write report to statusfile instead of stdout l2tpd.c:show_status() add info about ptyname, peer, ids, ... l2tpd.c:start_pppd() save ptyname in c->ptyname call.c:new_call() initialize ptyname to NULL call.h:struct call add char ptyname[6]
* configurable "listenaddr" l2tpd only binds to this address instead of "0.0.0.0"
file.c:struct keywords words[] add keyword "listenaddr" set_listenaddr() unsigned int listen_addy moved here from network.c