Commit d29feb91 authored by Pavel Emelyanov's avatar Pavel Emelyanov

packetsk: Add support for auxdata, origdev and vnethdr bits

These are boolean in reality.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 242fd55a
......@@ -7,4 +7,8 @@ struct cr_options;
int dump_one_packet_sk(struct fd_parms *p, int lfd, const struct cr_fdset *fds);
int collect_packet_sockets(void);
void show_packetsk(int fd, struct cr_options *);
#ifndef PACKET_VNET_HDR
#define PACKET_VNET_HDR 15
#endif
#endif
......@@ -13,4 +13,7 @@ message packet_sock_entry {
required uint32 version = 8;
required uint32 reserve = 9;
required bool aux_data = 10;
required bool orig_dev = 11;
required bool vnet_hdr = 12;
}
......@@ -24,7 +24,7 @@ void show_packetsk(int fd, struct cr_options *o)
static int dump_one_packet_fd(int lfd, u32 id, const struct fd_parms *p)
{
int type;
int type, yes;
PacketSockEntry psk = PACKET_SOCK_ENTRY__INIT;
SkOptsEntry skopts = SK_OPTS_ENTRY__INIT;
struct sockaddr_ll addr;
......@@ -59,6 +59,18 @@ static int dump_one_packet_fd(int lfd, u32 id, const struct fd_parms *p)
if (dump_opt(lfd, SOL_PACKET, PACKET_RESERVE, &psk.reserve))
return -1;
if (dump_opt(lfd, SOL_PACKET, PACKET_AUXDATA, &yes))
return -1;
psk.aux_data = (yes ? true : false);
if (dump_opt(lfd, SOL_PACKET, PACKET_ORIGDEV, &yes))
return 1;
psk.orig_dev = (yes ? true : false);
if (dump_opt(lfd, SOL_PACKET, PACKET_VNET_HDR, &yes))
return 1;
psk.vnet_hdr = (yes ? true : false);
return pb_write_one(fdset_fd(glob_fdset, CR_FD_PACKETSK), &psk, PB_PACKETSK);
}
......@@ -78,7 +90,7 @@ static int open_packet_sk(struct file_desc *d)
struct packet_sock_info *psi;
PacketSockEntry *pse;
struct sockaddr_ll addr;
int sk;
int sk, yes;
psi = container_of(d, struct packet_sock_info, d);
pse = psi->pse;
......@@ -106,6 +118,24 @@ static int open_packet_sk(struct file_desc *d)
if (restore_opt(sk, SOL_PACKET, PACKET_RESERVE, &pse->reserve))
goto err_cl;
if (pse->aux_data) {
yes = 1;
if (restore_opt(sk, SOL_PACKET, PACKET_AUXDATA, &yes))
goto err_cl;
}
if (pse->orig_dev) {
yes = 1;
if (restore_opt(sk, SOL_PACKET, PACKET_ORIGDEV, &yes))
goto err_cl;
}
if (pse->vnet_hdr) {
yes = 1;
if (restore_opt(sk, SOL_PACKET, PACKET_VNET_HDR, &yes))
goto err_cl;
}
if (rst_file_params(sk, pse->fown, pse->flags))
goto err_cl;
......
......@@ -54,7 +54,7 @@ int main(int argc, char **argv)
int sk1, sk2;
struct sockaddr_ll addr, addr1, addr2;
socklen_t alen;
int ver, rsv;
int ver, rsv, yes;
test_init(argc, argv);
......@@ -96,12 +96,24 @@ int main(int argc, char **argv)
return 1;
}
yes = 1;
if (setsockopt(sk1, SOL_PACKET, PACKET_AUXDATA, &yes, sizeof(yes)) < 0) {
err("Can't set auxdata %m");
return 1;
}
rsv = SK_RESERVE;
if (setsockopt(sk2, SOL_PACKET, PACKET_RESERVE, &rsv, sizeof(rsv)) < 0) {
err("Can't set reserve %m");
return 1;
}
yes = 1;
if (setsockopt(sk2, SOL_PACKET, PACKET_ORIGDEV, &yes, sizeof(yes)) < 0) {
err("Can't set origdev %m");
return 1;
}
test_daemon();
test_waitsig();
......@@ -125,6 +137,17 @@ int main(int argc, char **argv)
return 1;
}
alen = sizeof(yes);
if (getsockopt(sk1, SOL_PACKET, PACKET_AUXDATA, &yes, &alen) < 0) {
fail("Can't get sockopt auxdata %m");
return 1;
}
if (yes != 1) {
fail("Auxdata not ON");
return 1;
}
alen = sizeof(addr);
if (getsockname(sk2, (struct sockaddr *)&addr, &alen) < 0) {
fail("Can't get sockname 2 rst");
......@@ -140,6 +163,17 @@ int main(int argc, char **argv)
return 1;
}
alen = sizeof(yes);
if (getsockopt(sk2, SOL_PACKET, PACKET_ORIGDEV, &yes, &alen) < 0) {
fail("Can't get sockopt origdev %m");
return 1;
}
if (yes != 1) {
fail("OrigDev not ON");
return 1;
}
if (rsv != SK_RESERVE) {
fail("Reserve mismatch have %d, want %d\n", rsv, SK_RESERVE);
return 1;
......
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