cregit-Linux how code gets into the kernel

Release 4.14 net/vmw_vsock/vmci_transport.h

Directory: net/vmw_vsock
/*
 * VMware vSockets Driver
 *
 * Copyright (C) 2013 VMware, Inc. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation version 2 and no later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 */

#ifndef _VMCI_TRANSPORT_H_

#define _VMCI_TRANSPORT_H_

#include <linux/vmw_vmci_defs.h>
#include <linux/vmw_vmci_api.h>

#include <net/vsock_addr.h>
#include <net/af_vsock.h>

/* If the packet format changes in a release then this should change too. */

#define VMCI_TRANSPORT_PACKET_VERSION 1

/* The resource ID on which control packets are sent. */

#define VMCI_TRANSPORT_PACKET_RID 1

/* The resource ID on which control packets are sent to the hypervisor. */

#define VMCI_TRANSPORT_HYPERVISOR_PACKET_RID 15


#define VSOCK_PROTO_INVALID        0

#define VSOCK_PROTO_PKT_ON_NOTIFY (1 << 0)

#define VSOCK_PROTO_ALL_SUPPORTED (VSOCK_PROTO_PKT_ON_NOTIFY)


#define vmci_trans(_vsk) ((struct vmci_transport *)((_vsk)->trans))


enum vmci_transport_packet_type {
	
VMCI_TRANSPORT_PACKET_TYPE_INVALID = 0,
	
VMCI_TRANSPORT_PACKET_TYPE_REQUEST,
	
VMCI_TRANSPORT_PACKET_TYPE_NEGOTIATE,
	
VMCI_TRANSPORT_PACKET_TYPE_OFFER,
	
VMCI_TRANSPORT_PACKET_TYPE_ATTACH,
	
VMCI_TRANSPORT_PACKET_TYPE_WROTE,
	
VMCI_TRANSPORT_PACKET_TYPE_READ,
	
VMCI_TRANSPORT_PACKET_TYPE_RST,
	
VMCI_TRANSPORT_PACKET_TYPE_SHUTDOWN,
	
VMCI_TRANSPORT_PACKET_TYPE_WAITING_WRITE,
	
VMCI_TRANSPORT_PACKET_TYPE_WAITING_READ,
	
VMCI_TRANSPORT_PACKET_TYPE_REQUEST2,
	
VMCI_TRANSPORT_PACKET_TYPE_NEGOTIATE2,
	
VMCI_TRANSPORT_PACKET_TYPE_MAX
};


struct vmci_transport_waiting_info {
	
u64 generation;
	
u64 offset;
};

/* Control packet type for STREAM sockets.  DGRAMs have no control packets nor
 * special packet header for data packets, they are just raw VMCI DGRAM
 * messages.  For STREAMs, control packets are sent over the control channel
 * while data is written and read directly from queue pairs with no packet
 * format.
 */

struct vmci_transport_packet {
	
struct vmci_datagram dg;
	
u8 version;
	
u8 type;
	
u16 proto;
	
u32 src_port;
	
u32 dst_port;
	
u32 _reserved2;
	union {
		
u64 size;
		
u64 mode;
		
struct vmci_handle handle;
		
struct vmci_transport_waiting_info wait;
	
} u;
};


struct vmci_transport_notify_pkt {
	
u64 write_notify_window;
	
u64 write_notify_min_window;
	
bool peer_waiting_read;
	
bool peer_waiting_write;
	
bool peer_waiting_write_detected;
	
bool sent_waiting_read;
	
bool sent_waiting_write;
	
struct vmci_transport_waiting_info peer_waiting_read_info;
	
struct vmci_transport_waiting_info peer_waiting_write_info;
	
u64 produce_q_generation;
	
u64 consume_q_generation;
};


struct vmci_transport_notify_pkt_q_state {
	
u64 write_notify_window;
	
u64 write_notify_min_window;
	
bool peer_waiting_write;
	
bool peer_waiting_write_detected;
};


union vmci_transport_notify {
	
struct vmci_transport_notify_pkt pkt;
	
struct vmci_transport_notify_pkt_q_state pkt_q_state;
};

/* Our transport-specific data. */

struct vmci_transport {
	/* For DGRAMs. */
	
struct vmci_handle dg_handle;
	/* For STREAMs. */
	
struct vmci_handle qp_handle;
	
struct vmci_qp *qpair;
	
u64 produce_size;
	
u64 consume_size;
	
u64 queue_pair_size;
	
u64 queue_pair_min_size;
	
u64 queue_pair_max_size;
	
u32 detach_sub_id;
	
union vmci_transport_notify notify;
	
const struct vmci_transport_notify_ops *notify_ops;
	
struct list_head elem;
	
struct sock *sk;
	
spinlock_t lock; /* protects sk. */
};

int vmci_transport_register(void);
void vmci_transport_unregister(void);

int vmci_transport_send_wrote_bh(struct sockaddr_vm *dst,
				 struct sockaddr_vm *src);
int vmci_transport_send_read_bh(struct sockaddr_vm *dst,
				struct sockaddr_vm *src);
int vmci_transport_send_wrote(struct sock *sk);
int vmci_transport_send_read(struct sock *sk);
int vmci_transport_send_waiting_write(struct sock *sk,
				      struct vmci_transport_waiting_info *wait);
int vmci_transport_send_waiting_read(struct sock *sk,
				     struct vmci_transport_waiting_info *wait);

#endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Andy King34494.25%120.00%
Jorgen Hansen133.56%120.00%
Reilly Grant51.37%120.00%
Asias He20.55%120.00%
Julia Lawall10.27%120.00%
Total365100.00%5100.00%
Directory: net/vmw_vsock
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.