xref: /OK3568_Linux_fs/kernel/include/uapi/linux/vsockmon.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2*4882a593Smuzhiyun #ifndef _UAPI_VSOCKMON_H
3*4882a593Smuzhiyun #define _UAPI_VSOCKMON_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/virtio_vsock.h>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun /*
8*4882a593Smuzhiyun  * vsockmon is the AF_VSOCK packet capture device.  Packets captured have the
9*4882a593Smuzhiyun  * following layout:
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  *   +-----------------------------------+
12*4882a593Smuzhiyun  *   |           vsockmon header         |
13*4882a593Smuzhiyun  *   |      (struct af_vsockmon_hdr)     |
14*4882a593Smuzhiyun  *   +-----------------------------------+
15*4882a593Smuzhiyun  *   |          transport header         |
16*4882a593Smuzhiyun  *   | (af_vsockmon_hdr->len bytes long) |
17*4882a593Smuzhiyun  *   +-----------------------------------+
18*4882a593Smuzhiyun  *   |              payload              |
19*4882a593Smuzhiyun  *   |       (until end of packet)       |
20*4882a593Smuzhiyun  *   +-----------------------------------+
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * The vsockmon header is a transport-independent description of the packet.
23*4882a593Smuzhiyun  * It duplicates some of the information from the transport header so that
24*4882a593Smuzhiyun  * no transport-specific knowledge is necessary to process packets.
25*4882a593Smuzhiyun  *
26*4882a593Smuzhiyun  * The transport header is useful for low-level transport-specific packet
27*4882a593Smuzhiyun  * analysis.  Transport type is given in af_vsockmon_hdr->transport and
28*4882a593Smuzhiyun  * transport header length is given in af_vsockmon_hdr->len.
29*4882a593Smuzhiyun  *
30*4882a593Smuzhiyun  * If af_vsockmon_hdr->op is AF_VSOCK_OP_PAYLOAD then the payload follows the
31*4882a593Smuzhiyun  * transport header.  Other ops do not have a payload.
32*4882a593Smuzhiyun  */
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun struct af_vsockmon_hdr {
35*4882a593Smuzhiyun 	__le64 src_cid;
36*4882a593Smuzhiyun 	__le64 dst_cid;
37*4882a593Smuzhiyun 	__le32 src_port;
38*4882a593Smuzhiyun 	__le32 dst_port;
39*4882a593Smuzhiyun 	__le16 op;			/* enum af_vsockmon_op */
40*4882a593Smuzhiyun 	__le16 transport;		/* enum af_vsockmon_transport */
41*4882a593Smuzhiyun 	__le16 len;			/* Transport header length */
42*4882a593Smuzhiyun 	__u8 reserved[2];
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun enum af_vsockmon_op {
46*4882a593Smuzhiyun 	AF_VSOCK_OP_UNKNOWN = 0,
47*4882a593Smuzhiyun 	AF_VSOCK_OP_CONNECT = 1,
48*4882a593Smuzhiyun 	AF_VSOCK_OP_DISCONNECT = 2,
49*4882a593Smuzhiyun 	AF_VSOCK_OP_CONTROL = 3,
50*4882a593Smuzhiyun 	AF_VSOCK_OP_PAYLOAD = 4,
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun enum af_vsockmon_transport {
54*4882a593Smuzhiyun 	AF_VSOCK_TRANSPORT_UNKNOWN = 0,
55*4882a593Smuzhiyun 	AF_VSOCK_TRANSPORT_NO_INFO = 1,	/* No transport information */
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	/* Transport header type: struct virtio_vsock_hdr */
58*4882a593Smuzhiyun 	AF_VSOCK_TRANSPORT_VIRTIO = 2,
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #endif
62