1*2a5607d2Sgoda /* $OpenBSD: npppd.h,v 1.19 2017/08/12 11:20:34 goda Exp $ */ 2e109dc18Syasuoka 30fbf3537Syasuoka /*- 40fbf3537Syasuoka * Copyright (c) 2009 Internet Initiative Japan Inc. 50fbf3537Syasuoka * All rights reserved. 60fbf3537Syasuoka * 70fbf3537Syasuoka * Redistribution and use in source and binary forms, with or without 80fbf3537Syasuoka * modification, are permitted provided that the following conditions 90fbf3537Syasuoka * are met: 100fbf3537Syasuoka * 1. Redistributions of source code must retain the above copyright 110fbf3537Syasuoka * notice, this list of conditions and the following disclaimer. 120fbf3537Syasuoka * 2. Redistributions in binary form must reproduce the above copyright 130fbf3537Syasuoka * notice, this list of conditions and the following disclaimer in the 140fbf3537Syasuoka * documentation and/or other materials provided with the distribution. 150fbf3537Syasuoka * 160fbf3537Syasuoka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 170fbf3537Syasuoka * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 180fbf3537Syasuoka * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 190fbf3537Syasuoka * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 200fbf3537Syasuoka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 210fbf3537Syasuoka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 220fbf3537Syasuoka * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 230fbf3537Syasuoka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 240fbf3537Syasuoka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 250fbf3537Syasuoka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 260fbf3537Syasuoka * SUCH DAMAGE. 270fbf3537Syasuoka */ 280fbf3537Syasuoka #ifndef NPPPD_H 290fbf3537Syasuoka #define NPPPD_H 1 300fbf3537Syasuoka 31821f7c56Syasuoka 32821f7c56Syasuoka #include <sys/queue.h> 33821f7c56Syasuoka #include <sys/socket.h> 34821f7c56Syasuoka #include <stdbool.h> 35821f7c56Syasuoka #include <net/if.h> 36821f7c56Syasuoka #include <net/if_dl.h> 37821f7c56Syasuoka #include <netinet/in.h> 38821f7c56Syasuoka #include <event.h> 39dbad4650Sderaadt #include <limits.h> 40821f7c56Syasuoka 41821f7c56Syasuoka #include "addr_range.h" 42821f7c56Syasuoka 43821f7c56Syasuoka #include "l2tp_conf.h" 44821f7c56Syasuoka #include "pptp_conf.h" 45821f7c56Syasuoka #include "pppoe_conf.h" 46821f7c56Syasuoka 47dbad4650Sderaadt #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b)) 48dbad4650Sderaadt #define MAXIMUM(a, b) (((a) > (b)) ? (a) : (b)) 49dbad4650Sderaadt 506cc855c5Syasuoka #define NPPPD_USER "_ppp" 51821f7c56Syasuoka #define NPPPD_GENERIC_NAME_LEN 32 520fbf3537Syasuoka 53821f7c56Syasuoka /** Constants of tunnel type */ 54821f7c56Syasuoka #define NPPPD_TUNNEL_NONE 0 /** None Tunnel Type */ 55821f7c56Syasuoka #define NPPPD_TUNNEL_L2TP 1 /** L2TP Tunnel Type */ 56821f7c56Syasuoka #define NPPPD_TUNNEL_PPTP 2 /** PPTP Tunnel Type */ 57821f7c56Syasuoka #define NPPPD_TUNNEL_PPPOE 3 /** PPPoE Tunnel Type */ 58821f7c56Syasuoka #define NPPPD_TUNNEL_SSTP 4 /** SSTP Tunnel Type */ 590fbf3537Syasuoka 6041d69f6eSyasuoka #define npppd_pipex_proto(_tunnel) \ 6141d69f6eSyasuoka (((_tunnel) == NPPPD_TUNNEL_L2TP)? PIPEX_PROTO_L2TP : \ 6241d69f6eSyasuoka ((_tunnel) == NPPPD_TUNNEL_PPTP)? PIPEX_PROTO_PPTP : \ 6341d69f6eSyasuoka ((_tunnel) == NPPPD_TUNNEL_PPPOE)? PIPEX_PROTO_PPPOE : -1) 6441d69f6eSyasuoka 65821f7c56Syasuoka #define NPPPD_AUTH_METHODS_PAP 0x0001 66821f7c56Syasuoka #define NPPPD_AUTH_METHODS_CHAP 0x0002 67821f7c56Syasuoka #define NPPPD_AUTH_METHODS_MSCHAPV2 0x0004 680fbf3537Syasuoka 69821f7c56Syasuoka #define NPPPD_MPPE_DISABLED 0x0000 70821f7c56Syasuoka #define NPPPD_MPPE_ENABLED 0x0001 71821f7c56Syasuoka #define NPPPD_MPPE_REQUIRED 0x0002 720fbf3537Syasuoka 73821f7c56Syasuoka #define NPPPD_MPPE_40BIT 0x0001 74821f7c56Syasuoka #define NPPPD_MPPE_56BIT 0x0002 75821f7c56Syasuoka #define NPPPD_MPPE_128BIT 0x0004 760fbf3537Syasuoka 77821f7c56Syasuoka #define NPPPD_MPPE_STATEFUL 0x0001 78821f7c56Syasuoka #define NPPPD_MPPE_STATELESS 0x0002 790fbf3537Syasuoka 80821f7c56Syasuoka #define NPPPD_PROTO_BIT_IP 0x0001 81821f7c56Syasuoka #define NPPPD_PROTO_BIT_LCP 0x0002 82821f7c56Syasuoka #define NPPPD_PROTO_BIT_PAP 0x0004 83821f7c56Syasuoka #define NPPPD_PROTO_BIT_CHAP 0x0008 84821f7c56Syasuoka #define NPPPD_PROTO_BIT_EAP 0x0010 85821f7c56Syasuoka #define NPPPD_PROTO_BIT_MPPE 0x0020 86821f7c56Syasuoka #define NPPPD_PROTO_BIT_CCP 0x0040 87821f7c56Syasuoka #define NPPPD_PROTO_BIT_IPCP 0x0080 88821f7c56Syasuoka 89821f7c56Syasuoka #define NPPPD_CALLNUM_CHECK_NONE 0 90821f7c56Syasuoka #define NPPPD_CALLNUM_CHECK_STRICT 1 91821f7c56Syasuoka #define NPPPD_CALLNUM_CHECK_LOOSE 2 92821f7c56Syasuoka 93821f7c56Syasuoka struct tunnconf { 94821f7c56Syasuoka TAILQ_ENTRY(tunnconf) entry; 95821f7c56Syasuoka const char *name; 96821f7c56Syasuoka int protocol; 97821f7c56Syasuoka 98821f7c56Syasuoka union { 99821f7c56Syasuoka struct l2tp_conf l2tp; 100821f7c56Syasuoka struct pptp_conf pptp; 101821f7c56Syasuoka struct pppoe_conf pppoe; 102821f7c56Syasuoka } proto; 103821f7c56Syasuoka 104821f7c56Syasuoka int lcp_timeout; 105821f7c56Syasuoka int lcp_max_configure; 106821f7c56Syasuoka int lcp_max_terminate; 107821f7c56Syasuoka int lcp_max_nak_loop; 108821f7c56Syasuoka int mru; 109821f7c56Syasuoka bool lcp_keepalive; 110821f7c56Syasuoka int lcp_keepalive_interval; 111821f7c56Syasuoka int lcp_keepalive_retry_interval; 112821f7c56Syasuoka int lcp_keepalive_max_retries; 113821f7c56Syasuoka 114821f7c56Syasuoka u_int auth_methods; 115821f7c56Syasuoka 116821f7c56Syasuoka int ipcp_timeout; 117821f7c56Syasuoka int ipcp_max_configure; 118821f7c56Syasuoka int ipcp_max_terminate; 119821f7c56Syasuoka int ipcp_max_nak_loop; 120821f7c56Syasuoka int ccp_timeout; 121821f7c56Syasuoka int ccp_max_configure; 122821f7c56Syasuoka int ccp_max_terminate; 123821f7c56Syasuoka int ccp_max_nak_loop; 124821f7c56Syasuoka char *chap_name; 125821f7c56Syasuoka 126821f7c56Syasuoka bool mppe_yesno; 127821f7c56Syasuoka bool mppe_required; 128821f7c56Syasuoka u_int mppe_keylen; 129821f7c56Syasuoka u_int mppe_keystate; 130821f7c56Syasuoka 131821f7c56Syasuoka int idle_timeout; 132821f7c56Syasuoka bool tcp_mss_adjust; 133821f7c56Syasuoka bool ingress_filter; 134821f7c56Syasuoka int callnum_check; 135821f7c56Syasuoka 136821f7c56Syasuoka bool pipex; 137821f7c56Syasuoka 138821f7c56Syasuoka u_int debug_dump_pktin; 139821f7c56Syasuoka u_int debug_dump_pktout; 140821f7c56Syasuoka }; 141821f7c56Syasuoka 142821f7c56Syasuoka struct radserver { 143821f7c56Syasuoka TAILQ_ENTRY(radserver) entry; 144821f7c56Syasuoka struct sockaddr_storage address; 145821f7c56Syasuoka char *secret; 146821f7c56Syasuoka }; 147821f7c56Syasuoka 148821f7c56Syasuoka struct radconf { 149821f7c56Syasuoka TAILQ_HEAD(radservers, radserver) servers; 150821f7c56Syasuoka int timeout; 151821f7c56Syasuoka int max_tries; 152821f7c56Syasuoka int max_failovers; 153821f7c56Syasuoka }; 154821f7c56Syasuoka 155821f7c56Syasuoka struct authconf { 156821f7c56Syasuoka TAILQ_ENTRY(authconf) entry; 157821f7c56Syasuoka char name[NPPPD_GENERIC_NAME_LEN]; 158821f7c56Syasuoka int auth_type; 159821f7c56Syasuoka char *username_suffix; 160821f7c56Syasuoka bool eap_capable; 161821f7c56Syasuoka bool strip_nt_domain; 162821f7c56Syasuoka bool strip_atmark_realm; 163dbad4650Sderaadt char users_file_path[PATH_MAX]; 164d50b169aSgoda int user_max_session; 165821f7c56Syasuoka union { 166821f7c56Syasuoka struct { 167821f7c56Syasuoka struct radconf auth; 168821f7c56Syasuoka struct radconf acct; 169821f7c56Syasuoka } radius; 170dc316173Sespie } data; 171821f7c56Syasuoka }; 172821f7c56Syasuoka 173821f7c56Syasuoka struct ipcpconf { 174821f7c56Syasuoka TAILQ_ENTRY(ipcpconf) entry; 175821f7c56Syasuoka char name[NPPPD_GENERIC_NAME_LEN]; 176821f7c56Syasuoka bool dns_use_resolver; 177821f7c56Syasuoka struct in_addr dns_servers[2]; 178821f7c56Syasuoka struct in_addr nbns_servers[2]; 179821f7c56Syasuoka bool allow_user_select; 180821f7c56Syasuoka struct in_addr_range *dynamic_pool; 181821f7c56Syasuoka struct in_addr_range *static_pool; 182*2a5607d2Sgoda int max_session; 183821f7c56Syasuoka }; 184821f7c56Syasuoka 185821f7c56Syasuoka struct iface { 186821f7c56Syasuoka TAILQ_ENTRY(iface) entry; 187821f7c56Syasuoka char name[IFNAMSIZ]; 188821f7c56Syasuoka struct in_addr ip4addr; 189821f7c56Syasuoka struct ipcpconf *ipcpconf; 190821f7c56Syasuoka bool is_pppx; 191821f7c56Syasuoka }; 192821f7c56Syasuoka 193821f7c56Syasuoka struct confbind { 194821f7c56Syasuoka TAILQ_ENTRY(confbind) entry; 195821f7c56Syasuoka struct tunnconf *tunnconf; 196821f7c56Syasuoka struct authconf *authconf; 197821f7c56Syasuoka struct iface *iface; 198821f7c56Syasuoka }; 199821f7c56Syasuoka 200821f7c56Syasuoka struct npppd_conf { 201821f7c56Syasuoka int max_session; 202821f7c56Syasuoka int user_max_session; 203821f7c56Syasuoka TAILQ_HEAD(tunnconfs, tunnconf) tunnconfs; 204821f7c56Syasuoka TAILQ_HEAD(authconfs, authconf) authconfs; 205821f7c56Syasuoka TAILQ_HEAD(ipcpconfs, ipcpconf) ipcpconfs; 206821f7c56Syasuoka TAILQ_HEAD(ifaces, iface) ifaces; 207821f7c56Syasuoka TAILQ_HEAD(confbinds, confbind) confbinds; 208821f7c56Syasuoka struct l2tp_confs l2tp_confs; 209821f7c56Syasuoka struct pptp_confs pptp_confs; 210821f7c56Syasuoka struct pppoe_confs pppoe_confs; 211821f7c56Syasuoka }; 2120fbf3537Syasuoka 2130fbf3537Syasuoka /** sockaddr_npppd */ 2140fbf3537Syasuoka struct sockaddr_npppd { 2150fbf3537Syasuoka struct sockaddr_in sin4; 2160fbf3537Syasuoka struct sockaddr_in sin4mask; 2170fbf3537Syasuoka #define snp_len sin4.sin_len 2180fbf3537Syasuoka #define snp_family sin4.sin_family 2190fbf3537Syasuoka #define snp_addr sin4.sin_addr 2200fbf3537Syasuoka int snp_type; /* SNP_POOL or SNP_PPP */ 2210fbf3537Syasuoka #define snp_mask sin4mask.sin_addr 222f0a4e295Syasuoka /** next entry */ 2230fbf3537Syasuoka struct sockaddr_npppd *snp_next; 224f0a4e295Syasuoka /** contents of entry */ 2250fbf3537Syasuoka void *snp_data_ptr; 2260fbf3537Syasuoka }; 2270fbf3537Syasuoka #define SNP_POOL 1 2280fbf3537Syasuoka #define SNP_DYN_POOL 2 2290fbf3537Syasuoka #define SNP_PPP 3 2300fbf3537Syasuoka 231*2a5607d2Sgoda struct ipcpstat { 232*2a5607d2Sgoda LIST_ENTRY(ipcpstat) entry; 233*2a5607d2Sgoda char name[NPPPD_GENERIC_NAME_LEN]; 234*2a5607d2Sgoda int nsession; 235*2a5607d2Sgoda LIST_HEAD(, _npppd_ppp) ppp; 236*2a5607d2Sgoda }; 237*2a5607d2Sgoda LIST_HEAD(ipcpstat_head, ipcpstat); 238*2a5607d2Sgoda 2390fbf3537Syasuoka typedef struct _npppd npppd; 2400fbf3537Syasuoka 2410fbf3537Syasuoka #include "ppp.h" 2420fbf3537Syasuoka 24334682664Syasuoka #include <imsg.h> 24434682664Syasuoka 24534682664Syasuoka struct imsgev { 24634682664Syasuoka struct imsgbuf ibuf; 24734682664Syasuoka void (*handler)(int, short, void *); 24834682664Syasuoka struct event ev; 24934682664Syasuoka void *data; 25034682664Syasuoka short events; 25134682664Syasuoka }; 25234682664Syasuoka 25334682664Syasuoka struct ctl_conn { 25434682664Syasuoka TAILQ_ENTRY(ctl_conn) entry; 25534682664Syasuoka struct control_sock *parent; 25634682664Syasuoka u_int8_t flags; 25734682664Syasuoka #define CTL_CONN_NOTIFY 0x01 25834682664Syasuoka #define CTL_CONN_LOCKED 0x02 /* restricted mode */ 25934682664Syasuoka struct imsgev iev; 26034682664Syasuoka void *ctx; 26134682664Syasuoka }; 26234682664Syasuoka 26334682664Syasuoka TAILQ_HEAD(ctl_conn_list, ctl_conn); 26434682664Syasuoka extern struct ctl_conn_list ctl_conns; 26534682664Syasuoka 266821f7c56Syasuoka __BEGIN_DECLS 2670fbf3537Syasuoka npppd *npppd_get_npppd (void); 2680fbf3537Syasuoka int npppd_init (npppd *, const char *); 269821f7c56Syasuoka void npppd_start (npppd *); 2700fbf3537Syasuoka void npppd_stop (npppd *); 2710fbf3537Syasuoka void npppd_fini (npppd *); 272821f7c56Syasuoka int npppd_reset_routing_table (npppd *, int); 2730fbf3537Syasuoka int npppd_get_user_password (npppd *, npppd_ppp *, const char *, char *, int *); 2740fbf3537Syasuoka struct in_addr *npppd_get_user_framed_ip_address (npppd *, npppd_ppp *, const char *); 2750fbf3537Syasuoka int npppd_check_calling_number (npppd *, npppd_ppp *); 2760fbf3537Syasuoka npppd_ppp *npppd_get_ppp_by_ip (npppd *, struct in_addr); 277363e4d4bSyasuoka npppd_ppp *npppd_get_ppp_by_id (npppd *, u_int); 278821f7c56Syasuoka int npppd_check_user_max_session (npppd *, npppd_ppp *); 279821f7c56Syasuoka void npppd_network_output (npppd *, npppd_ppp *, int, u_char *, int); 280821f7c56Syasuoka int npppd_ppp_pipex_enable (npppd *, npppd_ppp *); 281821f7c56Syasuoka int npppd_ppp_pipex_disable (npppd *, npppd_ppp *); 282821f7c56Syasuoka int npppd_prepare_ip (npppd *, npppd_ppp *); 283821f7c56Syasuoka void npppd_release_ip (npppd *, npppd_ppp *); 284821f7c56Syasuoka void npppd_set_ip_enabled (npppd *, npppd_ppp *, int); 2850fbf3537Syasuoka int npppd_assign_ip_addr (npppd *, npppd_ppp *, uint32_t); 286821f7c56Syasuoka int npppd_set_radish (npppd *, void *); 2870fbf3537Syasuoka int npppd_ppp_bind_realm (npppd *, npppd_ppp *, const char *, int); 2880fbf3537Syasuoka int npppd_ppp_is_realm_local (npppd *, npppd_ppp *); 2890fbf3537Syasuoka int npppd_ppp_is_realm_radius (npppd *, npppd_ppp *); 2900fbf3537Syasuoka int npppd_ppp_is_realm_ready (npppd *, npppd_ppp *); 2910fbf3537Syasuoka const char *npppd_ppp_get_realm_name (npppd *, npppd_ppp *); 292821f7c56Syasuoka const char *npppd_ppp_get_iface_name (npppd *, npppd_ppp *); 293821f7c56Syasuoka int npppd_ppp_iface_is_ready (npppd *, npppd_ppp *); 2940fbf3537Syasuoka int npppd_ppp_bind_iface (npppd *, npppd_ppp *); 2950fbf3537Syasuoka void npppd_ppp_unbind_iface (npppd *, npppd_ppp *); 2968daf7599Syasuoka void *npppd_get_radius_auth_setting (npppd *, npppd_ppp *); 297821f7c56Syasuoka int sockaddr_npppd_match (void *, void *); 2980fbf3537Syasuoka const char *npppd_ppp_get_username_for_auth (npppd *, npppd_ppp *, const char *, char *); 299821f7c56Syasuoka const char *npppd_ppp_tunnel_protocol_name (npppd *, npppd_ppp *); 300821f7c56Syasuoka const char *npppd_tunnel_protocol_name (int); 301821f7c56Syasuoka struct tunnconf *npppd_get_tunnconf (npppd *, const char *); 302821f7c56Syasuoka int npppd_reload_config (npppd *); 303821f7c56Syasuoka int npppd_modules_reload (npppd *); 304821f7c56Syasuoka int npppd_ifaces_load_config (npppd *); 305821f7c56Syasuoka 306821f7c56Syasuoka int npppd_conf_parse (struct npppd_conf *, const char *); 307821f7c56Syasuoka void npppd_conf_init (struct npppd_conf *); 308821f7c56Syasuoka void npppd_conf_fini (struct npppd_conf *); 309821f7c56Syasuoka int npppd_config_check (const char *); 31034682664Syasuoka void npppd_on_ppp_start (npppd *, npppd_ppp *); 31134682664Syasuoka void npppd_on_ppp_stop (npppd *, npppd_ppp *); 31234682664Syasuoka void imsg_event_add(struct imsgev *); 31334682664Syasuoka 31434682664Syasuoka int control_init (struct control_sock *); 31534682664Syasuoka int control_listen (struct control_sock *); 31634682664Syasuoka void control_cleanup (struct control_sock *); 31734682664Syasuoka struct npppd_ctl *npppd_ctl_create (npppd *); 31834682664Syasuoka void npppd_ctl_destroy (struct npppd_ctl *); 31934682664Syasuoka int npppd_ctl_who (struct npppd_ctl *); 32034682664Syasuoka int npppd_ctl_monitor (struct npppd_ctl *); 32134682664Syasuoka int npppd_ctl_who_and_monitor (struct npppd_ctl *); 32234682664Syasuoka int npppd_ctl_add_started_ppp_id (struct npppd_ctl *, uint32_t); 32334682664Syasuoka int npppd_ctl_add_stopped_ppp (struct npppd_ctl *, npppd_ppp *); 32434682664Syasuoka int npppd_ctl_imsg_compose (struct npppd_ctl *, struct imsgbuf *); 32534682664Syasuoka int npppd_ctl_disconnect (struct npppd_ctl *, u_int *, int); 326821f7c56Syasuoka 327821f7c56Syasuoka __END_DECLS 328821f7c56Syasuoka 3290fbf3537Syasuoka #endif 330