at master 2.4 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Generic netlink handshake service 4 * 5 * Author: Chuck Lever <chuck.lever@oracle.com> 6 * 7 * Copyright (c) 2023, Oracle and/or its affiliates. 8 */ 9 10#ifndef _INTERNAL_HANDSHAKE_H 11#define _INTERNAL_HANDSHAKE_H 12 13/* Per-net namespace context */ 14struct handshake_net { 15 spinlock_t hn_lock; /* protects next 3 fields */ 16 int hn_pending; 17 int hn_pending_max; 18 struct list_head hn_requests; 19 20 unsigned long hn_flags; 21}; 22 23enum hn_flags_bits { 24 HANDSHAKE_F_NET_DRAINING, 25}; 26 27struct handshake_proto; 28 29/* One handshake request */ 30struct handshake_req { 31 struct list_head hr_list; 32 struct rhash_head hr_rhash; 33 unsigned long hr_flags; 34 const struct handshake_proto *hr_proto; 35 struct sock *hr_sk; 36 void (*hr_odestruct)(struct sock *sk); 37 38 /* Always the last field */ 39 char hr_priv[]; 40}; 41 42enum hr_flags_bits { 43 HANDSHAKE_F_REQ_COMPLETED, 44 HANDSHAKE_F_REQ_SESSION, 45}; 46 47struct genl_info; 48 49/* Invariants for all handshake requests for one transport layer 50 * security protocol 51 */ 52struct handshake_proto { 53 int hp_handler_class; 54 size_t hp_privsize; 55 unsigned long hp_flags; 56 57 int (*hp_accept)(struct handshake_req *req, 58 struct genl_info *info, int fd); 59 void (*hp_done)(struct handshake_req *req, 60 unsigned int status, 61 struct genl_info *info); 62 void (*hp_destroy)(struct handshake_req *req); 63}; 64 65enum hp_flags_bits { 66 HANDSHAKE_F_PROTO_NOTIFY, 67}; 68 69/* alert.c */ 70int tls_alert_send(struct socket *sock, u8 level, u8 description); 71 72/* netlink.c */ 73int handshake_genl_notify(struct net *net, const struct handshake_proto *proto, 74 gfp_t flags); 75struct nlmsghdr *handshake_genl_put(struct sk_buff *msg, 76 struct genl_info *info); 77struct handshake_net *handshake_pernet(struct net *net); 78 79/* request.c */ 80struct handshake_req *handshake_req_alloc(const struct handshake_proto *proto, 81 gfp_t flags); 82int handshake_req_hash_init(void); 83void handshake_req_hash_destroy(void); 84void *handshake_req_private(struct handshake_req *req); 85struct handshake_req *handshake_req_hash_lookup(struct sock *sk); 86struct handshake_req *handshake_req_next(struct handshake_net *hn, int class); 87int handshake_req_submit(struct socket *sock, struct handshake_req *req, 88 gfp_t flags); 89void handshake_complete(struct handshake_req *req, unsigned int status, 90 struct genl_info *info); 91bool handshake_req_cancel(struct sock *sk); 92 93#endif /* _INTERNAL_HANDSHAKE_H */