Add initial implementation of the qmsgq socket family that will replace the gunyah vsock functionality. This socket family is a temporary solution for communicating between guest vms using socket apis. This socket family will reusing the vsock address structures to minimize the changes in userspace from gunyah vsock to qmsgq. This version supports dgram sockets, future improvements will be made to support seqpacket sockets. Change-Id: I4ecf0a97c15e3dd68687ef501158fbd4bc2a6a2f Signed-off-by: Chris Lew <quic_clew@quicinc.com>
88 lines
2.6 KiB
C
88 lines
2.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
#ifndef __AF_QMSGQ_H_
|
|
#define __AF_QMSGQ_H_
|
|
|
|
#include <net/af_vsock.h>
|
|
|
|
struct qmsgq_endpoint;
|
|
|
|
struct qmsgq_sock {
|
|
/* sk must be the first member. */
|
|
struct sock sk;
|
|
const struct qmsgq_endpoint *ep;
|
|
struct sockaddr_vm local_addr;
|
|
struct sockaddr_vm remote_addr;
|
|
/* Links for the global tables of bound and connected sockets. */
|
|
struct list_head bound_table;
|
|
struct list_head connected_table;
|
|
/* Accessed without the socket lock held. This means it can never be
|
|
* modified outsided of socket create or destruct.
|
|
*/
|
|
bool trusted;
|
|
bool cached_peer_allow_dgram; /* Dgram communication allowed to
|
|
* cached peer?
|
|
*/
|
|
u32 cached_peer; /* Context ID of last dgram destination check. */
|
|
const struct cred *owner;
|
|
/* Rest are SOCK_STREAM only. */
|
|
long connect_timeout;
|
|
/* Listening socket that this came from. */
|
|
struct sock *listener;
|
|
/* Used for pending list and accept queue during connection handshake.
|
|
* The listening socket is the head for both lists. Sockets created
|
|
* for connection requests are placed in the pending list until they
|
|
* are connected, at which point they are put in the accept queue list
|
|
* so they can be accepted in accept(). If accept() cannot accept the
|
|
* connection, it is marked as rejected so the cleanup function knows
|
|
* to clean up the socket.
|
|
*/
|
|
struct list_head pending_links;
|
|
struct list_head accept_queue;
|
|
bool rejected;
|
|
struct delayed_work connect_work;
|
|
struct delayed_work pending_work;
|
|
struct delayed_work close_work;
|
|
bool close_work_scheduled;
|
|
u32 peer_shutdown;
|
|
bool sent_request;
|
|
bool ignore_connecting_rst;
|
|
|
|
/* Protected by lock_sock(sk) */
|
|
u64 buffer_size;
|
|
u64 buffer_min_size;
|
|
u64 buffer_max_size;
|
|
};
|
|
|
|
#define qsk_sk(__qsk) (&(__qsk)->sk)
|
|
#define sk_qsk(__sk) ((struct qmsgq_sock *)__sk)
|
|
|
|
struct qmsgq_endpoint {
|
|
struct module *module;
|
|
|
|
/* Initialize/tear-down socket. */
|
|
int (*init)(struct qmsgq_sock *qsk, struct qmsgq_sock *psk);
|
|
void (*destruct)(struct qmsgq_sock *qsk);
|
|
void (*release)(struct qmsgq_sock *qsk);
|
|
|
|
/* DGRAM. */
|
|
int (*dgram_enqueue)(struct qmsgq_sock *qsk, struct sockaddr_vm *addr,
|
|
struct msghdr *msg, size_t len);
|
|
bool (*dgram_allow)(u32 cid, u32 port);
|
|
|
|
/* Shutdown. */
|
|
int (*shutdown)(struct qmsgq_sock *qsk, int mode);
|
|
|
|
/* Addressing. */
|
|
u32 (*get_local_cid)(void);
|
|
};
|
|
|
|
int qmsgq_post(const struct qmsgq_endpoint *ep, struct sockaddr_vm *src, struct sockaddr_vm *dst,
|
|
void *data, int len);
|
|
int qmsgq_endpoint_register(const struct qmsgq_endpoint *ep);
|
|
void qmsgq_endpoint_unregister(const struct qmsgq_endpoint *ep);
|
|
|
|
#endif
|