1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * VMware vSockets Driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2009-2013 VMware, Inc. All rights reserved. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __VMCI_TRANSPORT_NOTIFY_H__ 9*4882a593Smuzhiyun #define __VMCI_TRANSPORT_NOTIFY_H__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/types.h> 12*4882a593Smuzhiyun #include <linux/vmw_vmci_defs.h> 13*4882a593Smuzhiyun #include <linux/vmw_vmci_api.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include "vmci_transport.h" 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* Comment this out to compare with old protocol. */ 18*4882a593Smuzhiyun #define VSOCK_OPTIMIZATION_WAITING_NOTIFY 1 19*4882a593Smuzhiyun #if defined(VSOCK_OPTIMIZATION_WAITING_NOTIFY) 20*4882a593Smuzhiyun /* Comment this out to remove flow control for "new" protocol */ 21*4882a593Smuzhiyun #define VSOCK_OPTIMIZATION_FLOW_CONTROL 1 22*4882a593Smuzhiyun #endif 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define VMCI_TRANSPORT_MAX_DGRAM_RESENDS 10 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct vmci_transport_recv_notify_data { 27*4882a593Smuzhiyun u64 consume_head; 28*4882a593Smuzhiyun u64 produce_tail; 29*4882a593Smuzhiyun bool notify_on_block; 30*4882a593Smuzhiyun }; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun struct vmci_transport_send_notify_data { 33*4882a593Smuzhiyun u64 consume_head; 34*4882a593Smuzhiyun u64 produce_tail; 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* Socket notification callbacks. */ 38*4882a593Smuzhiyun struct vmci_transport_notify_ops { 39*4882a593Smuzhiyun void (*socket_init) (struct sock *sk); 40*4882a593Smuzhiyun void (*socket_destruct) (struct vsock_sock *vsk); 41*4882a593Smuzhiyun int (*poll_in) (struct sock *sk, size_t target, 42*4882a593Smuzhiyun bool *data_ready_now); 43*4882a593Smuzhiyun int (*poll_out) (struct sock *sk, size_t target, 44*4882a593Smuzhiyun bool *space_avail_now); 45*4882a593Smuzhiyun void (*handle_notify_pkt) (struct sock *sk, 46*4882a593Smuzhiyun struct vmci_transport_packet *pkt, 47*4882a593Smuzhiyun bool bottom_half, struct sockaddr_vm *dst, 48*4882a593Smuzhiyun struct sockaddr_vm *src, 49*4882a593Smuzhiyun bool *pkt_processed); 50*4882a593Smuzhiyun int (*recv_init) (struct sock *sk, size_t target, 51*4882a593Smuzhiyun struct vmci_transport_recv_notify_data *data); 52*4882a593Smuzhiyun int (*recv_pre_block) (struct sock *sk, size_t target, 53*4882a593Smuzhiyun struct vmci_transport_recv_notify_data *data); 54*4882a593Smuzhiyun int (*recv_pre_dequeue) (struct sock *sk, size_t target, 55*4882a593Smuzhiyun struct vmci_transport_recv_notify_data *data); 56*4882a593Smuzhiyun int (*recv_post_dequeue) (struct sock *sk, size_t target, 57*4882a593Smuzhiyun ssize_t copied, bool data_read, 58*4882a593Smuzhiyun struct vmci_transport_recv_notify_data *data); 59*4882a593Smuzhiyun int (*send_init) (struct sock *sk, 60*4882a593Smuzhiyun struct vmci_transport_send_notify_data *data); 61*4882a593Smuzhiyun int (*send_pre_block) (struct sock *sk, 62*4882a593Smuzhiyun struct vmci_transport_send_notify_data *data); 63*4882a593Smuzhiyun int (*send_pre_enqueue) (struct sock *sk, 64*4882a593Smuzhiyun struct vmci_transport_send_notify_data *data); 65*4882a593Smuzhiyun int (*send_post_enqueue) (struct sock *sk, ssize_t written, 66*4882a593Smuzhiyun struct vmci_transport_send_notify_data *data); 67*4882a593Smuzhiyun void (*process_request) (struct sock *sk); 68*4882a593Smuzhiyun void (*process_negotiate) (struct sock *sk); 69*4882a593Smuzhiyun }; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun extern const struct vmci_transport_notify_ops vmci_transport_notify_pkt_ops; 72*4882a593Smuzhiyun extern const 73*4882a593Smuzhiyun struct vmci_transport_notify_ops vmci_transport_notify_pkt_q_state_ops; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun #endif /* __VMCI_TRANSPORT_NOTIFY_H__ */ 76