1/*	$FreeBSD$	*/
2
3/*
4 * Copyright (C) 1997-2001 by Darren Reed.
5 *
6 * See the IPFILTER.LICENCE file for details on licencing.
7 *
8 * $FreeBSD$
9 * Id: ip_proxy.h,v 2.31.2.2 2005/03/12 19:33:48 darrenr Exp
10 */
11
12#ifndef	__IP_PROXY_H__
13#define	__IP_PROXY_H__
14
15#ifndef SOLARIS
16#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
17#endif
18
19#if defined(__STDC__) || defined(__GNUC__) || defined(_AIX51)
20#define	SIOCPROXY	_IOWR('r', 64, struct ap_control)
21#else
22#define	SIOCPROXY	_IOWR(r, 64, struct ap_control)
23#endif
24
25#ifndef	APR_LABELLEN
26#define	APR_LABELLEN	16
27#endif
28#define	AP_SESS_SIZE	53
29
30struct	nat;
31struct	ipnat;
32struct	ipstate;
33
34typedef	struct	ap_tcp {
35	u_short	apt_sport;	/* source port */
36	u_short	apt_dport;	/* destination port */
37	short	apt_sel[2];	/* {seq,ack}{off,min} set selector */
38	short	apt_seqoff[2];	/* sequence # difference */
39	u_32_t	apt_seqmin[2];	/* don't change seq-off until after this */
40	short	apt_ackoff[2];	/* sequence # difference */
41	u_32_t	apt_ackmin[2];	/* don't change seq-off until after this */
42	u_char	apt_state[2];	/* connection state */
43} ap_tcp_t;
44
45typedef	struct	ap_udp {
46	u_short	apu_sport;	/* source port */
47	u_short	apu_dport;	/* destination port */
48} ap_udp_t;
49
50typedef	struct ap_session {
51	struct	aproxy	*aps_apr;
52	union {
53		struct	ap_tcp	apu_tcp;
54		struct	ap_udp	apu_udp;
55	} aps_un;
56	u_int	aps_flags;
57	U_QUAD_T aps_bytes;	/* bytes sent */
58	U_QUAD_T aps_pkts;	/* packets sent */
59	void	*aps_nat;	/* pointer back to nat struct */
60	void	*aps_data;	/* private data */
61	int	aps_p;		/* protocol */
62	int	aps_psiz;	/* size of private data */
63	struct	ap_session	*aps_hnext;
64	struct	ap_session	*aps_next;
65} ap_session_t;
66
67#define	aps_sport	aps_un.apu_tcp.apt_sport
68#define	aps_dport	aps_un.apu_tcp.apt_dport
69#define	aps_sel		aps_un.apu_tcp.apt_sel
70#define	aps_seqoff	aps_un.apu_tcp.apt_seqoff
71#define	aps_seqmin	aps_un.apu_tcp.apt_seqmin
72#define	aps_state	aps_un.apu_tcp.apt_state
73#define	aps_ackoff	aps_un.apu_tcp.apt_ackoff
74#define	aps_ackmin	aps_un.apu_tcp.apt_ackmin
75
76
77typedef	struct	ap_control {
78	char	apc_label[APR_LABELLEN];
79	u_char	apc_p;
80	/*
81	 * The following fields are upto the proxy's apr_ctl routine to deal
82	 * with.  When the proxy gets this in kernel space, apc_data will
83	 * point to a malloc'd region of memory of apc_dsize bytes.  If the
84	 * proxy wants to keep that memory, it must set apc_data to NULL
85	 * before it returns.  It is expected if this happens that it will
86	 * take care to free it in apr_fini or otherwise as appropriate.
87	 * apc_cmd is provided as a standard place to put simple commands,
88	 * with apc_arg being available to put a simple arg.
89	 */
90	u_long	apc_cmd;
91	u_long	apc_arg;
92	void	*apc_data;
93	size_t	apc_dsize;
94} ap_ctl_t;
95
96
97typedef	struct	aproxy	{
98	struct	aproxy	*apr_next;
99	char	apr_label[APR_LABELLEN];	/* Proxy label # */
100	u_char	apr_p;		/* protocol */
101	int	apr_ref;	/* +1 per rule referencing it */
102	int	apr_flags;
103	int	(* apr_init) __P((void));
104	void	(* apr_fini) __P((void));
105	int	(* apr_new) __P((fr_info_t *, ap_session_t *, struct nat *));
106	void	(* apr_del) __P((ap_session_t *));
107	int	(* apr_inpkt) __P((fr_info_t *, ap_session_t *, struct nat *));
108	int	(* apr_outpkt) __P((fr_info_t *, ap_session_t *, struct nat *));
109	int	(* apr_match) __P((fr_info_t *, ap_session_t *, struct nat *));
110	int	(* apr_ctl) __P((struct aproxy *, struct ap_control *));
111} aproxy_t;
112
113#define	APR_DELETE	1
114
115#define	APR_ERR(x)	((x) << 16)
116#define	APR_EXIT(x)	(((x) >> 16) & 0xffff)
117#define	APR_INC(x)	((x) & 0xffff)
118
119/*
120 * Generic #define's to cover missing things in the kernel
121 */
122#ifndef isdigit
123#define isdigit(x)	((x) >= '0' && (x) <= '9')
124#endif
125#ifndef isupper
126#define isupper(x)	(((unsigned)(x) >= 'A') && ((unsigned)(x) <= 'Z'))
127#endif
128#ifndef islower
129#define islower(x)	(((unsigned)(x) >= 'a') && ((unsigned)(x) <= 'z'))
130#endif
131#ifndef isalpha
132#define isalpha(x)	(isupper(x) || islower(x))
133#endif
134#ifndef toupper
135#define toupper(x)	(isupper(x) ? (x) : (x) - 'a' + 'A')
136#endif
137#ifndef isspace
138#define isspace(x)	(((x) == ' ') || ((x) == '\r') || ((x) == '\n') || \
139			 ((x) == '\t') || ((x) == '\b'))
140#endif
141
142/*
143 * This is the scratch buffer size used to hold strings from the TCP stream
144 * that we may want to parse.  It's an arbitrary size, really, but it must
145 * be at least as large as IPF_FTPBUFSZ.
146 */
147#define	FTP_BUFSZ	120
148
149/*
150 * This buffer, however, doesn't need to be nearly so big.  It just needs to
151 * be able to squeeze in the largest command it needs to rewrite, Which ones
152 * does it rewrite? EPRT, PORT, 227 replies.
153 */
154#define	IPF_FTPBUFSZ	80	/* This *MUST* be >= 53! */
155
156typedef struct  ftpside {
157	char	*ftps_rptr;
158	char	*ftps_wptr;
159	void	*ftps_ifp;
160	u_32_t	ftps_seq[2];
161	u_32_t	ftps_len;
162	int	ftps_junk;	/* 2 = no cr/lf yet, 1 = cannot parse */
163	int	ftps_cmds;
164	char	ftps_buf[FTP_BUFSZ];
165} ftpside_t;
166
167typedef struct  ftpinfo {
168	int 	  	ftp_passok;
169	int		ftp_incok;
170	ftpside_t	ftp_side[2];
171} ftpinfo_t;
172
173
174/*
175 * For the irc proxy.
176 */
177typedef	struct	ircinfo {
178	size_t	irc_len;
179	char	*irc_snick;
180	char	*irc_dnick;
181	char	*irc_type;
182	char	*irc_arg;
183	char	*irc_addr;
184	u_32_t	irc_ipnum;
185	u_short	irc_port;
186} ircinfo_t;
187
188
189/*
190 * Real audio proxy structure and #defines
191 */
192typedef	struct	raudio_s {
193	int	rap_seenpna;
194	int	rap_seenver;
195	int	rap_version;
196	int	rap_eos;	/* End Of Startup */
197	int	rap_gotid;
198	int	rap_gotlen;
199	int	rap_mode;
200	int	rap_sdone;
201	u_short	rap_plport;
202	u_short	rap_prport;
203	u_short	rap_srport;
204	char	rap_svr[19];
205	u_32_t	rap_sbf;	/* flag to indicate which of the 19 bytes have
206				 * been filled
207				 */
208	u_32_t	rap_sseq;
209} raudio_t;
210
211#define	RA_ID_END	0
212#define	RA_ID_UDP	1
213#define	RA_ID_ROBUST	7
214
215#define	RAP_M_UDP	1
216#define	RAP_M_ROBUST	2
217#define	RAP_M_TCP	4
218#define	RAP_M_UDP_ROBUST	(RAP_M_UDP|RAP_M_ROBUST)
219
220
221/*
222 * MSN RPC proxy
223 */
224typedef	struct	msnrpcinfo	{
225	u_int		mri_flags;
226	int		mri_cmd[2];
227	u_int		mri_valid;
228	struct	in_addr	mri_raddr;
229	u_short		mri_rport;
230} msnrpcinfo_t;
231
232
233/*
234 * IPSec proxy
235 */
236typedef	u_32_t	ipsec_cookie_t[2];
237
238typedef struct ipsec_pxy {
239	ipsec_cookie_t	ipsc_icookie;
240	ipsec_cookie_t	ipsc_rcookie;
241	int		ipsc_rckset;
242	ipnat_t		ipsc_rule;
243	nat_t		*ipsc_nat;
244	struct ipstate	*ipsc_state;
245} ipsec_pxy_t;
246
247/*
248 * PPTP proxy
249 */
250typedef	struct pptp_side {
251	u_32_t		pptps_nexthdr;
252	u_32_t		pptps_next;
253	int		pptps_state;
254	int		pptps_gothdr;
255	int		pptps_len;
256	int		pptps_bytes;
257	char		*pptps_wptr;
258	char		pptps_buffer[512];
259} pptp_side_t;
260
261typedef	struct pptp_pxy {
262	ipnat_t		pptp_rule;
263	nat_t		*pptp_nat;
264	struct ipstate	*pptp_state;
265	u_short		pptp_call[2];
266	pptp_side_t	pptp_side[2];
267} pptp_pxy_t;
268
269
270/*
271 * Sun RPCBIND proxy
272 */
273#define RPCB_MAXMSG	888
274#define RPCB_RES_PMAP	0	/* Response contains a v2 port. */
275#define RPCB_RES_STRING	1	/* " " " v3 (GETADDR) string. */
276#define RPCB_RES_LIST	2	/* " " " v4 (GETADDRLIST) list. */
277#define RPCB_MAXREQS	32	/* Arbitrary limit on tracked transactions */
278
279#define RPCB_REQMIN	40
280#define RPCB_REQMAX	888
281#define RPCB_REPMIN	20
282#define	RPCB_REPMAX	604	/* XXX double check this! */
283
284/*
285 * These macros determine the number of bytes between p and the end of
286 * r->rs_buf relative to l.
287 */
288#define RPCB_BUF_END(r) (char *)((r)->rm_msgbuf + (r)->rm_buflen)
289#define RPCB_BUF_GEQ(r, p, l)   \
290        ((RPCB_BUF_END((r)) > (char *)(p)) &&           \
291         ((RPCB_BUF_END((r)) - (char *)(p)) >= (l)))
292#define	RPCB_BUF_EQ(r, p, l)                            \
293        (RPCB_BUF_END((r)) == ((char *)(p) + (l)))
294
295/*
296 * The following correspond to RPC(B) detailed in RFC183[13].
297 */
298#define RPCB_CALL		0
299#define RPCB_REPLY		1
300#define RPCB_MSG_VERSION	2
301#define RPCB_PROG		100000
302#define RPCB_GETPORT		3
303#define RPCB_GETADDR		3
304#define RPCB_GETADDRLIST	11
305#define RPCB_MSG_ACCEPTED	0
306#define RPCB_MSG_DENIED		1
307
308/* BEGIN (Generic XDR structures) */
309typedef struct xdr_string {
310	u_32_t	*xs_len;
311	char	*xs_str;
312} xdr_string_t;
313
314typedef struct xdr_auth {
315	/* u_32_t	xa_flavor; */
316	xdr_string_t	xa_string;
317} xdr_auth_t;
318
319typedef struct xdr_uaddr {
320	u_32_t		xu_ip;
321	u_short         xu_port;
322	xdr_string_t	xu_str;
323} xdr_uaddr_t;
324
325typedef	struct xdr_proto {
326	u_int		xp_proto;
327	xdr_string_t	xp_str;
328} xdr_proto_t;
329
330#define xu_xslen	xu_str.xs_len
331#define xu_xsstr	xu_str.xs_str
332#define	xp_xslen	xp_str.xs_len
333#define xp_xsstr	xp_str.xs_str
334/* END (Generic XDR structures) */
335
336/* BEGIN (RPC call structures) */
337typedef struct pmap_args {
338	/* u_32_t	pa_prog; */
339	/* u_32_t	pa_vers; */
340	u_32_t		*pa_prot;
341	/* u_32_t	pa_port; */
342} pmap_args_t;
343
344typedef struct rpcb_args {
345	/* u_32_t	*ra_prog; */
346	/* u_32_t	*ra_vers; */
347	xdr_proto_t	ra_netid;
348	xdr_uaddr_t	ra_maddr;
349	/* xdr_string_t	ra_owner; */
350} rpcb_args_t;
351
352typedef struct rpc_call {
353	/* u_32_t	rc_rpcvers; */
354	/* u_32_t	rc_prog; */
355	u_32_t	*rc_vers;
356	u_32_t	*rc_proc;
357	xdr_auth_t	rc_authcred;
358	xdr_auth_t	rc_authverf;
359	union {
360		pmap_args_t	ra_pmapargs;
361		rpcb_args_t	ra_rpcbargs;
362	} rpcb_args;
363} rpc_call_t;
364
365#define	rc_pmapargs	rpcb_args.ra_pmapargs
366#define rc_rpcbargs	rpcb_args.ra_rpcbargs
367/* END (RPC call structures) */
368
369/* BEGIN (RPC reply structures) */
370typedef struct rpcb_entry {
371	xdr_uaddr_t	re_maddr;
372	xdr_proto_t	re_netid;
373	/* u_32_t	re_semantics; */
374	xdr_string_t	re_family;
375	xdr_proto_t	re_proto;
376	u_32_t		*re_more; /* 1 == another entry follows */
377} rpcb_entry_t;
378
379typedef struct rpcb_listp {
380	u_32_t		*rl_list; /* 1 == list follows */
381	int		rl_cnt;
382	rpcb_entry_t	rl_entries[2]; /* TCP / UDP only */
383} rpcb_listp_t;
384
385typedef struct rpc_resp {
386	/* u_32_t	rr_acceptdeny; */
387	/* Omitted 'message denied' fork; we don't care about rejects. */
388	xdr_auth_t	rr_authverf;
389	/* u_32_t		*rr_astat;	*/
390	union {
391		u_32_t		*resp_pmap;
392		xdr_uaddr_t	resp_getaddr;
393		rpcb_listp_t	resp_getaddrlist;
394	} rpcb_reply;
395} rpc_resp_t;
396
397#define	rr_v2	rpcb_reply.resp_pmap
398#define rr_v3	rpcb_reply.resp_getaddr
399#define	rr_v4	rpcb_reply.resp_getaddrlist
400/* END (RPC reply structures) */
401
402/* BEGIN (RPC message structure & macros) */
403typedef struct rpc_msg {
404	char	rm_msgbuf[RPCB_MAXMSG];	/* RPCB data buffer */
405	u_int	rm_buflen;
406	u_32_t	*rm_xid;
407	/* u_32_t Call vs Reply */
408	union {
409		rpc_call_t	rb_call;
410		rpc_resp_t	rb_resp;
411	} rm_body;
412} rpc_msg_t;
413
414#define rm_call		rm_body.rb_call
415#define rm_resp		rm_body.rb_resp
416/* END (RPC message structure & macros) */
417
418/*
419 * These code paths aren't hot enough to warrant per transaction
420 * mutexes.
421 */
422typedef struct rpcb_xact {
423	struct	rpcb_xact	*rx_next;
424	struct	rpcb_xact	**rx_pnext;
425	u_32_t	rx_xid;		/* RPC transmission ID */
426	u_int	rx_type;	/* RPCB response type */
427	u_int	rx_ref;         /* reference count */
428	u_int	rx_proto;	/* transport protocol (v2 only) */
429} rpcb_xact_t;
430
431typedef struct rpcb_session {
432        ipfmutex_t	rs_rxlock;
433	rpcb_xact_t	*rs_rxlist;
434} rpcb_session_t;
435
436/*
437 * For an explanation, please see the following:
438 *   RFC1832 - Sections 3.11, 4.4, and 4.5.
439 */
440#define XDRALIGN(x)	((((x) % 4) != 0) ? ((((x) + 3) / 4) * 4) : (x))
441
442extern	ap_session_t	*ap_sess_tab[AP_SESS_SIZE];
443extern	ap_session_t	*ap_sess_list;
444extern	aproxy_t	ap_proxies[];
445extern	int		ippr_ftp_pasvonly;
446extern	int		ipf_proxy_debug;
447
448extern	int	appr_add __P((aproxy_t *));
449extern	int	appr_ctl __P((ap_ctl_t *));
450extern	int	appr_del __P((aproxy_t *));
451extern	int	appr_init __P((void));
452extern	void	appr_unload __P((void));
453extern	int	appr_ok __P((fr_info_t *, tcphdr_t *, struct ipnat *));
454extern	int	appr_match __P((fr_info_t *, struct nat *));
455extern	void	appr_free __P((aproxy_t *));
456extern	void	aps_free __P((ap_session_t *));
457extern	int	appr_check __P((fr_info_t *, struct nat *));
458extern	aproxy_t	*appr_lookup __P((u_int, char *));
459extern	int	appr_new __P((fr_info_t *, struct nat *));
460extern	int	appr_ioctl __P((caddr_t, ioctlcmd_t, int, void *));
461
462#endif /* __IP_PROXY_H__ */
463