1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Kernel/userspace transport abstraction for Hyper-V util driver. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2015, Vitaly Kuznetsov <vkuznets@redhat.com> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _HV_UTILS_TRANSPORT_H 9*4882a593Smuzhiyun #define _HV_UTILS_TRANSPORT_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/connector.h> 12*4882a593Smuzhiyun #include <linux/miscdevice.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun enum hvutil_transport_mode { 15*4882a593Smuzhiyun HVUTIL_TRANSPORT_INIT = 0, 16*4882a593Smuzhiyun HVUTIL_TRANSPORT_NETLINK, 17*4882a593Smuzhiyun HVUTIL_TRANSPORT_CHARDEV, 18*4882a593Smuzhiyun HVUTIL_TRANSPORT_DESTROY, 19*4882a593Smuzhiyun }; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct hvutil_transport { 22*4882a593Smuzhiyun int mode; /* hvutil_transport_mode */ 23*4882a593Smuzhiyun struct file_operations fops; /* file operations */ 24*4882a593Smuzhiyun struct miscdevice mdev; /* misc device */ 25*4882a593Smuzhiyun struct cb_id cn_id; /* CN_*_IDX/CN_*_VAL */ 26*4882a593Smuzhiyun struct list_head list; /* hvt_list */ 27*4882a593Smuzhiyun int (*on_msg)(void *, int); /* callback on new user message */ 28*4882a593Smuzhiyun void (*on_reset)(void); /* callback when userspace drops */ 29*4882a593Smuzhiyun void (*on_read)(void); /* callback on message read */ 30*4882a593Smuzhiyun u8 *outmsg; /* message to the userspace */ 31*4882a593Smuzhiyun int outmsg_len; /* its length */ 32*4882a593Smuzhiyun wait_queue_head_t outmsg_q; /* poll/read wait queue */ 33*4882a593Smuzhiyun struct mutex lock; /* protects struct members */ 34*4882a593Smuzhiyun struct completion release; /* synchronize with fd release */ 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun struct hvutil_transport *hvutil_transport_init(const char *name, 38*4882a593Smuzhiyun u32 cn_idx, u32 cn_val, 39*4882a593Smuzhiyun int (*on_msg)(void *, int), 40*4882a593Smuzhiyun void (*on_reset)(void)); 41*4882a593Smuzhiyun int hvutil_transport_send(struct hvutil_transport *hvt, void *msg, int len, 42*4882a593Smuzhiyun void (*on_read_cb)(void)); 43*4882a593Smuzhiyun void hvutil_transport_destroy(struct hvutil_transport *hvt); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #endif /* _HV_UTILS_TRANSPORT_H */ 46