xref: /openbsd/usr.sbin/npppd/npppd/npppd.h (revision 2a5607d2)
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