channels.h revision 192595
1225394Sjchandra/* $OpenBSD: channels.h,v 1.98 2009/02/12 03:00:56 djm Exp $ */ 2233563Sjchandra 3233563Sjchandra/* 4225394Sjchandra * Author: Tatu Ylonen <ylo@cs.hut.fi> 5225394Sjchandra * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 6225394Sjchandra * All rights reserved 7225394Sjchandra * 8233563Sjchandra * As far as I am concerned, the code I have written for this software 9225394Sjchandra * can be used freely for any purpose. Any derived versions of this 10225394Sjchandra * software must be clearly marked as such, and if the derived work is 11225394Sjchandra * incompatible with the protocol description in the RFC file, it must be 12233563Sjchandra * called by a name other than "ssh" or "Secure Shell". 13233563Sjchandra */ 14233563Sjchandra/* 15233563Sjchandra * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved. 16233563Sjchandra * 17233563Sjchandra * Redistribution and use in source and binary forms, with or without 18233563Sjchandra * modification, are permitted provided that the following conditions 19233563Sjchandra * are met: 20233563Sjchandra * 1. Redistributions of source code must retain the above copyright 21233563Sjchandra * notice, this list of conditions and the following disclaimer. 22233563Sjchandra * 2. Redistributions in binary form must reproduce the above copyright 23233563Sjchandra * notice, this list of conditions and the following disclaimer in the 24233563Sjchandra * documentation and/or other materials provided with the distribution. 25233563Sjchandra * 26233563Sjchandra * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 27233563Sjchandra * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 28233563Sjchandra * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 29225394Sjchandra * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 30225394Sjchandra * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 31225394Sjchandra * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 32225394Sjchandra * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 33225394Sjchandra * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34225394Sjchandra * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 35225394Sjchandra * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36225394Sjchandra */ 37225394Sjchandra 38225394Sjchandra#ifndef CHANNEL_H 39225394Sjchandra#define CHANNEL_H 40225394Sjchandra 41233563Sjchandra/* Definitions for channel types. */ 42225394Sjchandra#define SSH_CHANNEL_X11_LISTENER 1 /* Listening for inet X11 conn. */ 43225394Sjchandra#define SSH_CHANNEL_PORT_LISTENER 2 /* Listening on a port. */ 44225394Sjchandra#define SSH_CHANNEL_OPENING 3 /* waiting for confirmation */ 45225394Sjchandra#define SSH_CHANNEL_OPEN 4 /* normal open two-way channel */ 46225394Sjchandra#define SSH_CHANNEL_CLOSED 5 /* waiting for close confirmation */ 47225394Sjchandra#define SSH_CHANNEL_AUTH_SOCKET 6 /* authentication socket */ 48225394Sjchandra#define SSH_CHANNEL_X11_OPEN 7 /* reading first X11 packet */ 49233563Sjchandra#define SSH_CHANNEL_INPUT_DRAINING 8 /* sending remaining data to conn */ 50233563Sjchandra#define SSH_CHANNEL_OUTPUT_DRAINING 9 /* sending remaining data to app */ 51225394Sjchandra#define SSH_CHANNEL_LARVAL 10 /* larval session */ 52225394Sjchandra#define SSH_CHANNEL_RPORT_LISTENER 11 /* Listening to a R-style port */ 53225394Sjchandra#define SSH_CHANNEL_CONNECTING 12 54225394Sjchandra#define SSH_CHANNEL_DYNAMIC 13 55225394Sjchandra#define SSH_CHANNEL_ZOMBIE 14 /* Almost dead. */ 56225394Sjchandra#define SSH_CHANNEL_MAX_TYPE 15 57225394Sjchandra 58225394Sjchandrastruct Channel; 59225394Sjchandratypedef struct Channel Channel; 60225394Sjchandra 61225394Sjchandratypedef void channel_callback_fn(int, void *); 62225394Sjchandratypedef int channel_infilter_fn(struct Channel *, char *, int); 63225394Sjchandratypedef void channel_filter_cleanup_fn(int, void *); 64225394Sjchandratypedef u_char *channel_outfilter_fn(struct Channel *, u_char **, u_int *); 65233536Sjchandra 66233556Sjchandra/* Channel success/failure callbacks */ 67225394Sjchandratypedef void channel_confirm_cb(int, struct Channel *, void *); 68225394Sjchandratypedef void channel_confirm_abandon_cb(struct Channel *, void *); 69225394Sjchandrastruct channel_confirm { 70225394Sjchandra TAILQ_ENTRY(channel_confirm) entry; 71225394Sjchandra channel_confirm_cb *cb; 72233563Sjchandra channel_confirm_abandon_cb *abandon_cb; 73225394Sjchandra void *ctx; 74233563Sjchandra}; 75233563SjchandraTAILQ_HEAD(channel_confirms, channel_confirm); 76233563Sjchandra 77233563Sjchandra/* Context for non-blocking connects */ 78233563Sjchandrastruct channel_connect { 79233563Sjchandra char *host; 80233563Sjchandra int port; 81233563Sjchandra struct addrinfo *ai, *aitop; 82233563Sjchandra}; 83233563Sjchandra 84233563Sjchandrastruct Channel { 85233563Sjchandra int type; /* channel type/state */ 86233563Sjchandra int self; /* my own channel identifier */ 87233563Sjchandra int remote_id; /* channel identifier for remote peer */ 88233563Sjchandra u_int istate; /* input from channel (state of receive half) */ 89233563Sjchandra u_int ostate; /* output to channel (state of transmit half) */ 90233563Sjchandra int flags; /* close sent/rcvd */ 91233563Sjchandra int rfd; /* read fd */ 92233563Sjchandra int wfd; /* write fd */ 93233563Sjchandra int efd; /* extended fd */ 94233563Sjchandra int sock; /* sock fd */ 95233563Sjchandra int ctl_fd; /* control fd (client sharing) */ 96233563Sjchandra int isatty; /* rfd is a tty */ 97233563Sjchandra int wfd_isatty; /* wfd is a tty */ 98233563Sjchandra int client_tty; /* (client) TTY has been requested */ 99233563Sjchandra int force_drain; /* force close on iEOF */ 100233563Sjchandra int delayed; /* fdset hack */ 101233563Sjchandra Buffer input; /* data read from socket, to be sent over 102233563Sjchandra * encrypted connection */ 103233563Sjchandra Buffer output; /* data received over encrypted connection for 104233563Sjchandra * send on socket */ 105233563Sjchandra Buffer extended; 106233563Sjchandra char *path; 107233563Sjchandra /* path for unix domain sockets, or host name for forwards */ 108233563Sjchandra int listening_port; /* port being listened for forwards */ 109225394Sjchandra int host_port; /* remote port to connect for forwards */ 110225394Sjchandra char *remote_name; /* remote hostname */ 111233563Sjchandra 112233563Sjchandra u_int remote_window; 113233563Sjchandra u_int remote_maxpacket; 114233563Sjchandra u_int local_window; 115233563Sjchandra u_int local_window_max; 116233563Sjchandra u_int local_consumed; 117233563Sjchandra u_int local_maxpacket; 118233563Sjchandra int extended_usage; 119233563Sjchandra int single_connection; 120233563Sjchandra 121233563Sjchandra char *ctype; /* type */ 122233563Sjchandra 123233563Sjchandra /* callback */ 124233563Sjchandra channel_callback_fn *open_confirm; 125233563Sjchandra void *open_confirm_ctx; 126233563Sjchandra channel_callback_fn *detach_user; 127233563Sjchandra int detach_close; 128233563Sjchandra struct channel_confirms status_confirms; 129233563Sjchandra 130233563Sjchandra /* filter */ 131233563Sjchandra channel_infilter_fn *input_filter; 132233563Sjchandra channel_outfilter_fn *output_filter; 133233563Sjchandra void *filter_ctx; 134233563Sjchandra channel_filter_cleanup_fn *filter_cleanup; 135233563Sjchandra 136233563Sjchandra /* keep boundaries */ 137233563Sjchandra int datagram; 138233563Sjchandra 139233563Sjchandra /* non-blocking connect */ 140233563Sjchandra struct channel_connect connect_ctx; 141233563Sjchandra}; 142233563Sjchandra 143233563Sjchandra#define CHAN_EXTENDED_IGNORE 0 144233563Sjchandra#define CHAN_EXTENDED_READ 1 145233563Sjchandra#define CHAN_EXTENDED_WRITE 2 146233563Sjchandra 147233563Sjchandra/* default window/packet sizes for tcp/x11-fwd-channel */ 148233563Sjchandra#define CHAN_SES_PACKET_DEFAULT (32*1024) 149233563Sjchandra#define CHAN_SES_WINDOW_DEFAULT (64*CHAN_SES_PACKET_DEFAULT) 150233563Sjchandra#define CHAN_TCP_PACKET_DEFAULT (32*1024) 151233563Sjchandra#define CHAN_TCP_WINDOW_DEFAULT (64*CHAN_TCP_PACKET_DEFAULT) 152233563Sjchandra#define CHAN_X11_PACKET_DEFAULT (16*1024) 153233563Sjchandra#define CHAN_X11_WINDOW_DEFAULT (4*CHAN_X11_PACKET_DEFAULT) 154233563Sjchandra 155233563Sjchandra/* possible input states */ 156233563Sjchandra#define CHAN_INPUT_OPEN 0 157233563Sjchandra#define CHAN_INPUT_WAIT_DRAIN 1 158233563Sjchandra#define CHAN_INPUT_WAIT_OCLOSE 2 159233563Sjchandra#define CHAN_INPUT_CLOSED 3 160233563Sjchandra 161233563Sjchandra/* possible output states */ 162233563Sjchandra#define CHAN_OUTPUT_OPEN 0 163233563Sjchandra#define CHAN_OUTPUT_WAIT_DRAIN 1 164233563Sjchandra#define CHAN_OUTPUT_WAIT_IEOF 2 165233563Sjchandra#define CHAN_OUTPUT_CLOSED 3 166233563Sjchandra 167233563Sjchandra#define CHAN_CLOSE_SENT 0x01 168233564Sjchandra#define CHAN_CLOSE_RCVD 0x02 169233563Sjchandra#define CHAN_EOF_SENT 0x04 170233563Sjchandra#define CHAN_EOF_RCVD 0x08 171233564Sjchandra 172233564Sjchandra#define CHAN_RBUF 16*1024 173233564Sjchandra 174233564Sjchandra/* check whether 'efd' is still in use */ 175233564Sjchandra#define CHANNEL_EFD_INPUT_ACTIVE(c) \ 176233564Sjchandra (compat20 && c->extended_usage == CHAN_EXTENDED_READ && \ 177233564Sjchandra (c->efd != -1 || \ 178233564Sjchandra buffer_len(&c->extended) > 0)) 179233564Sjchandra#define CHANNEL_EFD_OUTPUT_ACTIVE(c) \ 180233564Sjchandra (compat20 && c->extended_usage == CHAN_EXTENDED_WRITE && \ 181233564Sjchandra c->efd != -1 && (!(c->flags & (CHAN_EOF_RCVD|CHAN_CLOSE_RCVD)) || \ 182233564Sjchandra buffer_len(&c->extended) > 0)) 183233564Sjchandra 184233563Sjchandra/* channel management */ 185233563Sjchandra 186233563SjchandraChannel *channel_by_id(int); 187233563SjchandraChannel *channel_lookup(int); 188233563SjchandraChannel *channel_new(char *, int, int, int, int, u_int, u_int, int, char *, int); 189233563Sjchandravoid channel_set_fds(int, int, int, int, int, int, int, u_int); 190233563Sjchandravoid channel_free(Channel *); 191233563Sjchandravoid channel_free_all(void); 192233563Sjchandravoid channel_stop_listening(void); 193233563Sjchandra 194233563Sjchandravoid channel_send_open(int); 195233563Sjchandravoid channel_request_start(int, char *, int); 196233563Sjchandravoid channel_register_cleanup(int, channel_callback_fn *, int); 197233563Sjchandravoid channel_register_open_confirm(int, channel_callback_fn *, void *); 198233563Sjchandravoid channel_register_filter(int, channel_infilter_fn *, 199233563Sjchandra channel_outfilter_fn *, channel_filter_cleanup_fn *, void *); 200233563Sjchandravoid channel_register_status_confirm(int, channel_confirm_cb *, 201233563Sjchandra channel_confirm_abandon_cb *, void *); 202233563Sjchandravoid channel_cancel_cleanup(int); 203233563Sjchandraint channel_close_fd(int *); 204233563Sjchandravoid channel_send_window_changes(void); 205233563Sjchandra 206233563Sjchandra/* protocol handler */ 207233563Sjchandra 208233563Sjchandravoid channel_input_close(int, u_int32_t, void *); 209233563Sjchandravoid channel_input_close_confirmation(int, u_int32_t, void *); 210233563Sjchandravoid channel_input_data(int, u_int32_t, void *); 211233563Sjchandravoid channel_input_extended_data(int, u_int32_t, void *); 212233563Sjchandravoid channel_input_ieof(int, u_int32_t, void *); 213233563Sjchandravoid channel_input_oclose(int, u_int32_t, void *); 214233563Sjchandravoid channel_input_open_confirmation(int, u_int32_t, void *); 215233563Sjchandravoid channel_input_open_failure(int, u_int32_t, void *); 216233563Sjchandravoid channel_input_port_open(int, u_int32_t, void *); 217233563Sjchandravoid channel_input_window_adjust(int, u_int32_t, void *); 218233563Sjchandravoid channel_input_status_confirm(int, u_int32_t, void *); 219233563Sjchandra 220233563Sjchandra/* file descriptor handling (read/write) */ 221233563Sjchandra 222233563Sjchandravoid channel_prepare_select(fd_set **, fd_set **, int *, u_int*, int); 223233563Sjchandravoid channel_after_select(fd_set *, fd_set *); 224233563Sjchandravoid channel_output_poll(void); 225233563Sjchandra 226233563Sjchandraint channel_not_very_much_buffered_data(void); 227233563Sjchandravoid channel_close_all(void); 228233563Sjchandraint channel_still_open(void); 229233563Sjchandrachar *channel_open_message(void); 230233563Sjchandraint channel_find_open(void); 231233563Sjchandra 232233563Sjchandra/* tcp forwarding */ 233233563Sjchandravoid channel_set_af(int af); 234233563Sjchandravoid channel_permit_all_opens(void); 235233563Sjchandravoid channel_add_permitted_opens(char *, int); 236233563Sjchandraint channel_add_adm_permitted_opens(char *, int); 237233563Sjchandravoid channel_clear_permitted_opens(void); 238233563Sjchandravoid channel_clear_adm_permitted_opens(void); 239233563Sjchandravoid channel_print_adm_permitted_opens(void); 240233563Sjchandraint channel_input_port_forward_request(int, int); 241233563SjchandraChannel *channel_connect_to(const char *, u_short, char *, char *); 242233563SjchandraChannel *channel_connect_by_listen_address(u_short, char *, char *); 243233563Sjchandraint channel_request_remote_forwarding(const char *, u_short, 244233563Sjchandra const char *, u_short); 245233563Sjchandraint channel_setup_local_fwd_listener(const char *, u_short, 246233563Sjchandra const char *, u_short, int); 247233563Sjchandravoid channel_request_rforward_cancel(const char *host, u_short port); 248233563Sjchandraint channel_setup_remote_fwd_listener(const char *, u_short, int *, int); 249233563Sjchandraint channel_cancel_rport_listener(const char *, u_short); 250233563Sjchandra 251233563Sjchandra/* x11 forwarding */ 252233563Sjchandra 253233563Sjchandraint x11_connect_display(void); 254233563Sjchandraint x11_create_display_inet(int, int, int, u_int *, int **); 255233563Sjchandravoid x11_input_open(int, u_int32_t, void *); 256233563Sjchandravoid x11_request_forwarding_with_spoofing(int, const char *, const char *, 257233563Sjchandra const char *); 258233563Sjchandravoid deny_input_open(int, u_int32_t, void *); 259233563Sjchandra 260233563Sjchandra/* agent forwarding */ 261233563Sjchandra 262233563Sjchandravoid auth_request_forwarding(void); 263233563Sjchandra 264233563Sjchandra/* channel close */ 265233563Sjchandra 266233563Sjchandraint chan_is_dead(Channel *, int); 267233563Sjchandravoid chan_mark_dead(Channel *); 268233563Sjchandra 269233563Sjchandra/* channel events */ 270233563Sjchandra 271233564Sjchandravoid chan_rcvd_oclose(Channel *); 272233564Sjchandravoid chan_rcvd_eow(Channel *); /* SSH2-only */ 273233563Sjchandravoid chan_read_failed(Channel *); 274233563Sjchandravoid chan_ibuf_empty(Channel *); 275233563Sjchandra 276233563Sjchandravoid chan_rcvd_ieof(Channel *); 277233563Sjchandravoid chan_write_failed(Channel *); 278233563Sjchandravoid chan_obuf_empty(Channel *); 279233563Sjchandra 280233563Sjchandra#endif 281233563Sjchandra