Commit 1259a9ad authored by Pavel Emelyanov's avatar Pavel Emelyanov

packetsk: Support PACKET_VERSION sockoption

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 216a3a65
...@@ -10,4 +10,6 @@ message packet_sock_entry { ...@@ -10,4 +10,6 @@ message packet_sock_entry {
required fown_entry fown = 6; required fown_entry fown = 6;
required sk_opts_entry opts = 7; required sk_opts_entry opts = 7;
required uint32 version = 8;
} }
#include <linux/if_packet.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netpacket/packet.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include "crtools.h" #include "crtools.h"
...@@ -53,6 +53,9 @@ static int dump_one_packet_fd(int lfd, u32 id, const struct fd_parms *p) ...@@ -53,6 +53,9 @@ static int dump_one_packet_fd(int lfd, u32 id, const struct fd_parms *p)
psk.protocol = addr.sll_protocol; psk.protocol = addr.sll_protocol;
psk.ifindex = addr.sll_ifindex; psk.ifindex = addr.sll_ifindex;
if (dump_opt(lfd, SOL_PACKET, PACKET_VERSION, &psk.version))
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);
} }
...@@ -94,6 +97,9 @@ static int open_packet_sk(struct file_desc *d) ...@@ -94,6 +97,9 @@ static int open_packet_sk(struct file_desc *d)
goto err_cl; goto err_cl;
} }
if (restore_opt(sk, SOL_PACKET, PACKET_VERSION, &pse->version))
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;
......
...@@ -20,7 +20,7 @@ const char *test_author = "Pavel Emelyanov <xemul@parallels.com>"; ...@@ -20,7 +20,7 @@ const char *test_author = "Pavel Emelyanov <xemul@parallels.com>";
#include <stdlib.h> #include <stdlib.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netpacket/packet.h> #include <linux/if_packet.h>
#include <net/ethernet.h> #include <net/ethernet.h>
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)
...@@ -52,6 +52,7 @@ int main(int argc, char **argv) ...@@ -52,6 +52,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;
test_init(argc, argv); test_init(argc, argv);
...@@ -87,6 +88,12 @@ int main(int argc, char **argv) ...@@ -87,6 +88,12 @@ int main(int argc, char **argv)
return 1; return 1;
} }
ver = TPACKET_V2;
if (setsockopt(sk1, SOL_PACKET, PACKET_VERSION, &ver, sizeof(ver)) < 0) {
err("Can't set version %m");
return 1;
}
test_daemon(); test_daemon();
test_waitsig(); test_waitsig();
...@@ -99,6 +106,17 @@ int main(int argc, char **argv) ...@@ -99,6 +106,17 @@ int main(int argc, char **argv)
if (test_sockaddr(1, &addr, &addr1)) if (test_sockaddr(1, &addr, &addr1))
return 1; return 1;
alen = sizeof(ver);
if (getsockopt(sk1, SOL_PACKET, PACKET_VERSION, &ver, &alen) < 0) {
fail("Can't get sockopt ver %m");
return 1;
}
if (ver != TPACKET_V2) {
fail("Version mismatch have %d, want %d\n", ver, TPACKET_V2);
return 1;
}
alen = sizeof(addr); alen = sizeof(addr);
if (getsockname(sk2, (struct sockaddr *)&addr, &alen) < 0) { if (getsockname(sk2, (struct sockaddr *)&addr, &alen) < 0) {
fail("Can't get sockname 2 rst"); fail("Can't get sockname 2 rst");
......
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