Commit c5de18a3 authored by Pavel Emelyanov's avatar Pavel Emelyanov

soccr: Handle connection state

For now we only support ESTABLISHED state, so this is mostly
a preparation for the future extention.
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent cab3f176
...@@ -340,6 +340,7 @@ static int restore_tcp_conn_state(int sk, struct libsoccr_sk *socr, struct inet_ ...@@ -340,6 +340,7 @@ static int restore_tcp_conn_state(int sk, struct libsoccr_sk *socr, struct inet_
goto err_c; goto err_c;
} }
data.state = TCP_ESTABLISHED;
data.inq_len = tse->inq_len; data.inq_len = tse->inq_len;
data.inq_seq = tse->inq_seq; data.inq_seq = tse->inq_seq;
data.outq_len = tse->outq_len; data.outq_len = tse->outq_len;
......
...@@ -109,6 +109,8 @@ static int refresh_sk(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, str ...@@ -109,6 +109,8 @@ static int refresh_sk(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, str
return -1; return -1;
} }
data->state = TCP_ESTABLISHED;
if (ioctl(sk->fd, SIOCOUTQ, &size) == -1) { if (ioctl(sk->fd, SIOCOUTQ, &size) == -1) {
loge("Unable to get size of snd queue"); loge("Unable to get size of snd queue");
return -1; return -1;
...@@ -265,7 +267,7 @@ err_recv: ...@@ -265,7 +267,7 @@ err_recv:
/* /*
* This is how much data we've had in the initial libsoccr * This is how much data we've had in the initial libsoccr
*/ */
#define SOCR_DATA_MIN_SIZE (16 * sizeof(__u32)) #define SOCR_DATA_MIN_SIZE (17 * sizeof(__u32))
int libsoccr_get_sk_data(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size) int libsoccr_get_sk_data(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size)
{ {
...@@ -339,6 +341,9 @@ int libsoccr_set_sk_data_unbound(struct libsoccr_sk *sk, ...@@ -339,6 +341,9 @@ int libsoccr_set_sk_data_unbound(struct libsoccr_sk *sk,
if (!data || data_size < SOCR_DATA_MIN_SIZE) if (!data || data_size < SOCR_DATA_MIN_SIZE)
return -1; return -1;
if (data->state != TCP_ESTABLISHED)
return -1;
if (set_queue_seq(sk, TCP_RECV_QUEUE, if (set_queue_seq(sk, TCP_RECV_QUEUE,
data->inq_seq - data->inq_len)) data->inq_seq - data->inq_len))
return -2; return -2;
......
...@@ -12,6 +12,7 @@ void libsoccr_set_log(unsigned int level, void (*fn)(unsigned int level, const c ...@@ -12,6 +12,7 @@ void libsoccr_set_log(unsigned int level, void (*fn)(unsigned int level, const c
struct libsoccr_sk; struct libsoccr_sk;
struct libsoccr_sk_data { struct libsoccr_sk_data {
__u32 state;
__u32 inq_len; __u32 inq_len;
__u32 inq_seq; __u32 inq_seq;
__u32 outq_len; __u32 outq_len;
......
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