- connection_in = fd_in;
- connection_out = fd_out;
- cipher_init(&send_context, none, "", 0, NULL, 0, CIPHER_ENCRYPT);
- cipher_init(&receive_context, none, "", 0, NULL, 0, CIPHER_DECRYPT);
- newkeys[MODE_IN] = newkeys[MODE_OUT] = NULL;
- if (!initialized) {
- initialized = 1;
- buffer_init(&input);
- buffer_init(&output);
- buffer_init(&outgoing_packet);
- buffer_init(&incoming_packet);
- TAILQ_INIT(&outgoing);
+ if (active_state == NULL)
+ active_state = alloc_session_state();
+ active_state->connection_in = fd_in;
+ active_state->connection_out = fd_out;
+ cipher_init(&active_state->send_context, none, (const u_char *)"",
+ 0, NULL, 0, CIPHER_ENCRYPT);
+ cipher_init(&active_state->receive_context, none, (const u_char *)"",
+ 0, NULL, 0, CIPHER_DECRYPT);
+ active_state->newkeys[MODE_IN] = active_state->newkeys[MODE_OUT] = NULL;
+ if (!active_state->initialized) {
+ active_state->initialized = 1;
+ buffer_init(&active_state->input);
+ buffer_init(&active_state->output);
+ buffer_init(&active_state->outgoing_packet);
+ buffer_init(&active_state->incoming_packet);
+ TAILQ_INIT(&active_state->outgoing);
+ active_state->p_send.packets = active_state->p_read.packets = 0;
+ }
+}
+
+void
+packet_set_timeout(int timeout, int count)
+{
+ if (timeout == 0 || count == 0) {
+ active_state->packet_timeout_ms = -1;
+ return;
+ }
+ if ((INT_MAX / 1000) / count < timeout)
+ active_state->packet_timeout_ms = INT_MAX;
+ else
+ active_state->packet_timeout_ms = timeout * count * 1000;
+}
+
+static void
+packet_stop_discard(void)
+{
+ if (active_state->packet_discard_mac) {
+ char buf[1024];
+
+ memset(buf, 'a', sizeof(buf));
+ while (buffer_len(&active_state->incoming_packet) <
+ PACKET_MAX_SIZE)
+ buffer_append(&active_state->incoming_packet, buf,
+ sizeof(buf));
+ (void) mac_compute(active_state->packet_discard_mac,
+ active_state->p_read.seqnr,
+ buffer_ptr(&active_state->incoming_packet),
+ PACKET_MAX_SIZE);