From 3ef8d138ab99db58d01338eca01fa82a59ff7ec9 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Thu, 9 Aug 2012 17:38:15 +0400 Subject: [PATCH] packetsk: Support PACKET_RESERVE option Signed-off-by: Pavel Emelyanov --- protobuf/packet-sock.proto | 1 + sk-packet.c | 6 ++++++ test/zdtm/live/static/packet_sock.c | 21 ++++++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/protobuf/packet-sock.proto b/protobuf/packet-sock.proto index 76ae5929d..a255a2b3d 100644 --- a/protobuf/packet-sock.proto +++ b/protobuf/packet-sock.proto @@ -12,4 +12,5 @@ message packet_sock_entry { required sk_opts_entry opts = 7; required uint32 version = 8; + required uint32 reserve = 9; } diff --git a/sk-packet.c b/sk-packet.c index beb77eaad..b2c3f345e 100644 --- a/sk-packet.c +++ b/sk-packet.c @@ -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; diff --git a/test/zdtm/live/static/packet_sock.c b/test/zdtm/live/static/packet_sock.c index db1842ec6..da0e62c60 100644 --- a/test/zdtm/live/static/packet_sock.c +++ b/test/zdtm/live/static/packet_sock.c @@ -23,6 +23,8 @@ const char *test_author = "Pavel Emelyanov "; #include #include +#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; }