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 {
required fown_entry fown = 6;
required sk_opts_entry opts = 7;
required uint32 version = 8;
}
#include <linux/if_packet.h>
#include <sys/socket.h>
#include <netpacket/packet.h>
#include <unistd.h>
#include <string.h>
#include "crtools.h"
......@@ -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.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);
}
......@@ -94,6 +97,9 @@ static int open_packet_sk(struct file_desc *d)
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))
goto err_cl;
......
......@@ -20,7 +20,7 @@ const char *test_author = "Pavel Emelyanov <xemul@parallels.com>";
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netpacket/packet.h>
#include <linux/if_packet.h>
#include <net/ethernet.h>
static int test_sockaddr(int n, struct sockaddr_ll *have, struct sockaddr_ll *want)
......@@ -52,6 +52,7 @@ int main(int argc, char **argv)
int sk1, sk2;
struct sockaddr_ll addr, addr1, addr2;
socklen_t alen;
int ver;
test_init(argc, argv);
......@@ -87,6 +88,12 @@ int main(int argc, char **argv)
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_waitsig();
......@@ -99,6 +106,17 @@ int main(int argc, char **argv)
if (test_sockaddr(1, &addr, &addr1))
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);
if (getsockname(sk2, (struct sockaddr *)&addr, &alen) < 0) {
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