mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-21 09:10:10 +00:00
packetsk: Support PACKET_RESERVE option
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
parent
1259a9ad80
commit
3ef8d138ab
3 changed files with 27 additions and 1 deletions
|
|
@ -12,4 +12,5 @@ message packet_sock_entry {
|
|||
required sk_opts_entry opts = 7;
|
||||
|
||||
required uint32 version = 8;
|
||||
required uint32 reserve = 9;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ static int dump_one_packet_fd(int lfd, u32 id, const struct fd_parms *p)
|
|||
if (dump_opt(lfd, SOL_PACKET, PACKET_VERSION, &psk.version))
|
||||
return -1;
|
||||
|
||||
if (dump_opt(lfd, SOL_PACKET, PACKET_RESERVE, &psk.reserve))
|
||||
return -1;
|
||||
|
||||
return pb_write_one(fdset_fd(glob_fdset, CR_FD_PACKETSK), &psk, PB_PACKETSK);
|
||||
}
|
||||
|
||||
|
|
@ -100,6 +103,9 @@ static int open_packet_sk(struct file_desc *d)
|
|||
if (restore_opt(sk, SOL_PACKET, PACKET_VERSION, &pse->version))
|
||||
goto err_cl;
|
||||
|
||||
if (restore_opt(sk, SOL_PACKET, PACKET_RESERVE, &pse->reserve))
|
||||
goto err_cl;
|
||||
|
||||
if (rst_file_params(sk, pse->fown, pse->flags))
|
||||
goto err_cl;
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@ const char *test_author = "Pavel Emelyanov <xemul@parallels.com>";
|
|||
#include <linux/if_packet.h>
|
||||
#include <net/ethernet.h>
|
||||
|
||||
#define SK_RESERVE 8
|
||||
|
||||
static int test_sockaddr(int n, struct sockaddr_ll *have, struct sockaddr_ll *want)
|
||||
{
|
||||
if (have->sll_family != want->sll_family) {
|
||||
|
|
@ -52,7 +54,7 @@ int main(int argc, char **argv)
|
|||
int sk1, sk2;
|
||||
struct sockaddr_ll addr, addr1, addr2;
|
||||
socklen_t alen;
|
||||
int ver;
|
||||
int ver, rsv;
|
||||
|
||||
test_init(argc, argv);
|
||||
|
||||
|
|
@ -94,6 +96,12 @@ int main(int argc, char **argv)
|
|||
return 1;
|
||||
}
|
||||
|
||||
rsv = SK_RESERVE;
|
||||
if (setsockopt(sk2, SOL_PACKET, PACKET_RESERVE, &rsv, sizeof(rsv)) < 0) {
|
||||
err("Can't set reserve %m");
|
||||
return 1;
|
||||
}
|
||||
|
||||
test_daemon();
|
||||
test_waitsig();
|
||||
|
||||
|
|
@ -126,6 +134,17 @@ int main(int argc, char **argv)
|
|||
if (test_sockaddr(2, &addr, &addr2))
|
||||
return 1;
|
||||
|
||||
alen = sizeof(rsv);
|
||||
if (getsockopt(sk2, SOL_PACKET, PACKET_RESERVE, &rsv, &alen) < 0) {
|
||||
fail("Can't get sockopt rsv %m");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (rsv != SK_RESERVE) {
|
||||
fail("Reserve mismatch have %d, want %d\n", rsv, SK_RESERVE);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pass();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue