A little bit after the fact... I missed the original posting, but here are some 
comments.

On 5/2/12 1:28 PM, openwrt-comm...@openwrt.org wrote:
> Author: juhosg
> Date: 2012-05-02 21:28:10 +0200 (Wed, 02 May 2012)
> New Revision: 31561
> 
> Added:
>    packages/net/xl2tpd/files/l2tp.sh
>    packages/net/xl2tpd/patches/120-kernel-mode-l2tp.patch
>    packages/net/xl2tpd/patches/130-no-kill-ipparam.patch
> Modified:
>    packages/net/xl2tpd/Makefile
>    packages/net/xl2tpd/files/xl2tpd.conf
> Log:
> Update and fix x2ltpd, add connect script
> 
> Remove unwanted services from default configuration
> Ship xl2tpd-config
> Use kernel mode L2TP
> Don't scribble on ipparam
> 
> Signed-off-by: David Woodhouse <david.woodho...@intel.com>
> 
> Modified: packages/net/xl2tpd/Makefile
> ===================================================================
> --- packages/net/xl2tpd/Makefile      2012-05-02 19:28:09 UTC (rev 31560)
> +++ packages/net/xl2tpd/Makefile      2012-05-02 19:28:10 UTC (rev 31561)
> @@ -8,12 +8,14 @@
>  include $(TOPDIR)/rules.mk
>  
>  PKG_NAME:=xl2tpd
> -PKG_VERSION:=1.3.0
> +PKG_VERSION:=1.3.1
>  PKG_RELEASE:=1
>  
>  PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
> -PKG_SOURCE_URL:=ftp://ftp.xelerance.com/xl2tpd/
> -PKG_MD5SUM:=28264284552c442b24cf421755a2bb48
> +# Host seems to be down.
> +#PKG_SOURCE_URL:=ftp://ftp.xelerance.com/xl2tpd/
> +PKG_MD5SUM:=cf61576fef5c2d6c68279a408ec1f0d5
> +PKG_SOURCE_URL:=http://pkgs.fedoraproject.org/lookaside/pkgs/xl2tpd/xl2tpd-$(PKG_VERSION).tar.gz/$(PKG_MD5SUM)/
>  
>  PKG_INSTALL:=1
>  
> @@ -25,6 +27,7 @@
>    TITLE:=An L2TP (Layer 2 Tunneling Protocol) daemon
>    URL:=http://www.xelerance.com/software/xl2tpd/
>    SUBMENU:=VPN
> +  DEPENDS:=+ppp-mod-pppol2tp +ip +resolveip
>  endef
>  
>  define Package/xl2tpd/description
> @@ -46,6 +49,7 @@
>  define Package/xl2tpd/install
>       $(INSTALL_DIR) $(1)/usr/sbin
>       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/local/sbin/xl2tpd $(1)/usr/sbin/
> +     $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/local/sbin/xl2tpd-control 
> $(1)/usr/sbin/
>  
>       $(INSTALL_DIR) $(1)/etc/init.d
>       $(INSTALL_BIN) ./files/xl2tpd.init $(1)/etc/init.d/xl2tpd
> @@ -56,6 +60,9 @@
>  
>       $(INSTALL_DIR) $(1)/etc/ppp
>       $(INSTALL_DATA) ./files/options.xl2tpd $(1)/etc/ppp/
> +
> +     $(INSTALL_DIR) $(1)/lib/network
> +     $(INSTALL_DATA) ./files/l2tp.sh $(1)/lib/network
>  endef
>  
>  $(eval $(call BuildPackage,xl2tpd))
> 
> Added: packages/net/xl2tpd/files/l2tp.sh
> ===================================================================
> --- packages/net/xl2tpd/files/l2tp.sh                         (rev 0)
> +++ packages/net/xl2tpd/files/l2tp.sh 2012-05-02 19:28:10 UTC (rev 31561)
> @@ -0,0 +1,124 @@
> +find_route() {
> +     ip route get $1 | sed -e 's/ /\n/g' | \
> +            sed -ne '1p;/via/{N;p};/dev/{N;p};/src/{N;p};/mtu/{N;p}'
> +}
> +
> +scan_l2tp() {
> +     config_set "$1" device "l2tp-$1"
> +}
> +
> +stop_interface_l2tp() {
> +     local config="$1"
> +     local lock="/var/lock/l2tp-${config}"
> +     local optfile="/tmp/l2tp/options.${config}"
> +     local l2tpcontrol=/var/run/xl2tpd/l2tp-control
> +
> +     lock "$lock"
> +
> +     [ -p ${l2tpcontrol} ] && echo "r l2tp-${config}" > ${l2tpcontrol}
> +     rm -f ${optfile}
> +
> +     for ip in $(uci_get_state network "$1" serv_addrs); do
> +         ip route del "$ip" 2>/dev/null
> +     done
> +
> +     lock -u "$lock"
> +}
> +
> +setup_interface_l2tp() {
> +     local config="$2"
> +     local lock="/var/lock/l2tp-${config}"
> +     local optfile="/tmp/l2tp/options.${config}"
> +
> +     lock "$lock"
> +
> +     if [ ! -p /var/run/xl2tpd/l2tp-control ]; then
> +         /etc/init.d/xl2tpd start
> +     fi
> +     
> +     local device

I'd combine all of these as:

local device server username password ...


> +     config_get device "$config" device "l2tp-$config"
> +
> +     local server
> +     config_get server "$config" server
> +
> +     local username
> +     config_get username "$config" username
> +
> +     local password
> +     config_get password "$config" password
> +
> +     local keepalive
> +     config_get keepalive "$config" keepalive
> +
> +     local pppd_options
> +     config_get pppd_options "$config" pppd_options
> +
> +     local defaultroute
> +     config_get_bool defaultroute "$config" defaultroute 1
> +     [ "$defaultroute" -eq 1 ] && \
> +             defaultroute="defaultroute replacedefaultroute" || 
> defaultroute="nodefaultroute"
> +
> +     local interval="${keepalive##*[, ]}"
> +     [ "$interval" != "$keepalive" ] || interval=5
> +
> +     local dns
> +     config_get dns "$config" dns
> +
> +     local has_dns=0
> +     local peer_default=1
> +     [ -n "$dns" ] && {
> +             has_dns=1
> +             peer_default=0
> +     }
> +
> +     local peerdns
> +     config_get_bool peerdns "$config" peerdns $peer_default
> +
> +     [ "$peerdns" -eq 1 ] && {
> +             peerdns="usepeerdns"
> +     } || {
> +             peerdns=""
> +             add_dns "$config" $dns
> +     }

Not clear how this is better than:

if [ "$peerdns" -eq 1 ]; then
    peerdns="userpeerdns"
else
    peerdns=""
    add_dns "$config" $dns
fi


> +
> +     local ipv6
> +     config_get ipv6 "$config" ipv6 1
> +     [ "$ipv6" -eq 1 ] && ipv6="+ipv6" || ipv6=""
> +
> +     local serv_addrs=""
> +     for ip in $(resolveip -t 3 "$server"); do
> +             append serv_addrs "$ip"
> +             ip route replace $(find_route $ip)
> +     done
> +     uci_toggle_state network "$config" serv_addrs "$serv_addrs"
> +
> +     # fix up the netmask
> +     config_get netmask "$config" netmask
> +     [ -z "$netmask" -o -z "$device" ] || ifconfig $device netmask $netmask
> +
> +     config_get mtu "$config" mtu
> +
> +     mkdir -p /tmp/l2tp
> +
> +     echo ${keepalive:+lcp-echo-interval $interval lcp-echo-failure 
> ${keepalive%%[, ]*}} > ${optfile}
> +     echo "$peerdns" >> "${optfile}"
> +     echo "$defaultroute" >> "${optfile}"
> +     echo "${username:+user \"$username\" password \"$password\"}" >> 
> "${optfile}"
> +     echo "ipparam \"$config\"" >> "${optfile}"
> +     echo "ifname \"l2tp-$config\"" >> "${optfile}"
> +     # Don't wait for LCP term responses; exit immediately when killed.
> +     echo "lcp-max-terminate 0" >> "${optfile}"
> +     echo "${ipv6} ${pppd_options}" >> "${optfile}"

I'd have done:

cat <<__EOF__ >> "${optfile}"
${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[, ]*}}
...
__EOF__


> +
> +     xl2tpd-control remove l2tp-${config}
> +     # Wait and ensure pppd has died.
> +     while [ -d /sys/class/net/l2tp-${config} ]; do
> +         sleep 1
> +     done

If there's a bug, this might never exit...  Maybe add a counter?


> +     
> +     xl2tpd-control add l2tp-${config} pppoptfile=${optfile} lns=${server} 
> redial=yes redial timeout=20

Use of quotes around ${optfile} is inconsistent.


> +     xl2tpd-control connect l2tp-${config}
> +
> +     lock -u "${lock}"
> +}
> 
> 
> Property changes on: packages/net/xl2tpd/files/l2tp.sh
> ___________________________________________________________________
> Added: svn:eol-style
>    + native
> 
> Modified: packages/net/xl2tpd/files/xl2tpd.conf
> ===================================================================
> --- packages/net/xl2tpd/files/xl2tpd.conf     2012-05-02 19:28:09 UTC (rev 
> 31560)
> +++ packages/net/xl2tpd/files/xl2tpd.conf     2012-05-02 19:28:10 UTC (rev 
> 31561)
> @@ -3,21 +3,21 @@
>  auth file = /etc/xl2tpd/xl2tp-secrets
>  access control = no
>  
> -[lns default]
> -exclusive = yes
> -ip range = 192.168.254.202-192.168.254.210
> -lac = 10.0.1.2
> -hidden bit = no
> -local ip = 192.168.254.200
> -length bit = yes
> -refuse authentication = yes
> -name = VersaLink
> -ppp debug = yes
> -pppoptfile = /etc/ppp/options.xl2tpd
> +;[lns default]
> +;exclusive = yes
> +;ip range = 192.168.254.202-192.168.254.210
> +;lac = 10.0.1.2
> +;hidden bit = no
> +;local ip = 192.168.254.200
> +;length bit = yes
> +;refuse authentication = yes
> +;name = VersaLink
> +;ppp debug = yes
> +;pppoptfile = /etc/ppp/options.xl2tpd
>  
> -[lac left]
> -lns = 10.0.1.2
> -refuse authentication = yes
> -name = VersaLink
> -ppp debug = yes
> -pppoptfile = /etc/ppp/options.xl2tpd
> +;[lac left]
> +;lns = 10.0.1.2
> +;refuse authentication = yes
> +;name = VersaLink
> +;ppp debug = yes
> +;pppoptfile = /etc/ppp/options.xl2tpd
> 
> Added: packages/net/xl2tpd/patches/120-kernel-mode-l2tp.patch
> ===================================================================
> --- packages/net/xl2tpd/patches/120-kernel-mode-l2tp.patch                    
>         (rev 0)
> +++ packages/net/xl2tpd/patches/120-kernel-mode-l2tp.patch    2012-05-02 
> 19:28:10 UTC (rev 31561)
> @@ -0,0 +1,436 @@
> +diff --git a/Makefile b/Makefile
> +index 6f6481f..778f38d 100644
> +--- a/Makefile
> ++++ b/Makefile
> +@@ -62,8 +62,8 @@
> + # are packages seperately (eg kernel-headers on Fedora)
> + # Note: 2.6.23+ support still needs some changes in the xl2tpd source
> + #
> +-#OSFLAGS+= -DUSE_KERNEL
> +-#
> ++# Kernel mode fixed by sigwall <fio...@gmail.com>
> ++OSFLAGS+= -DUSE_KERNEL
> + #
> + # Uncomment the next line for FreeBSD
> + #
> +diff --git a/call.c b/call.c
> +index d1b1858..b672f91 100644
> +--- a/call.c
> ++++ b/call.c
> +@@ -680,6 +680,8 @@ struct call *get_call (int tunnel, int call,  struct 
> in_addr addr, int port,
> +         st->peer.sin_port = port;
> +     st->refme  = refme;
> +     st->refhim = refhim;
> ++        st->udp_fd = -1;
> ++        st->pppox_fd = -1;
> +         bcopy (&addr, &st->peer.sin_addr, sizeof (addr));
> +         st->next = tunnels.head;
> +         tunnels.head = st;
> +diff --git a/control.c b/control.c
> +index 0892df9..9362ffd 100644
> +--- a/control.c
> ++++ b/control.c
> +@@ -596,6 +596,9 @@ int control_finish (struct tunnel *t, struct call *c)
> +         if (gconfig.debug_state)
> +             l2tp_log (LOG_DEBUG, "%s: sending SCCCN\n", __FUNCTION__);
> +         control_xmit (buf);
> ++
> ++        connect_pppol2tp(t);
> ++
> +         /* Schedule a HELLO */
> +         tv.tv_sec = HELLO_DELAY;
> +         tv.tv_usec = 0;
> +@@ -608,6 +611,7 @@ int control_finish (struct tunnel *t, struct call *c)
> +               "Connection established to %s, %d.  Local: %d, Remote: %d 
> (ref=%u/%u).\n",
> +               IPADDY (t->peer.sin_addr),
> +               ntohs (t->peer.sin_port), t->ourtid, t->tid, t->refme, 
> t->refhim);
> ++
> +         if (t->lac)
> +         {
> +             /* This is part of a LAC, so we want to go ahead
> +@@ -635,6 +639,9 @@ int control_finish (struct tunnel *t, struct call *c)
> +               IPADDY (t->peer.sin_addr),
> +               ntohs (t->peer.sin_port), t->ourtid, t->tid, t->refme, 
> t->refhim,
> +               t->lns->entname);
> ++
> ++        connect_pppol2tp(t);
> ++
> +         /* Schedule a HELLO */
> +         tv.tv_sec = HELLO_DELAY;
> +         tv.tv_usec = 0;
> +diff --git a/l2tp.h b/l2tp.h
> +index 2724fff..856423f 100644
> +--- a/l2tp.h
> ++++ b/l2tp.h
> +@@ -167,6 +167,8 @@ struct tunnel
> +     int ourrws;                 /* Receive Window Size */
> +     int rxspeed;            /* Receive bps */
> +     int txspeed;            /* Transmit bps */
> ++    int udp_fd;                     /* UDP fd */
> ++    int pppox_fd;                   /* PPPOX tunnel fd */
> +     struct call *self;
> +     struct lns *lns;            /* LNS that owns us */
> +     struct lac *lac;            /* LAC that owns us */
> +@@ -220,6 +222,7 @@ extern void control_xmit (void *);
> + extern int ppd;
> + extern int switch_io;           /* jz */
> + extern int control_fd;
> ++extern int connect_pppol2tp(struct tunnel *t);
> + extern int start_pppd (struct call *c, struct ppp_opts *);
> + extern void magic_lac_dial (void *);
> + extern int get_entropy (unsigned char *, int);
> +diff --git a/linux/include/linux/if_pppol2tp.h 
> b/linux/include/linux/if_pppol2tp.h
> +index a7d6a22..0795e4a 100644
> +--- a/linux/include/linux/if_pppol2tp.h
> ++++ b/linux/include/linux/if_pppol2tp.h
> +@@ -36,6 +36,20 @@ struct pppol2tp_addr
> +     __u16 d_tunnel, d_session;      /* For sending outgoing packets */
> + };
> + 
> ++/* The L2TPv3 protocol changes tunnel and session ids from 16 to 32
> ++ * bits. So we need a different sockaddr structure.
> ++ */
> ++struct pppol2tpv3_addr {
> ++    pid_t   pid;                    /* pid that owns the fd.
> ++                                     * 0 => current */
> ++    int     fd;                     /* FD of UDP or IP socket to use */
> ++
> ++    struct sockaddr_in addr;        /* IP address and port to send to */
> ++
> ++    __u32 s_tunnel, s_session;      /* For matching incoming packets */
> ++    __u32 d_tunnel, d_session;      /* For sending outgoing packets */
> ++};
> ++
> + /* Socket options:
> +  * DEBUG    - bitmask of debug message categories
> +  * SENDSEQ  - 0 => don't send packets with sequence numbers
> +diff --git a/network.c b/network.c
> +index 241bd82..fde250e 100644
> +--- a/network.c
> ++++ b/network.c
> +@@ -22,6 +22,7 @@
> + #include <unistd.h>
> + #include <stdlib.h>
> + #include <sys/ioctl.h>
> ++#include <sys/wait.h>
> + #ifndef LINUX
> + # include <sys/uio.h>
> + #endif
> +@@ -36,6 +37,51 @@ int server_socket;              /* Server socket */
> + int kernel_support;             /* Kernel Support there or not? */
> + #endif
> + 
> ++#ifdef USE_KERNEL
> ++void modprobe() {
> ++    char * modules[] = { "l2tp_ppp", "pppol2tp", NULL };
> ++    char ** module;
> ++    char buf[256], *tok;
> ++    int pid, exit_status, fd;
> ++
> ++    FILE * fmod = fopen("/proc/modules", "r");
> ++
> ++    if (fmod == NULL)
> ++        return;
> ++
> ++    while (fgets(buf, 255, fmod) != NULL) {
> ++        if ((tok = strtok(buf, " ")) != NULL) {
> ++            for (module = modules; *module != NULL; ++module) {
> ++                if (!strcmp(*module, tok)) {
> ++                    fclose(fmod);
> ++                    return;
> ++                }
> ++            }
> ++        }
> ++    }
> ++
> ++    fclose(fmod);
> ++
> ++    for (module = modules; *module != NULL; ++module) {
> ++        if ((pid = fork()) >= 0) {
> ++            if (pid == 0) {
> ++                setenv("PATH", "/sbin:/usr/sbin:/bin:/usr/bin", 1);
> ++                if ((fd = open("/dev/null", O_RDWR)) > -1) {
> ++                    dup2(fd, 1);
> ++                    dup2(fd, 2);
> ++                }
> ++                execlp("modprobe", "modprobe", "-q", *module, (char *)NULL);
> ++                exit(1);
> ++            } else {
> ++                if ((pid = waitpid(pid, &exit_status, 0)) != -1 && 
> WIFEXITED(exit_status)) {
> ++                    if (WEXITSTATUS(exit_status) == 0)
> ++                        return;
> ++                }
> ++            }
> ++        }
> ++    }
> ++}
> ++#endif
> + 
> + int init_network (void)
> + {
> +@@ -45,6 +91,7 @@ int init_network (void)
> +     server.sin_family = AF_INET;
> +     server.sin_addr.s_addr = gconfig.listenaddr; 
> +     server.sin_port = htons (gconfig.port);
> ++    int flags;
> +     if ((server_socket = socket (PF_INET, SOCK_DGRAM, 0)) < 0)
> +     {
> +         l2tp_log (LOG_CRIT, "%s: Unable to allocate socket. Terminating.\n",
> +@@ -52,6 +99,10 @@ int init_network (void)
> +         return -EINVAL;
> +     };
> + 
> ++    flags = 1;
> ++    setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &flags, 
> sizeof(flags));
> ++    setsockopt(server_socket, SOL_SOCKET, SO_NO_CHECK, &flags, 
> sizeof(flags));
> ++
> +     if (bind (server_socket, (struct sockaddr *) &server, sizeof (server)))
> +     {
> +         close (server_socket);
> +@@ -91,6 +142,7 @@ int init_network (void)
> +     }
> +     else
> +     {
> ++        modprobe();
> +         int kernel_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
> +         if (kernel_fd < 0)
> +         {
> +@@ -321,6 +373,11 @@ int build_fdset (fd_set *readfds)
> + 
> +     while (tun)
> +     {
> ++            if (tun->udp_fd > -1) {
> ++                    if (tun->udp_fd > max)
> ++                            max = tun->udp_fd;
> ++                    FD_SET (tun->udp_fd, readfds);
> ++            }
> +             call = tun->call_head;
> +             while (call)
> +             {
> +@@ -390,6 +447,8 @@ void network_thread ()
> +     struct iovec iov;
> +     char cbuf[256];
> +     unsigned int refme, refhim;
> ++    int * currentfd;
> ++    int server_socket_processed;
> + 
> +     /* This one buffer can be recycled for everything except control 
> packets */
> +     buf = new_buf (MAX_RECV_SIZE);
> +@@ -428,7 +487,21 @@ void network_thread ()
> +         {
> +             do_control ();
> +         }
> +-        if (FD_ISSET (server_socket, &readfds))
> ++        server_socket_processed = 0;
> ++        currentfd = NULL;
> ++        st = tunnels.head;
> ++        while (st || !server_socket_processed) {
> ++            if (st && (st->udp_fd == -1)) {
> ++                st=st->next;
> ++                continue;
> ++            }
> ++            if (st) {
> ++                currentfd = &st->udp_fd;
> ++            } else {
> ++                currentfd = &server_socket;
> ++                server_socket_processed = 1;
> ++            }
> ++            if (FD_ISSET (*currentfd, &readfds))
> +         {
> +             /*
> +              * Okay, now we're ready for reading and processing new data.
> +@@ -457,12 +530,19 @@ void network_thread ()
> +         msgh.msg_flags = 0;
> +         
> +         /* Receive one packet. */
> +-        recvsize = recvmsg(server_socket, &msgh, 0);
> ++        recvsize = recvmsg(*currentfd, &msgh, 0);
> + 
> +             if (recvsize < MIN_PAYLOAD_HDR_LEN)
> +             {
> +                 if (recvsize < 0)
> +                 {
> ++                    if (errno == ECONNREFUSED) {
> ++                        close(*currentfd);
> ++                    }

I'd try to match the current indent style.


> ++                    if ((errno == ECONNREFUSED) ||
> ++                        (errno == EBADF)) {
> ++                        *currentfd = -1;
> ++                    }
> +                     if (errno != EAGAIN)
> +                         l2tp_log (LOG_WARNING,
> +                              "%s: recvfrom returned error %d (%s)\n",
> +@@ -567,6 +647,8 @@ void network_thread ()
> +             }
> +         };
> +     }
> ++    if (st) st=st->next;
> ++    }
> + 
> +     /*
> +      * finished obvious sources, look for data from PPP connections.
> +@@ -639,3 +721,82 @@ void network_thread ()
> +     }
> + 
> + }
> ++
> ++int connect_pppol2tp(struct tunnel *t) {
> ++#ifdef USE_KERNEL
> ++        if (kernel_support) {
> ++            int ufd = -1, fd2 = -1;
> ++            int flags;
> ++            struct sockaddr_pppol2tp sax;
> ++
> ++            struct sockaddr_in server;
> ++            server.sin_family = AF_INET;
> ++            server.sin_addr.s_addr = gconfig.listenaddr;
> ++            server.sin_port = htons (gconfig.port);
> ++            if ((ufd = socket (PF_INET, SOCK_DGRAM, 0)) < 0)
> ++            {
> ++                l2tp_log (LOG_CRIT, "%s: Unable to allocate UDP socket. 
> Terminating.\n",
> ++                    __FUNCTION__);
> ++                return -EINVAL;
> ++            };
> ++
> ++            flags=1;
> ++            setsockopt(ufd, SOL_SOCKET, SO_REUSEADDR, &flags, 
> sizeof(flags));
> ++            setsockopt(ufd, SOL_SOCKET, SO_NO_CHECK, &flags, sizeof(flags));
> ++
> ++            if (bind (ufd, (struct sockaddr *) &server, sizeof (server)))
> ++            {
> ++                close (ufd);
> ++                l2tp_log (LOG_CRIT, "%s: Unable to bind UDP socket: %s. 
> Terminating.\n",
> ++                     __FUNCTION__, strerror(errno), errno);
> ++                return -EINVAL;
> ++            };
> ++            server = t->peer;
> ++            flags = fcntl(ufd, F_GETFL);
> ++            if (flags == -1 || fcntl(ufd, F_SETFL, flags | O_NONBLOCK) == 
> -1) {
> ++                l2tp_log (LOG_WARNING, "%s: Unable to set UDP socket 
> nonblock.\n",
> ++                     __FUNCTION__);
> ++                return -EINVAL;
> ++            }
> ++            if (connect (ufd, (struct sockaddr *) &server, sizeof(server)) 
> < 0) {
> ++                l2tp_log (LOG_CRIT, "%s: Unable to connect UDP peer. 
> Terminating.\n",
> ++                 __FUNCTION__);
> ++                return -EINVAL;
> ++            }
> ++
> ++            t->udp_fd=ufd;
> ++
> ++            fd2 = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
> ++            if (fd2 < 0) {
> ++                l2tp_log (LOG_WARNING, "%s: Unable to allocate PPPoL2TP 
> socket.\n",
> ++                     __FUNCTION__);
> ++                return -EINVAL;
> ++            }
> ++            flags = fcntl(fd2, F_GETFL);
> ++            if (flags == -1 || fcntl(fd2, F_SETFL, flags | O_NONBLOCK) == 
> -1) {
> ++                l2tp_log (LOG_WARNING, "%s: Unable to set PPPoL2TP socket 
> nonblock.\n",
> ++                     __FUNCTION__);
> ++                return -EINVAL;
> ++            }
> ++            sax.sa_family = AF_PPPOX;
> ++            sax.sa_protocol = PX_PROTO_OL2TP;
> ++            sax.pppol2tp.pid = 0;
> ++            sax.pppol2tp.fd = t->udp_fd;
> ++            sax.pppol2tp.addr.sin_addr.s_addr = t->peer.sin_addr.s_addr;
> ++            sax.pppol2tp.addr.sin_port = t->peer.sin_port;
> ++            sax.pppol2tp.addr.sin_family = AF_INET;
> ++            sax.pppol2tp.s_tunnel  = t->ourtid;
> ++            sax.pppol2tp.s_session = 0;
> ++            sax.pppol2tp.d_tunnel  = t->tid;
> ++            sax.pppol2tp.d_session = 0;
> ++            if ((connect(fd2, (struct sockaddr *)&sax, sizeof(sax))) < 0) {
> ++                l2tp_log (LOG_WARNING, "%s: Unable to connect PPPoL2TP 
> socket. %d %s\n",
> ++                     __FUNCTION__, errno, strerror(errno));
> ++                close(fd2);
> ++                return -EINVAL;
> ++            }
> ++            t->pppox_fd = fd2;
> ++        }
> ++#endif
> ++    return 0;
> ++}
> +diff --git a/xl2tpd.c b/xl2tpd.c
> +index 307ac2e..3fb6dd7 100644
> +--- a/xl2tpd.c
> ++++ b/xl2tpd.c
> +@@ -278,7 +278,11 @@ void death_handler (int signal)
> +     struct tunnel *st, *st2;
> +     int sec;
> +     l2tp_log (LOG_CRIT, "%s: Fatal signal %d received\n", __FUNCTION__, 
> signal);
> ++#ifdef USE_KERNEL
> ++        if (kernel_support || signal != SIGTERM) {
> ++#else
> +         if (signal != SIGTERM) {
> ++#endif
> +                 st = tunnels.head;
> +                 while (st)
> +                 {
> +@@ -349,7 +353,7 @@ int start_pppd (struct call *c, struct ppp_opts *opts)
> +     int flags;
> + #endif
> +     int pos = 1;
> +-    int fd2;
> ++    int fd2 = -1;
> + #ifdef DEBUG_PPPD
> +     int x;
> + #endif
> +@@ -397,7 +401,7 @@ int start_pppd (struct call *c, struct ppp_opts *opts)
> +        sax.sa_family = AF_PPPOX;
> +        sax.sa_protocol = PX_PROTO_OL2TP;
> +        sax.pppol2tp.pid = 0;
> +-       sax.pppol2tp.fd = server_socket;
> ++       sax.pppol2tp.fd = c->container->udp_fd;
> +        sax.pppol2tp.addr.sin_addr.s_addr = 
> c->container->peer.sin_addr.s_addr;
> +        sax.pppol2tp.addr.sin_port = c->container->peer.sin_port;
> +        sax.pppol2tp.addr.sin_family = AF_INET;
> +@@ -408,6 +412,7 @@ int start_pppd (struct call *c, struct ppp_opts *opts)
> +        if (connect(fd2, (struct sockaddr *)&sax, sizeof(sax)) < 0) {
> +            l2tp_log (LOG_WARNING, "%s: Unable to connect PPPoL2TP 
> socket.\n",
> +                 __FUNCTION__);
> ++           close(fd2);
> +            return -EINVAL;
> +        }
> +        stropt[pos++] = strdup ("plugin");
> +@@ -484,7 +489,7 @@ int start_pppd (struct call *c, struct ppp_opts *opts)
> +         dup2 (fd2, 0);
> +         dup2 (fd2, 1);
> +     close(fd2);
> +-
> ++       }
> +         /* close all the calls pty fds */
> +         st = tunnels.head;
> +         while (st)
> +@@ -492,12 +497,17 @@ int start_pppd (struct call *c, struct ppp_opts *opts)
> +             sc = st->call_head;
> +             while (sc)
> +             {
> +-                close (sc->fd);
> ++#ifdef USE_KERNEL
> ++                if (kernel_support) {
> ++                    close(st->udp_fd); /* tunnel UDP fd */
> ++                    close(st->pppox_fd); /* tunnel PPPoX fd */
> ++                } else
> ++#endif
> ++                    close (sc->fd); /* call pty fd */
> +                 sc = sc->next;
> +             }
> +             st = st->next;
> +         }
> +-       }
> + 
> +         /* close the UDP socket fd */
> +         close (server_socket);
> +@@ -615,6 +625,10 @@ void destroy_tunnel (struct tunnel *t)
> +        the memory pointed to by t->chal_us.vector at some other place */
> +     if (t->chal_them.vector)
> +         free (t->chal_them.vector);
> ++    if (t->pppox_fd > -1 )
> ++        close (t->pppox_fd);

Two comments:

">= 0" reads more clearly than "> -1" ...

also, doing a close() on an invalid descriptor is pretty harmless... it returns 
-1 and sets errno = EINVAL, but since we're ignoring the return value anyway...

> ++    if (t->udp_fd > -1 )
> ++        close (t->udp_fd);
> +     free (t);
> +     free (me);
> + }
> 
> Added: packages/net/xl2tpd/patches/130-no-kill-ipparam.patch
> ===================================================================
> --- packages/net/xl2tpd/patches/130-no-kill-ipparam.patch                     
>         (rev 0)
> +++ packages/net/xl2tpd/patches/130-no-kill-ipparam.patch     2012-05-02 
> 19:28:10 UTC (rev 31561)
> @@ -0,0 +1,11 @@
> +--- xl2tpd-1.3.1/control.c.orig      2012-04-25 12:59:28.718825985 +0100
> ++++ xl2tpd-1.3.1/control.c   2012-04-25 12:59:37.063916785 +0100
> +@@ -905,8 +905,6 @@ int control_finish (struct tunnel *t, st
> +                 po = add_opt (po, c->lac->pppoptfile);
> +             }
> +         };
> +-    po = add_opt (po, "ipparam");
> +-        po = add_opt (po, IPADDY (t->peer.sin_addr));
> +         start_pppd (c, po);
> +         opt_destroy (po);
> +         if (c->lac)
> 
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to