1 | /* 2 | * Layer Two Tunnelling Protocol Daemon 3 | * Copyright (C) 1998 Adtran, Inc. 4 | * 5 | * Mark Spencer 6 | * 7 | * This software is distributed under the terms 8 | * of the GPL, which you should have received 9 | * along with this source. 10 | * 11 | * Protocol and implementation information, 12 | * structures and constants. 13 | */ 14 | /* 15 | typedef unsigned short _u16; 16 | typedef unsigned long long _u64; 17 | */ 18 | #ifndef _L2TP_H 19 | #define _L2TP_H 20 | 21 | #define MAXSTRLEN 120 /* Maximum length of common strings */ 22 | 23 | #include <netinet/in.h> 24 | #include <termios.h> 25 | #include "osport.h" 26 | #include "scheduler.h" 27 | #include "misc.h" 28 | #include "file.h" 29 | #include "call.h" 30 | #include "avp.h" 31 | #include "control.h" 32 | #include "aaa.h" 33 | #include "common.h" 34 | 35 | #define CONTROL_PIPE "/var/run/l2tp-control" 36 | 37 | #define BINARY "l2tpd" 38 | #define SERVER_VERSION "0.65.1" 39 | #define VENDOR_NAME "Adtran, l2tpd" 40 | #define PPPD "/usr/sbin/pppd" 41 | #define CALL_PPP_OPTS "defaultroute" 42 | #define FIRMWARE_REV 0x0651 /* Revision of our firmware (software, in this case) */ 43 | #define DEF_MAX_TUNNELS 32 /* By default only allow this many 44 | tunnels to exist */ 45 | 46 | #define HELLO_DELAY 60 /* How often to send a Hello message */ 47 | 48 | struct control_hdr 49 | { 50 | _u16 ver; /* Version and more */ 51 | _u16 length; /* Length field */ 52 | _u16 tid; /* Tunnel ID */ 53 | _u16 cid; /* Call ID */ 54 | _u16 Ns; /* Next sent */ 55 | _u16 Nr; /* Next received */ 56 | }; 57 | 58 | #define CTBIT(ver) (ver & 0x8000) /* Determins if control or not */ 59 | #define CLBIT(ver) (ver & 0x4000) /* Length bit present. Must be 1 60 | for control messages */ 61 | 62 | #define CZBITS(ver) (ver &0x37F8) /* Reserved bits: We must drop 63 | anything with these there */ 64 | 65 | #define CFBIT(ver) (ver & 0x0800) /* Presence of Ns and Nr fields 66 | flow bit? */ 67 | 68 | #define CVER(ver) (ver & 0x0007) /* Version of encapsulation */ 69 | 70 | 71 | struct payload_hdr 72 | { 73 | _u16 ver; /* Version and friends */ 74 | _u16 length; /* Optional Length */ 75 | _u16 tid; /* Tunnel ID */ 76 | _u16 cid; /* Caller ID */ 77 | _u16 Ns; /* Optional next sent */ 78 | _u16 Nr; /* Optional next received */ 79 | _u16 o_size; /* Optional offset size */ 80 | _u16 o_pad; /* Optional offset padding */ 81 | }; 82 | 83 | #define NZL_TIMEOUT_DIVISOR 4 /* Divide TIMEOUT by this and 84 | you know how often to send 85 | a zero byte packet */ 86 | 87 | #define PAYLOAD_BUF 10 /* Provide 10 expansion bytes 88 | so we can "decompress" the 89 | payloads and simplify coding */ 90 | #define DEFAULT_MAX_RETRIES 5 /* Recommended value from spec */ 91 | #define DEFAULT_RWS_SIZE 4 /* Default max outstanding 92 | control packets in queue */ 93 | #define DEFAULT_TX_BPS 10000000 /* For outgoing calls, report this speed */ 94 | #define DEFAULT_RX_BPS 10000000 95 | #define DEFAULT_MAX_BPS 10000000 /* jz: outgoing calls max bps */ 96 | #define DEFAULT_MIN_BPS 10000 /* jz: outgoing calls min bps */ 97 | #define PAYLOAD_FUDGE 2 /* How many packets we're willing to drop */ 98 | #define MIN_PAYLOAD_HDR_LEN 6 99 | 100 | #define UDP_LISTEN_PORT 1701 101 | /* FIXME: MAX_RECV_SIZE, what is it? */ 102 | #define MAX_RECV_SIZE 4096 /* Biggest packet we'll accept */ 103 | 104 | #define OUR_L2TP_VERSION 0x100 /* We support version 1, revision 0 */ 105 | 106 | #define PTBIT(ver) CTBIT(ver) /* Type bit: Must be zero for us */ 107 | #define PLBIT(ver) CLBIT(ver) /* Length specified? */ 108 | #define PFBIT(ver) CFBIT(ver) /* Flow control specified? */ 109 | #define PVER(ver) CVER(ver) /* Version */ 110 | #define PZBITS(ver) (ver & 0x14F8) /* Reserved bits */ 111 | #define PRBIT(ver) (ver & 0x2000) /* Reset Sr bit */ 112 | #define PSBIT(ver) (ver & 0x0200) /* Offset size bit */ 113 | #define PPBIT(ver) (ver & 0x0100) /* Preference bit */ 114 | 115 | struct tunnel 116 | { 117 | struct call *call_head; /* Member calls */ 118 | struct tunnel *next; /* Allows us to be linked easily */ 119 | 120 | int fc; /* Framing capabilities of peer */ 121 | struct schedule_entry *hello; 122 | int ourfc; /* Our framing capabilities */ 123 | int bc; /* Peer's bearer channels */ 124 | int hbit; /* Allow hidden AVP's? */ 125 | int ourbc; /* Our bearer channels */ 126 | _u64 tb; /* Their tie breaker */ 127 | _u64 ourtb; /* Our tie breaker */ 128 | int tid; /* Peer's tunnel identifier */ 129 | int ourtid; /* Our tunnel identifier */ 130 | int qtid; /* TID for disconnection */ 131 | int firmware; /* Peer's firmware revision */ 132 | #if 0 133 | unsigned int addr; /* Remote address */ 134 | unsigned short port; /* Port on remote end */ 135 | #else 136 | struct sockaddr_in peer; /* Peer's Address */ 137 | #endif 138 | int debug; /* Are we debugging or not? */ 139 | int nego; /* Show Negotiation? */ 140 | int count; /* How many membmer calls? */ 141 | int state; /* State of tunnel */ 142 | _u16 cSs; /* Sequence for next packet */ 143 | _u16 cSr; /* Next expected to receive */ 144 | int cLr; /* Last packet received by peer */ 145 | char hostname[MAXSTRLEN]; /* Remote hostname */ 146 | char vendor[MAXSTRLEN]; /* Vendor of remote product */ 147 | struct challenge chal_us; /* Their Challenge to us */ 148 | struct challenge chal_them; /* Our challenge to them */ 149 | char secret[MAXSTRLEN]; /* Secret to use */ 150 | #ifdef SANITY 151 | int sanity; /* check for sanity? */ 152 | #endif 153 | int rws; /* Peer's Receive Window Size */ 154 | int ourrws; /* Receive Window Size */ 155 | struct call *self; 156 | struct lns *lns; /* LNS that owns us */ 157 | struct lac *lac; /* LAC that owns us */ 158 | }; 159 | 160 | struct tunnel_list 161 | { 162 | struct tunnel *head; 163 | int count; 164 | int calls; 165 | }; 166 | 167 | /* Values for version */ 168 | #define VER_L2TP 2 169 | #define VER_PPTP 3 170 | 171 | /* Some PPP sync<->async stuff */ 172 | #define fcstab ppp_crc16_table 173 | 174 | #define PPP_FLAG 0x7e 175 | #define PPP_ESCAPE 0x7d 176 | #define PPP_TRANS 0x20 177 | 178 | #define PPP_INITFCS 0xffff 179 | #define PPP_GOODFCS 0xf0b8 180 | #define PPP_FCS(fcs,c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff]) 181 | 182 | /* Error Values */ 183 | 184 | extern struct tunnel_list tunnels; 185 | extern void tunnel_close (struct tunnel *t); 186 | extern void network_thread (); 187 | extern int init_network (); 188 | extern int debug_tunnel; 189 | extern int packet_dump; 190 | extern int debug_avp; 191 | extern int debug_state; 192 | extern int max_tunnels; 193 | extern int kernel_support; 194 | extern int server_socket; 195 | extern struct tunnel *new_tunnel (); 196 | extern struct packet_queue xmit_udp; 197 | extern void destroy_tunnel (struct tunnel *); 198 | extern struct buffer *new_payload (struct sockaddr_in); 199 | extern void recycle_payload (struct buffer *, struct sockaddr_in); 200 | extern void add_payload_hdr (struct tunnel *, struct call *, struct buffer *); 201 | extern int read_packet (struct buffer *, int, int); 202 | extern void udp_xmit (struct buffer *); 203 | extern void control_xmit (void *); 204 | extern int ppd; 205 | extern int switch_io; /* jz */ 206 | extern int control_fd; 207 | extern int start_pppd (struct call *c, struct ppp_opts *); 208 | extern void magic_lac_dial (void *); 209 | #ifndef MIN 210 | #define MIN(a,b) (((a)<(b)) ? (a) : (b)) 211 | #endif 212 | #endif 213 | 214 | 215 | /* 216 | * This is just some stuff to take 217 | * care of kernel definitions 218 | */ 219 | 220 | #ifdef USE_KERNEL 221 | #include <linux/sockios.h> 222 | #ifndef SIOCSETL2TP 223 | #warning This kernel source does not have l2tp support 224 | #undef USE_KERNEL 225 | #else 226 | #include <asm/types.h> 227 | #include <linux/l2tp.h> 228 | #endif 229 | #endif