| 98 |
/* default window/packet sizes for tcp/x11-fwd-channel */ |
/* default window/packet sizes for tcp/x11-fwd-channel */ |
| 99 |
#define CHAN_SES_PACKET_DEFAULT (32*1024) |
#define CHAN_SES_PACKET_DEFAULT (32*1024) |
| 100 |
#define CHAN_SES_WINDOW_DEFAULT (2*CHAN_SES_PACKET_DEFAULT) // READAMOUNT @ pkt.cと同期を取ること |
#define CHAN_SES_WINDOW_DEFAULT (2*CHAN_SES_PACKET_DEFAULT) // READAMOUNT @ pkt.cと同期を取ること |
| 101 |
|
#define CHAN_TCP_PACKET_DEFAULT (32*1024) |
| 102 |
|
#define CHAN_TCP_WINDOW_DEFAULT (4*CHAN_TCP_PACKET_DEFAULT) |
| 103 |
|
#define CHAN_X11_PACKET_DEFAULT (16*1024) |
| 104 |
|
#define CHAN_X11_WINDOW_DEFAULT (4*CHAN_X11_PACKET_DEFAULT) |
| 105 |
|
|
| 106 |
// channel data structure |
// channel data structure |
| 107 |
#define CHANNEL_MAX 100 |
#define CHANNEL_MAX 100 |
| 157 |
c->remote_window = 0; |
c->remote_window = 0; |
| 158 |
c->remote_maxpacket = 0; |
c->remote_maxpacket = 0; |
| 159 |
c->type = type; |
c->type = type; |
| 160 |
c->local_num = local_num; |
c->local_num = local_num; // alloc_channel()の返値を保存しておく |
| 161 |
|
|
| 162 |
return (c); |
return (c); |
| 163 |
} |
} |
| 1432 |
FWD_open(pvar, get_payload_uint32(pvar, 0), |
FWD_open(pvar, get_payload_uint32(pvar, 0), |
| 1433 |
pvar->ssh_state.payload + 8, local_port, |
pvar->ssh_state.payload + 8, local_port, |
| 1434 |
pvar->ssh_state.payload + 16 + host_len, |
pvar->ssh_state.payload + 16 + host_len, |
| 1435 |
originator_len); |
originator_len, |
| 1436 |
|
NULL); |
| 1437 |
} |
} |
| 1438 |
} else { |
} else { |
| 1439 |
if (grab_payload(pvar, 8) |
if (grab_payload(pvar, 8) |
| 1444 |
|
|
| 1445 |
pvar->ssh_state.payload[8 + host_len] = 0; |
pvar->ssh_state.payload[8 + host_len] = 0; |
| 1446 |
FWD_open(pvar, get_payload_uint32(pvar, 0), |
FWD_open(pvar, get_payload_uint32(pvar, 0), |
| 1447 |
pvar->ssh_state.payload + 8, local_port, NULL, 0); |
pvar->ssh_state.payload + 8, local_port, NULL, 0, |
| 1448 |
|
NULL); |
| 1449 |
} |
} |
| 1450 |
} |
} |
| 1451 |
|
|
| 2618 |
finish_send_packet(pvar); |
finish_send_packet(pvar); |
| 2619 |
|
|
| 2620 |
} else { |
} else { |
| 2621 |
|
buffer_t *msg; |
| 2622 |
|
unsigned char *outmsg; |
| 2623 |
|
int len; |
| 2624 |
|
Channel_t *c; |
| 2625 |
|
|
| 2626 |
|
// port-forwarding(remote to local)のローカル接続への成功をサーバへ返す。(2005.7.2 yutaka) |
| 2627 |
|
c = ssh2_local_channel_lookup(local_channel_num); |
| 2628 |
|
if (c == NULL) { |
| 2629 |
|
// It is sure to be successful as long as it's not a program bug either. |
| 2630 |
|
return; |
| 2631 |
|
} |
| 2632 |
|
|
| 2633 |
|
msg = buffer_init(); |
| 2634 |
|
if (msg == NULL) { |
| 2635 |
|
// TODO: error check |
| 2636 |
|
return; |
| 2637 |
|
} |
| 2638 |
|
buffer_put_int(msg, c->remote_id); |
| 2639 |
|
buffer_put_int(msg, c->self_id); |
| 2640 |
|
buffer_put_int(msg, c->local_window); |
| 2641 |
|
buffer_put_int(msg, c->local_maxpacket); |
| 2642 |
|
|
| 2643 |
|
len = buffer_len(msg); |
| 2644 |
|
outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, len); |
| 2645 |
|
memcpy(outmsg, buffer_ptr(msg), len); |
| 2646 |
|
finish_send_packet(pvar); |
| 2647 |
|
buffer_free(msg); |
| 2648 |
|
|
| 2649 |
} |
} |
| 2650 |
} |
} |
| 2835 |
return; |
return; |
| 2836 |
} |
} |
| 2837 |
|
|
| 2838 |
c = ssh2_channel_new(CHAN_SES_WINDOW_DEFAULT, CHAN_SES_PACKET_DEFAULT, TYPE_PORTFWD, local_channel_num); |
c = ssh2_channel_new(CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, TYPE_PORTFWD, local_channel_num); |
| 2839 |
|
|
| 2840 |
msg = buffer_init(); |
msg = buffer_init(); |
| 2841 |
if (msg == NULL) { |
if (msg == NULL) { |
| 5798 |
return TRUE; |
return TRUE; |
| 5799 |
} |
} |
| 5800 |
|
|
|
|
|
| 5801 |
static BOOL handle_SSH2_channel_open(PTInstVar pvar) |
static BOOL handle_SSH2_channel_open(PTInstVar pvar) |
| 5802 |
{ |
{ |
| 5803 |
int len; |
int len; |
| 5808 |
int remote_id; |
int remote_id; |
| 5809 |
int remote_window; |
int remote_window; |
| 5810 |
int remote_maxpacket; |
int remote_maxpacket; |
| 5811 |
|
int chan_num = -1; |
| 5812 |
|
|
| 5813 |
// 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード |
// 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード |
| 5814 |
data = pvar->ssh_state.payload; |
data = pvar->ssh_state.payload; |
| 5840 |
data += 4; |
data += 4; |
| 5841 |
|
|
| 5842 |
// searching request entry by listen_port & create_local_channel |
// searching request entry by listen_port & create_local_channel |
| 5843 |
FWD_open(pvar, remote_id, listen_addr, listen_port, orig_addr, orig_port); |
FWD_open(pvar, remote_id, listen_addr, listen_port, orig_addr, orig_port, |
| 5844 |
|
&chan_num); |
| 5845 |
|
|
| 5846 |
free(listen_addr); |
free(listen_addr); |
| 5847 |
free(orig_addr); |
free(orig_addr); |
| 5848 |
|
|
| 5849 |
|
// channelをアロケートし、必要な情報(remote window size)をここで取っておく。 |
| 5850 |
|
c = ssh2_channel_new(CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, TYPE_PORTFWD, chan_num); |
| 5851 |
|
c->remote_id = remote_id; |
| 5852 |
|
c->remote_window = remote_window; |
| 5853 |
|
c->remote_maxpacket = remote_maxpacket; |
| 5854 |
|
|
| 5855 |
} else if (strcmp(ctype, "x11") == 0) { // port-forwarding(X11) |
} else if (strcmp(ctype, "x11") == 0) { // port-forwarding(X11) |
| 5856 |
|
|
| 5857 |
} else { |
} else { |
| 6061 |
|
|
| 6062 |
/* |
/* |
| 6063 |
* $Log: not supported by cvs2svn $ |
* $Log: not supported by cvs2svn $ |
| 6064 |
|
* Revision 1.29 2005/06/26 14:26:24 yutakakn |
| 6065 |
|
* update: SSH2 port-forwarding (remote to local) |
| 6066 |
|
* |
| 6067 |
* Revision 1.28 2005/06/21 13:28:26 yutakakn |
* Revision 1.28 2005/06/21 13:28:26 yutakakn |
| 6068 |
* SSH2鍵交換中の(鍵交換以外の)SSH2メッセージ送信を破棄するようにした。 |
* SSH2鍵交換中の(鍵交換以外の)SSH2メッセージ送信を破棄するようにした。 |
| 6069 |
* |
* |