Difference between revisions of "Libsoccr"
Jump to navigation
Jump to search
(→Calls) |
|||
Line 58: | Line 58: | ||
=== Dump === | === Dump === | ||
− | ; <code>int | + | ; <code>int libsoccr_save(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size)</code> |
: Fills in the <code>data</code> structure with the info get from paused socket. The <code>data_size</code> should be the size of the structure passed. The return code is the size of the structure really filled with data. | : Fills in the <code>data</code> structure with the info get from paused socket. The <code>data_size</code> should be the size of the structure passed. The return code is the size of the structure really filled with data. | ||
− | ; <code>char *libsoccr_get_queue_bytes(struct libsoccr_sk *sk, int queue_id, | + | ; <code>char *libsoccr_get_queue_bytes(struct libsoccr_sk *sk, int queue_id, unsigned flags)</code> |
− | : Returns a malloc()-ed array with the contents of the queue. The queue can be TCP_RECV_QUEUE or TCP_SEND_QUEUE. The amount of bytes in each is <code>data.inq_len</code> and <code>data.outq_len</code> respectively. The <code> | + | : Returns a malloc()-ed array with the contents of the queue. The queue can be TCP_RECV_QUEUE or TCP_SEND_QUEUE. The amount of bytes in each is <code>data.inq_len</code> and <code>data.outq_len</code> respectively. The <code>flags</code> may include <code>SOCCR_MEM_EXCL</code> bit (see below). |
+ | |||
+ | ; <code>union libsoccr_addr *libsoccr_get_addr(struct libsoccr_sk *sk, int self, unsigned flags)</code> | ||
+ | : Returns address (self or peer) of the socket. The <code>flags</code> may include <code>SOCCR_MEM_EXCL</code> bit (see below) | ||
+ | (currently unimplemented) | ||
=== Restore === | === Restore === | ||
− | ; <code>int | + | ; <code>int libsoccr_restore(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size)</code> |
− | : Restores data on a socket from the <code>data</code> structure. Should be called | + | : Restores data on a socket from the <code>data</code> structure. Should be called after the calls below, but before the "resume" one. |
− | |||
− | |||
− | |||
− | ; <code>int | + | ; <code>int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, int queue, char *buf, unsigned flags)</code> |
− | : | + | : Puts back the contents of the respective queue. The <code>flags</code> may contain <code>SOCCR_MEM_EXCL</code>. |
− | ; <code>int | + | ; <code>int libsoccr_set_addr(struct libsoccr_sk *sk, int self, union libsoccr_addr *, unsigned flags)</code> |
− | : | + | : Sets address (self or peer) of the socket. The <code>flags</code> may contain <code>SOCCR_MEM_EXCL</code>. |
[[Category: Sub-projects]] | [[Category: Sub-projects]] | ||
[[Category: Sockets]] | [[Category: Sockets]] |
Revision as of 11:23, 11 January 2017
Libsoccr is the library that does TCP connection checkpoint and restore. It sits in criu sources and includes an API header and a static library.
Overview
To checkpoint a TCP connection one should
- pause a socket (referenced by descriptor)
- get socket data
- get contents of two queues
- (optionally) resume the socket
- close it
To restore a connection one should
- create a socket
- pause one
- restore unbound data
- bind() and/or connect() socket to whatever addresses is appropriate using standard calls
- restore noq data
- put contents of two queues
- restore remaining data
Data types
In soccr/soccr.h there are three types declares
struct libsoccr_sk
- It's an abstract handler returned by pausing routine that is used as an opaque identifier by the rest of the libsoccr calls
struct libsoccr_sk_data
- A structure containing a set of 32-bit values that are returned by getter and that are to be passed as is to the setter call
struct libsoccr_addr
- A structure that defines soccaddr for a socket. It's used by set/get calls described further.
Data internals
Inside the libsoccr_sk_data
structure there's a special field called flags
that gives information about the meaning of some other fields. Though it's not bad just to pass this structure as-is between libsoccr calls, doing some optimization based on flags is OK.
So here are the flags that make sense
SOCCR_FLAGS_WINDOW == 0x1
- When set indicates, that fields
snd_wl1
,snd_wnd
,max_window
,rcv_wnd
andrcv_wup
contain some valuable data (0 is valid value for any)
Calls
Generic
struct libsoccr_sk *libsoccr_pause(int sk)
- Pauses the socket and returns a handler for further operations. Any data flow for this socket must be blocked by the caller before this call.
void libsoccr_resume(struct libsoccr_sk *)
- Resumes the socket. Data flow unlock may happen before this.
void libsoccr_set_log(unsigned int level, void (*fn)(unsigned int level, const char *fmt, ...))
- Sets a function that will be called when libsoccr will want to print something on the screen.
Dump
int libsoccr_save(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size)
- Fills in the
data
structure with the info get from paused socket. Thedata_size
should be the size of the structure passed. The return code is the size of the structure really filled with data.
char *libsoccr_get_queue_bytes(struct libsoccr_sk *sk, int queue_id, unsigned flags)
- Returns a malloc()-ed array with the contents of the queue. The queue can be TCP_RECV_QUEUE or TCP_SEND_QUEUE. The amount of bytes in each is
data.inq_len
anddata.outq_len
respectively. Theflags
may includeSOCCR_MEM_EXCL
bit (see below).
union libsoccr_addr *libsoccr_get_addr(struct libsoccr_sk *sk, int self, unsigned flags)
- Returns address (self or peer) of the socket. The
flags
may includeSOCCR_MEM_EXCL
bit (see below)
(currently unimplemented)
Restore
int libsoccr_restore(struct libsoccr_sk *sk, struct libsoccr_sk_data *data, unsigned data_size)
- Restores data on a socket from the
data
structure. Should be called after the calls below, but before the "resume" one.
int libsoccr_set_queue_bytes(struct libsoccr_sk *sk, int queue, char *buf, unsigned flags)
- Puts back the contents of the respective queue. The
flags
may containSOCCR_MEM_EXCL
.
int libsoccr_set_addr(struct libsoccr_sk *sk, int self, union libsoccr_addr *, unsigned flags)
- Sets address (self or peer) of the socket. The
flags
may containSOCCR_MEM_EXCL
.