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 58 struct ChanType; 59 60 struct 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 93 struct 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 104 void chaninitialise(const struct ChanType *chantypes[]); 105 void chancleanup(); 106 void setchannelfds(fd_set *readfd, fd_set *writefd); 107 void channelio(fd_set *readfd, fd_set *writefd); 108 struct Channel* getchannel(); 109 struct Channel* newchannel(unsigned int remotechan, 110 const struct ChanType *type, 111 unsigned int transwindow, unsigned int transmaxpacket); 112 113 void recv_msg_channel_open(); 114 void recv_msg_channel_request(); 115 void send_msg_channel_failure(struct Channel *channel); 116 void send_msg_channel_success(struct Channel *channel); 117 void recv_msg_channel_data(); 118 void recv_msg_channel_extended_data(); 119 void recv_msg_channel_window_adjust(); 120 void recv_msg_channel_close(); 121 void recv_msg_channel_eof(); 122 123 void common_recv_msg_channel_data(struct Channel *channel, int fd, 124 circbuffer * buf); 125 126 #ifdef DROPBEAR_CLIENT 127 extern const struct ChanType clichansess; 128 #endif 129 130 #if defined(USING_LISTENERS) || defined(DROPBEAR_CLIENT) 131 int send_msg_channel_open_init(int fd, const struct ChanType *type); 132 void recv_msg_channel_open_confirmation(); 133 void recv_msg_channel_open_failure(); 134 #endif 135 136 #endif /* _CHANNEL_H_ */ 137