1/* 2 * Dropbear - a SSH2 server 3 * 4 * Copyright (c) 2002,2003 Matt Johnston 5 * All rights reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a copy 8 * of this software and associated documentation files (the "Software"), to deal 9 * in the Software without restriction, including without limitation the rights 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 * copies of the Software, and to permit persons to whom the Software is 12 * furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included in 15 * all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. */ 24 25#ifndef _CHANNEL_H_ 26#define _CHANNEL_H_ 27 28#include "includes.h" 29#include "buffer.h" 30#include "circbuffer.h" 31 32/* channel->type values */ 33#define CHANNEL_ID_NONE 0 34#define CHANNEL_ID_SESSION 1 35#define CHANNEL_ID_X11 2 36#define CHANNEL_ID_AGENT 3 37#define CHANNEL_ID_TCPDIRECT 4 38#define CHANNEL_ID_TCPFORWARDED 5 39 40#define SSH_OPEN_ADMINISTRATIVELY_PROHIBITED 1 41#define SSH_OPEN_CONNECT_FAILED 2 42#define SSH_OPEN_UNKNOWN_CHANNEL_TYPE 3 43#define SSH_OPEN_RESOURCE_SHORTAGE 4 44 45/* Not a real type */ 46#define SSH_OPEN_IN_PROGRESS 99 47 48#define MAX_CHANNELS 100 /* simple mem restriction, includes each tcp/x11 49 connection, so can't be _too_ small */ 50 51#define CHAN_EXTEND_SIZE 3 /* how many extra slots to add when we need more */ 52 53#define RECV_MAXWINDOW 8000 /* tweak */ 54#define RECV_WINDOWEXTEND 1000 /* We send a "window extend" every 55 RECV_WINDOWEXTEND bytes */ 56#define RECV_MAXPACKET RECV_MAXWINDOW /* tweak */ 57 58struct ChanType; 59 60struct Channel { 61 62 unsigned int index; /* the local channel index */ 63 unsigned int remotechan; 64 unsigned int recvwindow, transwindow; 65 unsigned int recvdonelen; 66 unsigned int recvmaxpacket, transmaxpacket; 67 void* typedata; /* a pointer to type specific data */ 68 int writefd; /* read from wire, written to insecure side */ 69 int readfd; /* read from insecure size, written to wire */ 70 int errfd; /* used like writefd or readfd, depending if it's client or server. 71 Doesn't exactly belong here, but is cleaner here */ 72 circbuffer *writebuf; /* data from the wire, for local consumption */ 73 circbuffer *extrabuf; /* extended-data for the program - used like writebuf 74 but for stderr */ 75 76 /* whether close/eof messages have been exchanged */ 77 int sent_close, recv_close; 78 int recv_eof, sent_eof; 79 80 int initconn; /* used for TCP forwarding, whether the channel has been 81 fully initialised */ 82 83 int await_open; /* flag indicating whether we've sent an open request 84 for this channel (and are awaiting a confirmation 85 or failure). */ 86 87 int flushing; 88 89 const struct ChanType* type; 90 91}; 92 93struct ChanType { 94 95 int sepfds; /* Whether this channel has seperate pipes for in/out or not */ 96 char *name; 97 int (*inithandler)(struct Channel*); 98 int (*check_close)(struct Channel*); 99 void (*reqhandler)(struct Channel*); 100 void (*closehandler)(struct Channel*); 101 102}; 103 104void chaninitialise(const struct ChanType *chantypes[]); 105void chancleanup(); 106void setchannelfds(fd_set *readfd, fd_set *writefd); 107void channelio(fd_set *readfd, fd_set *writefd); 108struct Channel* getchannel(); 109struct Channel* newchannel(unsigned int remotechan, 110 const struct ChanType *type, 111 unsigned int transwindow, unsigned int transmaxpacket); 112 113void recv_msg_channel_open(); 114void recv_msg_channel_request(); 115void send_msg_channel_failure(struct Channel *channel); 116void send_msg_channel_success(struct Channel *channel); 117void recv_msg_channel_data(); 118void recv_msg_channel_extended_data(); 119void recv_msg_channel_window_adjust(); 120void recv_msg_channel_close(); 121void recv_msg_channel_eof(); 122 123void common_recv_msg_channel_data(struct Channel *channel, int fd, 124 circbuffer * buf); 125 126#ifdef DROPBEAR_CLIENT 127extern const struct ChanType clichansess; 128#endif 129 130#if defined(USING_LISTENERS) || defined(DROPBEAR_CLIENT) 131int send_msg_channel_open_init(int fd, const struct ChanType *type); 132void recv_msg_channel_open_confirmation(); 133void recv_msg_channel_open_failure(); 134#endif 135 136#endif /* _CHANNEL_H_ */ 137