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