1  | 
     | 
     | 
    /*	$OpenBSD: l2tp_ctrl.c,v 1.21 2015/12/05 18:43:36 mmcc Exp $	*/  | 
    
    
    2  | 
     | 
     | 
     | 
    
    
    3  | 
     | 
     | 
    /*-  | 
    
    
    4  | 
     | 
     | 
     * Copyright (c) 2009 Internet Initiative Japan Inc.  | 
    
    
    5  | 
     | 
     | 
     * All rights reserved.  | 
    
    
    6  | 
     | 
     | 
     *  | 
    
    
    7  | 
     | 
     | 
     * Redistribution and use in source and binary forms, with or without  | 
    
    
    8  | 
     | 
     | 
     * modification, are permitted provided that the following conditions  | 
    
    
    9  | 
     | 
     | 
     * are met:  | 
    
    
    10  | 
     | 
     | 
     * 1. Redistributions of source code must retain the above copyright  | 
    
    
    11  | 
     | 
     | 
     *    notice, this list of conditions and the following disclaimer.  | 
    
    
    12  | 
     | 
     | 
     * 2. Redistributions in binary form must reproduce the above copyright  | 
    
    
    13  | 
     | 
     | 
     *    notice, this list of conditions and the following disclaimer in the  | 
    
    
    14  | 
     | 
     | 
     *    documentation and/or other materials provided with the distribution.  | 
    
    
    15  | 
     | 
     | 
     *  | 
    
    
    16  | 
     | 
     | 
     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND  | 
    
    
    17  | 
     | 
     | 
     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | 
    
    
    18  | 
     | 
     | 
     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  | 
    
    
    19  | 
     | 
     | 
     * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE  | 
    
    
    20  | 
     | 
     | 
     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  | 
    
    
    21  | 
     | 
     | 
     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  | 
    
    
    22  | 
     | 
     | 
     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  | 
    
    
    23  | 
     | 
     | 
     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  | 
    
    
    24  | 
     | 
     | 
     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  | 
    
    
    25  | 
     | 
     | 
     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  | 
    
    
    26  | 
     | 
     | 
     * SUCH DAMAGE.  | 
    
    
    27  | 
     | 
     | 
     */  | 
    
    
    28  | 
     | 
     | 
    /**@file Control connection processing functions for L2TP LNS */  | 
    
    
    29  | 
     | 
     | 
    /* $Id: l2tp_ctrl.c,v 1.21 2015/12/05 18:43:36 mmcc Exp $ */  | 
    
    
    30  | 
     | 
     | 
    #include <sys/types.h>  | 
    
    
    31  | 
     | 
     | 
    #include <sys/time.h>  | 
    
    
    32  | 
     | 
     | 
    #include <sys/socket.h>  | 
    
    
    33  | 
     | 
     | 
    #include <netinet/in.h>  | 
    
    
    34  | 
     | 
     | 
    #include <net/if.h>  | 
    
    
    35  | 
     | 
     | 
    #include <arpa/inet.h>  | 
    
    
    36  | 
     | 
     | 
    #include <endian.h>  | 
    
    
    37  | 
     | 
     | 
    #include <errno.h>  | 
    
    
    38  | 
     | 
     | 
    #include <event.h>  | 
    
    
    39  | 
     | 
     | 
    #include <ifaddrs.h>  | 
    
    
    40  | 
     | 
     | 
    #include <netdb.h>  | 
    
    
    41  | 
     | 
     | 
    #include <stdarg.h>  | 
    
    
    42  | 
     | 
     | 
    #include <stddef.h>  | 
    
    
    43  | 
     | 
     | 
    #include <stdio.h>  | 
    
    
    44  | 
     | 
     | 
    #include <stdlib.h>  | 
    
    
    45  | 
     | 
     | 
    #include <string.h>  | 
    
    
    46  | 
     | 
     | 
    #include <syslog.h>  | 
    
    
    47  | 
     | 
     | 
    #include <time.h>  | 
    
    
    48  | 
     | 
     | 
    #include <unistd.h>  | 
    
    
    49  | 
     | 
     | 
    #include <limits.h>  | 
    
    
    50  | 
     | 
     | 
     | 
    
    
    51  | 
     | 
     | 
    #ifdef USE_LIBSOCKUTIL  | 
    
    
    52  | 
     | 
     | 
    #include <seil/sockfromto.h>  | 
    
    
    53  | 
     | 
     | 
    #endif  | 
    
    
    54  | 
     | 
     | 
     | 
    
    
    55  | 
     | 
     | 
    #include "time_utils.h"  | 
    
    
    56  | 
     | 
     | 
    #include "ipsec_util.h"  | 
    
    
    57  | 
     | 
     | 
    #include "bytebuf.h"  | 
    
    
    58  | 
     | 
     | 
    #include "hash.h"  | 
    
    
    59  | 
     | 
     | 
    #include "debugutil.h"  | 
    
    
    60  | 
     | 
     | 
    #include "slist.h"  | 
    
    
    61  | 
     | 
     | 
    #include "l2tp.h"  | 
    
    
    62  | 
     | 
     | 
    #include "l2tp_local.h"  | 
    
    
    63  | 
     | 
     | 
    #include "l2tp_subr.h"  | 
    
    
    64  | 
     | 
     | 
    #include "net_utils.h"  | 
    
    
    65  | 
     | 
     | 
    #include "version.h"  | 
    
    
    66  | 
     | 
     | 
    #include "recvfromto.h"  | 
    
    
    67  | 
     | 
     | 
     | 
    
    
    68  | 
     | 
     | 
    #define MINIMUM(a, b)	(((a) < (b)) ? (a) : (b))  | 
    
    
    69  | 
     | 
     | 
     | 
    
    
    70  | 
     | 
     | 
    static int                l2tp_ctrl_init (l2tp_ctrl *, l2tpd *, struct sockaddr *, struct sockaddr *, void *);  | 
    
    
    71  | 
     | 
     | 
    static void               l2tp_ctrl_reload (l2tp_ctrl *);  | 
    
    
    72  | 
     | 
     | 
    static int                l2tp_ctrl_send_disconnect_notify (l2tp_ctrl *);  | 
    
    
    73  | 
     | 
     | 
    #if 0  | 
    
    
    74  | 
     | 
     | 
    static void               l2tp_ctrl_purge_ipsec_sa (l2tp_ctrl *);  | 
    
    
    75  | 
     | 
     | 
    #endif  | 
    
    
    76  | 
     | 
     | 
    static void               l2tp_ctrl_timeout (int, short, void *);  | 
    
    
    77  | 
     | 
     | 
    static int                l2tp_ctrl_resend_una_packets (l2tp_ctrl *);  | 
    
    
    78  | 
     | 
     | 
    static void               l2tp_ctrl_destroy_all_calls (l2tp_ctrl *);  | 
    
    
    79  | 
     | 
     | 
    static int                l2tp_ctrl_disconnect_all_calls (l2tp_ctrl *, int);  | 
    
    
    80  | 
     | 
     | 
    static void               l2tp_ctrl_reset_timeout (l2tp_ctrl *);  | 
    
    
    81  | 
     | 
     | 
    static inline int         l2tp_ctrl_txwin_size (l2tp_ctrl *);  | 
    
    
    82  | 
     | 
     | 
    static inline int         l2tp_ctrl_txwin_is_full (l2tp_ctrl *);  | 
    
    
    83  | 
     | 
     | 
    static int                l2tp_ctrl_recv_SCCRQ (l2tp_ctrl *, u_char *, int, l2tpd *, struct sockaddr *);  | 
    
    
    84  | 
     | 
     | 
    static int                l2tp_ctrl_send_StopCCN (l2tp_ctrl *, int);  | 
    
    
    85  | 
     | 
     | 
    static int                l2tp_ctrl_recv_StopCCN (l2tp_ctrl *, u_char *, int);  | 
    
    
    86  | 
     | 
     | 
    static void               l2tp_ctrl_send_SCCRP (l2tp_ctrl *);  | 
    
    
    87  | 
     | 
     | 
    static int                l2tp_ctrl_send_HELLO (l2tp_ctrl *);  | 
    
    
    88  | 
     | 
     | 
    static int                l2tp_ctrl_send_ZLB (l2tp_ctrl *);  | 
    
    
    89  | 
     | 
     | 
    static inline const char  *l2tp_ctrl_state_string (l2tp_ctrl *);  | 
    
    
    90  | 
     | 
     | 
     | 
    
    
    91  | 
     | 
     | 
    #ifdef	L2TP_CTRL_DEBUG  | 
    
    
    92  | 
     | 
     | 
    #define	L2TP_CTRL_ASSERT(x)	ASSERT(x)  | 
    
    
    93  | 
     | 
     | 
    #define	L2TP_CTRL_DBG(x)	l2tp_ctrl_log x  | 
    
    
    94  | 
     | 
     | 
    #else  | 
    
    
    95  | 
     | 
     | 
    #define	L2TP_CTRL_ASSERT(x)  | 
    
    
    96  | 
     | 
     | 
    #define	L2TP_CTRL_DBG(x)  | 
    
    
    97  | 
     | 
     | 
    #endif  | 
    
    
    98  | 
     | 
     | 
     | 
    
    
    99  | 
     | 
     | 
    /* Sequence # of l2tp_ctrl ID */  | 
    
    
    100  | 
     | 
     | 
    static u_int l2tp_ctrl_id_seq = 0;  | 
    
    
    101  | 
     | 
     | 
     | 
    
    
    102  | 
     | 
     | 
    #define SEQ_LT(a,b)	((int16_t)((a) - (b)) <  0)  | 
    
    
    103  | 
     | 
     | 
    #define SEQ_GT(a,b)	((int16_t)((a) - (b)) >  0)  | 
    
    
    104  | 
     | 
     | 
     | 
    
    
    105  | 
     | 
     | 
    /**  | 
    
    
    106  | 
     | 
     | 
     * Build instance of {@link ::_l2tp_ctrl L2TP LNS control connection} | 
    
    
    107  | 
     | 
     | 
     */  | 
    
    
    108  | 
     | 
     | 
    l2tp_ctrl *  | 
    
    
    109  | 
     | 
     | 
    l2tp_ctrl_create(void)  | 
    
    
    110  | 
     | 
     | 
    { | 
    
    
    111  | 
     | 
     | 
     | 
    
    
    112  | 
     | 
     | 
    	return calloc(1, sizeof(l2tp_ctrl));  | 
    
    
    113  | 
     | 
     | 
    }  | 
    
    
    114  | 
     | 
     | 
     | 
    
    
    115  | 
     | 
     | 
    /**  | 
    
    
    116  | 
     | 
     | 
     * initialize and startup of {@link ::_l2tp_ctrl L2TP LNS control connection} | 
    
    
    117  | 
     | 
     | 
     * instance  | 
    
    
    118  | 
     | 
     | 
     */  | 
    
    
    119  | 
     | 
     | 
    static int  | 
    
    
    120  | 
     | 
     | 
    l2tp_ctrl_init(l2tp_ctrl *_this, l2tpd *_l2tpd, struct sockaddr *peer,  | 
    
    
    121  | 
     | 
     | 
        struct sockaddr *sock, void *nat_t_ctx)  | 
    
    
    122  | 
     | 
     | 
    { | 
    
    
    123  | 
     | 
     | 
    	int tunid, i;  | 
    
    
    124  | 
     | 
     | 
    	bytebuffer *bytebuf;  | 
    
    
    125  | 
     | 
     | 
    	time_t curr_time;  | 
    
    
    126  | 
     | 
     | 
     | 
    
    
    127  | 
     | 
     | 
    	memset(_this, 0, sizeof(l2tp_ctrl));  | 
    
    
    128  | 
     | 
     | 
     | 
    
    
    129  | 
     | 
     | 
    	curr_time = get_monosec();  | 
    
    
    130  | 
     | 
     | 
    	_this->l2tpd = _l2tpd;  | 
    
    
    131  | 
     | 
     | 
    	_this->state = L2TP_CTRL_STATE_IDLE;  | 
    
    
    132  | 
     | 
     | 
    	_this->last_snd_ctrl = curr_time;  | 
    
    
    133  | 
     | 
     | 
     | 
    
    
    134  | 
     | 
     | 
    	slist_init(&_this->call_list);  | 
    
    
    135  | 
     | 
     | 
     | 
    
    
    136  | 
     | 
     | 
    	/* seek a free tunnel ID */  | 
    
    
    137  | 
     | 
     | 
    	i = 0;  | 
    
    
    138  | 
     | 
     | 
    	_this->id = ++l2tp_ctrl_id_seq;  | 
    
    
    139  | 
     | 
     | 
    	for (i = 0, tunid = _this->id; ; i++, tunid++) { | 
    
    
    140  | 
     | 
     | 
    		tunid &= 0xffff;  | 
    
    
    141  | 
     | 
     | 
    		_this->tunnel_id = l2tp_ctrl_id_seq & 0xffff;  | 
    
    
    142  | 
     | 
     | 
    		if (tunid == 0)  | 
    
    
    143  | 
     | 
     | 
    			continue;  | 
    
    
    144  | 
     | 
     | 
    		if (l2tpd_get_ctrl(_l2tpd, tunid) == NULL)  | 
    
    
    145  | 
     | 
     | 
    			break;  | 
    
    
    146  | 
     | 
     | 
    		if (i > 80000) { | 
    
    
    147  | 
     | 
     | 
    			/* this must be happen, just log it. */  | 
    
    
    148  | 
     | 
     | 
    			l2tpd_log(_l2tpd, LOG_ERR, "Too many l2tp controls");  | 
    
    
    149  | 
     | 
     | 
    			return -1;  | 
    
    
    150  | 
     | 
     | 
    		}  | 
    
    
    151  | 
     | 
     | 
    	}  | 
    
    
    152  | 
     | 
     | 
     | 
    
    
    153  | 
     | 
     | 
    	_this->tunnel_id = tunid;  | 
    
    
    154  | 
     | 
     | 
     | 
    
    
    155  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(peer != NULL);  | 
    
    
    156  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(sock != NULL);  | 
    
    
    157  | 
     | 
     | 
    	memcpy(&_this->peer, peer, peer->sa_len);  | 
    
    
    158  | 
     | 
     | 
    	memcpy(&_this->sock, sock, sock->sa_len);  | 
    
    
    159  | 
     | 
     | 
     | 
    
    
    160  | 
     | 
     | 
    	/* prepare send buffer */  | 
    
    
    161  | 
     | 
     | 
    	_this->winsz = L2TPD_DEFAULT_SEND_WINSZ;  | 
    
    
    162  | 
     | 
     | 
    	if ((_this->snd_buffers = calloc(_this->winsz, sizeof(bytebuffer *)))  | 
    
    
    163  | 
     | 
     | 
    	    == NULL) { | 
    
    
    164  | 
     | 
     | 
    		l2tpd_log(_l2tpd, LOG_ERR,  | 
    
    
    165  | 
     | 
     | 
    		    "calloc() failed in %s(): %m", __func__);  | 
    
    
    166  | 
     | 
     | 
    		goto fail;  | 
    
    
    167  | 
     | 
     | 
    	}  | 
    
    
    168  | 
     | 
     | 
    	for (i = 0; i < _this->winsz; i++) { | 
    
    
    169  | 
     | 
     | 
    		if ((bytebuf = bytebuffer_create(L2TPD_SND_BUFSIZ)) == NULL) { | 
    
    
    170  | 
     | 
     | 
    			l2tpd_log(_l2tpd, LOG_ERR,  | 
    
    
    171  | 
     | 
     | 
    			    "bytebuffer_create() failed in %s(): %m", __func__);  | 
    
    
    172  | 
     | 
     | 
    			goto fail;  | 
    
    
    173  | 
     | 
     | 
    		}  | 
    
    
    174  | 
     | 
     | 
    		_this->snd_buffers[i] = bytebuf;  | 
    
    
    175  | 
     | 
     | 
    	}  | 
    
    
    176  | 
     | 
     | 
    	if ((_this->zlb_buffer = bytebuffer_create(sizeof(struct l2tp_header)  | 
    
    
    177  | 
     | 
     | 
    	    + 128)) == NULL) { | 
    
    
    178  | 
     | 
     | 
    		l2tpd_log(_l2tpd, LOG_ERR,  | 
    
    
    179  | 
     | 
     | 
    		    "bytebuffer_create() failed in %s(): %m", __func__);  | 
    
    
    180  | 
     | 
     | 
    		goto fail;  | 
    
    
    181  | 
     | 
     | 
    	}  | 
    
    
    182  | 
     | 
     | 
    #if defined(USE_LIBSOCKUTIL) || defined(USE_SA_COOKIE)  | 
    
    
    183  | 
     | 
     | 
    	if (nat_t_ctx != NULL) { | 
    
    
    184  | 
     | 
     | 
    		if ((_this->sa_cookie = malloc(  | 
    
    
    185  | 
     | 
     | 
    		    sizeof(struct in_ipsec_sa_cookie))) != NULL) { | 
    
    
    186  | 
     | 
     | 
    			*(struct in_ipsec_sa_cookie *)_this->sa_cookie =  | 
    
    
    187  | 
     | 
     | 
    			    *(struct in_ipsec_sa_cookie *)nat_t_ctx;  | 
    
    
    188  | 
     | 
     | 
    		} else { | 
    
    
    189  | 
     | 
     | 
    			l2tpd_log(_l2tpd, LOG_ERR,  | 
    
    
    190  | 
     | 
     | 
    			    "creating sa_cookie failed: %m");  | 
    
    
    191  | 
     | 
     | 
    			goto fail;  | 
    
    
    192  | 
     | 
     | 
    		}  | 
    
    
    193  | 
     | 
     | 
    	}  | 
    
    
    194  | 
     | 
     | 
    #endif  | 
    
    
    195  | 
     | 
     | 
    	_this->hello_interval = L2TP_CTRL_DEFAULT_HELLO_INTERVAL;  | 
    
    
    196  | 
     | 
     | 
    	_this->hello_timeout = L2TP_CTRL_DEFAULT_HELLO_TIMEOUT;  | 
    
    
    197  | 
     | 
     | 
    	_this->hello_io_time = curr_time;  | 
    
    
    198  | 
     | 
     | 
     | 
    
    
    199  | 
     | 
     | 
    	/* initialize timeout timer */  | 
    
    
    200  | 
     | 
     | 
    	l2tp_ctrl_reset_timeout(_this);  | 
    
    
    201  | 
     | 
     | 
     | 
    
    
    202  | 
     | 
     | 
    	/* register l2tp context */  | 
    
    
    203  | 
     | 
     | 
    	l2tpd_add_ctrl(_l2tpd, _this);  | 
    
    
    204  | 
     | 
     | 
    	return 0;  | 
    
    
    205  | 
     | 
     | 
    fail:  | 
    
    
    206  | 
     | 
     | 
    	l2tp_ctrl_stop(_this, 0);  | 
    
    
    207  | 
     | 
     | 
    	return -1;  | 
    
    
    208  | 
     | 
     | 
    }  | 
    
    
    209  | 
     | 
     | 
     | 
    
    
    210  | 
     | 
     | 
    /*  | 
    
    
    211  | 
     | 
     | 
     * setup {@link ::_l2tp_ctrl L2TP LNS control connection} instance | 
    
    
    212  | 
     | 
     | 
     */  | 
    
    
    213  | 
     | 
     | 
    static void  | 
    
    
    214  | 
     | 
     | 
    l2tp_ctrl_reload(l2tp_ctrl *_this)  | 
    
    
    215  | 
     | 
     | 
    { | 
    
    
    216  | 
     | 
     | 
    	_this->data_use_seq = L2TP_CTRL_CONF(_this)->data_use_seq;  | 
    
    
    217  | 
     | 
     | 
    	if (L2TP_CTRL_CONF(_this)->hello_interval != 0)  | 
    
    
    218  | 
     | 
     | 
    		_this->hello_interval =  L2TP_CTRL_CONF(_this)->hello_interval;  | 
    
    
    219  | 
     | 
     | 
    	if (L2TP_CTRL_CONF(_this)->hello_timeout != 0)  | 
    
    
    220  | 
     | 
     | 
    		_this->hello_timeout = L2TP_CTRL_CONF(_this)->hello_timeout;  | 
    
    
    221  | 
     | 
     | 
    }  | 
    
    
    222  | 
     | 
     | 
     | 
    
    
    223  | 
     | 
     | 
    /*  | 
    
    
    224  | 
     | 
     | 
     * free {@link ::_l2tp_ctrl L2TP LNS control connection} instance | 
    
    
    225  | 
     | 
     | 
     */  | 
    
    
    226  | 
     | 
     | 
    void  | 
    
    
    227  | 
     | 
     | 
    l2tp_ctrl_destroy(l2tp_ctrl *_this)  | 
    
    
    228  | 
     | 
     | 
    { | 
    
    
    229  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(_this != NULL);  | 
    
    
    230  | 
     | 
     | 
    #if defined(USE_LIBSOCKUTIL) || defined(USE_SA_COOKIE)  | 
    
    
    231  | 
     | 
     | 
    	free(_this->sa_cookie);  | 
    
    
    232  | 
     | 
     | 
    #endif  | 
    
    
    233  | 
     | 
     | 
    	free(_this);  | 
    
    
    234  | 
     | 
     | 
    }  | 
    
    
    235  | 
     | 
     | 
     | 
    
    
    236  | 
     | 
     | 
    /*  | 
    
    
    237  | 
     | 
     | 
     * nortify disconnection to peer  | 
    
    
    238  | 
     | 
     | 
     *  | 
    
    
    239  | 
     | 
     | 
     * @return 	0: all CDN and StopCCN have been sent.  | 
    
    
    240  | 
     | 
     | 
     *		N: if the remaining calls which still not sent CDN exist,  | 
    
    
    241  | 
     | 
     | 
     *		   return # of the calls.  | 
    
    
    242  | 
     | 
     | 
     *		-1: when try to send of StopCCN failed.  | 
    
    
    243  | 
     | 
     | 
     */  | 
    
    
    244  | 
     | 
     | 
    static int  | 
    
    
    245  | 
     | 
     | 
    l2tp_ctrl_send_disconnect_notify(l2tp_ctrl *_this)  | 
    
    
    246  | 
     | 
     | 
    { | 
    
    
    247  | 
     | 
     | 
    	int ncalls;  | 
    
    
    248  | 
     | 
     | 
     | 
    
    
    249  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(_this != NULL)  | 
    
    
    250  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(_this->state == L2TP_CTRL_STATE_ESTABLISHED ||  | 
    
    
    251  | 
     | 
     | 
    	    _this->state == L2TP_CTRL_STATE_CLEANUP_WAIT);  | 
    
    
    252  | 
     | 
     | 
     | 
    
    
    253  | 
     | 
     | 
    	/* this control is not actively closing or StopCCN have been sent */  | 
    
    
    254  | 
     | 
     | 
    	if (_this->active_closing == 0)  | 
    
    
    255  | 
     | 
     | 
    		return 0;  | 
    
    
    256  | 
     | 
     | 
     | 
    
    
    257  | 
     | 
     | 
    	/* Send CDN all Calls */  | 
    
    
    258  | 
     | 
     | 
    	ncalls = 0;  | 
    
    
    259  | 
     | 
     | 
    	if (slist_length(&_this->call_list) != 0) { | 
    
    
    260  | 
     | 
     | 
    		ncalls = l2tp_ctrl_disconnect_all_calls(_this, 0);  | 
    
    
    261  | 
     | 
     | 
    		if (ncalls > 0) { | 
    
    
    262  | 
     | 
     | 
    			/*  | 
    
    
    263  | 
     | 
     | 
    			 * Call the function again to check whether the  | 
    
    
    264  | 
     | 
     | 
    			 * sending window is fulled.  In case ncalls == 0,  | 
    
    
    265  | 
     | 
     | 
    			 * it means we've sent CDN for all calls.  | 
    
    
    266  | 
     | 
     | 
    			 */  | 
    
    
    267  | 
     | 
     | 
    			ncalls = l2tp_ctrl_disconnect_all_calls(_this, 0);  | 
    
    
    268  | 
     | 
     | 
    		}  | 
    
    
    269  | 
     | 
     | 
    	}  | 
    
    
    270  | 
     | 
     | 
    	if (ncalls > 0)  | 
    
    
    271  | 
     | 
     | 
    		return ncalls;  | 
    
    
    272  | 
     | 
     | 
     | 
    
    
    273  | 
     | 
     | 
    	if (l2tp_ctrl_send_StopCCN(_this, _this->active_closing) != 0)  | 
    
    
    274  | 
     | 
     | 
    		return -1;  | 
    
    
    275  | 
     | 
     | 
    	_this->active_closing = 0;  | 
    
    
    276  | 
     | 
     | 
     | 
    
    
    277  | 
     | 
     | 
    	return 0;  | 
    
    
    278  | 
     | 
     | 
    }  | 
    
    
    279  | 
     | 
     | 
     | 
    
    
    280  | 
     | 
     | 
    /*  | 
    
    
    281  | 
     | 
     | 
     * Terminate the control connection  | 
    
    
    282  | 
     | 
     | 
     *  | 
    
    
    283  | 
     | 
     | 
     * <p>  | 
    
    
    284  | 
     | 
     | 
     * please specify an appropriate value to result( >0 ) for  | 
    
    
    285  | 
     | 
     | 
     * StopCCN ResultCode AVP, when to sent Active Close (which  | 
    
    
    286  | 
     | 
     | 
     * require StopCCN sent).</p>  | 
    
    
    287  | 
     | 
     | 
     * <p>  | 
    
    
    288  | 
     | 
     | 
     * When the return value of this function is zero, the _this  | 
    
    
    289  | 
     | 
     | 
     * is already released. The lt2p_ctrl process that was bound to it  | 
    
    
    290  | 
     | 
     | 
     * could not contine.  | 
    
    
    291  | 
     | 
     | 
     * When the return value of this function is one, the timer  | 
    
    
    292  | 
     | 
     | 
     * is reset.</p>  | 
    
    
    293  | 
     | 
     | 
     *  | 
    
    
    294  | 
     | 
     | 
     * @return	return 0 if terminate process was completed.  | 
    
    
    295  | 
     | 
     | 
     */  | 
    
    
    296  | 
     | 
     | 
    int  | 
    
    
    297  | 
     | 
     | 
    l2tp_ctrl_stop(l2tp_ctrl *_this, int result)  | 
    
    
    298  | 
     | 
     | 
    { | 
    
    
    299  | 
     | 
     | 
    	int i;  | 
    
    
    300  | 
     | 
     | 
    	l2tpd *_l2tpd;  | 
    
    
    301  | 
     | 
     | 
     | 
    
    
    302  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(_this != NULL);  | 
    
    
    303  | 
     | 
     | 
     | 
    
    
    304  | 
     | 
     | 
    	switch (_this->state) { | 
    
    
    305  | 
     | 
     | 
    	case L2TP_CTRL_STATE_ESTABLISHED:  | 
    
    
    306  | 
     | 
     | 
    		_this->state = L2TP_CTRL_STATE_CLEANUP_WAIT;  | 
    
    
    307  | 
     | 
     | 
    		if (result > 0) { | 
    
    
    308  | 
     | 
     | 
    			_this->active_closing = result;  | 
    
    
    309  | 
     | 
     | 
    			l2tp_ctrl_send_disconnect_notify(_this);  | 
    
    
    310  | 
     | 
     | 
    			break;  | 
    
    
    311  | 
     | 
     | 
    		}  | 
    
    
    312  | 
     | 
     | 
    		goto cleanup;  | 
    
    
    313  | 
     | 
     | 
    	default:  | 
    
    
    314  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_DEBUG, "%s() unexpected state=%s",  | 
    
    
    315  | 
     | 
     | 
    		    __func__, l2tp_ctrl_state_string(_this));  | 
    
    
    316  | 
     | 
     | 
    		/* FALLTHROUGH */  | 
    
    
    317  | 
     | 
     | 
    	case L2TP_CTRL_STATE_WAIT_CTL_CONN:  | 
    
    
    318  | 
     | 
     | 
    		/* FALLTHROUGH */  | 
    
    
    319  | 
     | 
     | 
    	case L2TP_CTRL_STATE_CLEANUP_WAIT:  | 
    
    
    320  | 
     | 
     | 
    cleanup:  | 
    
    
    321  | 
     | 
     | 
    		if (slist_length(&_this->call_list) != 0) { | 
    
    
    322  | 
     | 
     | 
    			if (l2tp_ctrl_disconnect_all_calls(_this, 1) > 0)  | 
    
    
    323  | 
     | 
     | 
    				break;  | 
    
    
    324  | 
     | 
     | 
    		}  | 
    
    
    325  | 
     | 
     | 
    #if 0  | 
    
    
    326  | 
     | 
     | 
    		if (L2TP_CTRL_CONF(_this)e_ipsec_sa != 0)  | 
    
    
    327  | 
     | 
     | 
    			l2tp_ctrl_purge_ipsec_sa(_this);  | 
    
    
    328  | 
     | 
     | 
    #endif  | 
    
    
    329  | 
     | 
     | 
     | 
    
    
    330  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_NOTICE, "logtype=Finished");  | 
    
    
    331  | 
     | 
     | 
     | 
    
    
    332  | 
     | 
     | 
    		evtimer_del(&_this->ev_timeout);  | 
    
    
    333  | 
     | 
     | 
     | 
    
    
    334  | 
     | 
     | 
    		/* free send buffer */  | 
    
    
    335  | 
     | 
     | 
    		if (_this->snd_buffers != NULL) { | 
    
    
    336  | 
     | 
     | 
    			for (i = 0; i < _this->winsz; i++)  | 
    
    
    337  | 
     | 
     | 
    				bytebuffer_destroy(_this->snd_buffers[i]);  | 
    
    
    338  | 
     | 
     | 
    			free(_this->snd_buffers);  | 
    
    
    339  | 
     | 
     | 
    			_this->snd_buffers = NULL;  | 
    
    
    340  | 
     | 
     | 
    		}  | 
    
    
    341  | 
     | 
     | 
    		if (_this->zlb_buffer != NULL) { | 
    
    
    342  | 
     | 
     | 
    			bytebuffer_destroy(_this->zlb_buffer);  | 
    
    
    343  | 
     | 
     | 
    			_this->zlb_buffer = NULL;  | 
    
    
    344  | 
     | 
     | 
    		}  | 
    
    
    345  | 
     | 
     | 
     | 
    
    
    346  | 
     | 
     | 
    		/* free l2tp_call */  | 
    
    
    347  | 
     | 
     | 
    		l2tp_ctrl_destroy_all_calls(_this);  | 
    
    
    348  | 
     | 
     | 
    		slist_fini(&_this->call_list);  | 
    
    
    349  | 
     | 
     | 
     | 
    
    
    350  | 
     | 
     | 
    		l2tpd_remove_ctrl(_this->l2tpd, _this->tunnel_id);  | 
    
    
    351  | 
     | 
     | 
     | 
    
    
    352  | 
     | 
     | 
    		_l2tpd = _this->l2tpd;  | 
    
    
    353  | 
     | 
     | 
    		l2tp_ctrl_destroy(_this);  | 
    
    
    354  | 
     | 
     | 
     | 
    
    
    355  | 
     | 
     | 
    		l2tpd_ctrl_finished_notify(_l2tpd);  | 
    
    
    356  | 
     | 
     | 
    		return 0;	/* stopped */  | 
    
    
    357  | 
     | 
     | 
    	}  | 
    
    
    358  | 
     | 
     | 
    	l2tp_ctrl_reset_timeout(_this);  | 
    
    
    359  | 
     | 
     | 
     | 
    
    
    360  | 
     | 
     | 
    	return 1;  | 
    
    
    361  | 
     | 
     | 
    }  | 
    
    
    362  | 
     | 
     | 
     | 
    
    
    363  | 
     | 
     | 
    #if 0  | 
    
    
    364  | 
     | 
     | 
    /** Delete the IPsec SA for disconnection */  | 
    
    
    365  | 
     | 
     | 
    static void  | 
    
    
    366  | 
     | 
     | 
    l2tp_ctrl_purge_ipsec_sa(l2tp_ctrl *_this)  | 
    
    
    367  | 
     | 
     | 
    { | 
    
    
    368  | 
     | 
     | 
    	int is_natt, proto;  | 
    
    
    369  | 
     | 
     | 
    	struct sockaddr_storage peer, sock;  | 
    
    
    370  | 
     | 
     | 
    	hash_link *hl;  | 
    
    
    371  | 
     | 
     | 
    #ifdef USE_LIBSOCKUTIL  | 
    
    
    372  | 
     | 
     | 
    	struct in_ipsec_sa_cookie *ipsec_sa_cookie;  | 
    
    
    373  | 
     | 
     | 
    #endif  | 
    
    
    374  | 
     | 
     | 
    	l2tp_ctrl *anot;  | 
    
    
    375  | 
     | 
     | 
     | 
    
    
    376  | 
     | 
     | 
    	/*  | 
    
    
    377  | 
     | 
     | 
    	 * Search another tunnel that uses the same IPsec SA  | 
    
    
    378  | 
     | 
     | 
    	 * by lineer.  | 
    
    
    379  | 
     | 
     | 
    	 */  | 
    
    
    380  | 
     | 
     | 
    	for (hl = hash_first(_this->l2tpd->ctrl_map);  | 
    
    
    381  | 
     | 
     | 
    	    hl != NULL; hl = hash_next(_this->l2tpd->ctrl_map)) { | 
    
    
    382  | 
     | 
     | 
    		anot = hl->item;  | 
    
    
    383  | 
     | 
     | 
    		if (anot == _this)  | 
    
    
    384  | 
     | 
     | 
    			continue;  | 
    
    
    385  | 
     | 
     | 
     | 
    
    
    386  | 
     | 
     | 
    		if (_this->peer.ss_family != anot->peer.ss_family)  | 
    
    
    387  | 
     | 
     | 
    			continue;  | 
    
    
    388  | 
     | 
     | 
    		if (_this->peer.ss_family == AF_INET) { | 
    
    
    389  | 
     | 
     | 
    			if (SIN(&_this->peer)->sin_addr.s_addr !=  | 
    
    
    390  | 
     | 
     | 
    			    SIN(&anot->peer)->sin_addr.s_addr)  | 
    
    
    391  | 
     | 
     | 
    				continue;  | 
    
    
    392  | 
     | 
     | 
    		} else if (_this->peer.ss_family == AF_INET6) { | 
    
    
    393  | 
     | 
     | 
    			if (!IN6_ARE_ADDR_EQUAL(  | 
    
    
    394  | 
     | 
     | 
    			    &(SIN6(&_this->peer)->sin6_addr),  | 
    
    
    395  | 
     | 
     | 
    			    &(SIN6(&anot->peer)->sin6_addr)))  | 
    
    
    396  | 
     | 
     | 
    				continue;  | 
    
    
    397  | 
     | 
     | 
    		}  | 
    
    
    398  | 
     | 
     | 
    #ifdef USE_LIBSOCKUTIL  | 
    
    
    399  | 
     | 
     | 
    		if (_this->sa_cookie != NULL && anot->sa_cookie != NULL) { | 
    
    
    400  | 
     | 
     | 
    			/* Both tunnels belong the same NAT box.  */  | 
    
    
    401  | 
     | 
     | 
     | 
    
    
    402  | 
     | 
     | 
    			if (memcmp(_this->sa_cookie, anot->sa_cookie,  | 
    
    
    403  | 
     | 
     | 
    			    sizeof(struct in_ipsec_sa_cookie)) != 0)  | 
    
    
    404  | 
     | 
     | 
    				/* Different hosts behind the NAT box.  */  | 
    
    
    405  | 
     | 
     | 
    				continue;  | 
    
    
    406  | 
     | 
     | 
     | 
    
    
    407  | 
     | 
     | 
    			/* The SA is shared by another tunnels by one host. */  | 
    
    
    408  | 
     | 
     | 
    			return;	/* don't purge the sa */  | 
    
    
    409  | 
     | 
     | 
     | 
    
    
    410  | 
     | 
     | 
    		} else if (_this->sa_cookie != NULL || anot->sa_cookie != NULL)  | 
    
    
    411  | 
     | 
     | 
    			/* Only one is behind the NAT */  | 
    
    
    412  | 
     | 
     | 
    			continue;  | 
    
    
    413  | 
     | 
     | 
    #endif  | 
    
    
    414  | 
     | 
     | 
    		return;	/* don't purge the sa */  | 
    
    
    415  | 
     | 
     | 
    	}  | 
    
    
    416  | 
     | 
     | 
     | 
    
    
    417  | 
     | 
     | 
    #if defined(USE_LIBSOCKUTIL)  && defined(IP_IPSEC_SA_COOKIE)  | 
    
    
    418  | 
     | 
     | 
    	is_natt = (_this->sa_cookie != NULL)? 1 : 0;  | 
    
    
    419  | 
     | 
     | 
    #else  | 
    
    
    420  | 
     | 
     | 
    	is_natt = 0;  | 
    
    
    421  | 
     | 
     | 
    #endif  | 
    
    
    422  | 
     | 
     | 
    	proto = 0;  | 
    
    
    423  | 
     | 
     | 
    	memcpy(&peer, &_this->peer, _this->peer.ss_len);  | 
    
    
    424  | 
     | 
     | 
    	memcpy(&sock, &_this->sock, _this->sock.ss_len);  | 
    
    
    425  | 
     | 
     | 
    	if (!is_natt)  | 
    
    
    426  | 
     | 
     | 
    		SIN(&peer)->sin_port = SIN(&sock)->sin_port = 0;  | 
    
    
    427  | 
     | 
     | 
    #if defined(USE_LIBSOCKUTIL)  && defined(IP_IPSEC_SA_COOKIE)  | 
    
    
    428  | 
     | 
     | 
    	else { | 
    
    
    429  | 
     | 
     | 
    		ipsec_sa_cookie = _this->sa_cookie;  | 
    
    
    430  | 
     | 
     | 
    		SIN(&peer)->sin_port = ipsec_sa_cookie->remote_port;  | 
    
    
    431  | 
     | 
     | 
    		SIN(&sock)->sin_port = ipsec_sa_cookie->local_port;  | 
    
    
    432  | 
     | 
     | 
    #if 1  | 
    
    
    433  | 
     | 
     | 
    		/*  | 
    
    
    434  | 
     | 
     | 
    		 * XXX: As RFC 2367, protocol sould be specified if the port  | 
    
    
    435  | 
     | 
     | 
    		 * XXX: number is non-zero.  | 
    
    
    436  | 
     | 
     | 
    		 */  | 
    
    
    437  | 
     | 
     | 
    		proto = 0;  | 
    
    
    438  | 
     | 
     | 
    #else  | 
    
    
    439  | 
     | 
     | 
    		proto = IPPROTO_UDP;  | 
    
    
    440  | 
     | 
     | 
    #endif  | 
    
    
    441  | 
     | 
     | 
    	}  | 
    
    
    442  | 
     | 
     | 
    #endif  | 
    
    
    443  | 
     | 
     | 
    	if (ipsec_util_purge_transport_sa((struct sockaddr *)&peer,  | 
    
    
    444  | 
     | 
     | 
    	    (struct sockaddr *)&sock, proto, IPSEC_UTIL_DIRECTION_BOTH) != 0)  | 
    
    
    445  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_NOTICE, "failed to purge IPSec SA");  | 
    
    
    446  | 
     | 
     | 
    }  | 
    
    
    447  | 
     | 
     | 
    #endif  | 
    
    
    448  | 
     | 
     | 
     | 
    
    
    449  | 
     | 
     | 
    /* timeout processing */  | 
    
    
    450  | 
     | 
     | 
    static void  | 
    
    
    451  | 
     | 
     | 
    l2tp_ctrl_timeout(int fd, short evtype, void *ctx)  | 
    
    
    452  | 
     | 
     | 
    { | 
    
    
    453  | 
     | 
     | 
    	int next_timeout, need_resend;  | 
    
    
    454  | 
     | 
     | 
    	time_t curr_time;  | 
    
    
    455  | 
     | 
     | 
    	l2tp_ctrl *_this;  | 
    
    
    456  | 
     | 
     | 
    	l2tp_call *call;  | 
    
    
    457  | 
     | 
     | 
     | 
    
    
    458  | 
     | 
     | 
    	/*  | 
    
    
    459  | 
     | 
     | 
    	 * the timer must be reset, when leave this function.  | 
    
    
    460  | 
     | 
     | 
    	 * MEMO: l2tp_ctrl_stop() will reset the timer in it.  | 
    
    
    461  | 
     | 
     | 
    	 * and please remember that the l2tp_ctrl_stop() may free _this.  | 
    
    
    462  | 
     | 
     | 
    	 */  | 
    
    
    463  | 
     | 
     | 
    	_this = ctx;  | 
    
    
    464  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(_this != NULL);  | 
    
    
    465  | 
     | 
     | 
     | 
    
    
    466  | 
     | 
     | 
    	curr_time = get_monosec();  | 
    
    
    467  | 
     | 
     | 
     | 
    
    
    468  | 
     | 
     | 
    	next_timeout = 2;  | 
    
    
    469  | 
     | 
     | 
    	need_resend = 0;  | 
    
    
    470  | 
     | 
     | 
     | 
    
    
    471  | 
     | 
     | 
    	if (l2tp_ctrl_txwin_size(_this) > 0)  { | 
    
    
    472  | 
     | 
     | 
    		if (_this->state == L2TP_CTRL_STATE_ESTABLISHED) { | 
    
    
    473  | 
     | 
     | 
    			if (_this->hello_wait_ack != 0) { | 
    
    
    474  | 
     | 
     | 
    				/* wait Hello reply */  | 
    
    
    475  | 
     | 
     | 
    				if (curr_time - _this->hello_io_time >=  | 
    
    
    476  | 
     | 
     | 
    				    _this->hello_timeout) { | 
    
    
    477  | 
     | 
     | 
    					l2tp_ctrl_log(_this, LOG_NOTICE,  | 
    
    
    478  | 
     | 
     | 
    					    "timeout waiting ack for hello "  | 
    
    
    479  | 
     | 
     | 
    					    "packets.");  | 
    
    
    480  | 
     | 
     | 
    					l2tp_ctrl_stop(_this,  | 
    
    
    481  | 
     | 
     | 
    					    L2TP_STOP_CCN_RCODE_GENERAL);  | 
    
    
    482  | 
     | 
     | 
    					return;  | 
    
    
    483  | 
     | 
     | 
    				}  | 
    
    
    484  | 
     | 
     | 
    			}  | 
    
    
    485  | 
     | 
     | 
    		} else if (curr_time - _this->last_snd_ctrl >=  | 
    
    
    486  | 
     | 
     | 
    		    L2TP_CTRL_CTRL_PKT_TIMEOUT) { | 
    
    
    487  | 
     | 
     | 
    			l2tp_ctrl_log(_this, LOG_NOTICE,  | 
    
    
    488  | 
     | 
     | 
    			    "timeout waiting ack for ctrl packets.");  | 
    
    
    489  | 
     | 
     | 
    			l2tp_ctrl_stop(_this,  | 
    
    
    490  | 
     | 
     | 
    			    L2TP_STOP_CCN_RCODE_GENERAL);  | 
    
    
    491  | 
     | 
     | 
    			return;  | 
    
    
    492  | 
     | 
     | 
    		}  | 
    
    
    493  | 
     | 
     | 
    		need_resend = 1;  | 
    
    
    494  | 
     | 
     | 
    	} else { | 
    
    
    495  | 
     | 
     | 
    		for (slist_itr_first(&_this->call_list);  | 
    
    
    496  | 
     | 
     | 
    		    slist_itr_has_next(&_this->call_list);) { | 
    
    
    497  | 
     | 
     | 
    			call = slist_itr_next(&_this->call_list);  | 
    
    
    498  | 
     | 
     | 
    			if (call->state == L2TP_CALL_STATE_CLEANUP_WAIT) { | 
    
    
    499  | 
     | 
     | 
    				l2tp_call_destroy(call, 1);  | 
    
    
    500  | 
     | 
     | 
    				slist_itr_remove(&_this->call_list);  | 
    
    
    501  | 
     | 
     | 
    			}  | 
    
    
    502  | 
     | 
     | 
    		}  | 
    
    
    503  | 
     | 
     | 
    	}  | 
    
    
    504  | 
     | 
     | 
     | 
    
    
    505  | 
     | 
     | 
    	switch (_this->state) { | 
    
    
    506  | 
     | 
     | 
    	case L2TP_CTRL_STATE_IDLE:  | 
    
    
    507  | 
     | 
     | 
    		/*  | 
    
    
    508  | 
     | 
     | 
    		 * idle:  | 
    
    
    509  | 
     | 
     | 
    		 * XXX: never happen in current implementation  | 
    
    
    510  | 
     | 
     | 
    		 */  | 
    
    
    511  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_ERR,  | 
    
    
    512  | 
     | 
     | 
    		    "Internal error, timeout on illegal state=idle");  | 
    
    
    513  | 
     | 
     | 
    		l2tp_ctrl_stop(_this, L2TP_STOP_CCN_RCODE_GENERAL);  | 
    
    
    514  | 
     | 
     | 
    		break;  | 
    
    
    515  | 
     | 
     | 
    	case L2TP_CTRL_STATE_WAIT_CTL_CONN:  | 
    
    
    516  | 
     | 
     | 
    		/*  | 
    
    
    517  | 
     | 
     | 
    		 * wait-ctrl-conn:  | 
    
    
    518  | 
     | 
     | 
    		 * 	if there is no ack for SCCRP, the peer will  | 
    
    
    519  | 
     | 
     | 
    		 * 	resend SCCRQ. however this implementation can  | 
    
    
    520  | 
     | 
     | 
    		 *	not recognize that the SCCRQ was resent or not.  | 
    
    
    521  | 
     | 
     | 
    		 *	Therefore, never resent from this side.  | 
    
    
    522  | 
     | 
     | 
    		 */  | 
    
    
    523  | 
     | 
     | 
    		need_resend = 0;  | 
    
    
    524  | 
     | 
     | 
    		break;  | 
    
    
    525  | 
     | 
     | 
    	case L2TP_CTRL_STATE_ESTABLISHED:  | 
    
    
    526  | 
     | 
     | 
    		if (slist_length(&_this->call_list) == 0 &&  | 
    
    
    527  | 
     | 
     | 
    		    curr_time - _this->last_snd_ctrl >=  | 
    
    
    528  | 
     | 
     | 
    			    L2TP_CTRL_WAIT_CALL_TIMEOUT) { | 
    
    
    529  | 
     | 
     | 
    			if (_this->ncalls == 0)  | 
    
    
    530  | 
     | 
     | 
    				/* fail to receive first call */  | 
    
    
    531  | 
     | 
     | 
    				l2tp_ctrl_log(_this, LOG_WARNING,  | 
    
    
    532  | 
     | 
     | 
    				    "timeout waiting call");  | 
    
    
    533  | 
     | 
     | 
    			l2tp_ctrl_stop(_this,  | 
    
    
    534  | 
     | 
     | 
    			    L2TP_STOP_CCN_RCODE_GENERAL);  | 
    
    
    535  | 
     | 
     | 
    			return;  | 
    
    
    536  | 
     | 
     | 
    		}  | 
    
    
    537  | 
     | 
     | 
    		if (_this->hello_wait_ack == 0 && _this->hello_interval > 0) { | 
    
    
    538  | 
     | 
     | 
    			/* send Hello */  | 
    
    
    539  | 
     | 
     | 
    			if (curr_time - _this->hello_interval >=  | 
    
    
    540  | 
     | 
     | 
    			    _this->hello_io_time) { | 
    
    
    541  | 
     | 
     | 
    				if (l2tp_ctrl_send_HELLO(_this) == 0)  | 
    
    
    542  | 
     | 
     | 
    					/* success */  | 
    
    
    543  | 
     | 
     | 
    					_this->hello_wait_ack = 1;  | 
    
    
    544  | 
     | 
     | 
    				_this->hello_io_time = curr_time;  | 
    
    
    545  | 
     | 
     | 
    				need_resend = 0;  | 
    
    
    546  | 
     | 
     | 
    			}  | 
    
    
    547  | 
     | 
     | 
    		}  | 
    
    
    548  | 
     | 
     | 
    		break;  | 
    
    
    549  | 
     | 
     | 
    	case L2TP_CTRL_STATE_CLEANUP_WAIT:  | 
    
    
    550  | 
     | 
     | 
    		if (curr_time - _this->last_snd_ctrl >=  | 
    
    
    551  | 
     | 
     | 
    		    L2TP_CTRL_CLEANUP_WAIT_TIME) { | 
    
    
    552  | 
     | 
     | 
    			l2tp_ctrl_log(_this, LOG_NOTICE,  | 
    
    
    553  | 
     | 
     | 
    			    "Cleanup timeout state=%d", _this->state);  | 
    
    
    554  | 
     | 
     | 
    			l2tp_ctrl_stop(_this, 0);  | 
    
    
    555  | 
     | 
     | 
    			return;  | 
    
    
    556  | 
     | 
     | 
    		}  | 
    
    
    557  | 
     | 
     | 
    		if (_this->active_closing != 0)  | 
    
    
    558  | 
     | 
     | 
    			l2tp_ctrl_send_disconnect_notify(_this);  | 
    
    
    559  | 
     | 
     | 
    		break;  | 
    
    
    560  | 
     | 
     | 
    	default:  | 
    
    
    561  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_ERR,  | 
    
    
    562  | 
     | 
     | 
    		    "Internal error, timeout on illegal state=%d",  | 
    
    
    563  | 
     | 
     | 
    			_this->state);  | 
    
    
    564  | 
     | 
     | 
    		l2tp_ctrl_stop(_this, L2TP_STOP_CCN_RCODE_GENERAL);  | 
    
    
    565  | 
     | 
     | 
    		return;  | 
    
    
    566  | 
     | 
     | 
    	}  | 
    
    
    567  | 
     | 
     | 
    	/* resend if required */  | 
    
    
    568  | 
     | 
     | 
    	if (need_resend)  | 
    
    
    569  | 
     | 
     | 
    		l2tp_ctrl_resend_una_packets(_this);  | 
    
    
    570  | 
     | 
     | 
    	l2tp_ctrl_reset_timeout(_this);  | 
    
    
    571  | 
     | 
     | 
    }  | 
    
    
    572  | 
     | 
     | 
     | 
    
    
    573  | 
     | 
     | 
    int  | 
    
    
    574  | 
     | 
     | 
    l2tp_ctrl_send(l2tp_ctrl *_this, const void *msg, int len)  | 
    
    
    575  | 
     | 
     | 
    { | 
    
    
    576  | 
     | 
     | 
    	int rval;  | 
    
    
    577  | 
     | 
     | 
     | 
    
    
    578  | 
     | 
     | 
    #ifdef USE_LIBSOCKUTIL  | 
    
    
    579  | 
     | 
     | 
    	if (_this->sa_cookie != NULL)  | 
    
    
    580  | 
     | 
     | 
    		rval = sendfromto_nat_t(LISTENER_SOCK(_this), msg, len, 0,  | 
    
    
    581  | 
     | 
     | 
    		    (struct sockaddr *)&_this->sock,  | 
    
    
    582  | 
     | 
     | 
    		    (struct sockaddr *)&_this->peer, _this->sa_cookie);  | 
    
    
    583  | 
     | 
     | 
    	else  | 
    
    
    584  | 
     | 
     | 
    		rval = sendfromto(LISTENER_SOCK(_this), msg, len, 0,  | 
    
    
    585  | 
     | 
     | 
    		    (struct sockaddr *)&_this->sock,  | 
    
    
    586  | 
     | 
     | 
    		    (struct sockaddr *)&_this->peer);  | 
    
    
    587  | 
     | 
     | 
    #else  | 
    
    
    588  | 
     | 
     | 
    #ifdef USE_SA_COOKIE  | 
    
    
    589  | 
     | 
     | 
    	if (_this->sa_cookie != NULL)  | 
    
    
    590  | 
     | 
     | 
    		rval = sendto_nat_t(LISTENER_SOCK(_this), msg, len, 0,  | 
    
    
    591  | 
     | 
     | 
    		    (struct sockaddr *)&_this->peer, _this->peer.ss_len,  | 
    
    
    592  | 
     | 
     | 
    		    _this->sa_cookie);  | 
    
    
    593  | 
     | 
     | 
    	else  | 
    
    
    594  | 
     | 
     | 
    #endif  | 
    
    
    595  | 
     | 
     | 
    	rval = sendto(LISTENER_SOCK(_this), msg, len, 0,  | 
    
    
    596  | 
     | 
     | 
    	    (struct sockaddr *)&_this->peer, _this->peer.ss_len);  | 
    
    
    597  | 
     | 
     | 
    #endif  | 
    
    
    598  | 
     | 
     | 
    	return rval;  | 
    
    
    599  | 
     | 
     | 
    }  | 
    
    
    600  | 
     | 
     | 
     | 
    
    
    601  | 
     | 
     | 
    /* resend una packets */  | 
    
    
    602  | 
     | 
     | 
    static int  | 
    
    
    603  | 
     | 
     | 
    l2tp_ctrl_resend_una_packets(l2tp_ctrl *_this)  | 
    
    
    604  | 
     | 
     | 
    { | 
    
    
    605  | 
     | 
     | 
    	uint16_t seq;  | 
    
    
    606  | 
     | 
     | 
    	bytebuffer *bytebuf;  | 
    
    
    607  | 
     | 
     | 
    	struct l2tp_header *header;  | 
    
    
    608  | 
     | 
     | 
    	int nsend;  | 
    
    
    609  | 
     | 
     | 
     | 
    
    
    610  | 
     | 
     | 
    	nsend = 0;  | 
    
    
    611  | 
     | 
     | 
    	for (seq = _this->snd_una; SEQ_LT(seq, _this->snd_nxt); seq++) { | 
    
    
    612  | 
     | 
     | 
    		bytebuf = _this->snd_buffers[seq % _this->winsz];  | 
    
    
    613  | 
     | 
     | 
    		header = bytebuffer_pointer(bytebuf);  | 
    
    
    614  | 
     | 
     | 
    		header->nr = htons(_this->rcv_nxt);  | 
    
    
    615  | 
     | 
     | 
    #ifdef L2TP_CTRL_DEBUG  | 
    
    
    616  | 
     | 
     | 
    		if (debuglevel >= 3) { | 
    
    
    617  | 
     | 
     | 
    			l2tp_ctrl_log(_this, DEBUG_LEVEL_3, "RESEND seq=%u",  | 
    
    
    618  | 
     | 
     | 
    			    ntohs(header->ns));  | 
    
    
    619  | 
     | 
     | 
    			show_hd(debug_get_debugfp(),  | 
    
    
    620  | 
     | 
     | 
    			    bytebuffer_pointer(bytebuf),  | 
    
    
    621  | 
     | 
     | 
    			    bytebuffer_remaining(bytebuf));  | 
    
    
    622  | 
     | 
     | 
    		}  | 
    
    
    623  | 
     | 
     | 
    #endif  | 
    
    
    624  | 
     | 
     | 
    		if (l2tp_ctrl_send(_this, bytebuffer_pointer(bytebuf),  | 
    
    
    625  | 
     | 
     | 
    		    bytebuffer_remaining(bytebuf)) < 0) { | 
    
    
    626  | 
     | 
     | 
    			l2tp_ctrl_log(_this, LOG_ERR,  | 
    
    
    627  | 
     | 
     | 
    			    "sendto() failed in %s: %m", __func__);  | 
    
    
    628  | 
     | 
     | 
    			return -1;  | 
    
    
    629  | 
     | 
     | 
    		}  | 
    
    
    630  | 
     | 
     | 
    		nsend++;  | 
    
    
    631  | 
     | 
     | 
    	}  | 
    
    
    632  | 
     | 
     | 
    	return nsend;  | 
    
    
    633  | 
     | 
     | 
    }  | 
    
    
    634  | 
     | 
     | 
     | 
    
    
    635  | 
     | 
     | 
    /* free all calls */  | 
    
    
    636  | 
     | 
     | 
    static void  | 
    
    
    637  | 
     | 
     | 
    l2tp_ctrl_destroy_all_calls(l2tp_ctrl *_this)  | 
    
    
    638  | 
     | 
     | 
    { | 
    
    
    639  | 
     | 
     | 
    	l2tp_call *call;  | 
    
    
    640  | 
     | 
     | 
     | 
    
    
    641  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(_this != NULL);  | 
    
    
    642  | 
     | 
     | 
     | 
    
    
    643  | 
     | 
     | 
    	while ((call = slist_remove_first(&_this->call_list)) != NULL)  | 
    
    
    644  | 
     | 
     | 
    		l2tp_call_destroy(call, 1);  | 
    
    
    645  | 
     | 
     | 
    }  | 
    
    
    646  | 
     | 
     | 
     | 
    
    
    647  | 
     | 
     | 
     | 
    
    
    648  | 
     | 
     | 
    /* disconnect all calls on the control context  | 
    
    
    649  | 
     | 
     | 
     * @return return # of calls that is not waiting cleanup.  | 
    
    
    650  | 
     | 
     | 
     */  | 
    
    
    651  | 
     | 
     | 
    static int  | 
    
    
    652  | 
     | 
     | 
    l2tp_ctrl_disconnect_all_calls(l2tp_ctrl *_this, int drop)  | 
    
    
    653  | 
     | 
     | 
    { | 
    
    
    654  | 
     | 
     | 
    	int i, len, ncalls;  | 
    
    
    655  | 
     | 
     | 
    	l2tp_call *call;  | 
    
    
    656  | 
     | 
     | 
     | 
    
    
    657  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(_this != NULL);  | 
    
    
    658  | 
     | 
     | 
     | 
    
    
    659  | 
     | 
     | 
    	ncalls = 0;  | 
    
    
    660  | 
     | 
     | 
    	len = slist_length(&_this->call_list);  | 
    
    
    661  | 
     | 
     | 
    	for (i = 0; i < len; i++) { | 
    
    
    662  | 
     | 
     | 
    		call = slist_get(&_this->call_list, i);  | 
    
    
    663  | 
     | 
     | 
    		if (call->state != L2TP_CALL_STATE_CLEANUP_WAIT) { | 
    
    
    664  | 
     | 
     | 
    			ncalls++;  | 
    
    
    665  | 
     | 
     | 
    			if (l2tp_ctrl_txwin_is_full(_this)) { | 
    
    
    666  | 
     | 
     | 
    				L2TP_CTRL_DBG((_this, LOG_INFO,  | 
    
    
    667  | 
     | 
     | 
    				    "Too many calls.  Sending window is not "  | 
    
    
    668  | 
     | 
     | 
    				    "enough to send CDN to all clients."));  | 
    
    
    669  | 
     | 
     | 
    				if (drop)  | 
    
    
    670  | 
     | 
     | 
    					l2tp_call_drop(call);  | 
    
    
    671  | 
     | 
     | 
    			} else  | 
    
    
    672  | 
     | 
     | 
    				l2tp_call_admin_disconnect(call);  | 
    
    
    673  | 
     | 
     | 
    		}  | 
    
    
    674  | 
     | 
     | 
    	}  | 
    
    
    675  | 
     | 
     | 
    	return ncalls;  | 
    
    
    676  | 
     | 
     | 
    }  | 
    
    
    677  | 
     | 
     | 
     | 
    
    
    678  | 
     | 
     | 
    /* reset timeout */  | 
    
    
    679  | 
     | 
     | 
    static void  | 
    
    
    680  | 
     | 
     | 
    l2tp_ctrl_reset_timeout(l2tp_ctrl *_this)  | 
    
    
    681  | 
     | 
     | 
    { | 
    
    
    682  | 
     | 
     | 
    	int intvl;  | 
    
    
    683  | 
     | 
     | 
    	struct timeval tv0;  | 
    
    
    684  | 
     | 
     | 
     | 
    
    
    685  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(_this != NULL);  | 
    
    
    686  | 
     | 
     | 
     | 
    
    
    687  | 
     | 
     | 
    	if (evtimer_initialized(&_this->ev_timeout))  | 
    
    
    688  | 
     | 
     | 
    		evtimer_del(&_this->ev_timeout);  | 
    
    
    689  | 
     | 
     | 
     | 
    
    
    690  | 
     | 
     | 
    	switch (_this->state) { | 
    
    
    691  | 
     | 
     | 
    	case L2TP_CTRL_STATE_CLEANUP_WAIT:  | 
    
    
    692  | 
     | 
     | 
    		intvl = 1;  | 
    
    
    693  | 
     | 
     | 
    		break;  | 
    
    
    694  | 
     | 
     | 
    	default:  | 
    
    
    695  | 
     | 
     | 
    		intvl = 2;  | 
    
    
    696  | 
     | 
     | 
    		break;  | 
    
    
    697  | 
     | 
     | 
    	}  | 
    
    
    698  | 
     | 
     | 
    	tv0.tv_usec = 0;  | 
    
    
    699  | 
     | 
     | 
    	tv0.tv_sec = intvl;  | 
    
    
    700  | 
     | 
     | 
    	if (!evtimer_initialized(&_this->ev_timeout))  | 
    
    
    701  | 
     | 
     | 
    		evtimer_set(&_this->ev_timeout, l2tp_ctrl_timeout, _this);  | 
    
    
    702  | 
     | 
     | 
    	evtimer_add(&_this->ev_timeout, &tv0);  | 
    
    
    703  | 
     | 
     | 
    }  | 
    
    
    704  | 
     | 
     | 
     | 
    
    
    705  | 
     | 
     | 
    /*  | 
    
    
    706  | 
     | 
     | 
     * protocols / send and receive  | 
    
    
    707  | 
     | 
     | 
     */  | 
    
    
    708  | 
     | 
     | 
    /* Receive packet */  | 
    
    
    709  | 
     | 
     | 
    void  | 
    
    
    710  | 
     | 
     | 
    l2tp_ctrl_input(l2tpd *_this, int listener_index, struct sockaddr *peer,  | 
    
    
    711  | 
     | 
     | 
        struct sockaddr *sock, void *nat_t_ctx, u_char *pkt, int pktlen)  | 
    
    
    712  | 
     | 
     | 
    { | 
    
    
    713  | 
     | 
     | 
    	int i, len, offsiz, reqlen, is_ctrl;  | 
    
    
    714  | 
     | 
     | 
    	uint16_t mestype;  | 
    
    
    715  | 
     | 
     | 
    	struct l2tp_avp *avp, *avp0;  | 
    
    
    716  | 
     | 
     | 
    	l2tp_ctrl *ctrl;  | 
    
    
    717  | 
     | 
     | 
    	l2tp_call *call;  | 
    
    
    718  | 
     | 
     | 
    	char buf[L2TP_AVP_MAXSIZ], errmsg[256];  | 
    
    
    719  | 
     | 
     | 
    	time_t curr_time;  | 
    
    
    720  | 
     | 
     | 
    	u_char *pkt0;  | 
    
    
    721  | 
     | 
     | 
    	struct l2tp_header hdr;  | 
    
    
    722  | 
     | 
     | 
    	char hbuf[NI_MAXHOST + NI_MAXSERV + 16];  | 
    
    
    723  | 
     | 
     | 
     | 
    
    
    724  | 
     | 
     | 
    	ctrl = NULL;  | 
    
    
    725  | 
     | 
     | 
    	curr_time = get_monosec();  | 
    
    
    726  | 
     | 
     | 
    	pkt0 = pkt;  | 
    
    
    727  | 
     | 
     | 
     | 
    
    
    728  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(peer->sa_family == sock->sa_family);  | 
    
    
    729  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(peer->sa_family == AF_INET ||  | 
    
    
    730  | 
     | 
     | 
    	    peer->sa_family == AF_INET6)  | 
    
    
    731  | 
     | 
     | 
        /*  | 
    
    
    732  | 
     | 
     | 
         * Parse L2TP Header  | 
    
    
    733  | 
     | 
     | 
         */  | 
    
    
    734  | 
     | 
     | 
    	memset(&hdr, 0, sizeof(hdr));  | 
    
    
    735  | 
     | 
     | 
    	if (pktlen < 2) { | 
    
    
    736  | 
     | 
     | 
    		snprintf(errmsg, sizeof(errmsg), "a short packet.  "  | 
    
    
    737  | 
     | 
     | 
    		    "length=%d", pktlen);  | 
    
    
    738  | 
     | 
     | 
    		goto bad_packet;  | 
    
    
    739  | 
     | 
     | 
    	}  | 
    
    
    740  | 
     | 
     | 
    	memcpy(&hdr, pkt, 2);  | 
    
    
    741  | 
     | 
     | 
    	pkt += 2;  | 
    
    
    742  | 
     | 
     | 
    	if (hdr.ver != L2TP_HEADER_VERSION_RFC2661) { | 
    
    
    743  | 
     | 
     | 
    		/* XXX: only RFC2661 is supported */  | 
    
    
    744  | 
     | 
     | 
    		snprintf(errmsg, sizeof(errmsg),  | 
    
    
    745  | 
     | 
     | 
    		    "Unsupported version at header = %d", hdr.ver);  | 
    
    
    746  | 
     | 
     | 
    		goto bad_packet;  | 
    
    
    747  | 
     | 
     | 
    	}  | 
    
    
    748  | 
     | 
     | 
    	is_ctrl = (hdr.t != 0)? 1 : 0;  | 
    
    
    749  | 
     | 
     | 
     | 
    
    
    750  | 
     | 
     | 
    	/* calc required length */  | 
    
    
    751  | 
     | 
     | 
    	reqlen = 6;		/* for Flags, Tunnel-Id, Session-Id field */  | 
    
    
    752  | 
     | 
     | 
    	if (hdr.l) reqlen += 2;	/* for Length field (opt) */  | 
    
    
    753  | 
     | 
     | 
    	if (hdr.s) reqlen += 4;	/* for Ns, Nr field (opt) */  | 
    
    
    754  | 
     | 
     | 
    	if (hdr.o) reqlen += 2;	/* for Offset Size field (opt) */  | 
    
    
    755  | 
     | 
     | 
    	if (reqlen > pktlen) { | 
    
    
    756  | 
     | 
     | 
    		snprintf(errmsg, sizeof(errmsg),  | 
    
    
    757  | 
     | 
     | 
    		    "a short packet. length=%d", pktlen);  | 
    
    
    758  | 
     | 
     | 
    		goto bad_packet;  | 
    
    
    759  | 
     | 
     | 
    	}  | 
    
    
    760  | 
     | 
     | 
     | 
    
    
    761  | 
     | 
     | 
    	if (hdr.l != 0) { | 
    
    
    762  | 
     | 
     | 
    		GETSHORT(hdr.length, pkt);  | 
    
    
    763  | 
     | 
     | 
    		if (hdr.length > pktlen) { | 
    
    
    764  | 
     | 
     | 
    			snprintf(errmsg, sizeof(errmsg),  | 
    
    
    765  | 
     | 
     | 
    			    "Actual packet size is smaller than the length "  | 
    
    
    766  | 
     | 
     | 
    			    "field %d < %d", pktlen, hdr.length);  | 
    
    
    767  | 
     | 
     | 
    			goto bad_packet;  | 
    
    
    768  | 
     | 
     | 
    		}  | 
    
    
    769  | 
     | 
     | 
    		pktlen = hdr.length;	/* remove trailing trash */  | 
    
    
    770  | 
     | 
     | 
    	}  | 
    
    
    771  | 
     | 
     | 
    	GETSHORT(hdr.tunnel_id, pkt);  | 
    
    
    772  | 
     | 
     | 
    	GETSHORT(hdr.session_id, pkt);  | 
    
    
    773  | 
     | 
     | 
    	if (hdr.s != 0) { | 
    
    
    774  | 
     | 
     | 
    		GETSHORT(hdr.ns, pkt);  | 
    
    
    775  | 
     | 
     | 
    		GETSHORT(hdr.nr, pkt);  | 
    
    
    776  | 
     | 
     | 
    	}  | 
    
    
    777  | 
     | 
     | 
    	if (hdr.o != 0) { | 
    
    
    778  | 
     | 
     | 
    		GETSHORT(offsiz, pkt);  | 
    
    
    779  | 
     | 
     | 
    		if (pktlen < offsiz) { | 
    
    
    780  | 
     | 
     | 
    			snprintf(errmsg, sizeof(errmsg),  | 
    
    
    781  | 
     | 
     | 
    			    "offset field is bigger than remaining packet "  | 
    
    
    782  | 
     | 
     | 
    			    "length %d > %d", offsiz, pktlen);  | 
    
    
    783  | 
     | 
     | 
    			goto bad_packet;  | 
    
    
    784  | 
     | 
     | 
    		}  | 
    
    
    785  | 
     | 
     | 
    		pkt += offsiz;  | 
    
    
    786  | 
     | 
     | 
    	}  | 
    
    
    787  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(pkt - pkt0 == reqlen);  | 
    
    
    788  | 
     | 
     | 
    	pktlen -= (pkt - pkt0);	/* cut down the length of header */  | 
    
    
    789  | 
     | 
     | 
     | 
    
    
    790  | 
     | 
     | 
    	ctrl = NULL;  | 
    
    
    791  | 
     | 
     | 
    	memset(buf, 0, sizeof(buf));  | 
    
    
    792  | 
     | 
     | 
    	mestype = 0;  | 
    
    
    793  | 
     | 
     | 
    	avp = NULL;  | 
    
    
    794  | 
     | 
     | 
     | 
    
    
    795  | 
     | 
     | 
    	if (is_ctrl) { | 
    
    
    796  | 
     | 
     | 
    		avp0 = (struct l2tp_avp *)buf;  | 
    
    
    797  | 
     | 
     | 
    		avp = avp_find_message_type_avp(avp0, pkt, pktlen);  | 
    
    
    798  | 
     | 
     | 
    		if (avp != NULL)  | 
    
    
    799  | 
     | 
     | 
    			mestype = avp->attr_value[0] << 8 | avp->attr_value[1];  | 
    
    
    800  | 
     | 
     | 
    	}  | 
    
    
    801  | 
     | 
     | 
    	ctrl = l2tpd_get_ctrl(_this, hdr.tunnel_id);  | 
    
    
    802  | 
     | 
     | 
     | 
    
    
    803  | 
     | 
     | 
    	if (ctrl == NULL) { | 
    
    
    804  | 
     | 
     | 
    		/* new control */  | 
    
    
    805  | 
     | 
     | 
    		if (!is_ctrl) { | 
    
    
    806  | 
     | 
     | 
    			snprintf(errmsg, sizeof(errmsg),  | 
    
    
    807  | 
     | 
     | 
    			    "bad data message: tunnelId=%d is not "  | 
    
    
    808  | 
     | 
     | 
    			    "found.", hdr.tunnel_id);  | 
    
    
    809  | 
     | 
     | 
    			goto bad_packet;  | 
    
    
    810  | 
     | 
     | 
    		}  | 
    
    
    811  | 
     | 
     | 
    		if (mestype != L2TP_AVP_MESSAGE_TYPE_SCCRQ) { | 
    
    
    812  | 
     | 
     | 
    			snprintf(errmsg, sizeof(errmsg),  | 
    
    
    813  | 
     | 
     | 
    			    "bad control message: tunnelId=%d is not "  | 
    
    
    814  | 
     | 
     | 
    			    "found.  mestype=%s", hdr.tunnel_id,  | 
    
    
    815  | 
     | 
     | 
    			    avp_mes_type_string(mestype));  | 
    
    
    816  | 
     | 
     | 
    			goto bad_packet;  | 
    
    
    817  | 
     | 
     | 
    		}  | 
    
    
    818  | 
     | 
     | 
     | 
    
    
    819  | 
     | 
     | 
    		if ((ctrl = l2tp_ctrl_create()) == NULL) { | 
    
    
    820  | 
     | 
     | 
    			l2tp_ctrl_log(ctrl, LOG_ERR,  | 
    
    
    821  | 
     | 
     | 
    			    "l2tp_ctrl_create() failed: %m");  | 
    
    
    822  | 
     | 
     | 
    			goto fail;  | 
    
    
    823  | 
     | 
     | 
    		}  | 
    
    
    824  | 
     | 
     | 
     | 
    
    
    825  | 
     | 
     | 
    		if (l2tp_ctrl_init(ctrl, _this, peer, sock, nat_t_ctx) != 0) { | 
    
    
    826  | 
     | 
     | 
    			l2tp_ctrl_log(ctrl, LOG_ERR,  | 
    
    
    827  | 
     | 
     | 
    			    "l2tp_ctrl_start() failed: %m");  | 
    
    
    828  | 
     | 
     | 
    			goto fail;  | 
    
    
    829  | 
     | 
     | 
    		}  | 
    
    
    830  | 
     | 
     | 
     | 
    
    
    831  | 
     | 
     | 
    		ctrl->listener_index = listener_index;  | 
    
    
    832  | 
     | 
     | 
    		l2tp_ctrl_reload(ctrl);  | 
    
    
    833  | 
     | 
     | 
    	} else { | 
    
    
    834  | 
     | 
     | 
    		/*  | 
    
    
    835  | 
     | 
     | 
    		 * treat as an error if src address and port is not  | 
    
    
    836  | 
     | 
     | 
    		 * match. (because it is potentially DoS attach)  | 
    
    
    837  | 
     | 
     | 
    		 */  | 
    
    
    838  | 
     | 
     | 
    		int notmatch = 0;  | 
    
    
    839  | 
     | 
     | 
     | 
    
    
    840  | 
     | 
     | 
    		if (ctrl->peer.ss_family != peer->sa_family)  | 
    
    
    841  | 
     | 
     | 
    			notmatch = 1;  | 
    
    
    842  | 
     | 
     | 
    		else if (peer->sa_family == AF_INET) { | 
    
    
    843  | 
     | 
     | 
    			if (SIN(peer)->sin_addr.s_addr !=  | 
    
    
    844  | 
     | 
     | 
    			    SIN(&ctrl->peer)->sin_addr.s_addr ||  | 
    
    
    845  | 
     | 
     | 
    			    SIN(peer)->sin_port != SIN(&ctrl->peer)->sin_port)  | 
    
    
    846  | 
     | 
     | 
    				notmatch = 1;  | 
    
    
    847  | 
     | 
     | 
    		} else if (peer->sa_family == AF_INET6) { | 
    
    
    848  | 
     | 
     | 
    			if (!IN6_ARE_ADDR_EQUAL(&(SIN6(peer)->sin6_addr),  | 
    
    
    849  | 
     | 
     | 
    				    &(SIN6(&ctrl->peer)->sin6_addr)) ||  | 
    
    
    850  | 
     | 
     | 
    			    SIN6(peer)->sin6_port !=  | 
    
    
    851  | 
     | 
     | 
    				    SIN6(&ctrl->peer)->sin6_port)  | 
    
    
    852  | 
     | 
     | 
    				notmatch = 1;  | 
    
    
    853  | 
     | 
     | 
     		}  | 
    
    
    854  | 
     | 
     | 
    		if (notmatch) { | 
    
    
    855  | 
     | 
     | 
    			snprintf(errmsg, sizeof(errmsg),  | 
    
    
    856  | 
     | 
     | 
    			    "tunnelId=%u is already assigned for %s",  | 
    
    
    857  | 
     | 
     | 
    			    hdr.tunnel_id, addrport_tostring(  | 
    
    
    858  | 
     | 
     | 
    				(struct sockaddr *)&ctrl->peer,  | 
    
    
    859  | 
     | 
     | 
    				ctrl->peer.ss_len, hbuf, sizeof(hbuf)));  | 
    
    
    860  | 
     | 
     | 
    			goto bad_packet;  | 
    
    
    861  | 
     | 
     | 
    		}  | 
    
    
    862  | 
     | 
     | 
    	}  | 
    
    
    863  | 
     | 
     | 
    	ctrl->last_rcv = curr_time;  | 
    
    
    864  | 
     | 
     | 
    	call = NULL;  | 
    
    
    865  | 
     | 
     | 
    	if (hdr.session_id != 0) { | 
    
    
    866  | 
     | 
     | 
    		/* search l2tp_call by Session ID */  | 
    
    
    867  | 
     | 
     | 
    		/* linear search is enough for this purpose */  | 
    
    
    868  | 
     | 
     | 
    		len = slist_length(&ctrl->call_list);  | 
    
    
    869  | 
     | 
     | 
    		for (i = 0; i < len; i++) { | 
    
    
    870  | 
     | 
     | 
    			call = slist_get(&ctrl->call_list, i);  | 
    
    
    871  | 
     | 
     | 
    			if (call->session_id == hdr.session_id)  | 
    
    
    872  | 
     | 
     | 
    				break;  | 
    
    
    873  | 
     | 
     | 
    			call = NULL;  | 
    
    
    874  | 
     | 
     | 
    		}  | 
    
    
    875  | 
     | 
     | 
    	}  | 
    
    
    876  | 
     | 
     | 
    	if (!is_ctrl) { | 
    
    
    877  | 
     | 
     | 
    		int delayed = 0;  | 
    
    
    878  | 
     | 
     | 
     | 
    
    
    879  | 
     | 
     | 
    		/* L2TP data */  | 
    
    
    880  | 
     | 
     | 
    		if (ctrl->state != L2TP_CTRL_STATE_ESTABLISHED) { | 
    
    
    881  | 
     | 
     | 
    			l2tp_ctrl_log(ctrl, LOG_WARNING,  | 
    
    
    882  | 
     | 
     | 
    			    "Received Data packet in '%s'",  | 
    
    
    883  | 
     | 
     | 
    			    l2tp_ctrl_state_string(ctrl));  | 
    
    
    884  | 
     | 
     | 
    			goto fail;  | 
    
    
    885  | 
     | 
     | 
    		}  | 
    
    
    886  | 
     | 
     | 
    		if (call == NULL) { | 
    
    
    887  | 
     | 
     | 
    			l2tp_ctrl_log(ctrl, LOG_WARNING,  | 
    
    
    888  | 
     | 
     | 
    			    "Received a data packet but it has no call.  "  | 
    
    
    889  | 
     | 
     | 
    			    "session_id=%u",  hdr.session_id);  | 
    
    
    890  | 
     | 
     | 
    			goto fail;  | 
    
    
    891  | 
     | 
     | 
    		}  | 
    
    
    892  | 
     | 
     | 
    		L2TP_CTRL_DBG((ctrl, DEBUG_LEVEL_2,  | 
    
    
    893  | 
     | 
     | 
    		    "call=%u RECV   ns=%u nr=%u snd_nxt=%u rcv_nxt=%u len=%d",  | 
    
    
    894  | 
     | 
     | 
    		    call->id, hdr.ns, hdr.nr, call->snd_nxt, call->rcv_nxt,  | 
    
    
    895  | 
     | 
     | 
    		    pktlen));  | 
    
    
    896  | 
     | 
     | 
    		if (call->state != L2TP_CALL_STATE_ESTABLISHED){ | 
    
    
    897  | 
     | 
     | 
    			l2tp_ctrl_log(ctrl, LOG_WARNING,  | 
    
    
    898  | 
     | 
     | 
    			    "Received a data packet but call is not "  | 
    
    
    899  | 
     | 
     | 
    			    "established");  | 
    
    
    900  | 
     | 
     | 
    			goto fail;  | 
    
    
    901  | 
     | 
     | 
    		}  | 
    
    
    902  | 
     | 
     | 
     | 
    
    
    903  | 
     | 
     | 
    		if (hdr.s != 0) { | 
    
    
    904  | 
     | 
     | 
    			if (SEQ_LT(hdr.ns, call->rcv_nxt)) { | 
    
    
    905  | 
     | 
     | 
    				if (SEQ_LT(hdr.ns,  | 
    
    
    906  | 
     | 
     | 
    				    call->rcv_nxt - L2TP_CALL_DELAY_LIMIT)) { | 
    
    
    907  | 
     | 
     | 
    					/* sequence number seems to be delayed */  | 
    
    
    908  | 
     | 
     | 
    					/* XXX: need to log? */  | 
    
    
    909  | 
     | 
     | 
    					L2TP_CTRL_DBG((ctrl, LOG_DEBUG,  | 
    
    
    910  | 
     | 
     | 
    					    "receive a out of sequence "  | 
    
    
    911  | 
     | 
     | 
    					    "data packet: %u < %u.",  | 
    
    
    912  | 
     | 
     | 
    					    hdr.ns, call->rcv_nxt));  | 
    
    
    913  | 
     | 
     | 
    					return;  | 
    
    
    914  | 
     | 
     | 
    				}  | 
    
    
    915  | 
     | 
     | 
    				delayed = 1;  | 
    
    
    916  | 
     | 
     | 
    			} else { | 
    
    
    917  | 
     | 
     | 
    				call->rcv_nxt = hdr.ns + 1;  | 
    
    
    918  | 
     | 
     | 
    			}  | 
    
    
    919  | 
     | 
     | 
    		}  | 
    
    
    920  | 
     | 
     | 
     | 
    
    
    921  | 
     | 
     | 
    		l2tp_call_ppp_input(call, pkt, pktlen, delayed);  | 
    
    
    922  | 
     | 
     | 
     | 
    
    
    923  | 
     | 
     | 
    		return;  | 
    
    
    924  | 
     | 
     | 
    	}  | 
    
    
    925  | 
     | 
     | 
    	if (hdr.s != 0) { | 
    
    
    926  | 
     | 
     | 
    		L2TP_CTRL_DBG((ctrl, DEBUG_LEVEL_2,  | 
    
    
    927  | 
     | 
     | 
    		    "RECV %s ns=%u nr=%u snd_nxt=%u snd_una=%u rcv_nxt=%u "  | 
    
    
    928  | 
     | 
     | 
    		    "len=%d", (is_ctrl)? "C" : "", hdr.ns, hdr.nr,  | 
    
    
    929  | 
     | 
     | 
    		    ctrl->snd_nxt, ctrl->snd_una, ctrl->rcv_nxt, pktlen));  | 
    
    
    930  | 
     | 
     | 
     | 
    
    
    931  | 
     | 
     | 
    		if (pktlen <= 0)  | 
    
    
    932  | 
     | 
     | 
    			l2tp_ctrl_log(ctrl, LOG_INFO, "RecvZLB");  | 
    
    
    933  | 
     | 
     | 
     | 
    
    
    934  | 
     | 
     | 
    		if (SEQ_GT(hdr.nr, ctrl->snd_una)) { | 
    
    
    935  | 
     | 
     | 
    			if (hdr.nr == ctrl->snd_nxt ||  | 
    
    
    936  | 
     | 
     | 
    			    SEQ_LT(hdr.nr, ctrl->snd_nxt))  | 
    
    
    937  | 
     | 
     | 
    				ctrl->snd_una = hdr.nr;  | 
    
    
    938  | 
     | 
     | 
    			else { | 
    
    
    939  | 
     | 
     | 
    				l2tp_ctrl_log(ctrl, LOG_INFO,  | 
    
    
    940  | 
     | 
     | 
    				    "Received message has bad Nr field: "  | 
    
    
    941  | 
     | 
     | 
    				    "%u < %u.", hdr.ns, ctrl->snd_nxt);  | 
    
    
    942  | 
     | 
     | 
    				/* XXX Drop with ZLB? */  | 
    
    
    943  | 
     | 
     | 
    				goto fail;  | 
    
    
    944  | 
     | 
     | 
    			}  | 
    
    
    945  | 
     | 
     | 
    		}  | 
    
    
    946  | 
     | 
     | 
    		if (l2tp_ctrl_txwin_size(ctrl) <= 0) { | 
    
    
    947  | 
     | 
     | 
    			/* no waiting ack */  | 
    
    
    948  | 
     | 
     | 
    			if (ctrl->hello_wait_ack != 0) { | 
    
    
    949  | 
     | 
     | 
    				/*  | 
    
    
    950  | 
     | 
     | 
    				 * Reset Hello state, as an ack for the Hello  | 
    
    
    951  | 
     | 
     | 
    				 * is recived.  | 
    
    
    952  | 
     | 
     | 
    				 */  | 
    
    
    953  | 
     | 
     | 
    				ctrl->hello_wait_ack = 0;  | 
    
    
    954  | 
     | 
     | 
    				ctrl->hello_io_time = curr_time;  | 
    
    
    955  | 
     | 
     | 
    			}  | 
    
    
    956  | 
     | 
     | 
    			switch (ctrl->state) { | 
    
    
    957  | 
     | 
     | 
    			case L2TP_CTRL_STATE_CLEANUP_WAIT:  | 
    
    
    958  | 
     | 
     | 
    				l2tp_ctrl_stop(ctrl, 0);  | 
    
    
    959  | 
     | 
     | 
    				return;  | 
    
    
    960  | 
     | 
     | 
    			}  | 
    
    
    961  | 
     | 
     | 
    		}  | 
    
    
    962  | 
     | 
     | 
    		if (hdr.ns != ctrl->rcv_nxt) { | 
    
    
    963  | 
     | 
     | 
    			/* there are remaining packet */  | 
    
    
    964  | 
     | 
     | 
    			if (l2tp_ctrl_resend_una_packets(ctrl) <= 0) { | 
    
    
    965  | 
     | 
     | 
    				/* resend or sent ZLB */  | 
    
    
    966  | 
     | 
     | 
    				l2tp_ctrl_send_ZLB(ctrl);  | 
    
    
    967  | 
     | 
     | 
    			}  | 
    
    
    968  | 
     | 
     | 
    #ifdef	L2TP_CTRL_DEBUG  | 
    
    
    969  | 
     | 
     | 
    			if (pktlen != 0) {	/* not ZLB */ | 
    
    
    970  | 
     | 
     | 
    				L2TP_CTRL_DBG((ctrl, LOG_DEBUG,  | 
    
    
    971  | 
     | 
     | 
    				    "receive out of sequence %u must be %u.  "  | 
    
    
    972  | 
     | 
     | 
    				    "mestype=%s", hdr.ns, ctrl->rcv_nxt,  | 
    
    
    973  | 
     | 
     | 
    				    avp_mes_type_string(mestype)));  | 
    
    
    974  | 
     | 
     | 
    			}  | 
    
    
    975  | 
     | 
     | 
    #endif  | 
    
    
    976  | 
     | 
     | 
    			return;  | 
    
    
    977  | 
     | 
     | 
    		}  | 
    
    
    978  | 
     | 
     | 
    		if (pktlen <= 0)  | 
    
    
    979  | 
     | 
     | 
    			return;		/* ZLB */  | 
    
    
    980  | 
     | 
     | 
     | 
    
    
    981  | 
     | 
     | 
    		if (l2tp_ctrl_txwin_is_full(ctrl)) { | 
    
    
    982  | 
     | 
     | 
    			L2TP_CTRL_DBG((ctrl, LOG_DEBUG,  | 
    
    
    983  | 
     | 
     | 
    			    "Received message cannot be handled. "  | 
    
    
    984  | 
     | 
     | 
    			    "Transmission window is full."));  | 
    
    
    985  | 
     | 
     | 
    			l2tp_ctrl_send_ZLB(ctrl);  | 
    
    
    986  | 
     | 
     | 
    			return;  | 
    
    
    987  | 
     | 
     | 
    		}  | 
    
    
    988  | 
     | 
     | 
     | 
    
    
    989  | 
     | 
     | 
    		ctrl->rcv_nxt++;  | 
    
    
    990  | 
     | 
     | 
    		if (avp == NULL) { | 
    
    
    991  | 
     | 
     | 
    			l2tpd_log(_this, LOG_WARNING,  | 
    
    
    992  | 
     | 
     | 
    			    "bad control message: no message-type AVP.");  | 
    
    
    993  | 
     | 
     | 
    			goto fail;  | 
    
    
    994  | 
     | 
     | 
    		}  | 
    
    
    995  | 
     | 
     | 
    	}  | 
    
    
    996  | 
     | 
     | 
     | 
    
    
    997  | 
     | 
     | 
        /*  | 
    
    
    998  | 
     | 
     | 
         * state machine (RFC2661 pp. 56-57)  | 
    
    
    999  | 
     | 
     | 
         */  | 
    
    
    1000  | 
     | 
     | 
    	switch (ctrl->state) { | 
    
    
    1001  | 
     | 
     | 
    	case L2TP_CTRL_STATE_IDLE:  | 
    
    
    1002  | 
     | 
     | 
    		switch (mestype) { | 
    
    
    1003  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_SCCRQ:  | 
    
    
    1004  | 
     | 
     | 
    			if (l2tp_ctrl_recv_SCCRQ(ctrl, pkt, pktlen, _this,  | 
    
    
    1005  | 
     | 
     | 
    			    peer) == 0) { | 
    
    
    1006  | 
     | 
     | 
    				/* acceptable */  | 
    
    
    1007  | 
     | 
     | 
    				l2tp_ctrl_send_SCCRP(ctrl);  | 
    
    
    1008  | 
     | 
     | 
    				ctrl->state = L2TP_CTRL_STATE_WAIT_CTL_CONN;  | 
    
    
    1009  | 
     | 
     | 
    				return;  | 
    
    
    1010  | 
     | 
     | 
    			}  | 
    
    
    1011  | 
     | 
     | 
    			/*  | 
    
    
    1012  | 
     | 
     | 
    			 * in case un-acceptable, it was already processed  | 
    
    
    1013  | 
     | 
     | 
    			 * at l2tcp_ctrl_recv_SCCRQ  | 
    
    
    1014  | 
     | 
     | 
    			 */  | 
    
    
    1015  | 
     | 
     | 
    			return;  | 
    
    
    1016  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_SCCRP:  | 
    
    
    1017  | 
     | 
     | 
    			/*  | 
    
    
    1018  | 
     | 
     | 
    			 * RFC specifies that sent of StopCCN in the state,  | 
    
    
    1019  | 
     | 
     | 
    			 * However as this implementation only support Passive  | 
    
    
    1020  | 
     | 
     | 
    			 * open, this packet will not received.  | 
    
    
    1021  | 
     | 
     | 
    			 */  | 
    
    
    1022  | 
     | 
     | 
    			/* FALLTHROUGH */  | 
    
    
    1023  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_SCCCN:  | 
    
    
    1024  | 
     | 
     | 
    		default:  | 
    
    
    1025  | 
     | 
     | 
    			break;  | 
    
    
    1026  | 
     | 
     | 
    		}  | 
    
    
    1027  | 
     | 
     | 
    		goto fsm_fail;  | 
    
    
    1028  | 
     | 
     | 
     | 
    
    
    1029  | 
     | 
     | 
    	case L2TP_CTRL_STATE_WAIT_CTL_CONN:  | 
    
    
    1030  | 
     | 
     | 
    	    /* Wait-Ctl-Conn */  | 
    
    
    1031  | 
     | 
     | 
    		switch (mestype) { | 
    
    
    1032  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_SCCCN:  | 
    
    
    1033  | 
     | 
     | 
    			l2tp_ctrl_log(ctrl, LOG_INFO, "RecvSCCN");  | 
    
    
    1034  | 
     | 
     | 
    			if (l2tp_ctrl_send_ZLB(ctrl) == 0) { | 
    
    
    1035  | 
     | 
     | 
    				ctrl->state = L2TP_CTRL_STATE_ESTABLISHED;  | 
    
    
    1036  | 
     | 
     | 
    			}  | 
    
    
    1037  | 
     | 
     | 
    			return;  | 
    
    
    1038  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_StopCCN:  | 
    
    
    1039  | 
     | 
     | 
    			goto receive_stop_ccn;  | 
    
    
    1040  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_SCCRQ:  | 
    
    
    1041  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_SCCRP:  | 
    
    
    1042  | 
     | 
     | 
    		default:  | 
    
    
    1043  | 
     | 
     | 
    			break;  | 
    
    
    1044  | 
     | 
     | 
    		}  | 
    
    
    1045  | 
     | 
     | 
    		break;	/* fsm_fail */  | 
    
    
    1046  | 
     | 
     | 
    	case L2TP_CTRL_STATE_ESTABLISHED:  | 
    
    
    1047  | 
     | 
     | 
    	    /* Established */  | 
    
    
    1048  | 
     | 
     | 
    		switch (mestype) { | 
    
    
    1049  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_SCCCN:  | 
    
    
    1050  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_SCCRQ:  | 
    
    
    1051  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_SCCRP:  | 
    
    
    1052  | 
     | 
     | 
    			break;  | 
    
    
    1053  | 
     | 
     | 
    receive_stop_ccn:  | 
    
    
    1054  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_StopCCN:  | 
    
    
    1055  | 
     | 
     | 
    			if (l2tp_ctrl_recv_StopCCN(ctrl, pkt, pktlen) == 0) { | 
    
    
    1056  | 
     | 
     | 
    				if (l2tp_ctrl_resend_una_packets(ctrl) <= 0)  | 
    
    
    1057  | 
     | 
     | 
    					l2tp_ctrl_send_ZLB(ctrl);  | 
    
    
    1058  | 
     | 
     | 
    				l2tp_ctrl_stop(ctrl, 0);  | 
    
    
    1059  | 
     | 
     | 
    				return;  | 
    
    
    1060  | 
     | 
     | 
    			}  | 
    
    
    1061  | 
     | 
     | 
    			l2tp_ctrl_log(ctrl, LOG_ERR, "Received bad StopCCN");  | 
    
    
    1062  | 
     | 
     | 
    			l2tp_ctrl_send_ZLB(ctrl);  | 
    
    
    1063  | 
     | 
     | 
    			l2tp_ctrl_stop(ctrl, 0);  | 
    
    
    1064  | 
     | 
     | 
    			return;  | 
    
    
    1065  | 
     | 
     | 
     | 
    
    
    1066  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_HELLO:  | 
    
    
    1067  | 
     | 
     | 
    			if (l2tp_ctrl_resend_una_packets(ctrl) <= 0)  | 
    
    
    1068  | 
     | 
     | 
    				l2tp_ctrl_send_ZLB(ctrl);  | 
    
    
    1069  | 
     | 
     | 
    			return;  | 
    
    
    1070  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_CDN:  | 
    
    
    1071  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_ICRP:  | 
    
    
    1072  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_ICCN:  | 
    
    
    1073  | 
     | 
     | 
    			if (call == NULL) { | 
    
    
    1074  | 
     | 
     | 
    				l2tp_ctrl_log(ctrl, LOG_INFO,  | 
    
    
    1075  | 
     | 
     | 
    				    "Unknown call message: %s",  | 
    
    
    1076  | 
     | 
     | 
    				    avp_mes_type_string(mestype));  | 
    
    
    1077  | 
     | 
     | 
    				goto fail;  | 
    
    
    1078  | 
     | 
     | 
    			}  | 
    
    
    1079  | 
     | 
     | 
    			/* FALLTHROUGH */  | 
    
    
    1080  | 
     | 
     | 
    		case L2TP_AVP_MESSAGE_TYPE_ICRQ:  | 
    
    
    1081  | 
     | 
     | 
    			l2tp_call_recv_packet(ctrl, call, mestype, pkt,  | 
    
    
    1082  | 
     | 
     | 
    			    pktlen);  | 
    
    
    1083  | 
     | 
     | 
    			return;  | 
    
    
    1084  | 
     | 
     | 
    		default:  | 
    
    
    1085  | 
     | 
     | 
    			break;  | 
    
    
    1086  | 
     | 
     | 
    		}  | 
    
    
    1087  | 
     | 
     | 
    		break;	/* fsm_fail */  | 
    
    
    1088  | 
     | 
     | 
    	case L2TP_CTRL_STATE_CLEANUP_WAIT:  | 
    
    
    1089  | 
     | 
     | 
    		if (mestype == L2TP_AVP_MESSAGE_TYPE_StopCCN) { | 
    
    
    1090  | 
     | 
     | 
    			/*  | 
    
    
    1091  | 
     | 
     | 
    			 * We left ESTABLISHED state, but the peer sent StopCCN.  | 
    
    
    1092  | 
     | 
     | 
    			 */  | 
    
    
    1093  | 
     | 
     | 
    			goto receive_stop_ccn;  | 
    
    
    1094  | 
     | 
     | 
    		}  | 
    
    
    1095  | 
     | 
     | 
    		break;	/* fsm_fail */  | 
    
    
    1096  | 
     | 
     | 
    	}  | 
    
    
    1097  | 
     | 
     | 
     | 
    
    
    1098  | 
     | 
     | 
    fsm_fail:  | 
    
    
    1099  | 
     | 
     | 
    	/* state machine error */  | 
    
    
    1100  | 
     | 
     | 
    	l2tp_ctrl_log(ctrl, LOG_WARNING, "Received %s in '%s' state",  | 
    
    
    1101  | 
     | 
     | 
    	    avp_mes_type_string(mestype), l2tp_ctrl_state_string(ctrl));  | 
    
    
    1102  | 
     | 
     | 
    	l2tp_ctrl_stop(ctrl, L2TP_STOP_CCN_RCODE_FSM_ERROR);  | 
    
    
    1103  | 
     | 
     | 
     | 
    
    
    1104  | 
     | 
     | 
    	return;  | 
    
    
    1105  | 
     | 
     | 
    fail:  | 
    
    
    1106  | 
     | 
     | 
    	if (ctrl != NULL && mestype != 0) { | 
    
    
    1107  | 
     | 
     | 
    		l2tp_ctrl_log(ctrl, LOG_WARNING, "Received %s in '%s' state",  | 
    
    
    1108  | 
     | 
     | 
    		    avp_mes_type_string(mestype), l2tp_ctrl_state_string(ctrl));  | 
    
    
    1109  | 
     | 
     | 
    		l2tp_ctrl_stop(ctrl, L2TP_STOP_CCN_RCODE_GENERAL_ERROR);  | 
    
    
    1110  | 
     | 
     | 
    	}  | 
    
    
    1111  | 
     | 
     | 
    	return;  | 
    
    
    1112  | 
     | 
     | 
     | 
    
    
    1113  | 
     | 
     | 
    bad_packet:  | 
    
    
    1114  | 
     | 
     | 
    	l2tpd_log(_this, LOG_INFO, "Received from=%s: %s",  | 
    
    
    1115  | 
     | 
     | 
    	    addrport_tostring(peer, peer->sa_len, hbuf, sizeof(hbuf)), errmsg);  | 
    
    
    1116  | 
     | 
     | 
     | 
    
    
    1117  | 
     | 
     | 
    	return;  | 
    
    
    1118  | 
     | 
     | 
    }  | 
    
    
    1119  | 
     | 
     | 
     | 
    
    
    1120  | 
     | 
     | 
    static inline int  | 
    
    
    1121  | 
     | 
     | 
    l2tp_ctrl_txwin_size(l2tp_ctrl *_this)  | 
    
    
    1122  | 
     | 
     | 
    { | 
    
    
    1123  | 
     | 
     | 
    	uint16_t sz;  | 
    
    
    1124  | 
     | 
     | 
     | 
    
    
    1125  | 
     | 
     | 
    	sz = _this->snd_nxt - _this->snd_una;  | 
    
    
    1126  | 
     | 
     | 
     | 
    
    
    1127  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(sz <= _this->winsz);  | 
    
    
    1128  | 
     | 
     | 
     | 
    
    
    1129  | 
     | 
     | 
    	return sz;  | 
    
    
    1130  | 
     | 
     | 
    }  | 
    
    
    1131  | 
     | 
     | 
     | 
    
    
    1132  | 
     | 
     | 
    static inline int  | 
    
    
    1133  | 
     | 
     | 
    l2tp_ctrl_txwin_is_full(l2tp_ctrl *_this)  | 
    
    
    1134  | 
     | 
     | 
    { | 
    
    
    1135  | 
     | 
     | 
    	return (l2tp_ctrl_txwin_size(_this) >= _this->winsz)? 1 : 0;  | 
    
    
    1136  | 
     | 
     | 
    }  | 
    
    
    1137  | 
     | 
     | 
     | 
    
    
    1138  | 
     | 
     | 
    /* send control packet */  | 
    
    
    1139  | 
     | 
     | 
    int  | 
    
    
    1140  | 
     | 
     | 
    l2tp_ctrl_send_packet(l2tp_ctrl *_this, int call_id, bytebuffer *bytebuf)  | 
    
    
    1141  | 
     | 
     | 
    { | 
    
    
    1142  | 
     | 
     | 
    	struct l2tp_header *hdr;  | 
    
    
    1143  | 
     | 
     | 
    	int rval;  | 
    
    
    1144  | 
     | 
     | 
    	time_t curr_time;  | 
    
    
    1145  | 
     | 
     | 
     | 
    
    
    1146  | 
     | 
     | 
    	curr_time = get_monosec();  | 
    
    
    1147  | 
     | 
     | 
     | 
    
    
    1148  | 
     | 
     | 
    	bytebuffer_flip(bytebuf);  | 
    
    
    1149  | 
     | 
     | 
    	hdr = (struct l2tp_header *)bytebuffer_pointer(bytebuf);  | 
    
    
    1150  | 
     | 
     | 
    	memset(hdr, 0, sizeof(*hdr));  | 
    
    
    1151  | 
     | 
     | 
     | 
    
    
    1152  | 
     | 
     | 
    	hdr->t = 1;  | 
    
    
    1153  | 
     | 
     | 
    	hdr->ver = L2TP_HEADER_VERSION_RFC2661;  | 
    
    
    1154  | 
     | 
     | 
    	hdr->l = 1;  | 
    
    
    1155  | 
     | 
     | 
    	hdr->length = htons(bytebuffer_remaining(bytebuf));  | 
    
    
    1156  | 
     | 
     | 
    	hdr->tunnel_id = htons(_this->peer_tunnel_id);  | 
    
    
    1157  | 
     | 
     | 
    	hdr->session_id = htons(call_id);  | 
    
    
    1158  | 
     | 
     | 
     | 
    
    
    1159  | 
     | 
     | 
    	hdr->s = 1;  | 
    
    
    1160  | 
     | 
     | 
    	hdr->ns = htons(_this->snd_nxt);  | 
    
    
    1161  | 
     | 
     | 
    	hdr->nr = htons(_this->rcv_nxt);  | 
    
    
    1162  | 
     | 
     | 
     | 
    
    
    1163  | 
     | 
     | 
    	if (bytebuffer_remaining(bytebuf) > sizeof(struct l2tp_header))  | 
    
    
    1164  | 
     | 
     | 
    		/* Not ZLB */  | 
    
    
    1165  | 
     | 
     | 
    		_this->snd_nxt++;  | 
    
    
    1166  | 
     | 
     | 
     | 
    
    
    1167  | 
     | 
     | 
    	L2TP_CTRL_DBG((_this, DEBUG_LEVEL_2,  | 
    
    
    1168  | 
     | 
     | 
    	    "SEND C ns=%u nr=%u snd_nxt=%u snd_una=%u rcv_nxt=%u ",  | 
    
    
    1169  | 
     | 
     | 
    	    ntohs(hdr->ns), htons(hdr->nr),  | 
    
    
    1170  | 
     | 
     | 
    	    _this->snd_nxt, _this->snd_una, _this->rcv_nxt));  | 
    
    
    1171  | 
     | 
     | 
     | 
    
    
    1172  | 
     | 
     | 
    	if (L2TP_CTRL_CONF(_this)->ctrl_out_pktdump  != 0) { | 
    
    
    1173  | 
     | 
     | 
    		l2tpd_log(_this->l2tpd, LOG_DEBUG,  | 
    
    
    1174  | 
     | 
     | 
    		    "L2TP Control output packet dump");  | 
    
    
    1175  | 
     | 
     | 
    		show_hd(debug_get_debugfp(), bytebuffer_pointer(bytebuf),  | 
    
    
    1176  | 
     | 
     | 
    		    bytebuffer_remaining(bytebuf));  | 
    
    
    1177  | 
     | 
     | 
    	}  | 
    
    
    1178  | 
     | 
     | 
     | 
    
    
    1179  | 
     | 
     | 
    	if ((rval = l2tp_ctrl_send(_this, bytebuffer_pointer(bytebuf),  | 
    
    
    1180  | 
     | 
     | 
    	    bytebuffer_remaining(bytebuf))) < 0) { | 
    
    
    1181  | 
     | 
     | 
    		L2TP_CTRL_DBG((_this, LOG_DEBUG, "sendto() failed: %m"));  | 
    
    
    1182  | 
     | 
     | 
    	}  | 
    
    
    1183  | 
     | 
     | 
     | 
    
    
    1184  | 
     | 
     | 
    	_this->last_snd_ctrl = curr_time;  | 
    
    
    1185  | 
     | 
     | 
     | 
    
    
    1186  | 
     | 
     | 
    	return (rval == bytebuffer_remaining(bytebuf))? 0 : 1;  | 
    
    
    1187  | 
     | 
     | 
    }  | 
    
    
    1188  | 
     | 
     | 
     | 
    
    
    1189  | 
     | 
     | 
    /*  | 
    
    
    1190  | 
     | 
     | 
     * receiver SCCRQ  | 
    
    
    1191  | 
     | 
     | 
     */  | 
    
    
    1192  | 
     | 
     | 
    static int  | 
    
    
    1193  | 
     | 
     | 
    l2tp_ctrl_recv_SCCRQ(l2tp_ctrl *_this, u_char *pkt, int pktlen, l2tpd *_l2tpd,  | 
    
    
    1194  | 
     | 
     | 
        struct sockaddr *peer)  | 
    
    
    1195  | 
     | 
     | 
    { | 
    
    
    1196  | 
     | 
     | 
    	int avpsz, len, protover, protorev, firmrev, result;  | 
    
    
    1197  | 
     | 
     | 
    	struct l2tp_avp *avp;  | 
    
    
    1198  | 
     | 
     | 
    	char host[NI_MAXHOST], serv[NI_MAXSERV];  | 
    
    
    1199  | 
     | 
     | 
    	char buf[L2TP_AVP_MAXSIZ], emes[256], hostname[256], vendorname[256];  | 
    
    
    1200  | 
     | 
     | 
     | 
    
    
    1201  | 
     | 
     | 
    	result = L2TP_STOP_CCN_RCODE_GENERAL_ERROR;  | 
    
    
    1202  | 
     | 
     | 
    	strlcpy(hostname, "(no hostname)", sizeof(hostname));  | 
    
    
    1203  | 
     | 
     | 
    	strlcpy(vendorname, "(no vendorname)", sizeof(vendorname));  | 
    
    
    1204  | 
     | 
     | 
     | 
    
    
    1205  | 
     | 
     | 
    	firmrev = 0;  | 
    
    
    1206  | 
     | 
     | 
    	protover = 0;  | 
    
    
    1207  | 
     | 
     | 
    	protorev = 0;  | 
    
    
    1208  | 
     | 
     | 
    	avp = (struct l2tp_avp *)buf;  | 
    
    
    1209  | 
     | 
     | 
    	while (pktlen >= 6 && (avpsz = avp_enum(avp, pkt, pktlen, 1)) > 0) { | 
    
    
    1210  | 
     | 
     | 
    		pkt += avpsz;  | 
    
    
    1211  | 
     | 
     | 
    		pktlen -= avpsz;  | 
    
    
    1212  | 
     | 
     | 
    		if (avp->vendor_id != 0) { | 
    
    
    1213  | 
     | 
     | 
    			L2TP_CTRL_DBG((_this, LOG_DEBUG,  | 
    
    
    1214  | 
     | 
     | 
    			    "Received a Vendor-specific AVP vendor-id=%d "  | 
    
    
    1215  | 
     | 
     | 
    			    "type=%d", avp->vendor_id, avp->attr_type));  | 
    
    
    1216  | 
     | 
     | 
    			continue;  | 
    
    
    1217  | 
     | 
     | 
    		}  | 
    
    
    1218  | 
     | 
     | 
    		switch (avp->attr_type) { | 
    
    
    1219  | 
     | 
     | 
    		case L2TP_AVP_TYPE_MESSAGE_TYPE:  | 
    
    
    1220  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, ==, 8);  | 
    
    
    1221  | 
     | 
     | 
    			continue;  | 
    
    
    1222  | 
     | 
     | 
    		case L2TP_AVP_TYPE_PROTOCOL_VERSION:  | 
    
    
    1223  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, ==, 8);  | 
    
    
    1224  | 
     | 
     | 
    			protover = avp->attr_value[0];  | 
    
    
    1225  | 
     | 
     | 
    			protorev = avp->attr_value[1];  | 
    
    
    1226  | 
     | 
     | 
     | 
    
    
    1227  | 
     | 
     | 
    			if (protover != L2TP_RFC2661_VERSION ||  | 
    
    
    1228  | 
     | 
     | 
    			    protorev != L2TP_RFC2661_REVISION) { | 
    
    
    1229  | 
     | 
     | 
    				result = L2TP_STOP_CCN_RCODE_GENERAL_ERROR;  | 
    
    
    1230  | 
     | 
     | 
    				snprintf(emes, sizeof(emes),  | 
    
    
    1231  | 
     | 
     | 
    				    "Peer's protocol version is not supported:"  | 
    
    
    1232  | 
     | 
     | 
    				    " %d.%d", protover, protorev);  | 
    
    
    1233  | 
     | 
     | 
    				goto not_acceptable;  | 
    
    
    1234  | 
     | 
     | 
    			}  | 
    
    
    1235  | 
     | 
     | 
    			continue;  | 
    
    
    1236  | 
     | 
     | 
    		case L2TP_AVP_TYPE_FRAMING_CAPABILITIES:  | 
    
    
    1237  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, ==, 10);  | 
    
    
    1238  | 
     | 
     | 
    			if ((avp_get_val32(avp) & L2TP_FRAMING_CAP_FLAGS_SYNC)  | 
    
    
    1239  | 
     | 
     | 
    			    == 0) { | 
    
    
    1240  | 
     | 
     | 
    				L2TP_CTRL_DBG((_this, LOG_DEBUG, "Peer doesn't "  | 
    
    
    1241  | 
     | 
     | 
    				    "support synchronous framing"));  | 
    
    
    1242  | 
     | 
     | 
    			}  | 
    
    
    1243  | 
     | 
     | 
    			continue;  | 
    
    
    1244  | 
     | 
     | 
    		case L2TP_AVP_TYPE_BEARER_CAPABILITIES:  | 
    
    
    1245  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, ==, 10);  | 
    
    
    1246  | 
     | 
     | 
    			continue;  | 
    
    
    1247  | 
     | 
     | 
    		case L2TP_AVP_TYPE_TIE_BREAKER:  | 
    
    
    1248  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, ==, 14);  | 
    
    
    1249  | 
     | 
     | 
    			/*  | 
    
    
    1250  | 
     | 
     | 
    			 * As the implementation never send SCCRQ,  | 
    
    
    1251  | 
     | 
     | 
    			 * the peer is always winner  | 
    
    
    1252  | 
     | 
     | 
    			 */  | 
    
    
    1253  | 
     | 
     | 
    			continue;  | 
    
    
    1254  | 
     | 
     | 
    		case L2TP_AVP_TYPE_FIRMWARE_REVISION:  | 
    
    
    1255  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, >=, 6);  | 
    
    
    1256  | 
     | 
     | 
    			firmrev = avp_get_val16(avp);  | 
    
    
    1257  | 
     | 
     | 
    			continue;  | 
    
    
    1258  | 
     | 
     | 
    		case L2TP_AVP_TYPE_HOST_NAME:  | 
    
    
    1259  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, >, 4);  | 
    
    
    1260  | 
     | 
     | 
    			len = MINIMUM(sizeof(hostname) - 1, avp->length - 6);  | 
    
    
    1261  | 
     | 
     | 
    			memcpy(hostname, avp->attr_value, len);  | 
    
    
    1262  | 
     | 
     | 
    			hostname[len] = '\0';  | 
    
    
    1263  | 
     | 
     | 
    			continue;  | 
    
    
    1264  | 
     | 
     | 
    		case L2TP_AVP_TYPE_VENDOR_NAME:  | 
    
    
    1265  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, >, 4);  | 
    
    
    1266  | 
     | 
     | 
    			len = MINIMUM(sizeof(vendorname) - 1, avp->length - 6);  | 
    
    
    1267  | 
     | 
     | 
    			memcpy(vendorname, avp->attr_value, len);  | 
    
    
    1268  | 
     | 
     | 
    			vendorname[len] = '\0';  | 
    
    
    1269  | 
     | 
     | 
    			continue;  | 
    
    
    1270  | 
     | 
     | 
    		case L2TP_AVP_TYPE_ASSINGED_TUNNEL_ID:  | 
    
    
    1271  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, ==, 8);  | 
    
    
    1272  | 
     | 
     | 
    			_this->peer_tunnel_id = avp_get_val16(avp);  | 
    
    
    1273  | 
     | 
     | 
    			continue;  | 
    
    
    1274  | 
     | 
     | 
    		case L2TP_AVP_TYPE_RECV_WINDOW_SIZE:  | 
    
    
    1275  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, ==, 8);  | 
    
    
    1276  | 
     | 
     | 
    			_this->peer_winsz = avp_get_val16(avp);  | 
    
    
    1277  | 
     | 
     | 
    			continue;  | 
    
    
    1278  | 
     | 
     | 
    		}  | 
    
    
    1279  | 
     | 
     | 
    		if (avp->is_mandatory) { | 
    
    
    1280  | 
     | 
     | 
    			l2tp_ctrl_log(_this, LOG_WARNING,  | 
    
    
    1281  | 
     | 
     | 
    			    "Received AVP (%s/%d) is not supported, but it's "  | 
    
    
    1282  | 
     | 
     | 
    			    "mandatory", avp_attr_type_string(avp->attr_type),  | 
    
    
    1283  | 
     | 
     | 
    			    avp->attr_type);  | 
    
    
    1284  | 
     | 
     | 
    #ifdef L2TP_CTRL_DEBUG  | 
    
    
    1285  | 
     | 
     | 
    		} else { | 
    
    
    1286  | 
     | 
     | 
    			L2TP_CTRL_DBG((_this, LOG_DEBUG,  | 
    
    
    1287  | 
     | 
     | 
    			    "AVP (%s/%d) is not handled",  | 
    
    
    1288  | 
     | 
     | 
    			    avp_attr_type_string(avp->attr_type),  | 
    
    
    1289  | 
     | 
     | 
    			    avp->attr_type));  | 
    
    
    1290  | 
     | 
     | 
    #endif  | 
    
    
    1291  | 
     | 
     | 
    		}  | 
    
    
    1292  | 
     | 
     | 
    	}  | 
    
    
    1293  | 
     | 
     | 
    	if (getnameinfo((struct sockaddr *)&_this->peer, _this->peer.ss_len,  | 
    
    
    1294  | 
     | 
     | 
    	    host, sizeof(host), serv, sizeof(serv),  | 
    
    
    1295  | 
     | 
     | 
    	    NI_NUMERICHOST | NI_NUMERICSERV | NI_DGRAM) != 0) { | 
    
    
    1296  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_ERR,  | 
    
    
    1297  | 
     | 
     | 
    		    "getnameinfo() failed at %s(): %m", __func__);  | 
    
    
    1298  | 
     | 
     | 
    		strlcpy(host, "error", sizeof(host));  | 
    
    
    1299  | 
     | 
     | 
    		strlcpy(serv, "error", sizeof(serv));  | 
    
    
    1300  | 
     | 
     | 
    	}  | 
    
    
    1301  | 
     | 
     | 
    	l2tp_ctrl_log(_this, LOG_NOTICE, "logtype=Started RecvSCCRQ "  | 
    
    
    1302  | 
     | 
     | 
    	    "from=%s:%s/udp tunnel_id=%u/%u protocol=%d.%d winsize=%d "  | 
    
    
    1303  | 
     | 
     | 
    	    "hostname=%s vendor=%s firm=%04X", host, serv, _this->tunnel_id,  | 
    
    
    1304  | 
     | 
     | 
    	    _this->peer_tunnel_id, protover, protorev, _this->peer_winsz,  | 
    
    
    1305  | 
     | 
     | 
    	    hostname, vendorname, firmrev);  | 
    
    
    1306  | 
     | 
     | 
     | 
    
    
    1307  | 
     | 
     | 
    	return 0;  | 
    
    
    1308  | 
     | 
     | 
    not_acceptable:  | 
    
    
    1309  | 
     | 
     | 
    size_check_failed:  | 
    
    
    1310  | 
     | 
     | 
    	l2tp_ctrl_log(_this, LOG_ERR, "Received bad SCCRQ: %s", emes);  | 
    
    
    1311  | 
     | 
     | 
    	l2tp_ctrl_stop(_this, result);  | 
    
    
    1312  | 
     | 
     | 
     | 
    
    
    1313  | 
     | 
     | 
    	return 1;  | 
    
    
    1314  | 
     | 
     | 
    }  | 
    
    
    1315  | 
     | 
     | 
     | 
    
    
    1316  | 
     | 
     | 
    /*  | 
    
    
    1317  | 
     | 
     | 
     * send StopCCN  | 
    
    
    1318  | 
     | 
     | 
     */  | 
    
    
    1319  | 
     | 
     | 
    static int  | 
    
    
    1320  | 
     | 
     | 
    l2tp_ctrl_send_StopCCN(l2tp_ctrl *_this, int result)  | 
    
    
    1321  | 
     | 
     | 
    { | 
    
    
    1322  | 
     | 
     | 
    	struct l2tp_avp *avp;  | 
    
    
    1323  | 
     | 
     | 
    	char buf[L2TP_AVP_MAXSIZ];  | 
    
    
    1324  | 
     | 
     | 
    	bytebuffer *bytebuf;  | 
    
    
    1325  | 
     | 
     | 
     | 
    
    
    1326  | 
     | 
     | 
    	if ((bytebuf = l2tp_ctrl_prepare_snd_buffer(_this, 1)) == NULL) { | 
    
    
    1327  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_ERR,  | 
    
    
    1328  | 
     | 
     | 
    		    "sending StopCCN failed: no buffer.");  | 
    
    
    1329  | 
     | 
     | 
    		return -1;  | 
    
    
    1330  | 
     | 
     | 
    	}  | 
    
    
    1331  | 
     | 
     | 
    	avp = (struct l2tp_avp *)buf;  | 
    
    
    1332  | 
     | 
     | 
     | 
    
    
    1333  | 
     | 
     | 
    	/* Message Type = StopCCN */  | 
    
    
    1334  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1335  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1336  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_MESSAGE_TYPE;  | 
    
    
    1337  | 
     | 
     | 
    	avp_set_val16(avp, L2TP_AVP_MESSAGE_TYPE_StopCCN);  | 
    
    
    1338  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 2);  | 
    
    
    1339  | 
     | 
     | 
     | 
    
    
    1340  | 
     | 
     | 
    	/* Assigned Tunnel Id */  | 
    
    
    1341  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1342  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1343  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_ASSINGED_TUNNEL_ID;  | 
    
    
    1344  | 
     | 
     | 
    	avp_set_val16(avp, _this->tunnel_id);  | 
    
    
    1345  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 2);  | 
    
    
    1346  | 
     | 
     | 
     | 
    
    
    1347  | 
     | 
     | 
    	/* Result Code */  | 
    
    
    1348  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1349  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1350  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_RESULT_CODE;  | 
    
    
    1351  | 
     | 
     | 
    	avp_set_val16(avp, result);  | 
    
    
    1352  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 2);  | 
    
    
    1353  | 
     | 
     | 
     | 
    
    
    1354  | 
     | 
     | 
    	if (l2tp_ctrl_send_packet(_this, 0, bytebuf) != 0) { | 
    
    
    1355  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_ERR, "sending StopCCN failed");  | 
    
    
    1356  | 
     | 
     | 
    		return - 1;  | 
    
    
    1357  | 
     | 
     | 
    	}  | 
    
    
    1358  | 
     | 
     | 
    	l2tp_ctrl_log(_this, LOG_INFO, "SendStopCCN result=%d", result);  | 
    
    
    1359  | 
     | 
     | 
     | 
    
    
    1360  | 
     | 
     | 
    	return 0;  | 
    
    
    1361  | 
     | 
     | 
    }  | 
    
    
    1362  | 
     | 
     | 
     | 
    
    
    1363  | 
     | 
     | 
    /*  | 
    
    
    1364  | 
     | 
     | 
     * Receiver StopCCN  | 
    
    
    1365  | 
     | 
     | 
     */  | 
    
    
    1366  | 
     | 
     | 
    static int  | 
    
    
    1367  | 
     | 
     | 
    l2tp_ctrl_recv_StopCCN(l2tp_ctrl *_this, u_char *pkt, int pktlen)  | 
    
    
    1368  | 
     | 
     | 
    { | 
    
    
    1369  | 
     | 
     | 
    	int result, error, avpsz, len;  | 
    
    
    1370  | 
     | 
     | 
    	uint16_t tunid;  | 
    
    
    1371  | 
     | 
     | 
    	struct l2tp_avp *avp;  | 
    
    
    1372  | 
     | 
     | 
    	char buf[L2TP_AVP_MAXSIZ + 16], emes[256], pmes[256];  | 
    
    
    1373  | 
     | 
     | 
     | 
    
    
    1374  | 
     | 
     | 
    	result = 0;  | 
    
    
    1375  | 
     | 
     | 
    	error = 0;  | 
    
    
    1376  | 
     | 
     | 
    	tunid = 0;  | 
    
    
    1377  | 
     | 
     | 
    	pmes[0] = '\0';  | 
    
    
    1378  | 
     | 
     | 
    	avp = (struct l2tp_avp *)buf;  | 
    
    
    1379  | 
     | 
     | 
    	while (pktlen >= 6 && (avpsz = avp_enum(avp, pkt, pktlen, 1)) > 0) { | 
    
    
    1380  | 
     | 
     | 
    		pkt += avpsz;  | 
    
    
    1381  | 
     | 
     | 
    		pktlen -= avpsz;  | 
    
    
    1382  | 
     | 
     | 
    		if (avp->vendor_id != 0) { | 
    
    
    1383  | 
     | 
     | 
    			L2TP_CTRL_DBG((_this, LOG_DEBUG,  | 
    
    
    1384  | 
     | 
     | 
    			    "Received a Vendor-specific AVP vendor-id=%d "  | 
    
    
    1385  | 
     | 
     | 
    			    "type=%d", avp->vendor_id, avp->attr_type));  | 
    
    
    1386  | 
     | 
     | 
    			continue;  | 
    
    
    1387  | 
     | 
     | 
    		}  | 
    
    
    1388  | 
     | 
     | 
    		if (avp->is_hidden != 0) { | 
    
    
    1389  | 
     | 
     | 
    			l2tp_ctrl_log(_this, LOG_WARNING,  | 
    
    
    1390  | 
     | 
     | 
    			    "Received AVP (%s/%d) is hidden.  But we don't "  | 
    
    
    1391  | 
     | 
     | 
    			    "share secret.",  | 
    
    
    1392  | 
     | 
     | 
    			    avp_attr_type_string(avp->attr_type),  | 
    
    
    1393  | 
     | 
     | 
    			    avp->attr_type);  | 
    
    
    1394  | 
     | 
     | 
    			if (avp->is_mandatory != 0) { | 
    
    
    1395  | 
     | 
     | 
    				l2tp_ctrl_stop(_this,  | 
    
    
    1396  | 
     | 
     | 
    				    L2TP_STOP_CCN_RCODE_GENERAL_ERROR |  | 
    
    
    1397  | 
     | 
     | 
    				    L2TP_ECODE_UNKNOWN_MANDATORY_AVP);  | 
    
    
    1398  | 
     | 
     | 
    				return 1;  | 
    
    
    1399  | 
     | 
     | 
    			}  | 
    
    
    1400  | 
     | 
     | 
    			continue;  | 
    
    
    1401  | 
     | 
     | 
    		}  | 
    
    
    1402  | 
     | 
     | 
    		switch (avp->attr_type) { | 
    
    
    1403  | 
     | 
     | 
    		case L2TP_AVP_TYPE_MESSAGE_TYPE:  | 
    
    
    1404  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, ==, 8);  | 
    
    
    1405  | 
     | 
     | 
    			continue;  | 
    
    
    1406  | 
     | 
     | 
    		case L2TP_AVP_TYPE_RESULT_CODE:  | 
    
    
    1407  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, >=, 8);  | 
    
    
    1408  | 
     | 
     | 
    			result = avp->attr_value[0] << 8 | avp->attr_value[1];  | 
    
    
    1409  | 
     | 
     | 
    			if (avp->length >= 10) { | 
    
    
    1410  | 
     | 
     | 
    				error = avp->attr_value[2] << 8 |  | 
    
    
    1411  | 
     | 
     | 
    				    avp->attr_value[3];  | 
    
    
    1412  | 
     | 
     | 
    				len = avp->length - 12;  | 
    
    
    1413  | 
     | 
     | 
    				if (len > 0) { | 
    
    
    1414  | 
     | 
     | 
    					len = MINIMUM(len, sizeof(pmes) - 1);  | 
    
    
    1415  | 
     | 
     | 
    					memcpy(pmes, &avp->attr_value[4], len);  | 
    
    
    1416  | 
     | 
     | 
    					pmes[len] = '\0';  | 
    
    
    1417  | 
     | 
     | 
    				}  | 
    
    
    1418  | 
     | 
     | 
    			}  | 
    
    
    1419  | 
     | 
     | 
    			continue;  | 
    
    
    1420  | 
     | 
     | 
    		case L2TP_AVP_TYPE_ASSINGED_TUNNEL_ID:  | 
    
    
    1421  | 
     | 
     | 
    			AVP_SIZE_CHECK(avp, ==, 8);  | 
    
    
    1422  | 
     | 
     | 
    			tunid = avp_get_val16(avp);  | 
    
    
    1423  | 
     | 
     | 
    			continue;  | 
    
    
    1424  | 
     | 
     | 
    		default:  | 
    
    
    1425  | 
     | 
     | 
    			if (avp->is_mandatory != 0) { | 
    
    
    1426  | 
     | 
     | 
    				l2tp_ctrl_log(_this, LOG_WARNING,  | 
    
    
    1427  | 
     | 
     | 
    				    "Received AVP (%s/%d) is not supported, "  | 
    
    
    1428  | 
     | 
     | 
    				    "but it's mandatory",  | 
    
    
    1429  | 
     | 
     | 
    				    avp_attr_type_string(avp->attr_type),  | 
    
    
    1430  | 
     | 
     | 
    				    avp->attr_type);  | 
    
    
    1431  | 
     | 
     | 
    #ifdef L2TP_CTRL_DEBUG  | 
    
    
    1432  | 
     | 
     | 
    			} else { | 
    
    
    1433  | 
     | 
     | 
    				L2TP_CTRL_DBG((_this, LOG_DEBUG,  | 
    
    
    1434  | 
     | 
     | 
    				    "AVP (%s/%d) is not handled",  | 
    
    
    1435  | 
     | 
     | 
    				    avp_attr_type_string(avp->attr_type),  | 
    
    
    1436  | 
     | 
     | 
    				    avp->attr_type));  | 
    
    
    1437  | 
     | 
     | 
    #endif  | 
    
    
    1438  | 
     | 
     | 
    			}  | 
    
    
    1439  | 
     | 
     | 
    		}  | 
    
    
    1440  | 
     | 
     | 
    	}  | 
    
    
    1441  | 
     | 
     | 
     | 
    
    
    1442  | 
     | 
     | 
    	if (result == L2TP_CDN_RCODE_ERROR_CODE &&  | 
    
    
    1443  | 
     | 
     | 
    	    error == L2TP_ECODE_NO_RESOURCE) { | 
    
    
    1444  | 
     | 
     | 
    		/*  | 
    
    
    1445  | 
     | 
     | 
    		 * Memo:  | 
    
    
    1446  | 
     | 
     | 
    		 * This state may be happen in following state.  | 
    
    
    1447  | 
     | 
     | 
    		 * - lots of connect/disconect by long-running  | 
    
    
    1448  | 
     | 
     | 
    		 *   windows2000, sometimes it fall to this state.  | 
    
    
    1449  | 
     | 
     | 
    		 *   Once it fall to here, connection will fail till  | 
    
    
    1450  | 
     | 
     | 
    		 *   the windows rebooted  | 
    
    
    1451  | 
     | 
     | 
    		 */  | 
    
    
    1452  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_WARNING,  | 
    
    
    1453  | 
     | 
     | 
    		    "Peer indicates \"No Resource\" error.");  | 
    
    
    1454  | 
     | 
     | 
    	}  | 
    
    
    1455  | 
     | 
     | 
     | 
    
    
    1456  | 
     | 
     | 
    	l2tp_ctrl_log(_this, LOG_INFO, "RecvStopCCN result=%s/%u "  | 
    
    
    1457  | 
     | 
     | 
    	    "error=%s/%u tunnel_id=%u message=\"%s\"",  | 
    
    
    1458  | 
     | 
     | 
    	    l2tp_stopccn_rcode_string(result), result,  | 
    
    
    1459  | 
     | 
     | 
    	    l2tp_ecode_string(error), error, tunid, pmes);  | 
    
    
    1460  | 
     | 
     | 
     | 
    
    
    1461  | 
     | 
     | 
    	return 0;  | 
    
    
    1462  | 
     | 
     | 
     | 
    
    
    1463  | 
     | 
     | 
    size_check_failed:  | 
    
    
    1464  | 
     | 
     | 
    	l2tp_ctrl_log(_this, LOG_ERR, "Received bad StopCCN: %s", emes);  | 
    
    
    1465  | 
     | 
     | 
     | 
    
    
    1466  | 
     | 
     | 
    	return -1;  | 
    
    
    1467  | 
     | 
     | 
    }  | 
    
    
    1468  | 
     | 
     | 
     | 
    
    
    1469  | 
     | 
     | 
    /*  | 
    
    
    1470  | 
     | 
     | 
     * send SCCRP  | 
    
    
    1471  | 
     | 
     | 
     */  | 
    
    
    1472  | 
     | 
     | 
    static void  | 
    
    
    1473  | 
     | 
     | 
    l2tp_ctrl_send_SCCRP(l2tp_ctrl *_this)  | 
    
    
    1474  | 
     | 
     | 
    { | 
    
    
    1475  | 
     | 
     | 
    	int len;  | 
    
    
    1476  | 
     | 
     | 
    	struct l2tp_avp *avp;  | 
    
    
    1477  | 
     | 
     | 
    	char buf[L2TP_AVP_MAXSIZ], hbuf[HOST_NAME_MAX+1];  | 
    
    
    1478  | 
     | 
     | 
    	const char *val;  | 
    
    
    1479  | 
     | 
     | 
    	bytebuffer *bytebuf;  | 
    
    
    1480  | 
     | 
     | 
     | 
    
    
    1481  | 
     | 
     | 
    	if ((bytebuf = l2tp_ctrl_prepare_snd_buffer(_this, 1)) == NULL) { | 
    
    
    1482  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_ERR,  | 
    
    
    1483  | 
     | 
     | 
    		    "sending SCCRP failed: no buffer.");  | 
    
    
    1484  | 
     | 
     | 
    		return;  | 
    
    
    1485  | 
     | 
     | 
    	}  | 
    
    
    1486  | 
     | 
     | 
    	avp = (struct l2tp_avp *)buf;  | 
    
    
    1487  | 
     | 
     | 
     | 
    
    
    1488  | 
     | 
     | 
    	/* Message Type = SCCRP */  | 
    
    
    1489  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1490  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1491  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_MESSAGE_TYPE;  | 
    
    
    1492  | 
     | 
     | 
    	avp_set_val16(avp, L2TP_AVP_MESSAGE_TYPE_SCCRP);  | 
    
    
    1493  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 2);  | 
    
    
    1494  | 
     | 
     | 
     | 
    
    
    1495  | 
     | 
     | 
    	/* Protocol Version = 1.0 */  | 
    
    
    1496  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1497  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1498  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_PROTOCOL_VERSION;  | 
    
    
    1499  | 
     | 
     | 
    	avp->attr_value[0] = L2TP_RFC2661_VERSION;  | 
    
    
    1500  | 
     | 
     | 
    	avp->attr_value[1] = L2TP_RFC2661_REVISION;  | 
    
    
    1501  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 2);  | 
    
    
    1502  | 
     | 
     | 
     | 
    
    
    1503  | 
     | 
     | 
    	/* Framing Capability = Async */  | 
    
    
    1504  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1505  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1506  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_FRAMING_CAPABILITIES;  | 
    
    
    1507  | 
     | 
     | 
    	avp_set_val32(avp, L2TP_FRAMING_CAP_FLAGS_SYNC);  | 
    
    
    1508  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 4);  | 
    
    
    1509  | 
     | 
     | 
     | 
    
    
    1510  | 
     | 
     | 
    	/* Host Name */  | 
    
    
    1511  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1512  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1513  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_HOST_NAME;  | 
    
    
    1514  | 
     | 
     | 
    	if ((val = L2TP_CTRL_CONF(_this)->hostname) == NULL) { | 
    
    
    1515  | 
     | 
     | 
    		gethostname(hbuf, sizeof(hbuf));  | 
    
    
    1516  | 
     | 
     | 
    		val = hbuf;  | 
    
    
    1517  | 
     | 
     | 
    	}  | 
    
    
    1518  | 
     | 
     | 
    	len = strlen(val);  | 
    
    
    1519  | 
     | 
     | 
    	memcpy(avp->attr_value, val, len);  | 
    
    
    1520  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, len);  | 
    
    
    1521  | 
     | 
     | 
     | 
    
    
    1522  | 
     | 
     | 
    	/* Assigned Tunnel Id */  | 
    
    
    1523  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1524  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1525  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_ASSINGED_TUNNEL_ID;  | 
    
    
    1526  | 
     | 
     | 
    	avp_set_val16(avp, _this->tunnel_id);  | 
    
    
    1527  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 2);  | 
    
    
    1528  | 
     | 
     | 
     | 
    
    
    1529  | 
     | 
     | 
    	/* Bearer Capability  | 
    
    
    1530  | 
     | 
     | 
    	 * This implementation never act as LAC.  | 
    
    
    1531  | 
     | 
     | 
    	 *  | 
    
    
    1532  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1533  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1534  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_BEARER_CAPABILITIES;  | 
    
    
    1535  | 
     | 
     | 
    	avp_set_val32(avp, 0);  | 
    
    
    1536  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 4);  | 
    
    
    1537  | 
     | 
     | 
    	 */  | 
    
    
    1538  | 
     | 
     | 
     | 
    
    
    1539  | 
     | 
     | 
    	/* Firmware Revision */  | 
    
    
    1540  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1541  | 
     | 
     | 
    	avp->is_mandatory = 0;  | 
    
    
    1542  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_FIRMWARE_REVISION;  | 
    
    
    1543  | 
     | 
     | 
    	avp->attr_value[0] = MAJOR_VERSION;  | 
    
    
    1544  | 
     | 
     | 
    	avp->attr_value[1] = MINOR_VERSION;  | 
    
    
    1545  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 2);  | 
    
    
    1546  | 
     | 
     | 
     | 
    
    
    1547  | 
     | 
     | 
    	/* Vendor Name */  | 
    
    
    1548  | 
     | 
     | 
    	if ((val = L2TP_CTRL_CONF(_this)->vendor_name) != NULL) { | 
    
    
    1549  | 
     | 
     | 
    		memset(avp, 0, sizeof(*avp));  | 
    
    
    1550  | 
     | 
     | 
    		avp->is_mandatory = 0;  | 
    
    
    1551  | 
     | 
     | 
    		avp->attr_type = L2TP_AVP_TYPE_VENDOR_NAME;  | 
    
    
    1552  | 
     | 
     | 
     | 
    
    
    1553  | 
     | 
     | 
    		len = strlen(val);  | 
    
    
    1554  | 
     | 
     | 
    		memcpy(avp->attr_value, val, len);  | 
    
    
    1555  | 
     | 
     | 
    		bytebuf_add_avp(bytebuf, avp, len);  | 
    
    
    1556  | 
     | 
     | 
    	}  | 
    
    
    1557  | 
     | 
     | 
     | 
    
    
    1558  | 
     | 
     | 
    	/* Window Size */  | 
    
    
    1559  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1560  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1561  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_RECV_WINDOW_SIZE;  | 
    
    
    1562  | 
     | 
     | 
    	avp_set_val16(avp, _this->winsz);  | 
    
    
    1563  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 2);  | 
    
    
    1564  | 
     | 
     | 
     | 
    
    
    1565  | 
     | 
     | 
    	if ((l2tp_ctrl_send_packet(_this, 0, bytebuf)) != 0) { | 
    
    
    1566  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_ERR, "sending SCCRP failed");  | 
    
    
    1567  | 
     | 
     | 
    		l2tp_ctrl_stop(_this, L2TP_STOP_CCN_RCODE_GENERAL);  | 
    
    
    1568  | 
     | 
     | 
    		return;  | 
    
    
    1569  | 
     | 
     | 
    	}  | 
    
    
    1570  | 
     | 
     | 
    	l2tp_ctrl_log(_this, LOG_INFO, "SendSCCRP");  | 
    
    
    1571  | 
     | 
     | 
    }  | 
    
    
    1572  | 
     | 
     | 
     | 
    
    
    1573  | 
     | 
     | 
    static int  | 
    
    
    1574  | 
     | 
     | 
    l2tp_ctrl_send_HELLO(l2tp_ctrl *_this)  | 
    
    
    1575  | 
     | 
     | 
    { | 
    
    
    1576  | 
     | 
     | 
    	struct l2tp_avp *avp;  | 
    
    
    1577  | 
     | 
     | 
    	char buf[L2TP_AVP_MAXSIZ];  | 
    
    
    1578  | 
     | 
     | 
    	bytebuffer *bytebuf;  | 
    
    
    1579  | 
     | 
     | 
     | 
    
    
    1580  | 
     | 
     | 
    	if ((bytebuf = l2tp_ctrl_prepare_snd_buffer(_this, 1)) == NULL) { | 
    
    
    1581  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_ERR,  | 
    
    
    1582  | 
     | 
     | 
    		    "sending SCCRP failed: no buffer.");  | 
    
    
    1583  | 
     | 
     | 
    		return 1;  | 
    
    
    1584  | 
     | 
     | 
    	}  | 
    
    
    1585  | 
     | 
     | 
    	avp = (struct l2tp_avp *)buf;  | 
    
    
    1586  | 
     | 
     | 
     | 
    
    
    1587  | 
     | 
     | 
    	/* Message Type = HELLO */  | 
    
    
    1588  | 
     | 
     | 
    	memset(avp, 0, sizeof(*avp));  | 
    
    
    1589  | 
     | 
     | 
    	avp->is_mandatory = 1;  | 
    
    
    1590  | 
     | 
     | 
    	avp->attr_type = L2TP_AVP_TYPE_MESSAGE_TYPE;  | 
    
    
    1591  | 
     | 
     | 
    	avp_set_val16(avp, L2TP_AVP_MESSAGE_TYPE_HELLO);  | 
    
    
    1592  | 
     | 
     | 
    	bytebuf_add_avp(bytebuf, avp, 2);  | 
    
    
    1593  | 
     | 
     | 
     | 
    
    
    1594  | 
     | 
     | 
    	if ((l2tp_ctrl_send_packet(_this, 0, bytebuf)) != 0) { | 
    
    
    1595  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_ERR, "sending HELLO failed");  | 
    
    
    1596  | 
     | 
     | 
    		l2tp_ctrl_stop(_this, L2TP_STOP_CCN_RCODE_GENERAL);  | 
    
    
    1597  | 
     | 
     | 
    		return 1;  | 
    
    
    1598  | 
     | 
     | 
    	}  | 
    
    
    1599  | 
     | 
     | 
    	l2tp_ctrl_log(_this, LOG_DEBUG, "SendHELLO");  | 
    
    
    1600  | 
     | 
     | 
     | 
    
    
    1601  | 
     | 
     | 
    	return 0;  | 
    
    
    1602  | 
     | 
     | 
    }  | 
    
    
    1603  | 
     | 
     | 
     | 
    
    
    1604  | 
     | 
     | 
    /* Send  ZLB */  | 
    
    
    1605  | 
     | 
     | 
    static int  | 
    
    
    1606  | 
     | 
     | 
    l2tp_ctrl_send_ZLB(l2tp_ctrl *_this)  | 
    
    
    1607  | 
     | 
     | 
    { | 
    
    
    1608  | 
     | 
     | 
    	int loglevel;  | 
    
    
    1609  | 
     | 
     | 
     | 
    
    
    1610  | 
     | 
     | 
    	loglevel = (_this->state == L2TP_CTRL_STATE_ESTABLISHED)  | 
    
    
    1611  | 
     | 
     | 
    	    ? LOG_DEBUG : LOG_INFO;  | 
    
    
    1612  | 
     | 
     | 
    	l2tp_ctrl_log(_this, loglevel, "SendZLB");  | 
    
    
    1613  | 
     | 
     | 
    	bytebuffer_clear(_this->zlb_buffer);  | 
    
    
    1614  | 
     | 
     | 
    	bytebuffer_put(_this->zlb_buffer, BYTEBUFFER_PUT_DIRECT,  | 
    
    
    1615  | 
     | 
     | 
    	    sizeof(struct l2tp_header));  | 
    
    
    1616  | 
     | 
     | 
     | 
    
    
    1617  | 
     | 
     | 
    	return l2tp_ctrl_send_packet(_this, 0, _this->zlb_buffer);  | 
    
    
    1618  | 
     | 
     | 
    }  | 
    
    
    1619  | 
     | 
     | 
     | 
    
    
    1620  | 
     | 
     | 
    /*  | 
    
    
    1621  | 
     | 
     | 
     * Utitlity  | 
    
    
    1622  | 
     | 
     | 
     */  | 
    
    
    1623  | 
     | 
     | 
     | 
    
    
    1624  | 
     | 
     | 
    /**  | 
    
    
    1625  | 
     | 
     | 
     * Prepare send buffer  | 
    
    
    1626  | 
     | 
     | 
     * @return return Null when the send buffer exceed Window.  | 
    
    
    1627  | 
     | 
     | 
     */  | 
    
    
    1628  | 
     | 
     | 
    bytebuffer *  | 
    
    
    1629  | 
     | 
     | 
    l2tp_ctrl_prepare_snd_buffer(l2tp_ctrl *_this, int with_seq)  | 
    
    
    1630  | 
     | 
     | 
    { | 
    
    
    1631  | 
     | 
     | 
    	bytebuffer *bytebuf;  | 
    
    
    1632  | 
     | 
     | 
     | 
    
    
    1633  | 
     | 
     | 
    	L2TP_CTRL_ASSERT(_this != NULL);  | 
    
    
    1634  | 
     | 
     | 
     | 
    
    
    1635  | 
     | 
     | 
    	if (l2tp_ctrl_txwin_is_full(_this)) { | 
    
    
    1636  | 
     | 
     | 
    		l2tp_ctrl_log(_this, LOG_INFO, "sending buffer is full.");  | 
    
    
    1637  | 
     | 
     | 
    		return NULL;  | 
    
    
    1638  | 
     | 
     | 
    	}  | 
    
    
    1639  | 
     | 
     | 
    	bytebuf = _this->snd_buffers[_this->snd_nxt % _this->winsz];  | 
    
    
    1640  | 
     | 
     | 
    	bytebuffer_clear(bytebuf);  | 
    
    
    1641  | 
     | 
     | 
    	if (with_seq)  | 
    
    
    1642  | 
     | 
     | 
    		bytebuffer_put(bytebuf, BYTEBUFFER_PUT_DIRECT,  | 
    
    
    1643  | 
     | 
     | 
    		    sizeof(struct l2tp_header));  | 
    
    
    1644  | 
     | 
     | 
    	else  | 
    
    
    1645  | 
     | 
     | 
    		bytebuffer_put(bytebuf, BYTEBUFFER_PUT_DIRECT,  | 
    
    
    1646  | 
     | 
     | 
    		    offsetof(struct l2tp_header, ns));  | 
    
    
    1647  | 
     | 
     | 
     | 
    
    
    1648  | 
     | 
     | 
    	return bytebuf;  | 
    
    
    1649  | 
     | 
     | 
    }  | 
    
    
    1650  | 
     | 
     | 
     | 
    
    
    1651  | 
     | 
     | 
    /**  | 
    
    
    1652  | 
     | 
     | 
     * return current state as strings  | 
    
    
    1653  | 
     | 
     | 
     */  | 
    
    
    1654  | 
     | 
     | 
    static inline const char *  | 
    
    
    1655  | 
     | 
     | 
    l2tp_ctrl_state_string(l2tp_ctrl *_this)  | 
    
    
    1656  | 
     | 
     | 
    { | 
    
    
    1657  | 
     | 
     | 
    	switch (_this->state) { | 
    
    
    1658  | 
     | 
     | 
    	case L2TP_CTRL_STATE_IDLE:		return "idle";  | 
    
    
    1659  | 
     | 
     | 
    	case L2TP_CTRL_STATE_WAIT_CTL_CONN:	return "wait-ctl-conn";  | 
    
    
    1660  | 
     | 
     | 
    	case L2TP_CTRL_STATE_WAIT_CTL_REPLY:	return "wait-ctl-reply";  | 
    
    
    1661  | 
     | 
     | 
    	case L2TP_CTRL_STATE_ESTABLISHED:	return "established";  | 
    
    
    1662  | 
     | 
     | 
    	case L2TP_CTRL_STATE_CLEANUP_WAIT:	return "cleanup-wait";  | 
    
    
    1663  | 
     | 
     | 
    	}  | 
    
    
    1664  | 
     | 
     | 
    	return "unknown";  | 
    
    
    1665  | 
     | 
     | 
    }  | 
    
    
    1666  | 
     | 
     | 
     | 
    
    
    1667  | 
     | 
     | 
    /* logging with the label of the l2tp instance. */  | 
    
    
    1668  | 
     | 
     | 
    void  | 
    
    
    1669  | 
     | 
     | 
    l2tp_ctrl_log(l2tp_ctrl *_this, int prio, const char *fmt, ...)  | 
    
    
    1670  | 
     | 
     | 
    { | 
    
    
    1671  | 
     | 
     | 
    	char logbuf[BUFSIZ];  | 
    
    
    1672  | 
     | 
     | 
    	va_list ap;  | 
    
    
    1673  | 
     | 
     | 
     | 
    
    
    1674  | 
     | 
     | 
    	va_start(ap, fmt);  | 
    
    
    1675  | 
     | 
     | 
    #ifdef	L2TPD_MULTIPLE  | 
    
    
    1676  | 
     | 
     | 
    	snprintf(logbuf, sizeof(logbuf), "l2tpd id=%u ctrl=%u %s",  | 
    
    
    1677  | 
     | 
     | 
    	    _this->l2tpd->id, _this->id, fmt);  | 
    
    
    1678  | 
     | 
     | 
    #else  | 
    
    
    1679  | 
     | 
     | 
    	snprintf(logbuf, sizeof(logbuf), "l2tpd ctrl=%u %s", _this->id, fmt);  | 
    
    
    1680  | 
     | 
     | 
    #endif  | 
    
    
    1681  | 
     | 
     | 
    	vlog_printf(prio, logbuf, ap);  | 
    
    
    1682  | 
     | 
     | 
    	va_end(ap);  | 
    
    
    1683  | 
     | 
     | 
    }  |