version 1.97, 2002/07/04 08:12:15 |
version 1.97.2.1, 2003/04/01 00:12:14 |
|
|
CipherContext *cc; |
CipherContext *cc; |
int encrypt; |
int encrypt; |
|
|
debug("newkeys: mode %d", mode); |
debug2("set_newkeys: mode %d", mode); |
|
|
if (mode == MODE_OUT) { |
if (mode == MODE_OUT) { |
cc = &send_context; |
cc = &send_context; |
|
|
encrypt = CIPHER_DECRYPT; |
encrypt = CIPHER_DECRYPT; |
} |
} |
if (newkeys[mode] != NULL) { |
if (newkeys[mode] != NULL) { |
debug("newkeys: rekeying"); |
debug("set_newkeys: rekeying"); |
cipher_cleanup(cc); |
cipher_cleanup(cc); |
enc = &newkeys[mode]->enc; |
enc = &newkeys[mode]->enc; |
mac = &newkeys[mode]->mac; |
mac = &newkeys[mode]->mac; |
|
|
cp = buffer_ptr(&input); |
cp = buffer_ptr(&input); |
len = GET_32BIT(cp); |
len = GET_32BIT(cp); |
if (len < 1 + 2 + 2 || len > 256 * 1024) |
if (len < 1 + 2 + 2 || len > 256 * 1024) |
packet_disconnect("Bad packet length %d.", len); |
packet_disconnect("Bad packet length %u.", len); |
padded_len = (len + 8) & ~7; |
padded_len = (len + 8) & ~7; |
|
|
/* Check if the packet has been entirely received. */ |
/* Check if the packet has been entirely received. */ |
|
|
packet_length = GET_32BIT(cp); |
packet_length = GET_32BIT(cp); |
if (packet_length < 1 + 4 || packet_length > 256 * 1024) { |
if (packet_length < 1 + 4 || packet_length > 256 * 1024) { |
buffer_dump(&incoming_packet); |
buffer_dump(&incoming_packet); |
packet_disconnect("Bad packet length %d.", packet_length); |
packet_disconnect("Bad packet length %u.", packet_length); |
} |
} |
DBG(debug("input: packet len %d", packet_length+4)); |
DBG(debug("input: packet len %u", packet_length+4)); |
buffer_consume(&input, block_size); |
buffer_consume(&input, block_size); |
} |
} |
/* we have a partial packet of block_size bytes */ |
/* we have a partial packet of block_size bytes */ |
|
|
vsnprintf(buf, sizeof(buf), fmt, args); |
vsnprintf(buf, sizeof(buf), fmt, args); |
va_end(args); |
va_end(args); |
|
|
|
/* Display the error locally */ |
|
log("Disconnecting: %.100s", buf); |
|
|
/* Send the disconnect message to the other side, and wait for it to get sent. */ |
/* Send the disconnect message to the other side, and wait for it to get sent. */ |
if (compat20) { |
if (compat20) { |
packet_start(SSH2_MSG_DISCONNECT); |
packet_start(SSH2_MSG_DISCONNECT); |
|
|
/* Close the connection. */ |
/* Close the connection. */ |
packet_close(); |
packet_close(); |
|
|
/* Display the error locally and exit. */ |
|
log("Disconnecting: %.100s", buf); |
|
fatal_cleanup(); |
fatal_cleanup(); |
} |
} |
|
|
|
|
return buffer_len(&output) < 128 * 1024; |
return buffer_len(&output) < 128 * 1024; |
} |
} |
|
|
|
static void |
|
packet_set_tos(int interactive) |
|
{ |
|
int tos = interactive ? IPTOS_LOWDELAY : IPTOS_THROUGHPUT; |
|
|
|
if (!packet_connection_is_on_socket() || |
|
!packet_connection_is_ipv4()) |
|
return; |
|
if (setsockopt(connection_in, IPPROTO_IP, IP_TOS, &tos, |
|
sizeof(tos)) < 0) |
|
error("setsockopt IP_TOS %d: %.100s:", |
|
tos, strerror(errno)); |
|
} |
|
|
/* Informs that the current session is interactive. Sets IP flags for that. */ |
/* Informs that the current session is interactive. Sets IP flags for that. */ |
|
|
void |
void |
packet_set_interactive(int interactive) |
packet_set_interactive(int interactive) |
{ |
{ |
static int called = 0; |
static int called = 0; |
int lowdelay = IPTOS_LOWDELAY; |
|
int throughput = IPTOS_THROUGHPUT; |
|
|
|
if (called) |
if (called) |
return; |
return; |
|
|
/* Only set socket options if using a socket. */ |
/* Only set socket options if using a socket. */ |
if (!packet_connection_is_on_socket()) |
if (!packet_connection_is_on_socket()) |
return; |
return; |
/* |
if (interactive) |
* IPTOS_LOWDELAY and IPTOS_THROUGHPUT are IPv4 only |
|
*/ |
|
if (interactive) { |
|
/* |
|
* Set IP options for an interactive connection. Use |
|
* IPTOS_LOWDELAY and TCP_NODELAY. |
|
*/ |
|
if (packet_connection_is_ipv4()) { |
|
if (setsockopt(connection_in, IPPROTO_IP, IP_TOS, |
|
&lowdelay, sizeof(lowdelay)) < 0) |
|
error("setsockopt IPTOS_LOWDELAY: %.100s", |
|
strerror(errno)); |
|
} |
|
set_nodelay(connection_in); |
set_nodelay(connection_in); |
} else if (packet_connection_is_ipv4()) { |
packet_set_tos(interactive); |
/* |
|
* Set IP options for a non-interactive connection. Use |
|
* IPTOS_THROUGHPUT. |
|
*/ |
|
if (setsockopt(connection_in, IPPROTO_IP, IP_TOS, &throughput, |
|
sizeof(throughput)) < 0) |
|
error("setsockopt IPTOS_THROUGHPUT: %.100s", strerror(errno)); |
|
} |
|
} |
} |
|
|
/* Returns true if the current connection is interactive. */ |
/* Returns true if the current connection is interactive. */ |