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; ...@@ -7,4 +7,8 @@ struct cr_options;
int dump_one_packet_sk(struct fd_parms *p, int lfd, const struct cr_fdset *fds); int dump_one_packet_sk(struct fd_parms *p, int lfd, const struct cr_fdset *fds);
int collect_packet_sockets(void); int collect_packet_sockets(void);
void show_packetsk(int fd, struct cr_options *); void show_packetsk(int fd, struct cr_options *);
#ifndef PACKET_VNET_HDR
#define PACKET_VNET_HDR 15
#endif
#endif #endif
...@@ -13,4 +13,7 @@ message packet_sock_entry { ...@@ -13,4 +13,7 @@ message packet_sock_entry {
required uint32 version = 8; required uint32 version = 8;
required uint32 reserve = 9; 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) ...@@ -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) 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; PacketSockEntry psk = PACKET_SOCK_ENTRY__INIT;
SkOptsEntry skopts = SK_OPTS_ENTRY__INIT; SkOptsEntry skopts = SK_OPTS_ENTRY__INIT;
struct sockaddr_ll addr; struct sockaddr_ll addr;
...@@ -59,6 +59,18 @@ static int dump_one_packet_fd(int lfd, u32 id, const struct fd_parms *p) ...@@ -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)) if (dump_opt(lfd, SOL_PACKET, PACKET_RESERVE, &psk.reserve))
return -1; 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); 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) ...@@ -78,7 +90,7 @@ static int open_packet_sk(struct file_desc *d)
struct packet_sock_info *psi; struct packet_sock_info *psi;
PacketSockEntry *pse; PacketSockEntry *pse;
struct sockaddr_ll addr; struct sockaddr_ll addr;
int sk; int sk, yes;
psi = container_of(d, struct packet_sock_info, d); psi = container_of(d, struct packet_sock_info, d);
pse = psi->pse; pse = psi->pse;
...@@ -106,6 +118,24 @@ static int open_packet_sk(struct file_desc *d) ...@@ -106,6 +118,24 @@ static int open_packet_sk(struct file_desc *d)
if (restore_opt(sk, SOL_PACKET, PACKET_RESERVE, &pse->reserve)) if (restore_opt(sk, SOL_PACKET, PACKET_RESERVE, &pse->reserve))
goto err_cl; 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)) if (rst_file_params(sk, pse->fown, pse->flags))
goto err_cl; goto err_cl;
......
...@@ -54,7 +54,7 @@ int main(int argc, char **argv) ...@@ -54,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, rsv; int ver, rsv, yes;
test_init(argc, argv); test_init(argc, argv);
...@@ -96,12 +96,24 @@ int main(int argc, char **argv) ...@@ -96,12 +96,24 @@ int main(int argc, char **argv)
return 1; 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; rsv = SK_RESERVE;
if (setsockopt(sk2, SOL_PACKET, PACKET_RESERVE, &rsv, sizeof(rsv)) < 0) { if (setsockopt(sk2, SOL_PACKET, PACKET_RESERVE, &rsv, sizeof(rsv)) < 0) {
err("Can't set reserve %m"); err("Can't set reserve %m");
return 1; 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_daemon();
test_waitsig(); test_waitsig();
...@@ -125,6 +137,17 @@ int main(int argc, char **argv) ...@@ -125,6 +137,17 @@ int main(int argc, char **argv)
return 1; 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); 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");
...@@ -140,6 +163,17 @@ int main(int argc, char **argv) ...@@ -140,6 +163,17 @@ int main(int argc, char **argv)
return 1; 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) { if (rsv != SK_RESERVE) {
fail("Reserve mismatch have %d, want %d\n", rsv, SK_RESERVE); fail("Reserve mismatch have %d, want %d\n", rsv, SK_RESERVE);
return 1; 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