Commit 3ef8d138 authored by Pavel Emelyanov's avatar Pavel Emelyanov

packetsk: Support PACKET_RESERVE option

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 1259a9ad
...@@ -12,4 +12,5 @@ message packet_sock_entry { ...@@ -12,4 +12,5 @@ message packet_sock_entry {
required sk_opts_entry opts = 7; required sk_opts_entry opts = 7;
required uint32 version = 8; 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) ...@@ -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)) if (dump_opt(lfd, SOL_PACKET, PACKET_VERSION, &psk.version))
return -1; 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); 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) ...@@ -100,6 +103,9 @@ static int open_packet_sk(struct file_desc *d)
if (restore_opt(sk, SOL_PACKET, PACKET_VERSION, &pse->version)) if (restore_opt(sk, SOL_PACKET, PACKET_VERSION, &pse->version))
goto err_cl; 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)) if (rst_file_params(sk, pse->fown, pse->flags))
goto err_cl; goto err_cl;
......
...@@ -23,6 +23,8 @@ const char *test_author = "Pavel Emelyanov <xemul@parallels.com>"; ...@@ -23,6 +23,8 @@ const char *test_author = "Pavel Emelyanov <xemul@parallels.com>";
#include <linux/if_packet.h> #include <linux/if_packet.h>
#include <net/ethernet.h> #include <net/ethernet.h>
#define SK_RESERVE 8
static int test_sockaddr(int n, struct sockaddr_ll *have, struct sockaddr_ll *want) static int test_sockaddr(int n, struct sockaddr_ll *have, struct sockaddr_ll *want)
{ {
if (have->sll_family != want->sll_family) { if (have->sll_family != want->sll_family) {
...@@ -52,7 +54,7 @@ int main(int argc, char **argv) ...@@ -52,7 +54,7 @@ int main(int argc, char **argv)
int sk1, sk2; int sk1, sk2;
struct sockaddr_ll addr, addr1, addr2; struct sockaddr_ll addr, addr1, addr2;
socklen_t alen; socklen_t alen;
int ver; int ver, rsv;
test_init(argc, argv); test_init(argc, argv);
...@@ -94,6 +96,12 @@ int main(int argc, char **argv) ...@@ -94,6 +96,12 @@ int main(int argc, char **argv)
return 1; 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_daemon();
test_waitsig(); test_waitsig();
...@@ -126,6 +134,17 @@ int main(int argc, char **argv) ...@@ -126,6 +134,17 @@ int main(int argc, char **argv)
if (test_sockaddr(2, &addr, &addr2)) if (test_sockaddr(2, &addr, &addr2))
return 1; 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(); pass();
return 0; return 0;
} }
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