xref: /freebsd/crypto/openssh/channels.h (revision 069ac18495ad8fde2748bc94b0f80a50250bb01d)
1*069ac184SEd Maste /* $OpenBSD: channels.h,v 1.154 2023/12/18 14:47:20 djm Exp $ */
2af12a3e7SDag-Erling Smørgrav 
3b66f2d16SKris Kennaway /*
4b66f2d16SKris Kennaway  * Author: Tatu Ylonen <ylo@cs.hut.fi>
5b66f2d16SKris Kennaway  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
6b66f2d16SKris Kennaway  *                    All rights reserved
7b66f2d16SKris Kennaway  *
8b66f2d16SKris Kennaway  * As far as I am concerned, the code I have written for this software
9b66f2d16SKris Kennaway  * can be used freely for any purpose.  Any derived versions of this
10b66f2d16SKris Kennaway  * software must be clearly marked as such, and if the derived work is
11b66f2d16SKris Kennaway  * incompatible with the protocol description in the RFC file, it must be
12b66f2d16SKris Kennaway  * called by a name other than "ssh" or "Secure Shell".
13b66f2d16SKris Kennaway  */
14b66f2d16SKris Kennaway /*
15af12a3e7SDag-Erling Smørgrav  * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl.  All rights reserved.
16b66f2d16SKris Kennaway  *
17b66f2d16SKris Kennaway  * Redistribution and use in source and binary forms, with or without
18b66f2d16SKris Kennaway  * modification, are permitted provided that the following conditions
19b66f2d16SKris Kennaway  * are met:
20b66f2d16SKris Kennaway  * 1. Redistributions of source code must retain the above copyright
21b66f2d16SKris Kennaway  *    notice, this list of conditions and the following disclaimer.
22b66f2d16SKris Kennaway  * 2. Redistributions in binary form must reproduce the above copyright
23b66f2d16SKris Kennaway  *    notice, this list of conditions and the following disclaimer in the
24b66f2d16SKris Kennaway  *    documentation and/or other materials provided with the distribution.
25b66f2d16SKris Kennaway  *
26b66f2d16SKris Kennaway  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27b66f2d16SKris Kennaway  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28b66f2d16SKris Kennaway  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29b66f2d16SKris Kennaway  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30b66f2d16SKris Kennaway  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31b66f2d16SKris Kennaway  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32b66f2d16SKris Kennaway  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33b66f2d16SKris Kennaway  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34b66f2d16SKris Kennaway  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35b66f2d16SKris Kennaway  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36b66f2d16SKris Kennaway  */
37511b41d2SMark Murray 
38af12a3e7SDag-Erling Smørgrav #ifndef CHANNEL_H
39af12a3e7SDag-Erling Smørgrav #define CHANNEL_H
40511b41d2SMark Murray 
41511b41d2SMark Murray /* Definitions for channel types. */
42511b41d2SMark Murray #define SSH_CHANNEL_X11_LISTENER	1	/* Listening for inet X11 conn. */
43511b41d2SMark Murray #define SSH_CHANNEL_PORT_LISTENER	2	/* Listening on a port. */
44511b41d2SMark Murray #define SSH_CHANNEL_OPENING		3	/* waiting for confirmation */
45511b41d2SMark Murray #define SSH_CHANNEL_OPEN		4	/* normal open two-way channel */
46511b41d2SMark Murray #define SSH_CHANNEL_CLOSED		5	/* waiting for close confirmation */
47a04a10f8SKris Kennaway #define SSH_CHANNEL_AUTH_SOCKET		6	/* authentication socket */
48a04a10f8SKris Kennaway #define SSH_CHANNEL_X11_OPEN		7	/* reading first X11 packet */
49a04a10f8SKris Kennaway #define SSH_CHANNEL_LARVAL		10	/* larval session */
50ca3176e7SBrian Feldman #define SSH_CHANNEL_RPORT_LISTENER	11	/* Listening to a R-style port  */
51ca3176e7SBrian Feldman #define SSH_CHANNEL_CONNECTING		12
52ca3176e7SBrian Feldman #define SSH_CHANNEL_DYNAMIC		13
53af12a3e7SDag-Erling Smørgrav #define SSH_CHANNEL_ZOMBIE		14	/* Almost dead. */
54b15c8340SDag-Erling Smørgrav #define SSH_CHANNEL_MUX_LISTENER	15	/* Listener for mux conn. */
5519261079SEd Maste #define SSH_CHANNEL_MUX_CLIENT		16	/* Conn. to mux client */
56e4a9863fSDag-Erling Smørgrav #define SSH_CHANNEL_ABANDONED		17	/* Abandoned session, eg mux */
57a0ee8cc6SDag-Erling Smørgrav #define SSH_CHANNEL_UNIX_LISTENER	18	/* Listening on a domain socket. */
58a0ee8cc6SDag-Erling Smørgrav #define SSH_CHANNEL_RUNIX_LISTENER	19	/* Listening to a R-style domain socket. */
5919261079SEd Maste #define SSH_CHANNEL_MUX_PROXY		20	/* proxy channel for mux-client */
604f52dfbbSDag-Erling Smørgrav #define SSH_CHANNEL_RDYNAMIC_OPEN	21	/* reverse SOCKS, parsing request */
614f52dfbbSDag-Erling Smørgrav #define SSH_CHANNEL_RDYNAMIC_FINISH	22	/* reverse SOCKS, finishing connect */
624f52dfbbSDag-Erling Smørgrav #define SSH_CHANNEL_MAX_TYPE		23
63511b41d2SMark Murray 
64462c32cbSDag-Erling Smørgrav #define CHANNEL_CANCEL_PORT_STATIC	-1
65462c32cbSDag-Erling Smørgrav 
6619261079SEd Maste /* nonblocking flags for channel_new */
6719261079SEd Maste #define CHANNEL_NONBLOCK_LEAVE	0 /* don't modify non-blocking state */
6819261079SEd Maste #define CHANNEL_NONBLOCK_SET	1 /* set non-blocking state */
6919261079SEd Maste #define CHANNEL_NONBLOCK_STDIO	2 /* set non-blocking and restore on close */
7019261079SEd Maste 
7119261079SEd Maste /* c->restore_block mask flags */
7219261079SEd Maste #define CHANNEL_RESTORE_RFD	0x01
7319261079SEd Maste #define CHANNEL_RESTORE_WFD	0x02
7419261079SEd Maste #define CHANNEL_RESTORE_EFD	0x04
7519261079SEd Maste 
76190cef3dSDag-Erling Smørgrav /* TCP forwarding */
77190cef3dSDag-Erling Smørgrav #define FORWARD_DENY		0
78190cef3dSDag-Erling Smørgrav #define FORWARD_REMOTE		(1)
79190cef3dSDag-Erling Smørgrav #define FORWARD_LOCAL		(1<<1)
80190cef3dSDag-Erling Smørgrav #define FORWARD_ALLOW		(FORWARD_REMOTE|FORWARD_LOCAL)
81190cef3dSDag-Erling Smørgrav 
82190cef3dSDag-Erling Smørgrav #define FORWARD_ADM		0x100
83190cef3dSDag-Erling Smørgrav #define FORWARD_USER		0x101
84190cef3dSDag-Erling Smørgrav 
854f52dfbbSDag-Erling Smørgrav struct ssh;
86b66f2d16SKris Kennaway struct Channel;
87b66f2d16SKris Kennaway typedef struct Channel Channel;
884f52dfbbSDag-Erling Smørgrav struct fwd_perm_list;
89511b41d2SMark Murray 
904f52dfbbSDag-Erling Smørgrav typedef void channel_open_fn(struct ssh *, int, int, void *);
91f374ba41SEd Maste typedef void channel_callback_fn(struct ssh *, int, int, void *);
924f52dfbbSDag-Erling Smørgrav typedef int channel_infilter_fn(struct ssh *, struct Channel *, char *, int);
934f52dfbbSDag-Erling Smørgrav typedef void channel_filter_cleanup_fn(struct ssh *, int, void *);
944f52dfbbSDag-Erling Smørgrav typedef u_char *channel_outfilter_fn(struct ssh *, struct Channel *,
954f52dfbbSDag-Erling Smørgrav     u_char **, size_t *);
96b66f2d16SKris Kennaway 
97d4af9e69SDag-Erling Smørgrav /* Channel success/failure callbacks */
984f52dfbbSDag-Erling Smørgrav typedef void channel_confirm_cb(struct ssh *, int, struct Channel *, void *);
994f52dfbbSDag-Erling Smørgrav typedef void channel_confirm_abandon_cb(struct ssh *, struct Channel *, void *);
100d4af9e69SDag-Erling Smørgrav struct channel_confirm {
101d4af9e69SDag-Erling Smørgrav 	TAILQ_ENTRY(channel_confirm) entry;
102d4af9e69SDag-Erling Smørgrav 	channel_confirm_cb *cb;
103d4af9e69SDag-Erling Smørgrav 	channel_confirm_abandon_cb *abandon_cb;
104d4af9e69SDag-Erling Smørgrav 	void *ctx;
105d4af9e69SDag-Erling Smørgrav };
106d4af9e69SDag-Erling Smørgrav TAILQ_HEAD(channel_confirms, channel_confirm);
107d4af9e69SDag-Erling Smørgrav 
108d4af9e69SDag-Erling Smørgrav /* Context for non-blocking connects */
109d4af9e69SDag-Erling Smørgrav struct channel_connect {
110d4af9e69SDag-Erling Smørgrav 	char *host;
111d4af9e69SDag-Erling Smørgrav 	int port;
112d4af9e69SDag-Erling Smørgrav 	struct addrinfo *ai, *aitop;
113d4af9e69SDag-Erling Smørgrav };
114d4af9e69SDag-Erling Smørgrav 
115b15c8340SDag-Erling Smørgrav /* Callbacks for mux channels back into client-specific code */
1164f52dfbbSDag-Erling Smørgrav typedef int mux_callback_fn(struct ssh *, struct Channel *);
117b15c8340SDag-Erling Smørgrav 
11819261079SEd Maste /*
11919261079SEd Maste  * NB. channel IDs on the wire and in c->remote_id are uint32, but local
12019261079SEd Maste  * channel IDs (e.g. c->self) only ever use the int32 subset of this range,
12119261079SEd Maste  * because we use local channel ID -1 for housekeeping. Remote channels have
12219261079SEd Maste  * a dedicated "have_remote_id" flag to indicate their validity.
12319261079SEd Maste  */
12419261079SEd Maste 
125b66f2d16SKris Kennaway struct Channel {
126511b41d2SMark Murray 	int     type;		/* channel type/state */
12719261079SEd Maste 
128511b41d2SMark Murray 	int     self;		/* my own channel identifier */
1294f52dfbbSDag-Erling Smørgrav 	uint32_t remote_id;	/* channel identifier for remote peer */
1304f52dfbbSDag-Erling Smørgrav 	int	have_remote_id;	/* non-zero if remote_id is valid */
1314f52dfbbSDag-Erling Smørgrav 
132af12a3e7SDag-Erling Smørgrav 	u_int   istate;		/* input from channel (state of receive half) */
133af12a3e7SDag-Erling Smørgrav 	u_int   ostate;		/* output to channel  (state of transmit half) */
134a04a10f8SKris Kennaway 	int     flags;		/* close sent/rcvd */
135a04a10f8SKris Kennaway 	int     rfd;		/* read fd */
136a04a10f8SKris Kennaway 	int     wfd;		/* write fd */
137a04a10f8SKris Kennaway 	int     efd;		/* extended fd */
138a04a10f8SKris Kennaway 	int     sock;		/* sock fd */
1391323ec57SEd Maste 	u_int	io_want;	/* bitmask of SSH_CHAN_IO_* */
1401323ec57SEd Maste 	u_int	io_ready;	/* bitmask of SSH_CHAN_IO_* */
14187c1498dSEd Maste 	int	pfds[4];	/* pollfd entries for rfd/wfd/efd/sock */
142b15c8340SDag-Erling Smørgrav 	int     ctl_chan;	/* control channel (multiplexed connections) */
143e0fbb1d2SBrian Feldman 	int     isatty;		/* rfd is a tty */
144e4a9863fSDag-Erling Smørgrav #ifdef _AIX
145f388f5efSDag-Erling Smørgrav 	int     wfd_isatty;	/* wfd is a tty */
146e4a9863fSDag-Erling Smørgrav #endif
147aa49c926SDag-Erling Smørgrav 	int	client_tty;	/* (client) TTY has been requested */
148af12a3e7SDag-Erling Smørgrav 	int     force_drain;	/* force close on iEOF */
149462c32cbSDag-Erling Smørgrav 	time_t	notbefore;	/* Pause IO until deadline (time_t) */
1501323ec57SEd Maste 	int     delayed;	/* post-IO handlers for newly created
151b15c8340SDag-Erling Smørgrav 				 * channels are delayed until the first call
1521323ec57SEd Maste 				 * to a matching pre-IO handler.
1531323ec57SEd Maste 				 * this way post-IO handlers are not
154e4a9863fSDag-Erling Smørgrav 				 * accidentally called if a FD gets reused */
15519261079SEd Maste 	int	restore_block;	/* fd mask to restore blocking status */
156f374ba41SEd Maste 	int	restore_flags[3];/* flags to restore */
1574f52dfbbSDag-Erling Smørgrav 	struct sshbuf *input;	/* data read from socket, to be sent over
158511b41d2SMark Murray 				 * encrypted connection */
1594f52dfbbSDag-Erling Smørgrav 	struct sshbuf *output;	/* data received over encrypted connection for
160511b41d2SMark Murray 				 * send on socket */
1614f52dfbbSDag-Erling Smørgrav 	struct sshbuf *extended;
1624f52dfbbSDag-Erling Smørgrav 
163cce7d346SDag-Erling Smørgrav 	char    *path;
164af12a3e7SDag-Erling Smørgrav 		/* path for unix domain sockets, or host name for forwards */
165511b41d2SMark Murray 	int     listening_port;	/* port being listened for forwards */
166462c32cbSDag-Erling Smørgrav 	char   *listening_addr;	/* addr being listened for forwards */
167511b41d2SMark Murray 	int     host_port;	/* remote port to connect for forwards */
168511b41d2SMark Murray 	char   *remote_name;	/* remote hostname */
169a04a10f8SKris Kennaway 
170a82e551fSDag-Erling Smørgrav 	u_int	remote_window;
171a82e551fSDag-Erling Smørgrav 	u_int	remote_maxpacket;
172a82e551fSDag-Erling Smørgrav 	u_int	local_window;
173*069ac184SEd Maste 	u_int	local_window_exceeded;
174a82e551fSDag-Erling Smørgrav 	u_int	local_window_max;
175a82e551fSDag-Erling Smørgrav 	u_int	local_consumed;
176a82e551fSDag-Erling Smørgrav 	u_int	local_maxpacket;
177a04a10f8SKris Kennaway 	int     extended_usage;
178af12a3e7SDag-Erling Smørgrav 	int	single_connection;
179a04a10f8SKris Kennaway 
180f374ba41SEd Maste 	char   *ctype;		/* const type - NB. not freed on channel_free */
181f374ba41SEd Maste 	char   *xctype;		/* extended type */
182a04a10f8SKris Kennaway 
183a04a10f8SKris Kennaway 	/* callback */
184e2f6069cSDag-Erling Smørgrav 	channel_open_fn		*open_confirm;
185d4af9e69SDag-Erling Smørgrav 	void			*open_confirm_ctx;
186b74df5b2SDag-Erling Smørgrav 	channel_callback_fn	*detach_user;
187b74df5b2SDag-Erling Smørgrav 	int			detach_close;
188d4af9e69SDag-Erling Smørgrav 	struct channel_confirms	status_confirms;
189b66f2d16SKris Kennaway 
190b66f2d16SKris Kennaway 	/* filter */
191b74df5b2SDag-Erling Smørgrav 	channel_infilter_fn	*input_filter;
192b74df5b2SDag-Erling Smørgrav 	channel_outfilter_fn	*output_filter;
193d4af9e69SDag-Erling Smørgrav 	void			*filter_ctx;
194d4af9e69SDag-Erling Smørgrav 	channel_filter_cleanup_fn *filter_cleanup;
195b74df5b2SDag-Erling Smørgrav 
196d4af9e69SDag-Erling Smørgrav 	/* keep boundaries */
197d4af9e69SDag-Erling Smørgrav 	int			datagram;
198d4af9e69SDag-Erling Smørgrav 
199d4af9e69SDag-Erling Smørgrav 	/* non-blocking connect */
2004f52dfbbSDag-Erling Smørgrav 	/* XXX make this a pointer so the structure can be opaque */
201d4af9e69SDag-Erling Smørgrav 	struct channel_connect	connect_ctx;
202b15c8340SDag-Erling Smørgrav 
203b15c8340SDag-Erling Smørgrav 	/* multiplexing protocol hook, called for each packet received */
204b15c8340SDag-Erling Smørgrav 	mux_callback_fn		*mux_rcb;
205b15c8340SDag-Erling Smørgrav 	void			*mux_ctx;
206e2f6069cSDag-Erling Smørgrav 	int			mux_pause;
207ca86bcf2SDag-Erling Smørgrav 	int			mux_downstream_id;
208f374ba41SEd Maste 
209f374ba41SEd Maste 	/* Inactivity timeouts */
210f374ba41SEd Maste 
211f374ba41SEd Maste 	/* Last traffic seen for OPEN channels */
212f374ba41SEd Maste 	time_t			lastused;
213f374ba41SEd Maste 	/* Inactivity timeout deadline in seconds (0 = no timeout) */
214535af610SEd Maste 	int			inactive_deadline;
215b66f2d16SKris Kennaway };
216a04a10f8SKris Kennaway 
217a04a10f8SKris Kennaway #define CHAN_EXTENDED_IGNORE		0
218a04a10f8SKris Kennaway #define CHAN_EXTENDED_READ		1
219a04a10f8SKris Kennaway #define CHAN_EXTENDED_WRITE		2
220a04a10f8SKris Kennaway 
221b66f2d16SKris Kennaway /* default window/packet sizes for tcp/x11-fwd-channel */
222af12a3e7SDag-Erling Smørgrav #define CHAN_SES_PACKET_DEFAULT	(32*1024)
223d4af9e69SDag-Erling Smørgrav #define CHAN_SES_WINDOW_DEFAULT	(64*CHAN_SES_PACKET_DEFAULT)
224af12a3e7SDag-Erling Smørgrav #define CHAN_TCP_PACKET_DEFAULT	(32*1024)
225d4af9e69SDag-Erling Smørgrav #define CHAN_TCP_WINDOW_DEFAULT	(64*CHAN_TCP_PACKET_DEFAULT)
226af12a3e7SDag-Erling Smørgrav #define CHAN_X11_PACKET_DEFAULT	(16*1024)
227af12a3e7SDag-Erling Smørgrav #define CHAN_X11_WINDOW_DEFAULT	(4*CHAN_X11_PACKET_DEFAULT)
22889986192SBrooks Davis 
229af12a3e7SDag-Erling Smørgrav /* possible input states */
230af12a3e7SDag-Erling Smørgrav #define CHAN_INPUT_OPEN			0
231af12a3e7SDag-Erling Smørgrav #define CHAN_INPUT_WAIT_DRAIN		1
232af12a3e7SDag-Erling Smørgrav #define CHAN_INPUT_WAIT_OCLOSE		2
233af12a3e7SDag-Erling Smørgrav #define CHAN_INPUT_CLOSED		3
234b66f2d16SKris Kennaway 
235af12a3e7SDag-Erling Smørgrav /* possible output states */
236af12a3e7SDag-Erling Smørgrav #define CHAN_OUTPUT_OPEN		0
237af12a3e7SDag-Erling Smørgrav #define CHAN_OUTPUT_WAIT_DRAIN		1
238af12a3e7SDag-Erling Smørgrav #define CHAN_OUTPUT_WAIT_IEOF		2
239af12a3e7SDag-Erling Smørgrav #define CHAN_OUTPUT_CLOSED		3
240a04a10f8SKris Kennaway 
241af12a3e7SDag-Erling Smørgrav #define CHAN_CLOSE_SENT			0x01
242af12a3e7SDag-Erling Smørgrav #define CHAN_CLOSE_RCVD			0x02
24380628bacSDag-Erling Smørgrav #define CHAN_EOF_SENT			0x04
24480628bacSDag-Erling Smørgrav #define CHAN_EOF_RCVD			0x08
245b15c8340SDag-Erling Smørgrav #define CHAN_LOCAL			0x10
24680628bacSDag-Erling Smørgrav 
2471323ec57SEd Maste /* file descriptor events */
2481323ec57SEd Maste #define SSH_CHAN_IO_RFD			0x01
2491323ec57SEd Maste #define SSH_CHAN_IO_WFD			0x02
2501323ec57SEd Maste #define SSH_CHAN_IO_EFD_R		0x04
2511323ec57SEd Maste #define SSH_CHAN_IO_EFD_W		0x08
2521323ec57SEd Maste #define SSH_CHAN_IO_EFD			(SSH_CHAN_IO_EFD_R|SSH_CHAN_IO_EFD_W)
2531323ec57SEd Maste #define SSH_CHAN_IO_SOCK_R		0x10
2541323ec57SEd Maste #define SSH_CHAN_IO_SOCK_W		0x20
2551323ec57SEd Maste #define SSH_CHAN_IO_SOCK		(SSH_CHAN_IO_SOCK_R|SSH_CHAN_IO_SOCK_W)
2561323ec57SEd Maste 
2574f52dfbbSDag-Erling Smørgrav /* Read buffer size */
2584f52dfbbSDag-Erling Smørgrav #define CHAN_RBUF	(16*1024)
2594f52dfbbSDag-Erling Smørgrav 
2601323ec57SEd Maste /* Maximum size for direct reads to buffers */
2611323ec57SEd Maste #define CHANNEL_MAX_READ	CHAN_SES_PACKET_DEFAULT
2621323ec57SEd Maste 
26319261079SEd Maste /* Maximum channel input buffer size */
26419261079SEd Maste #define CHAN_INPUT_MAX	(16*1024*1024)
26519261079SEd Maste 
2664f52dfbbSDag-Erling Smørgrav /* Hard limit on number of channels */
2674f52dfbbSDag-Erling Smørgrav #define CHANNELS_MAX_CHANNELS	(16*1024)
268b74df5b2SDag-Erling Smørgrav 
26980628bacSDag-Erling Smørgrav /* check whether 'efd' is still in use */
27080628bacSDag-Erling Smørgrav #define CHANNEL_EFD_INPUT_ACTIVE(c) \
2714f52dfbbSDag-Erling Smørgrav 	(c->extended_usage == CHAN_EXTENDED_READ && \
27280628bacSDag-Erling Smørgrav 	(c->efd != -1 || \
2734f52dfbbSDag-Erling Smørgrav 	sshbuf_len(c->extended) > 0))
27480628bacSDag-Erling Smørgrav #define CHANNEL_EFD_OUTPUT_ACTIVE(c) \
2754f52dfbbSDag-Erling Smørgrav 	(c->extended_usage == CHAN_EXTENDED_WRITE && \
276d4ecd108SDag-Erling Smørgrav 	c->efd != -1 && (!(c->flags & (CHAN_EOF_RCVD|CHAN_CLOSE_RCVD)) || \
2774f52dfbbSDag-Erling Smørgrav 	sshbuf_len(c->extended) > 0))
2784f52dfbbSDag-Erling Smørgrav 
2794f52dfbbSDag-Erling Smørgrav /* Add channel management structures to SSH transport instance */
2804f52dfbbSDag-Erling Smørgrav void channel_init_channels(struct ssh *ssh);
281a04a10f8SKris Kennaway 
282af12a3e7SDag-Erling Smørgrav /* channel management */
2835b9b2fafSBrian Feldman 
2844f52dfbbSDag-Erling Smørgrav Channel	*channel_by_id(struct ssh *, int);
2854f52dfbbSDag-Erling Smørgrav Channel	*channel_by_remote_id(struct ssh *, u_int);
2864f52dfbbSDag-Erling Smørgrav Channel	*channel_lookup(struct ssh *, int);
2874f52dfbbSDag-Erling Smørgrav Channel *channel_new(struct ssh *, char *, int, int, int, int,
28838a52bd3SEd Maste 	    u_int, u_int, int, const char *, int);
2894f52dfbbSDag-Erling Smørgrav void	 channel_set_fds(struct ssh *, int, int, int, int, int,
2904f52dfbbSDag-Erling Smørgrav 	    int, int, u_int);
2914f52dfbbSDag-Erling Smørgrav void	 channel_free(struct ssh *, Channel *);
2924f52dfbbSDag-Erling Smørgrav void	 channel_free_all(struct ssh *);
2934f52dfbbSDag-Erling Smørgrav void	 channel_stop_listening(struct ssh *);
294f374ba41SEd Maste void	 channel_force_close(struct ssh *, Channel *, int);
295f374ba41SEd Maste void	 channel_set_xtype(struct ssh *, int, const char *);
296a04a10f8SKris Kennaway 
2974f52dfbbSDag-Erling Smørgrav void	 channel_send_open(struct ssh *, int);
2984f52dfbbSDag-Erling Smørgrav void	 channel_request_start(struct ssh *, int, char *, int);
2994f52dfbbSDag-Erling Smørgrav void	 channel_register_cleanup(struct ssh *, int,
3004f52dfbbSDag-Erling Smørgrav 	    channel_callback_fn *, int);
3014f52dfbbSDag-Erling Smørgrav void	 channel_register_open_confirm(struct ssh *, int,
3024f52dfbbSDag-Erling Smørgrav 	    channel_open_fn *, void *);
3034f52dfbbSDag-Erling Smørgrav void	 channel_register_filter(struct ssh *, int, channel_infilter_fn *,
304d4af9e69SDag-Erling Smørgrav 	    channel_outfilter_fn *, channel_filter_cleanup_fn *, void *);
3054f52dfbbSDag-Erling Smørgrav void	 channel_register_status_confirm(struct ssh *, int,
3064f52dfbbSDag-Erling Smørgrav 	    channel_confirm_cb *, channel_confirm_abandon_cb *, void *);
3074f52dfbbSDag-Erling Smørgrav void	 channel_cancel_cleanup(struct ssh *, int);
30819261079SEd Maste int	 channel_close_fd(struct ssh *, Channel *, int *);
3094f52dfbbSDag-Erling Smørgrav void	 channel_send_window_changes(struct ssh *);
310af12a3e7SDag-Erling Smørgrav 
311f374ba41SEd Maste /* channel inactivity timeouts */
312535af610SEd Maste void channel_add_timeout(struct ssh *, const char *, int);
313f374ba41SEd Maste void channel_clear_timeouts(struct ssh *);
314f374ba41SEd Maste 
315ca86bcf2SDag-Erling Smørgrav /* mux proxy support */
316ca86bcf2SDag-Erling Smørgrav 
3174f52dfbbSDag-Erling Smørgrav int	 channel_proxy_downstream(struct ssh *, Channel *mc);
3184f52dfbbSDag-Erling Smørgrav int	 channel_proxy_upstream(Channel *, int, u_int32_t, struct ssh *);
319ca86bcf2SDag-Erling Smørgrav 
320af12a3e7SDag-Erling Smørgrav /* protocol handler */
321af12a3e7SDag-Erling Smørgrav 
3224f52dfbbSDag-Erling Smørgrav int	 channel_input_data(int, u_int32_t, struct ssh *);
3234f52dfbbSDag-Erling Smørgrav int	 channel_input_extended_data(int, u_int32_t, struct ssh *);
3244f52dfbbSDag-Erling Smørgrav int	 channel_input_ieof(int, u_int32_t, struct ssh *);
3254f52dfbbSDag-Erling Smørgrav int	 channel_input_oclose(int, u_int32_t, struct ssh *);
3264f52dfbbSDag-Erling Smørgrav int	 channel_input_open_confirmation(int, u_int32_t, struct ssh *);
3274f52dfbbSDag-Erling Smørgrav int	 channel_input_open_failure(int, u_int32_t, struct ssh *);
3284f52dfbbSDag-Erling Smørgrav int	 channel_input_port_open(int, u_int32_t, struct ssh *);
3294f52dfbbSDag-Erling Smørgrav int	 channel_input_window_adjust(int, u_int32_t, struct ssh *);
3304f52dfbbSDag-Erling Smørgrav int	 channel_input_status_confirm(int, u_int32_t, struct ssh *);
331af12a3e7SDag-Erling Smørgrav 
332af12a3e7SDag-Erling Smørgrav /* file descriptor handling (read/write) */
3331323ec57SEd Maste struct pollfd;
334f374ba41SEd Maste struct timespec;
335af12a3e7SDag-Erling Smørgrav 
3361323ec57SEd Maste void	 channel_prepare_poll(struct ssh *, struct pollfd **,
337f374ba41SEd Maste 	    u_int *, u_int *, u_int, struct timespec *);
3381323ec57SEd Maste void	 channel_after_poll(struct ssh *, struct pollfd *, u_int);
339edf85781SEd Maste int	 channel_output_poll(struct ssh *);
340af12a3e7SDag-Erling Smørgrav 
3414f52dfbbSDag-Erling Smørgrav int      channel_not_very_much_buffered_data(struct ssh *);
3424f52dfbbSDag-Erling Smørgrav void     channel_close_all(struct ssh *);
3434f52dfbbSDag-Erling Smørgrav int      channel_still_open(struct ssh *);
344*069ac184SEd Maste int	 channel_tty_open(struct ssh *);
3452f513db7SEd Maste const char *channel_format_extended_usage(const Channel *);
3464f52dfbbSDag-Erling Smørgrav char	*channel_open_message(struct ssh *);
3474f52dfbbSDag-Erling Smørgrav int	 channel_find_open(struct ssh *);
348ca3176e7SBrian Feldman 
349af12a3e7SDag-Erling Smørgrav /* tcp forwarding */
350a0ee8cc6SDag-Erling Smørgrav struct Forward;
351a0ee8cc6SDag-Erling Smørgrav struct ForwardOptions;
3524f52dfbbSDag-Erling Smørgrav void	 channel_set_af(struct ssh *, int af);
353190cef3dSDag-Erling Smørgrav void     channel_permit_all(struct ssh *, int);
354190cef3dSDag-Erling Smørgrav void	 channel_add_permission(struct ssh *, int, int, char *, int);
355190cef3dSDag-Erling Smørgrav void	 channel_clear_permission(struct ssh *, int, int);
356190cef3dSDag-Erling Smørgrav void	 channel_disable_admin(struct ssh *, int);
357190cef3dSDag-Erling Smørgrav void	 channel_update_permission(struct ssh *, int, int);
3584f52dfbbSDag-Erling Smørgrav Channel	*channel_connect_to_port(struct ssh *, const char *, u_short,
3594f52dfbbSDag-Erling Smørgrav 	    char *, char *, int *, const char **);
3604f52dfbbSDag-Erling Smørgrav Channel *channel_connect_to_path(struct ssh *, const char *, char *, char *);
3614f52dfbbSDag-Erling Smørgrav Channel	*channel_connect_stdio_fwd(struct ssh *, const char*,
362535af610SEd Maste 	    int, int, int, int);
3634f52dfbbSDag-Erling Smørgrav Channel	*channel_connect_by_listen_address(struct ssh *, const char *,
3644f52dfbbSDag-Erling Smørgrav 	    u_short, char *, char *);
3654f52dfbbSDag-Erling Smørgrav Channel	*channel_connect_by_listen_path(struct ssh *, const char *,
366a0ee8cc6SDag-Erling Smørgrav 	    char *, char *);
3674f52dfbbSDag-Erling Smørgrav int	 channel_request_remote_forwarding(struct ssh *, struct Forward *);
3684f52dfbbSDag-Erling Smørgrav int	 channel_setup_local_fwd_listener(struct ssh *, struct Forward *,
3694f52dfbbSDag-Erling Smørgrav 	    struct ForwardOptions *);
3704f52dfbbSDag-Erling Smørgrav int	 channel_request_rforward_cancel(struct ssh *, struct Forward *);
3714f52dfbbSDag-Erling Smørgrav int	 channel_setup_remote_fwd_listener(struct ssh *, struct Forward *,
3724f52dfbbSDag-Erling Smørgrav 	    int *, struct ForwardOptions *);
3734f52dfbbSDag-Erling Smørgrav int	 channel_cancel_rport_listener(struct ssh *, struct Forward *);
3744f52dfbbSDag-Erling Smørgrav int	 channel_cancel_lport_listener(struct ssh *, struct Forward *,
3754f52dfbbSDag-Erling Smørgrav 	    int, struct ForwardOptions *);
376462c32cbSDag-Erling Smørgrav int	 permitopen_port(const char *);
377af12a3e7SDag-Erling Smørgrav 
378af12a3e7SDag-Erling Smørgrav /* x11 forwarding */
379af12a3e7SDag-Erling Smørgrav 
3804d3fc8b0SEd Maste void	 channel_set_x11_refuse_time(struct ssh *, time_t);
3814f52dfbbSDag-Erling Smørgrav int	 x11_connect_display(struct ssh *);
3824f52dfbbSDag-Erling Smørgrav int	 x11_create_display_inet(struct ssh *, int, int, int, u_int *, int **);
3834f52dfbbSDag-Erling Smørgrav void	 x11_request_forwarding_with_spoofing(struct ssh *, int,
3844f52dfbbSDag-Erling Smørgrav 	    const char *, const char *, const char *, int);
385af12a3e7SDag-Erling Smørgrav 
386af12a3e7SDag-Erling Smørgrav /* channel close */
387af12a3e7SDag-Erling Smørgrav 
3884f52dfbbSDag-Erling Smørgrav int	 chan_is_dead(struct ssh *, Channel *, int);
3894f52dfbbSDag-Erling Smørgrav void	 chan_mark_dead(struct ssh *, Channel *);
390af12a3e7SDag-Erling Smørgrav 
391af12a3e7SDag-Erling Smørgrav /* channel events */
392af12a3e7SDag-Erling Smørgrav 
3934f52dfbbSDag-Erling Smørgrav void	 chan_rcvd_oclose(struct ssh *, Channel *);
3944f52dfbbSDag-Erling Smørgrav void	 chan_rcvd_eow(struct ssh *, Channel *);
3954f52dfbbSDag-Erling Smørgrav void	 chan_read_failed(struct ssh *, Channel *);
3964f52dfbbSDag-Erling Smørgrav void	 chan_ibuf_empty(struct ssh *, Channel *);
3974f52dfbbSDag-Erling Smørgrav void	 chan_rcvd_ieof(struct ssh *, Channel *);
3984f52dfbbSDag-Erling Smørgrav void	 chan_write_failed(struct ssh *, Channel *);
3994f52dfbbSDag-Erling Smørgrav void	 chan_obuf_empty(struct ssh *, Channel *);
400af12a3e7SDag-Erling Smørgrav 
401511b41d2SMark Murray #endif
402