Commit ff4e387b authored by Pavel Emelyanov's avatar Pavel Emelyanov

soccr: Move queue pointers from _data

Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Acked-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 4b9b56b2
...@@ -257,12 +257,7 @@ static int read_tcp_queue(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, ...@@ -257,12 +257,7 @@ static int read_tcp_queue(struct libsoccr_sk *sk, struct libsoccr_sk_data *data,
if (read_img_buf(img, buf, len) < 0) if (read_img_buf(img, buf, len) < 0)
goto err; goto err;
if (queue == TCP_SEND_QUEUE) return libsoccr_set_queue_bytes(sk, queue, buf, SOCCR_MEM_EXCL);
data->outq_data = buf;
else
data->inq_data = buf;
return 0;
err: err:
xfree(buf); xfree(buf);
...@@ -379,8 +374,6 @@ static int restore_tcp_conn_state(int sk, struct libsoccr_sk *socr, struct inet_ ...@@ -379,8 +374,6 @@ static int restore_tcp_conn_state(int sk, struct libsoccr_sk *socr, struct inet_
return 0; return 0;
err_c: err_c:
xfree(data.inq_data);
xfree(data.outq_data);
tcp_stream_entry__free_unpacked(tse, NULL); tcp_stream_entry__free_unpacked(tse, NULL);
close_image(img); close_image(img);
err: err:
......
...@@ -104,10 +104,14 @@ static int tcp_repair_off(int fd) ...@@ -104,10 +104,14 @@ static int tcp_repair_off(int fd)
struct libsoccr_sk { struct libsoccr_sk {
int fd; int fd;
unsigned flags;
char *recv_queue; char *recv_queue;
char *send_queue; char *send_queue;
}; };
#define SK_FLAG_FREE_RQ 0x1
#define SK_FLAG_FREE_SQ 0x2
struct libsoccr_sk *libsoccr_pause(int fd) struct libsoccr_sk *libsoccr_pause(int fd)
{ {
struct libsoccr_sk *ret; struct libsoccr_sk *ret;
...@@ -121,6 +125,7 @@ struct libsoccr_sk *libsoccr_pause(int fd) ...@@ -121,6 +125,7 @@ struct libsoccr_sk *libsoccr_pause(int fd)
return NULL; return NULL;
} }
ret->flags = 0;
ret->recv_queue = NULL; ret->recv_queue = NULL;
ret->send_queue = NULL; ret->send_queue = NULL;
ret->fd = fd; ret->fd = fd;
...@@ -130,8 +135,10 @@ struct libsoccr_sk *libsoccr_pause(int fd) ...@@ -130,8 +135,10 @@ struct libsoccr_sk *libsoccr_pause(int fd)
void libsoccr_resume(struct libsoccr_sk *sk) void libsoccr_resume(struct libsoccr_sk *sk)
{ {
tcp_repair_off(sk->fd); tcp_repair_off(sk->fd);
free(sk->send_queue); if (sk->flags & SK_FLAG_FREE_RQ)
free(sk->recv_queue); free(sk->recv_queue);
if (sk->flags & SK_FLAG_FREE_SQ)
free(sk->send_queue);
free(sk); free(sk);
} }
...@@ -345,6 +352,8 @@ int libsoccr_save(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigne ...@@ -345,6 +352,8 @@ int libsoccr_save(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigne
if (get_window(sk, data)) if (get_window(sk, data))
return -4; return -4;
sk->flags |= SK_FLAG_FREE_SQ | SK_FLAG_FREE_RQ;
if (get_queue(sk->fd, TCP_RECV_QUEUE, &data->inq_seq, data->inq_len, &sk->recv_queue)) if (get_queue(sk->fd, TCP_RECV_QUEUE, &data->inq_seq, data->inq_len, &sk->recv_queue))
return -4; return -4;
...@@ -623,7 +632,7 @@ static int restore_fin_in_snd_queue(int sk, int acked) ...@@ -623,7 +632,7 @@ static int restore_fin_in_snd_queue(int sk, int acked)
return ret; return ret;
} }
static int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size, static int libsoccr_restore_queue(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size,
int queue, char *buf); int queue, char *buf);
int libsoccr_restore(struct libsoccr_sk *sk, int libsoccr_restore(struct libsoccr_sk *sk,
...@@ -634,10 +643,10 @@ int libsoccr_restore(struct libsoccr_sk *sk, ...@@ -634,10 +643,10 @@ int libsoccr_restore(struct libsoccr_sk *sk,
if (libsoccr_set_sk_data_noq(sk, data, data_size)) if (libsoccr_set_sk_data_noq(sk, data, data_size))
return -1; return -1;
if (libsoccr_set_queue_bytes(sk, data, sizeof(*data), TCP_RECV_QUEUE, data->inq_data)) if (libsoccr_restore_queue(sk, data, sizeof(*data), TCP_RECV_QUEUE, sk->recv_queue))
return -1; return -1;
if (libsoccr_set_queue_bytes(sk, data, sizeof(*data), TCP_SEND_QUEUE, data->outq_data)) if (libsoccr_restore_queue(sk, data, sizeof(*data), TCP_SEND_QUEUE, sk->send_queue))
return -1; return -1;
if (data->flags & SOCCR_FLAGS_WINDOW) { if (data->flags & SOCCR_FLAGS_WINDOW) {
...@@ -749,9 +758,12 @@ static int send_queue(struct libsoccr_sk *sk, int queue, char *buf, __u32 len) ...@@ -749,9 +758,12 @@ static int send_queue(struct libsoccr_sk *sk, int queue, char *buf, __u32 len)
return __send_queue(sk, queue, buf, len); return __send_queue(sk, queue, buf, len);
} }
static int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size, static int libsoccr_restore_queue(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size,
int queue, char *buf) int queue, char *buf)
{ {
if (!buf)
return 0;
if (!data || data_size < SOCR_DATA_MIN_SIZE) if (!data || data_size < SOCR_DATA_MIN_SIZE)
return -1; return -1;
...@@ -793,3 +805,25 @@ static int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, struct libsoccr_sk_d ...@@ -793,3 +805,25 @@ static int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, struct libsoccr_sk_d
return -5; return -5;
} }
#define SET_Q_FLAGS (SOCCR_MEM_EXCL)
int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, int queue_id, char *bytes, unsigned flags)
{
if (flags & ~SET_Q_FLAGS)
return -1;
switch (queue_id) {
case TCP_RECV_QUEUE:
sk->recv_queue = bytes;
if (flags & SOCCR_MEM_EXCL)
sk->flags |= SK_FLAG_FREE_RQ;
return 0;
case TCP_SEND_QUEUE:
sk->send_queue = bytes;
if (flags & SOCCR_MEM_EXCL)
sk->flags |= SK_FLAG_FREE_SQ;
return 0;
}
return -1;
}
...@@ -91,9 +91,6 @@ struct libsoccr_sk_data { ...@@ -91,9 +91,6 @@ struct libsoccr_sk_data {
__u32 rcv_wnd; __u32 rcv_wnd;
__u32 rcv_wup; __u32 rcv_wup;
char *inq_data;
char *outq_data;
union libsoccr_addr src_addr; union libsoccr_addr src_addr;
union libsoccr_addr dst_addr; union libsoccr_addr dst_addr;
}; };
...@@ -196,6 +193,8 @@ char *libsoccr_get_queue_bytes(struct libsoccr_sk *sk, int queue_id, unsigned fl ...@@ -196,6 +193,8 @@ char *libsoccr_get_queue_bytes(struct libsoccr_sk *sk, int queue_id, unsigned fl
* sk = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); * sk = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
* *
* h = libsoccr_pause(sk) * h = libsoccr_pause(sk)
* libsoccr_set_queue_bytes(h, TCP_SEND_QUEUE, outq);
* libsoccr_set_queue_bytes(h, TCP_RECV_QUEUE, inq);
* libsoccr_restore(h, &data, sizeof(data)) * libsoccr_restore(h, &data, sizeof(data))
* *
* libsoccr_resume(h) * libsoccr_resume(h)
...@@ -204,6 +203,13 @@ char *libsoccr_get_queue_bytes(struct libsoccr_sk *sk, int queue_id, unsigned fl ...@@ -204,6 +203,13 @@ char *libsoccr_get_queue_bytes(struct libsoccr_sk *sk, int queue_id, unsigned fl
* enabled back. * enabled back.
*/ */
/*
* Set a pointer on the send/recv queue data.
* If flags have SOCCR_MEM_EXCL, the buffer is stolen by the library and is
* free()-ed after libsoccr_resume().
*/
int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, int queue_id, char *bytes, unsigned flags);
/* /*
* Performs restore actions on bind()-ed socket * Performs restore actions on bind()-ed socket
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment