162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* AF_RXRPC internal definitions 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 562306a36Sopenharmony_ci * Written by David Howells (dhowells@redhat.com) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/atomic.h> 962306a36Sopenharmony_ci#include <linux/seqlock.h> 1062306a36Sopenharmony_ci#include <linux/win_minmax.h> 1162306a36Sopenharmony_ci#include <net/net_namespace.h> 1262306a36Sopenharmony_ci#include <net/netns/generic.h> 1362306a36Sopenharmony_ci#include <net/sock.h> 1462306a36Sopenharmony_ci#include <net/af_rxrpc.h> 1562306a36Sopenharmony_ci#include <keys/rxrpc-type.h> 1662306a36Sopenharmony_ci#include "protocol.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define FCRYPT_BSIZE 8 1962306a36Sopenharmony_cistruct rxrpc_crypt { 2062306a36Sopenharmony_ci union { 2162306a36Sopenharmony_ci u8 x[FCRYPT_BSIZE]; 2262306a36Sopenharmony_ci __be32 n[2]; 2362306a36Sopenharmony_ci }; 2462306a36Sopenharmony_ci} __attribute__((aligned(8))); 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define rxrpc_queue_work(WS) queue_work(rxrpc_workqueue, (WS)) 2762306a36Sopenharmony_ci#define rxrpc_queue_delayed_work(WS,D) \ 2862306a36Sopenharmony_ci queue_delayed_work(rxrpc_workqueue, (WS), (D)) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistruct key_preparsed_payload; 3162306a36Sopenharmony_cistruct rxrpc_connection; 3262306a36Sopenharmony_cistruct rxrpc_txbuf; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* 3562306a36Sopenharmony_ci * Mark applied to socket buffers in skb->mark. skb->priority is used 3662306a36Sopenharmony_ci * to pass supplementary information. 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_cienum rxrpc_skb_mark { 3962306a36Sopenharmony_ci RXRPC_SKB_MARK_PACKET, /* Received packet */ 4062306a36Sopenharmony_ci RXRPC_SKB_MARK_ERROR, /* Error notification */ 4162306a36Sopenharmony_ci RXRPC_SKB_MARK_SERVICE_CONN_SECURED, /* Service connection response has been verified */ 4262306a36Sopenharmony_ci RXRPC_SKB_MARK_REJECT_BUSY, /* Reject with BUSY */ 4362306a36Sopenharmony_ci RXRPC_SKB_MARK_REJECT_ABORT, /* Reject with ABORT (code in skb->priority) */ 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* 4762306a36Sopenharmony_ci * sk_state for RxRPC sockets 4862306a36Sopenharmony_ci */ 4962306a36Sopenharmony_cienum { 5062306a36Sopenharmony_ci RXRPC_UNBOUND = 0, 5162306a36Sopenharmony_ci RXRPC_CLIENT_UNBOUND, /* Unbound socket used as client */ 5262306a36Sopenharmony_ci RXRPC_CLIENT_BOUND, /* client local address bound */ 5362306a36Sopenharmony_ci RXRPC_SERVER_BOUND, /* server local address bound */ 5462306a36Sopenharmony_ci RXRPC_SERVER_BOUND2, /* second server local address bound */ 5562306a36Sopenharmony_ci RXRPC_SERVER_LISTENING, /* server listening for connections */ 5662306a36Sopenharmony_ci RXRPC_SERVER_LISTEN_DISABLED, /* server listening disabled */ 5762306a36Sopenharmony_ci RXRPC_CLOSE, /* socket is being closed */ 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/* 6162306a36Sopenharmony_ci * Per-network namespace data. 6262306a36Sopenharmony_ci */ 6362306a36Sopenharmony_cistruct rxrpc_net { 6462306a36Sopenharmony_ci struct proc_dir_entry *proc_net; /* Subdir in /proc/net */ 6562306a36Sopenharmony_ci u32 epoch; /* Local epoch for detecting local-end reset */ 6662306a36Sopenharmony_ci struct list_head calls; /* List of calls active in this namespace */ 6762306a36Sopenharmony_ci spinlock_t call_lock; /* Lock for ->calls */ 6862306a36Sopenharmony_ci atomic_t nr_calls; /* Count of allocated calls */ 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci atomic_t nr_conns; 7162306a36Sopenharmony_ci struct list_head conn_proc_list; /* List of conns in this namespace for proc */ 7262306a36Sopenharmony_ci struct list_head service_conns; /* Service conns in this namespace */ 7362306a36Sopenharmony_ci rwlock_t conn_lock; /* Lock for ->conn_proc_list, ->service_conns */ 7462306a36Sopenharmony_ci struct work_struct service_conn_reaper; 7562306a36Sopenharmony_ci struct timer_list service_conn_reap_timer; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci bool live; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci atomic_t nr_client_conns; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci struct hlist_head local_endpoints; 8262306a36Sopenharmony_ci struct mutex local_mutex; /* Lock for ->local_endpoints */ 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci DECLARE_HASHTABLE (peer_hash, 10); 8562306a36Sopenharmony_ci spinlock_t peer_hash_lock; /* Lock for ->peer_hash */ 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define RXRPC_KEEPALIVE_TIME 20 /* NAT keepalive time in seconds */ 8862306a36Sopenharmony_ci u8 peer_keepalive_cursor; 8962306a36Sopenharmony_ci time64_t peer_keepalive_base; 9062306a36Sopenharmony_ci struct list_head peer_keepalive[32]; 9162306a36Sopenharmony_ci struct list_head peer_keepalive_new; 9262306a36Sopenharmony_ci struct timer_list peer_keepalive_timer; 9362306a36Sopenharmony_ci struct work_struct peer_keepalive_work; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci atomic_t stat_tx_data; 9662306a36Sopenharmony_ci atomic_t stat_tx_data_retrans; 9762306a36Sopenharmony_ci atomic_t stat_tx_data_send; 9862306a36Sopenharmony_ci atomic_t stat_tx_data_send_frag; 9962306a36Sopenharmony_ci atomic_t stat_tx_data_send_fail; 10062306a36Sopenharmony_ci atomic_t stat_tx_data_underflow; 10162306a36Sopenharmony_ci atomic_t stat_tx_data_cwnd_reset; 10262306a36Sopenharmony_ci atomic_t stat_rx_data; 10362306a36Sopenharmony_ci atomic_t stat_rx_data_reqack; 10462306a36Sopenharmony_ci atomic_t stat_rx_data_jumbo; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci atomic_t stat_tx_ack_fill; 10762306a36Sopenharmony_ci atomic_t stat_tx_ack_send; 10862306a36Sopenharmony_ci atomic_t stat_tx_ack_skip; 10962306a36Sopenharmony_ci atomic_t stat_tx_acks[256]; 11062306a36Sopenharmony_ci atomic_t stat_rx_acks[256]; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci atomic_t stat_why_req_ack[8]; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci atomic_t stat_io_loop; 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/* 11862306a36Sopenharmony_ci * Service backlog preallocation. 11962306a36Sopenharmony_ci * 12062306a36Sopenharmony_ci * This contains circular buffers of preallocated peers, connections and calls 12162306a36Sopenharmony_ci * for incoming service calls and their head and tail pointers. This allows 12262306a36Sopenharmony_ci * calls to be set up in the data_ready handler, thereby avoiding the need to 12362306a36Sopenharmony_ci * shuffle packets around so much. 12462306a36Sopenharmony_ci */ 12562306a36Sopenharmony_cistruct rxrpc_backlog { 12662306a36Sopenharmony_ci unsigned short peer_backlog_head; 12762306a36Sopenharmony_ci unsigned short peer_backlog_tail; 12862306a36Sopenharmony_ci unsigned short conn_backlog_head; 12962306a36Sopenharmony_ci unsigned short conn_backlog_tail; 13062306a36Sopenharmony_ci unsigned short call_backlog_head; 13162306a36Sopenharmony_ci unsigned short call_backlog_tail; 13262306a36Sopenharmony_ci#define RXRPC_BACKLOG_MAX 32 13362306a36Sopenharmony_ci struct rxrpc_peer *peer_backlog[RXRPC_BACKLOG_MAX]; 13462306a36Sopenharmony_ci struct rxrpc_connection *conn_backlog[RXRPC_BACKLOG_MAX]; 13562306a36Sopenharmony_ci struct rxrpc_call *call_backlog[RXRPC_BACKLOG_MAX]; 13662306a36Sopenharmony_ci}; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci/* 13962306a36Sopenharmony_ci * RxRPC socket definition 14062306a36Sopenharmony_ci */ 14162306a36Sopenharmony_cistruct rxrpc_sock { 14262306a36Sopenharmony_ci /* WARNING: sk has to be the first member */ 14362306a36Sopenharmony_ci struct sock sk; 14462306a36Sopenharmony_ci rxrpc_notify_new_call_t notify_new_call; /* Func to notify of new call */ 14562306a36Sopenharmony_ci rxrpc_discard_new_call_t discard_new_call; /* Func to discard a new call */ 14662306a36Sopenharmony_ci struct rxrpc_local *local; /* local endpoint */ 14762306a36Sopenharmony_ci struct rxrpc_backlog *backlog; /* Preallocation for services */ 14862306a36Sopenharmony_ci spinlock_t incoming_lock; /* Incoming call vs service shutdown lock */ 14962306a36Sopenharmony_ci struct list_head sock_calls; /* List of calls owned by this socket */ 15062306a36Sopenharmony_ci struct list_head to_be_accepted; /* calls awaiting acceptance */ 15162306a36Sopenharmony_ci struct list_head recvmsg_q; /* Calls awaiting recvmsg's attention */ 15262306a36Sopenharmony_ci spinlock_t recvmsg_lock; /* Lock for recvmsg_q */ 15362306a36Sopenharmony_ci struct key *key; /* security for this socket */ 15462306a36Sopenharmony_ci struct key *securities; /* list of server security descriptors */ 15562306a36Sopenharmony_ci struct rb_root calls; /* User ID -> call mapping */ 15662306a36Sopenharmony_ci unsigned long flags; 15762306a36Sopenharmony_ci#define RXRPC_SOCK_CONNECTED 0 /* connect_srx is set */ 15862306a36Sopenharmony_ci rwlock_t call_lock; /* lock for calls */ 15962306a36Sopenharmony_ci u32 min_sec_level; /* minimum security level */ 16062306a36Sopenharmony_ci#define RXRPC_SECURITY_MAX RXRPC_SECURITY_ENCRYPT 16162306a36Sopenharmony_ci bool exclusive; /* Exclusive connection for a client socket */ 16262306a36Sopenharmony_ci u16 second_service; /* Additional service bound to the endpoint */ 16362306a36Sopenharmony_ci struct { 16462306a36Sopenharmony_ci /* Service upgrade information */ 16562306a36Sopenharmony_ci u16 from; /* Service ID to upgrade (if not 0) */ 16662306a36Sopenharmony_ci u16 to; /* service ID to upgrade to */ 16762306a36Sopenharmony_ci } service_upgrade; 16862306a36Sopenharmony_ci sa_family_t family; /* Protocol family created with */ 16962306a36Sopenharmony_ci struct sockaddr_rxrpc srx; /* Primary Service/local addresses */ 17062306a36Sopenharmony_ci struct sockaddr_rxrpc connect_srx; /* Default client address from connect() */ 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci#define rxrpc_sk(__sk) container_of((__sk), struct rxrpc_sock, sk) 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci/* 17662306a36Sopenharmony_ci * CPU-byteorder normalised Rx packet header. 17762306a36Sopenharmony_ci */ 17862306a36Sopenharmony_cistruct rxrpc_host_header { 17962306a36Sopenharmony_ci u32 epoch; /* client boot timestamp */ 18062306a36Sopenharmony_ci u32 cid; /* connection and channel ID */ 18162306a36Sopenharmony_ci u32 callNumber; /* call ID (0 for connection-level packets) */ 18262306a36Sopenharmony_ci u32 seq; /* sequence number of pkt in call stream */ 18362306a36Sopenharmony_ci u32 serial; /* serial number of pkt sent to network */ 18462306a36Sopenharmony_ci u8 type; /* packet type */ 18562306a36Sopenharmony_ci u8 flags; /* packet flags */ 18662306a36Sopenharmony_ci u8 userStatus; /* app-layer defined status */ 18762306a36Sopenharmony_ci u8 securityIndex; /* security protocol ID */ 18862306a36Sopenharmony_ci union { 18962306a36Sopenharmony_ci u16 _rsvd; /* reserved */ 19062306a36Sopenharmony_ci u16 cksum; /* kerberos security checksum */ 19162306a36Sopenharmony_ci }; 19262306a36Sopenharmony_ci u16 serviceId; /* service ID */ 19362306a36Sopenharmony_ci} __packed; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci/* 19662306a36Sopenharmony_ci * RxRPC socket buffer private variables 19762306a36Sopenharmony_ci * - max 48 bytes (struct sk_buff::cb) 19862306a36Sopenharmony_ci */ 19962306a36Sopenharmony_cistruct rxrpc_skb_priv { 20062306a36Sopenharmony_ci struct rxrpc_connection *conn; /* Connection referred to (poke packet) */ 20162306a36Sopenharmony_ci union { 20262306a36Sopenharmony_ci struct { 20362306a36Sopenharmony_ci u16 offset; /* Offset of data */ 20462306a36Sopenharmony_ci u16 len; /* Length of data */ 20562306a36Sopenharmony_ci u8 flags; 20662306a36Sopenharmony_ci#define RXRPC_RX_VERIFIED 0x01 20762306a36Sopenharmony_ci }; 20862306a36Sopenharmony_ci struct { 20962306a36Sopenharmony_ci rxrpc_seq_t first_ack; /* First packet in acks table */ 21062306a36Sopenharmony_ci u8 nr_acks; /* Number of acks+nacks */ 21162306a36Sopenharmony_ci u8 nr_nacks; /* Number of nacks */ 21262306a36Sopenharmony_ci }; 21362306a36Sopenharmony_ci }; 21462306a36Sopenharmony_ci struct rxrpc_host_header hdr; /* RxRPC packet header from this packet */ 21562306a36Sopenharmony_ci}; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci#define rxrpc_skb(__skb) ((struct rxrpc_skb_priv *) &(__skb)->cb) 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci/* 22062306a36Sopenharmony_ci * RxRPC security module interface 22162306a36Sopenharmony_ci */ 22262306a36Sopenharmony_cistruct rxrpc_security { 22362306a36Sopenharmony_ci const char *name; /* name of this service */ 22462306a36Sopenharmony_ci u8 security_index; /* security type provided */ 22562306a36Sopenharmony_ci u32 no_key_abort; /* Abort code indicating no key */ 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci /* Initialise a security service */ 22862306a36Sopenharmony_ci int (*init)(void); 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci /* Clean up a security service */ 23162306a36Sopenharmony_ci void (*exit)(void); 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci /* Parse the information from a server key */ 23462306a36Sopenharmony_ci int (*preparse_server_key)(struct key_preparsed_payload *); 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci /* Clean up the preparse buffer after parsing a server key */ 23762306a36Sopenharmony_ci void (*free_preparse_server_key)(struct key_preparsed_payload *); 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci /* Destroy the payload of a server key */ 24062306a36Sopenharmony_ci void (*destroy_server_key)(struct key *); 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci /* Describe a server key */ 24362306a36Sopenharmony_ci void (*describe_server_key)(const struct key *, struct seq_file *); 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* initialise a connection's security */ 24662306a36Sopenharmony_ci int (*init_connection_security)(struct rxrpc_connection *, 24762306a36Sopenharmony_ci struct rxrpc_key_token *); 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci /* Work out how much data we can store in a packet, given an estimate 25062306a36Sopenharmony_ci * of the amount of data remaining. 25162306a36Sopenharmony_ci */ 25262306a36Sopenharmony_ci int (*how_much_data)(struct rxrpc_call *, size_t, 25362306a36Sopenharmony_ci size_t *, size_t *, size_t *); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci /* impose security on a packet */ 25662306a36Sopenharmony_ci int (*secure_packet)(struct rxrpc_call *, struct rxrpc_txbuf *); 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci /* verify the security on a received packet */ 25962306a36Sopenharmony_ci int (*verify_packet)(struct rxrpc_call *, struct sk_buff *); 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci /* Free crypto request on a call */ 26262306a36Sopenharmony_ci void (*free_call_crypto)(struct rxrpc_call *); 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci /* issue a challenge */ 26562306a36Sopenharmony_ci int (*issue_challenge)(struct rxrpc_connection *); 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci /* respond to a challenge */ 26862306a36Sopenharmony_ci int (*respond_to_challenge)(struct rxrpc_connection *, 26962306a36Sopenharmony_ci struct sk_buff *); 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci /* verify a response */ 27262306a36Sopenharmony_ci int (*verify_response)(struct rxrpc_connection *, 27362306a36Sopenharmony_ci struct sk_buff *); 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci /* clear connection security */ 27662306a36Sopenharmony_ci void (*clear)(struct rxrpc_connection *); 27762306a36Sopenharmony_ci}; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci/* 28062306a36Sopenharmony_ci * RxRPC local transport endpoint description 28162306a36Sopenharmony_ci * - owned by a single AF_RXRPC socket 28262306a36Sopenharmony_ci * - pointed to by transport socket struct sk_user_data 28362306a36Sopenharmony_ci */ 28462306a36Sopenharmony_cistruct rxrpc_local { 28562306a36Sopenharmony_ci struct rcu_head rcu; 28662306a36Sopenharmony_ci atomic_t active_users; /* Number of users of the local endpoint */ 28762306a36Sopenharmony_ci refcount_t ref; /* Number of references to the structure */ 28862306a36Sopenharmony_ci struct net *net; /* The network namespace */ 28962306a36Sopenharmony_ci struct rxrpc_net *rxnet; /* Our bits in the network namespace */ 29062306a36Sopenharmony_ci struct hlist_node link; 29162306a36Sopenharmony_ci struct socket *socket; /* my UDP socket */ 29262306a36Sopenharmony_ci struct task_struct *io_thread; 29362306a36Sopenharmony_ci struct completion io_thread_ready; /* Indication that the I/O thread started */ 29462306a36Sopenharmony_ci struct rxrpc_sock *service; /* Service(s) listening on this endpoint */ 29562306a36Sopenharmony_ci#ifdef CONFIG_AF_RXRPC_INJECT_RX_DELAY 29662306a36Sopenharmony_ci struct sk_buff_head rx_delay_queue; /* Delay injection queue */ 29762306a36Sopenharmony_ci#endif 29862306a36Sopenharmony_ci struct sk_buff_head rx_queue; /* Received packets */ 29962306a36Sopenharmony_ci struct list_head conn_attend_q; /* Conns requiring immediate attention */ 30062306a36Sopenharmony_ci struct list_head call_attend_q; /* Calls requiring immediate attention */ 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci struct rb_root client_bundles; /* Client connection bundles by socket params */ 30362306a36Sopenharmony_ci spinlock_t client_bundles_lock; /* Lock for client_bundles */ 30462306a36Sopenharmony_ci bool kill_all_client_conns; 30562306a36Sopenharmony_ci struct list_head idle_client_conns; 30662306a36Sopenharmony_ci struct timer_list client_conn_reap_timer; 30762306a36Sopenharmony_ci unsigned long client_conn_flags; 30862306a36Sopenharmony_ci#define RXRPC_CLIENT_CONN_REAP_TIMER 0 /* The client conn reap timer expired */ 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci spinlock_t lock; /* access lock */ 31162306a36Sopenharmony_ci rwlock_t services_lock; /* lock for services list */ 31262306a36Sopenharmony_ci int debug_id; /* debug ID for printks */ 31362306a36Sopenharmony_ci bool dead; 31462306a36Sopenharmony_ci bool service_closed; /* Service socket closed */ 31562306a36Sopenharmony_ci struct idr conn_ids; /* List of connection IDs */ 31662306a36Sopenharmony_ci struct list_head new_client_calls; /* Newly created client calls need connection */ 31762306a36Sopenharmony_ci spinlock_t client_call_lock; /* Lock for ->new_client_calls */ 31862306a36Sopenharmony_ci struct sockaddr_rxrpc srx; /* local address */ 31962306a36Sopenharmony_ci}; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci/* 32262306a36Sopenharmony_ci * RxRPC remote transport endpoint definition 32362306a36Sopenharmony_ci * - matched by local endpoint, remote port, address and protocol type 32462306a36Sopenharmony_ci */ 32562306a36Sopenharmony_cistruct rxrpc_peer { 32662306a36Sopenharmony_ci struct rcu_head rcu; /* This must be first */ 32762306a36Sopenharmony_ci refcount_t ref; 32862306a36Sopenharmony_ci unsigned long hash_key; 32962306a36Sopenharmony_ci struct hlist_node hash_link; 33062306a36Sopenharmony_ci struct rxrpc_local *local; 33162306a36Sopenharmony_ci struct hlist_head error_targets; /* targets for net error distribution */ 33262306a36Sopenharmony_ci struct rb_root service_conns; /* Service connections */ 33362306a36Sopenharmony_ci struct list_head keepalive_link; /* Link in net->peer_keepalive[] */ 33462306a36Sopenharmony_ci time64_t last_tx_at; /* Last time packet sent here */ 33562306a36Sopenharmony_ci seqlock_t service_conn_lock; 33662306a36Sopenharmony_ci spinlock_t lock; /* access lock */ 33762306a36Sopenharmony_ci unsigned int if_mtu; /* interface MTU for this peer */ 33862306a36Sopenharmony_ci unsigned int mtu; /* network MTU for this peer */ 33962306a36Sopenharmony_ci unsigned int maxdata; /* data size (MTU - hdrsize) */ 34062306a36Sopenharmony_ci unsigned short hdrsize; /* header size (IP + UDP + RxRPC) */ 34162306a36Sopenharmony_ci int debug_id; /* debug ID for printks */ 34262306a36Sopenharmony_ci struct sockaddr_rxrpc srx; /* remote address */ 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci /* calculated RTT cache */ 34562306a36Sopenharmony_ci#define RXRPC_RTT_CACHE_SIZE 32 34662306a36Sopenharmony_ci spinlock_t rtt_input_lock; /* RTT lock for input routine */ 34762306a36Sopenharmony_ci ktime_t rtt_last_req; /* Time of last RTT request */ 34862306a36Sopenharmony_ci unsigned int rtt_count; /* Number of samples we've got */ 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci u32 srtt_us; /* smoothed round trip time << 3 in usecs */ 35162306a36Sopenharmony_ci u32 mdev_us; /* medium deviation */ 35262306a36Sopenharmony_ci u32 mdev_max_us; /* maximal mdev for the last rtt period */ 35362306a36Sopenharmony_ci u32 rttvar_us; /* smoothed mdev_max */ 35462306a36Sopenharmony_ci u32 rto_j; /* Retransmission timeout in jiffies */ 35562306a36Sopenharmony_ci u8 backoff; /* Backoff timeout */ 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci u8 cong_ssthresh; /* Congestion slow-start threshold */ 35862306a36Sopenharmony_ci}; 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci/* 36162306a36Sopenharmony_ci * Keys for matching a connection. 36262306a36Sopenharmony_ci */ 36362306a36Sopenharmony_cistruct rxrpc_conn_proto { 36462306a36Sopenharmony_ci union { 36562306a36Sopenharmony_ci struct { 36662306a36Sopenharmony_ci u32 epoch; /* epoch of this connection */ 36762306a36Sopenharmony_ci u32 cid; /* connection ID */ 36862306a36Sopenharmony_ci }; 36962306a36Sopenharmony_ci u64 index_key; 37062306a36Sopenharmony_ci }; 37162306a36Sopenharmony_ci}; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_cistruct rxrpc_conn_parameters { 37462306a36Sopenharmony_ci struct rxrpc_local *local; /* Representation of local endpoint */ 37562306a36Sopenharmony_ci struct key *key; /* Security details */ 37662306a36Sopenharmony_ci bool exclusive; /* T if conn is exclusive */ 37762306a36Sopenharmony_ci bool upgrade; /* T if service ID can be upgraded */ 37862306a36Sopenharmony_ci u16 service_id; /* Service ID for this connection */ 37962306a36Sopenharmony_ci u32 security_level; /* Security level selected */ 38062306a36Sopenharmony_ci}; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci/* 38362306a36Sopenharmony_ci * Call completion condition (state == RXRPC_CALL_COMPLETE). 38462306a36Sopenharmony_ci */ 38562306a36Sopenharmony_cienum rxrpc_call_completion { 38662306a36Sopenharmony_ci RXRPC_CALL_SUCCEEDED, /* - Normal termination */ 38762306a36Sopenharmony_ci RXRPC_CALL_REMOTELY_ABORTED, /* - call aborted by peer */ 38862306a36Sopenharmony_ci RXRPC_CALL_LOCALLY_ABORTED, /* - call aborted locally on error or close */ 38962306a36Sopenharmony_ci RXRPC_CALL_LOCAL_ERROR, /* - call failed due to local error */ 39062306a36Sopenharmony_ci RXRPC_CALL_NETWORK_ERROR, /* - call terminated by network error */ 39162306a36Sopenharmony_ci NR__RXRPC_CALL_COMPLETIONS 39262306a36Sopenharmony_ci}; 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci/* 39562306a36Sopenharmony_ci * Bits in the connection flags. 39662306a36Sopenharmony_ci */ 39762306a36Sopenharmony_cienum rxrpc_conn_flag { 39862306a36Sopenharmony_ci RXRPC_CONN_IN_SERVICE_CONNS, /* Conn is in peer->service_conns */ 39962306a36Sopenharmony_ci RXRPC_CONN_DONT_REUSE, /* Don't reuse this connection */ 40062306a36Sopenharmony_ci RXRPC_CONN_PROBING_FOR_UPGRADE, /* Probing for service upgrade */ 40162306a36Sopenharmony_ci RXRPC_CONN_FINAL_ACK_0, /* Need final ACK for channel 0 */ 40262306a36Sopenharmony_ci RXRPC_CONN_FINAL_ACK_1, /* Need final ACK for channel 1 */ 40362306a36Sopenharmony_ci RXRPC_CONN_FINAL_ACK_2, /* Need final ACK for channel 2 */ 40462306a36Sopenharmony_ci RXRPC_CONN_FINAL_ACK_3, /* Need final ACK for channel 3 */ 40562306a36Sopenharmony_ci}; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci#define RXRPC_CONN_FINAL_ACK_MASK ((1UL << RXRPC_CONN_FINAL_ACK_0) | \ 40862306a36Sopenharmony_ci (1UL << RXRPC_CONN_FINAL_ACK_1) | \ 40962306a36Sopenharmony_ci (1UL << RXRPC_CONN_FINAL_ACK_2) | \ 41062306a36Sopenharmony_ci (1UL << RXRPC_CONN_FINAL_ACK_3)) 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci/* 41362306a36Sopenharmony_ci * Events that can be raised upon a connection. 41462306a36Sopenharmony_ci */ 41562306a36Sopenharmony_cienum rxrpc_conn_event { 41662306a36Sopenharmony_ci RXRPC_CONN_EV_CHALLENGE, /* Send challenge packet */ 41762306a36Sopenharmony_ci RXRPC_CONN_EV_ABORT_CALLS, /* Abort attached calls */ 41862306a36Sopenharmony_ci}; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci/* 42162306a36Sopenharmony_ci * The connection protocol state. 42262306a36Sopenharmony_ci */ 42362306a36Sopenharmony_cienum rxrpc_conn_proto_state { 42462306a36Sopenharmony_ci RXRPC_CONN_UNUSED, /* Connection not yet attempted */ 42562306a36Sopenharmony_ci RXRPC_CONN_CLIENT_UNSECURED, /* Client connection needs security init */ 42662306a36Sopenharmony_ci RXRPC_CONN_CLIENT, /* Client connection */ 42762306a36Sopenharmony_ci RXRPC_CONN_SERVICE_PREALLOC, /* Service connection preallocation */ 42862306a36Sopenharmony_ci RXRPC_CONN_SERVICE_UNSECURED, /* Service unsecured connection */ 42962306a36Sopenharmony_ci RXRPC_CONN_SERVICE_CHALLENGING, /* Service challenging for security */ 43062306a36Sopenharmony_ci RXRPC_CONN_SERVICE, /* Service secured connection */ 43162306a36Sopenharmony_ci RXRPC_CONN_ABORTED, /* Conn aborted */ 43262306a36Sopenharmony_ci RXRPC_CONN__NR_STATES 43362306a36Sopenharmony_ci}; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci/* 43662306a36Sopenharmony_ci * RxRPC client connection bundle. 43762306a36Sopenharmony_ci */ 43862306a36Sopenharmony_cistruct rxrpc_bundle { 43962306a36Sopenharmony_ci struct rxrpc_local *local; /* Representation of local endpoint */ 44062306a36Sopenharmony_ci struct rxrpc_peer *peer; /* Remote endpoint */ 44162306a36Sopenharmony_ci struct key *key; /* Security details */ 44262306a36Sopenharmony_ci const struct rxrpc_security *security; /* applied security module */ 44362306a36Sopenharmony_ci refcount_t ref; 44462306a36Sopenharmony_ci atomic_t active; /* Number of active users */ 44562306a36Sopenharmony_ci unsigned int debug_id; 44662306a36Sopenharmony_ci u32 security_level; /* Security level selected */ 44762306a36Sopenharmony_ci u16 service_id; /* Service ID for this connection */ 44862306a36Sopenharmony_ci bool try_upgrade; /* True if the bundle is attempting upgrade */ 44962306a36Sopenharmony_ci bool exclusive; /* T if conn is exclusive */ 45062306a36Sopenharmony_ci bool upgrade; /* T if service ID can be upgraded */ 45162306a36Sopenharmony_ci unsigned short alloc_error; /* Error from last conn allocation */ 45262306a36Sopenharmony_ci struct rb_node local_node; /* Node in local->client_conns */ 45362306a36Sopenharmony_ci struct list_head waiting_calls; /* Calls waiting for channels */ 45462306a36Sopenharmony_ci unsigned long avail_chans; /* Mask of available channels */ 45562306a36Sopenharmony_ci struct rxrpc_connection *conns[4]; /* The connections in the bundle (max 4) */ 45662306a36Sopenharmony_ci}; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci/* 45962306a36Sopenharmony_ci * RxRPC connection definition 46062306a36Sopenharmony_ci * - matched by { local, peer, epoch, conn_id, direction } 46162306a36Sopenharmony_ci * - each connection can only handle four simultaneous calls 46262306a36Sopenharmony_ci */ 46362306a36Sopenharmony_cistruct rxrpc_connection { 46462306a36Sopenharmony_ci struct rxrpc_conn_proto proto; 46562306a36Sopenharmony_ci struct rxrpc_local *local; /* Representation of local endpoint */ 46662306a36Sopenharmony_ci struct rxrpc_peer *peer; /* Remote endpoint */ 46762306a36Sopenharmony_ci struct rxrpc_net *rxnet; /* Network namespace to which call belongs */ 46862306a36Sopenharmony_ci struct key *key; /* Security details */ 46962306a36Sopenharmony_ci struct list_head attend_link; /* Link in local->conn_attend_q */ 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_ci refcount_t ref; 47262306a36Sopenharmony_ci atomic_t active; /* Active count for service conns */ 47362306a36Sopenharmony_ci struct rcu_head rcu; 47462306a36Sopenharmony_ci struct list_head cache_link; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci unsigned char act_chans; /* Mask of active channels */ 47762306a36Sopenharmony_ci struct rxrpc_channel { 47862306a36Sopenharmony_ci unsigned long final_ack_at; /* Time at which to issue final ACK */ 47962306a36Sopenharmony_ci struct rxrpc_call *call; /* Active call */ 48062306a36Sopenharmony_ci unsigned int call_debug_id; /* call->debug_id */ 48162306a36Sopenharmony_ci u32 call_id; /* ID of current call */ 48262306a36Sopenharmony_ci u32 call_counter; /* Call ID counter */ 48362306a36Sopenharmony_ci u32 last_call; /* ID of last call */ 48462306a36Sopenharmony_ci u8 last_type; /* Type of last packet */ 48562306a36Sopenharmony_ci union { 48662306a36Sopenharmony_ci u32 last_seq; 48762306a36Sopenharmony_ci u32 last_abort; 48862306a36Sopenharmony_ci }; 48962306a36Sopenharmony_ci } channels[RXRPC_MAXCALLS]; 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci struct timer_list timer; /* Conn event timer */ 49262306a36Sopenharmony_ci struct work_struct processor; /* connection event processor */ 49362306a36Sopenharmony_ci struct work_struct destructor; /* In-process-context destroyer */ 49462306a36Sopenharmony_ci struct rxrpc_bundle *bundle; /* Client connection bundle */ 49562306a36Sopenharmony_ci struct rb_node service_node; /* Node in peer->service_conns */ 49662306a36Sopenharmony_ci struct list_head proc_link; /* link in procfs list */ 49762306a36Sopenharmony_ci struct list_head link; /* link in master connection list */ 49862306a36Sopenharmony_ci struct sk_buff_head rx_queue; /* received conn-level packets */ 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci struct mutex security_lock; /* Lock for security management */ 50162306a36Sopenharmony_ci const struct rxrpc_security *security; /* applied security module */ 50262306a36Sopenharmony_ci union { 50362306a36Sopenharmony_ci struct { 50462306a36Sopenharmony_ci struct crypto_sync_skcipher *cipher; /* encryption handle */ 50562306a36Sopenharmony_ci struct rxrpc_crypt csum_iv; /* packet checksum base */ 50662306a36Sopenharmony_ci u32 nonce; /* response re-use preventer */ 50762306a36Sopenharmony_ci } rxkad; 50862306a36Sopenharmony_ci }; 50962306a36Sopenharmony_ci unsigned long flags; 51062306a36Sopenharmony_ci unsigned long events; 51162306a36Sopenharmony_ci unsigned long idle_timestamp; /* Time at which last became idle */ 51262306a36Sopenharmony_ci spinlock_t state_lock; /* state-change lock */ 51362306a36Sopenharmony_ci enum rxrpc_conn_proto_state state; /* current state of connection */ 51462306a36Sopenharmony_ci enum rxrpc_call_completion completion; /* Completion condition */ 51562306a36Sopenharmony_ci s32 abort_code; /* Abort code of connection abort */ 51662306a36Sopenharmony_ci int debug_id; /* debug ID for printks */ 51762306a36Sopenharmony_ci rxrpc_serial_t tx_serial; /* Outgoing packet serial number counter */ 51862306a36Sopenharmony_ci unsigned int hi_serial; /* highest serial number received */ 51962306a36Sopenharmony_ci u32 service_id; /* Service ID, possibly upgraded */ 52062306a36Sopenharmony_ci u32 security_level; /* Security level selected */ 52162306a36Sopenharmony_ci u8 security_ix; /* security type */ 52262306a36Sopenharmony_ci u8 out_clientflag; /* RXRPC_CLIENT_INITIATED if we are client */ 52362306a36Sopenharmony_ci u8 bundle_shift; /* Index into bundle->avail_chans */ 52462306a36Sopenharmony_ci bool exclusive; /* T if conn is exclusive */ 52562306a36Sopenharmony_ci bool upgrade; /* T if service ID can be upgraded */ 52662306a36Sopenharmony_ci u16 orig_service_id; /* Originally requested service ID */ 52762306a36Sopenharmony_ci short error; /* Local error code */ 52862306a36Sopenharmony_ci}; 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_cistatic inline bool rxrpc_to_server(const struct rxrpc_skb_priv *sp) 53162306a36Sopenharmony_ci{ 53262306a36Sopenharmony_ci return sp->hdr.flags & RXRPC_CLIENT_INITIATED; 53362306a36Sopenharmony_ci} 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_cistatic inline bool rxrpc_to_client(const struct rxrpc_skb_priv *sp) 53662306a36Sopenharmony_ci{ 53762306a36Sopenharmony_ci return !rxrpc_to_server(sp); 53862306a36Sopenharmony_ci} 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci/* 54162306a36Sopenharmony_ci * Flags in call->flags. 54262306a36Sopenharmony_ci */ 54362306a36Sopenharmony_cienum rxrpc_call_flag { 54462306a36Sopenharmony_ci RXRPC_CALL_RELEASED, /* call has been released - no more message to userspace */ 54562306a36Sopenharmony_ci RXRPC_CALL_HAS_USERID, /* has a user ID attached */ 54662306a36Sopenharmony_ci RXRPC_CALL_IS_SERVICE, /* Call is service call */ 54762306a36Sopenharmony_ci RXRPC_CALL_EXPOSED, /* The call was exposed to the world */ 54862306a36Sopenharmony_ci RXRPC_CALL_RX_LAST, /* Received the last packet (at rxtx_top) */ 54962306a36Sopenharmony_ci RXRPC_CALL_TX_LAST, /* Last packet in Tx buffer (at rxtx_top) */ 55062306a36Sopenharmony_ci RXRPC_CALL_TX_ALL_ACKED, /* Last packet has been hard-acked */ 55162306a36Sopenharmony_ci RXRPC_CALL_SEND_PING, /* A ping will need to be sent */ 55262306a36Sopenharmony_ci RXRPC_CALL_RETRANS_TIMEOUT, /* Retransmission due to timeout occurred */ 55362306a36Sopenharmony_ci RXRPC_CALL_BEGAN_RX_TIMER, /* We began the expect_rx_by timer */ 55462306a36Sopenharmony_ci RXRPC_CALL_RX_HEARD, /* The peer responded at least once to this call */ 55562306a36Sopenharmony_ci RXRPC_CALL_DISCONNECTED, /* The call has been disconnected */ 55662306a36Sopenharmony_ci RXRPC_CALL_KERNEL, /* The call was made by the kernel */ 55762306a36Sopenharmony_ci RXRPC_CALL_UPGRADE, /* Service upgrade was requested for the call */ 55862306a36Sopenharmony_ci RXRPC_CALL_EXCLUSIVE, /* The call uses a once-only connection */ 55962306a36Sopenharmony_ci RXRPC_CALL_RX_IS_IDLE, /* recvmsg() is idle - send an ACK */ 56062306a36Sopenharmony_ci RXRPC_CALL_RECVMSG_READ_ALL, /* recvmsg() read all of the received data */ 56162306a36Sopenharmony_ci}; 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci/* 56462306a36Sopenharmony_ci * Events that can be raised on a call. 56562306a36Sopenharmony_ci */ 56662306a36Sopenharmony_cienum rxrpc_call_event { 56762306a36Sopenharmony_ci RXRPC_CALL_EV_ACK_LOST, /* ACK may be lost, send ping */ 56862306a36Sopenharmony_ci RXRPC_CALL_EV_INITIAL_PING, /* Send initial ping for a new service call */ 56962306a36Sopenharmony_ci}; 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci/* 57262306a36Sopenharmony_ci * The states that a call can be in. 57362306a36Sopenharmony_ci */ 57462306a36Sopenharmony_cienum rxrpc_call_state { 57562306a36Sopenharmony_ci RXRPC_CALL_UNINITIALISED, 57662306a36Sopenharmony_ci RXRPC_CALL_CLIENT_AWAIT_CONN, /* - client waiting for connection to become available */ 57762306a36Sopenharmony_ci RXRPC_CALL_CLIENT_SEND_REQUEST, /* - client sending request phase */ 57862306a36Sopenharmony_ci RXRPC_CALL_CLIENT_AWAIT_REPLY, /* - client awaiting reply */ 57962306a36Sopenharmony_ci RXRPC_CALL_CLIENT_RECV_REPLY, /* - client receiving reply phase */ 58062306a36Sopenharmony_ci RXRPC_CALL_SERVER_PREALLOC, /* - service preallocation */ 58162306a36Sopenharmony_ci RXRPC_CALL_SERVER_SECURING, /* - server securing request connection */ 58262306a36Sopenharmony_ci RXRPC_CALL_SERVER_RECV_REQUEST, /* - server receiving request */ 58362306a36Sopenharmony_ci RXRPC_CALL_SERVER_ACK_REQUEST, /* - server pending ACK of request */ 58462306a36Sopenharmony_ci RXRPC_CALL_SERVER_SEND_REPLY, /* - server sending reply */ 58562306a36Sopenharmony_ci RXRPC_CALL_SERVER_AWAIT_ACK, /* - server awaiting final ACK */ 58662306a36Sopenharmony_ci RXRPC_CALL_COMPLETE, /* - call complete */ 58762306a36Sopenharmony_ci NR__RXRPC_CALL_STATES 58862306a36Sopenharmony_ci}; 58962306a36Sopenharmony_ci 59062306a36Sopenharmony_ci/* 59162306a36Sopenharmony_ci * Call Tx congestion management modes. 59262306a36Sopenharmony_ci */ 59362306a36Sopenharmony_cienum rxrpc_congest_mode { 59462306a36Sopenharmony_ci RXRPC_CALL_SLOW_START, 59562306a36Sopenharmony_ci RXRPC_CALL_CONGEST_AVOIDANCE, 59662306a36Sopenharmony_ci RXRPC_CALL_PACKET_LOSS, 59762306a36Sopenharmony_ci RXRPC_CALL_FAST_RETRANSMIT, 59862306a36Sopenharmony_ci NR__RXRPC_CONGEST_MODES 59962306a36Sopenharmony_ci}; 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci/* 60262306a36Sopenharmony_ci * RxRPC call definition 60362306a36Sopenharmony_ci * - matched by { connection, call_id } 60462306a36Sopenharmony_ci */ 60562306a36Sopenharmony_cistruct rxrpc_call { 60662306a36Sopenharmony_ci struct rcu_head rcu; 60762306a36Sopenharmony_ci struct rxrpc_connection *conn; /* connection carrying call */ 60862306a36Sopenharmony_ci struct rxrpc_bundle *bundle; /* Connection bundle to use */ 60962306a36Sopenharmony_ci struct rxrpc_peer *peer; /* Peer record for remote address */ 61062306a36Sopenharmony_ci struct rxrpc_local *local; /* Representation of local endpoint */ 61162306a36Sopenharmony_ci struct rxrpc_sock __rcu *socket; /* socket responsible */ 61262306a36Sopenharmony_ci struct rxrpc_net *rxnet; /* Network namespace to which call belongs */ 61362306a36Sopenharmony_ci struct key *key; /* Security details */ 61462306a36Sopenharmony_ci const struct rxrpc_security *security; /* applied security module */ 61562306a36Sopenharmony_ci struct mutex user_mutex; /* User access mutex */ 61662306a36Sopenharmony_ci struct sockaddr_rxrpc dest_srx; /* Destination address */ 61762306a36Sopenharmony_ci unsigned long delay_ack_at; /* When DELAY ACK needs to happen */ 61862306a36Sopenharmony_ci unsigned long ack_lost_at; /* When ACK is figured as lost */ 61962306a36Sopenharmony_ci unsigned long resend_at; /* When next resend needs to happen */ 62062306a36Sopenharmony_ci unsigned long ping_at; /* When next to send a ping */ 62162306a36Sopenharmony_ci unsigned long keepalive_at; /* When next to send a keepalive ping */ 62262306a36Sopenharmony_ci unsigned long expect_rx_by; /* When we expect to get a packet by */ 62362306a36Sopenharmony_ci unsigned long expect_req_by; /* When we expect to get a request DATA packet by */ 62462306a36Sopenharmony_ci unsigned long expect_term_by; /* When we expect call termination by */ 62562306a36Sopenharmony_ci u32 next_rx_timo; /* Timeout for next Rx packet (jif) */ 62662306a36Sopenharmony_ci u32 next_req_timo; /* Timeout for next Rx request packet (jif) */ 62762306a36Sopenharmony_ci u32 hard_timo; /* Maximum lifetime or 0 (jif) */ 62862306a36Sopenharmony_ci struct timer_list timer; /* Combined event timer */ 62962306a36Sopenharmony_ci struct work_struct destroyer; /* In-process-context destroyer */ 63062306a36Sopenharmony_ci rxrpc_notify_rx_t notify_rx; /* kernel service Rx notification function */ 63162306a36Sopenharmony_ci struct list_head link; /* link in master call list */ 63262306a36Sopenharmony_ci struct list_head wait_link; /* Link in local->new_client_calls */ 63362306a36Sopenharmony_ci struct hlist_node error_link; /* link in error distribution list */ 63462306a36Sopenharmony_ci struct list_head accept_link; /* Link in rx->acceptq */ 63562306a36Sopenharmony_ci struct list_head recvmsg_link; /* Link in rx->recvmsg_q */ 63662306a36Sopenharmony_ci struct list_head sock_link; /* Link in rx->sock_calls */ 63762306a36Sopenharmony_ci struct rb_node sock_node; /* Node in rx->calls */ 63862306a36Sopenharmony_ci struct list_head attend_link; /* Link in local->call_attend_q */ 63962306a36Sopenharmony_ci struct rxrpc_txbuf *tx_pending; /* Tx buffer being filled */ 64062306a36Sopenharmony_ci wait_queue_head_t waitq; /* Wait queue for channel or Tx */ 64162306a36Sopenharmony_ci s64 tx_total_len; /* Total length left to be transmitted (or -1) */ 64262306a36Sopenharmony_ci unsigned long user_call_ID; /* user-defined call ID */ 64362306a36Sopenharmony_ci unsigned long flags; 64462306a36Sopenharmony_ci unsigned long events; 64562306a36Sopenharmony_ci spinlock_t notify_lock; /* Kernel notification lock */ 64662306a36Sopenharmony_ci unsigned int send_abort_why; /* Why the abort [enum rxrpc_abort_reason] */ 64762306a36Sopenharmony_ci s32 send_abort; /* Abort code to be sent */ 64862306a36Sopenharmony_ci short send_abort_err; /* Error to be associated with the abort */ 64962306a36Sopenharmony_ci rxrpc_seq_t send_abort_seq; /* DATA packet that incurred the abort (or 0) */ 65062306a36Sopenharmony_ci s32 abort_code; /* Local/remote abort code */ 65162306a36Sopenharmony_ci int error; /* Local error incurred */ 65262306a36Sopenharmony_ci enum rxrpc_call_state _state; /* Current state of call (needs barrier) */ 65362306a36Sopenharmony_ci enum rxrpc_call_completion completion; /* Call completion condition */ 65462306a36Sopenharmony_ci refcount_t ref; 65562306a36Sopenharmony_ci u8 security_ix; /* Security type */ 65662306a36Sopenharmony_ci enum rxrpc_interruptibility interruptibility; /* At what point call may be interrupted */ 65762306a36Sopenharmony_ci u32 call_id; /* call ID on connection */ 65862306a36Sopenharmony_ci u32 cid; /* connection ID plus channel index */ 65962306a36Sopenharmony_ci u32 security_level; /* Security level selected */ 66062306a36Sopenharmony_ci int debug_id; /* debug ID for printks */ 66162306a36Sopenharmony_ci unsigned short rx_pkt_offset; /* Current recvmsg packet offset */ 66262306a36Sopenharmony_ci unsigned short rx_pkt_len; /* Current recvmsg packet len */ 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ci /* Transmitted data tracking. */ 66562306a36Sopenharmony_ci spinlock_t tx_lock; /* Transmit queue lock */ 66662306a36Sopenharmony_ci struct list_head tx_sendmsg; /* Sendmsg prepared packets */ 66762306a36Sopenharmony_ci struct list_head tx_buffer; /* Buffer of transmissible packets */ 66862306a36Sopenharmony_ci rxrpc_seq_t tx_bottom; /* First packet in buffer */ 66962306a36Sopenharmony_ci rxrpc_seq_t tx_transmitted; /* Highest packet transmitted */ 67062306a36Sopenharmony_ci rxrpc_seq_t tx_prepared; /* Highest Tx slot prepared. */ 67162306a36Sopenharmony_ci rxrpc_seq_t tx_top; /* Highest Tx slot allocated. */ 67262306a36Sopenharmony_ci u16 tx_backoff; /* Delay to insert due to Tx failure */ 67362306a36Sopenharmony_ci u8 tx_winsize; /* Maximum size of Tx window */ 67462306a36Sopenharmony_ci#define RXRPC_TX_MAX_WINDOW 128 67562306a36Sopenharmony_ci ktime_t tx_last_sent; /* Last time a transmission occurred */ 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci /* Received data tracking */ 67862306a36Sopenharmony_ci struct sk_buff_head recvmsg_queue; /* Queue of packets ready for recvmsg() */ 67962306a36Sopenharmony_ci struct sk_buff_head rx_oos_queue; /* Queue of out of sequence packets */ 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_ci rxrpc_seq_t rx_highest_seq; /* Higest sequence number received */ 68262306a36Sopenharmony_ci rxrpc_seq_t rx_consumed; /* Highest packet consumed */ 68362306a36Sopenharmony_ci rxrpc_serial_t rx_serial; /* Highest serial received for this call */ 68462306a36Sopenharmony_ci u8 rx_winsize; /* Size of Rx window */ 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ci /* TCP-style slow-start congestion control [RFC5681]. Since the SMSS 68762306a36Sopenharmony_ci * is fixed, we keep these numbers in terms of segments (ie. DATA 68862306a36Sopenharmony_ci * packets) rather than bytes. 68962306a36Sopenharmony_ci */ 69062306a36Sopenharmony_ci#define RXRPC_TX_SMSS RXRPC_JUMBO_DATALEN 69162306a36Sopenharmony_ci#define RXRPC_MIN_CWND (RXRPC_TX_SMSS > 2190 ? 2 : RXRPC_TX_SMSS > 1095 ? 3 : 4) 69262306a36Sopenharmony_ci u8 cong_cwnd; /* Congestion window size */ 69362306a36Sopenharmony_ci u8 cong_extra; /* Extra to send for congestion management */ 69462306a36Sopenharmony_ci u8 cong_ssthresh; /* Slow-start threshold */ 69562306a36Sopenharmony_ci enum rxrpc_congest_mode cong_mode:8; /* Congestion management mode */ 69662306a36Sopenharmony_ci u8 cong_dup_acks; /* Count of ACKs showing missing packets */ 69762306a36Sopenharmony_ci u8 cong_cumul_acks; /* Cumulative ACK count */ 69862306a36Sopenharmony_ci ktime_t cong_tstamp; /* Last time cwnd was changed */ 69962306a36Sopenharmony_ci struct sk_buff *cong_last_nack; /* Last ACK with nacks received */ 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ci /* Receive-phase ACK management (ACKs we send). */ 70262306a36Sopenharmony_ci u8 ackr_reason; /* reason to ACK */ 70362306a36Sopenharmony_ci u16 ackr_sack_base; /* Starting slot in SACK table ring */ 70462306a36Sopenharmony_ci rxrpc_seq_t ackr_window; /* Base of SACK window */ 70562306a36Sopenharmony_ci rxrpc_seq_t ackr_wtop; /* Base of SACK window */ 70662306a36Sopenharmony_ci unsigned int ackr_nr_unacked; /* Number of unacked packets */ 70762306a36Sopenharmony_ci atomic_t ackr_nr_consumed; /* Number of packets needing hard ACK */ 70862306a36Sopenharmony_ci struct { 70962306a36Sopenharmony_ci#define RXRPC_SACK_SIZE 256 71062306a36Sopenharmony_ci /* SACK table for soft-acked packets */ 71162306a36Sopenharmony_ci u8 ackr_sack_table[RXRPC_SACK_SIZE]; 71262306a36Sopenharmony_ci } __aligned(8); 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_ci /* RTT management */ 71562306a36Sopenharmony_ci rxrpc_serial_t rtt_serial[4]; /* Serial number of DATA or PING sent */ 71662306a36Sopenharmony_ci ktime_t rtt_sent_at[4]; /* Time packet sent */ 71762306a36Sopenharmony_ci unsigned long rtt_avail; /* Mask of available slots in bits 0-3, 71862306a36Sopenharmony_ci * Mask of pending samples in 8-11 */ 71962306a36Sopenharmony_ci#define RXRPC_CALL_RTT_AVAIL_MASK 0xf 72062306a36Sopenharmony_ci#define RXRPC_CALL_RTT_PEND_SHIFT 8 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_ci /* Transmission-phase ACK management (ACKs we've received). */ 72362306a36Sopenharmony_ci ktime_t acks_latest_ts; /* Timestamp of latest ACK received */ 72462306a36Sopenharmony_ci rxrpc_seq_t acks_first_seq; /* first sequence number received */ 72562306a36Sopenharmony_ci rxrpc_seq_t acks_prev_seq; /* Highest previousPacket received */ 72662306a36Sopenharmony_ci rxrpc_seq_t acks_hard_ack; /* Latest hard-ack point */ 72762306a36Sopenharmony_ci rxrpc_seq_t acks_lowest_nak; /* Lowest NACK in the buffer (or ==tx_hard_ack) */ 72862306a36Sopenharmony_ci rxrpc_serial_t acks_highest_serial; /* Highest serial number ACK'd */ 72962306a36Sopenharmony_ci}; 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci/* 73262306a36Sopenharmony_ci * Summary of a new ACK and the changes it made to the Tx buffer packet states. 73362306a36Sopenharmony_ci */ 73462306a36Sopenharmony_cistruct rxrpc_ack_summary { 73562306a36Sopenharmony_ci u16 nr_acks; /* Number of ACKs in packet */ 73662306a36Sopenharmony_ci u16 nr_new_acks; /* Number of new ACKs in packet */ 73762306a36Sopenharmony_ci u16 nr_new_nacks; /* Number of new nacks in packet */ 73862306a36Sopenharmony_ci u16 nr_retained_nacks; /* Number of nacks retained between ACKs */ 73962306a36Sopenharmony_ci u8 ack_reason; 74062306a36Sopenharmony_ci bool saw_nacks; /* Saw NACKs in packet */ 74162306a36Sopenharmony_ci bool new_low_nack; /* T if new low NACK found */ 74262306a36Sopenharmony_ci bool retrans_timeo; /* T if reTx due to timeout happened */ 74362306a36Sopenharmony_ci u8 flight_size; /* Number of unreceived transmissions */ 74462306a36Sopenharmony_ci /* Place to stash values for tracing */ 74562306a36Sopenharmony_ci enum rxrpc_congest_mode mode:8; 74662306a36Sopenharmony_ci u8 cwnd; 74762306a36Sopenharmony_ci u8 ssthresh; 74862306a36Sopenharmony_ci u8 dup_acks; 74962306a36Sopenharmony_ci u8 cumulative_acks; 75062306a36Sopenharmony_ci}; 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_ci/* 75362306a36Sopenharmony_ci * sendmsg() cmsg-specified parameters. 75462306a36Sopenharmony_ci */ 75562306a36Sopenharmony_cienum rxrpc_command { 75662306a36Sopenharmony_ci RXRPC_CMD_SEND_DATA, /* send data message */ 75762306a36Sopenharmony_ci RXRPC_CMD_SEND_ABORT, /* request abort generation */ 75862306a36Sopenharmony_ci RXRPC_CMD_REJECT_BUSY, /* [server] reject a call as busy */ 75962306a36Sopenharmony_ci RXRPC_CMD_CHARGE_ACCEPT, /* [server] charge accept preallocation */ 76062306a36Sopenharmony_ci}; 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_cistruct rxrpc_call_params { 76362306a36Sopenharmony_ci s64 tx_total_len; /* Total Tx data length (if send data) */ 76462306a36Sopenharmony_ci unsigned long user_call_ID; /* User's call ID */ 76562306a36Sopenharmony_ci struct { 76662306a36Sopenharmony_ci u32 hard; /* Maximum lifetime (sec) */ 76762306a36Sopenharmony_ci u32 idle; /* Max time since last data packet (msec) */ 76862306a36Sopenharmony_ci u32 normal; /* Max time since last call packet (msec) */ 76962306a36Sopenharmony_ci } timeouts; 77062306a36Sopenharmony_ci u8 nr_timeouts; /* Number of timeouts specified */ 77162306a36Sopenharmony_ci bool kernel; /* T if kernel is making the call */ 77262306a36Sopenharmony_ci enum rxrpc_interruptibility interruptibility; /* How is interruptible is the call? */ 77362306a36Sopenharmony_ci}; 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_cistruct rxrpc_send_params { 77662306a36Sopenharmony_ci struct rxrpc_call_params call; 77762306a36Sopenharmony_ci u32 abort_code; /* Abort code to Tx (if abort) */ 77862306a36Sopenharmony_ci enum rxrpc_command command : 8; /* The command to implement */ 77962306a36Sopenharmony_ci bool exclusive; /* Shared or exclusive call */ 78062306a36Sopenharmony_ci bool upgrade; /* If the connection is upgradeable */ 78162306a36Sopenharmony_ci}; 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_ci/* 78462306a36Sopenharmony_ci * Buffer of data to be output as a packet. 78562306a36Sopenharmony_ci */ 78662306a36Sopenharmony_cistruct rxrpc_txbuf { 78762306a36Sopenharmony_ci struct rcu_head rcu; 78862306a36Sopenharmony_ci struct list_head call_link; /* Link in call->tx_sendmsg/tx_buffer */ 78962306a36Sopenharmony_ci struct list_head tx_link; /* Link in live Enc queue or Tx queue */ 79062306a36Sopenharmony_ci ktime_t last_sent; /* Time at which last transmitted */ 79162306a36Sopenharmony_ci refcount_t ref; 79262306a36Sopenharmony_ci rxrpc_seq_t seq; /* Sequence number of this packet */ 79362306a36Sopenharmony_ci unsigned int call_debug_id; 79462306a36Sopenharmony_ci unsigned int debug_id; 79562306a36Sopenharmony_ci unsigned int len; /* Amount of data in buffer */ 79662306a36Sopenharmony_ci unsigned int space; /* Remaining data space */ 79762306a36Sopenharmony_ci unsigned int offset; /* Offset of fill point */ 79862306a36Sopenharmony_ci unsigned long flags; 79962306a36Sopenharmony_ci#define RXRPC_TXBUF_LAST 0 /* Set if last packet in Tx phase */ 80062306a36Sopenharmony_ci#define RXRPC_TXBUF_RESENT 1 /* Set if has been resent */ 80162306a36Sopenharmony_ci u8 /*enum rxrpc_propose_ack_trace*/ ack_why; /* If ack, why */ 80262306a36Sopenharmony_ci struct { 80362306a36Sopenharmony_ci /* The packet for encrypting and DMA'ing. We align it such 80462306a36Sopenharmony_ci * that data[] aligns correctly for any crypto blocksize. 80562306a36Sopenharmony_ci */ 80662306a36Sopenharmony_ci u8 pad[64 - sizeof(struct rxrpc_wire_header)]; 80762306a36Sopenharmony_ci struct rxrpc_wire_header wire; /* Network-ready header */ 80862306a36Sopenharmony_ci union { 80962306a36Sopenharmony_ci u8 data[RXRPC_JUMBO_DATALEN]; /* Data packet */ 81062306a36Sopenharmony_ci struct { 81162306a36Sopenharmony_ci struct rxrpc_ackpacket ack; 81262306a36Sopenharmony_ci DECLARE_FLEX_ARRAY(u8, acks); 81362306a36Sopenharmony_ci }; 81462306a36Sopenharmony_ci }; 81562306a36Sopenharmony_ci } __aligned(64); 81662306a36Sopenharmony_ci}; 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_cistatic inline bool rxrpc_sending_to_server(const struct rxrpc_txbuf *txb) 81962306a36Sopenharmony_ci{ 82062306a36Sopenharmony_ci return txb->wire.flags & RXRPC_CLIENT_INITIATED; 82162306a36Sopenharmony_ci} 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_cistatic inline bool rxrpc_sending_to_client(const struct rxrpc_txbuf *txb) 82462306a36Sopenharmony_ci{ 82562306a36Sopenharmony_ci return !rxrpc_sending_to_server(txb); 82662306a36Sopenharmony_ci} 82762306a36Sopenharmony_ci 82862306a36Sopenharmony_ci#include <trace/events/rxrpc.h> 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci/* 83162306a36Sopenharmony_ci * Allocate the next serial number on a connection. 0 must be skipped. 83262306a36Sopenharmony_ci */ 83362306a36Sopenharmony_cistatic inline rxrpc_serial_t rxrpc_get_next_serial(struct rxrpc_connection *conn) 83462306a36Sopenharmony_ci{ 83562306a36Sopenharmony_ci rxrpc_serial_t serial; 83662306a36Sopenharmony_ci 83762306a36Sopenharmony_ci serial = conn->tx_serial; 83862306a36Sopenharmony_ci if (serial == 0) 83962306a36Sopenharmony_ci serial = 1; 84062306a36Sopenharmony_ci conn->tx_serial = serial + 1; 84162306a36Sopenharmony_ci return serial; 84262306a36Sopenharmony_ci} 84362306a36Sopenharmony_ci 84462306a36Sopenharmony_ci/* 84562306a36Sopenharmony_ci * af_rxrpc.c 84662306a36Sopenharmony_ci */ 84762306a36Sopenharmony_ciextern atomic_t rxrpc_n_rx_skbs; 84862306a36Sopenharmony_ciextern struct workqueue_struct *rxrpc_workqueue; 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_ci/* 85162306a36Sopenharmony_ci * call_accept.c 85262306a36Sopenharmony_ci */ 85362306a36Sopenharmony_ciint rxrpc_service_prealloc(struct rxrpc_sock *, gfp_t); 85462306a36Sopenharmony_civoid rxrpc_discard_prealloc(struct rxrpc_sock *); 85562306a36Sopenharmony_cibool rxrpc_new_incoming_call(struct rxrpc_local *local, 85662306a36Sopenharmony_ci struct rxrpc_peer *peer, 85762306a36Sopenharmony_ci struct rxrpc_connection *conn, 85862306a36Sopenharmony_ci struct sockaddr_rxrpc *peer_srx, 85962306a36Sopenharmony_ci struct sk_buff *skb); 86062306a36Sopenharmony_civoid rxrpc_accept_incoming_calls(struct rxrpc_local *); 86162306a36Sopenharmony_ciint rxrpc_user_charge_accept(struct rxrpc_sock *, unsigned long); 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_ci/* 86462306a36Sopenharmony_ci * call_event.c 86562306a36Sopenharmony_ci */ 86662306a36Sopenharmony_civoid rxrpc_propose_ping(struct rxrpc_call *call, u32 serial, 86762306a36Sopenharmony_ci enum rxrpc_propose_ack_trace why); 86862306a36Sopenharmony_civoid rxrpc_send_ACK(struct rxrpc_call *, u8, rxrpc_serial_t, enum rxrpc_propose_ack_trace); 86962306a36Sopenharmony_civoid rxrpc_propose_delay_ACK(struct rxrpc_call *, rxrpc_serial_t, 87062306a36Sopenharmony_ci enum rxrpc_propose_ack_trace); 87162306a36Sopenharmony_civoid rxrpc_shrink_call_tx_buffer(struct rxrpc_call *); 87262306a36Sopenharmony_civoid rxrpc_resend(struct rxrpc_call *call, struct sk_buff *ack_skb); 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_civoid rxrpc_reduce_call_timer(struct rxrpc_call *call, 87562306a36Sopenharmony_ci unsigned long expire_at, 87662306a36Sopenharmony_ci unsigned long now, 87762306a36Sopenharmony_ci enum rxrpc_timer_trace why); 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_cibool rxrpc_input_call_event(struct rxrpc_call *call, struct sk_buff *skb); 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_ci/* 88262306a36Sopenharmony_ci * call_object.c 88362306a36Sopenharmony_ci */ 88462306a36Sopenharmony_ciextern const char *const rxrpc_call_states[]; 88562306a36Sopenharmony_ciextern const char *const rxrpc_call_completions[]; 88662306a36Sopenharmony_ciextern struct kmem_cache *rxrpc_call_jar; 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_civoid rxrpc_poke_call(struct rxrpc_call *call, enum rxrpc_call_poke_trace what); 88962306a36Sopenharmony_cistruct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *, unsigned long); 89062306a36Sopenharmony_cistruct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *, gfp_t, unsigned int); 89162306a36Sopenharmony_cistruct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *, 89262306a36Sopenharmony_ci struct rxrpc_conn_parameters *, 89362306a36Sopenharmony_ci struct sockaddr_rxrpc *, 89462306a36Sopenharmony_ci struct rxrpc_call_params *, gfp_t, 89562306a36Sopenharmony_ci unsigned int); 89662306a36Sopenharmony_civoid rxrpc_start_call_timer(struct rxrpc_call *call); 89762306a36Sopenharmony_civoid rxrpc_incoming_call(struct rxrpc_sock *, struct rxrpc_call *, 89862306a36Sopenharmony_ci struct sk_buff *); 89962306a36Sopenharmony_civoid rxrpc_release_call(struct rxrpc_sock *, struct rxrpc_call *); 90062306a36Sopenharmony_civoid rxrpc_release_calls_on_socket(struct rxrpc_sock *); 90162306a36Sopenharmony_civoid rxrpc_see_call(struct rxrpc_call *, enum rxrpc_call_trace); 90262306a36Sopenharmony_cistruct rxrpc_call *rxrpc_try_get_call(struct rxrpc_call *, enum rxrpc_call_trace); 90362306a36Sopenharmony_civoid rxrpc_get_call(struct rxrpc_call *, enum rxrpc_call_trace); 90462306a36Sopenharmony_civoid rxrpc_put_call(struct rxrpc_call *, enum rxrpc_call_trace); 90562306a36Sopenharmony_civoid rxrpc_cleanup_call(struct rxrpc_call *); 90662306a36Sopenharmony_civoid rxrpc_destroy_all_calls(struct rxrpc_net *); 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_cistatic inline bool rxrpc_is_service_call(const struct rxrpc_call *call) 90962306a36Sopenharmony_ci{ 91062306a36Sopenharmony_ci return test_bit(RXRPC_CALL_IS_SERVICE, &call->flags); 91162306a36Sopenharmony_ci} 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_cistatic inline bool rxrpc_is_client_call(const struct rxrpc_call *call) 91462306a36Sopenharmony_ci{ 91562306a36Sopenharmony_ci return !rxrpc_is_service_call(call); 91662306a36Sopenharmony_ci} 91762306a36Sopenharmony_ci 91862306a36Sopenharmony_ci/* 91962306a36Sopenharmony_ci * call_state.c 92062306a36Sopenharmony_ci */ 92162306a36Sopenharmony_cibool rxrpc_set_call_completion(struct rxrpc_call *call, 92262306a36Sopenharmony_ci enum rxrpc_call_completion compl, 92362306a36Sopenharmony_ci u32 abort_code, 92462306a36Sopenharmony_ci int error); 92562306a36Sopenharmony_cibool rxrpc_call_completed(struct rxrpc_call *call); 92662306a36Sopenharmony_cibool rxrpc_abort_call(struct rxrpc_call *call, rxrpc_seq_t seq, 92762306a36Sopenharmony_ci u32 abort_code, int error, enum rxrpc_abort_reason why); 92862306a36Sopenharmony_civoid rxrpc_prefail_call(struct rxrpc_call *call, enum rxrpc_call_completion compl, 92962306a36Sopenharmony_ci int error); 93062306a36Sopenharmony_ci 93162306a36Sopenharmony_cistatic inline void rxrpc_set_call_state(struct rxrpc_call *call, 93262306a36Sopenharmony_ci enum rxrpc_call_state state) 93362306a36Sopenharmony_ci{ 93462306a36Sopenharmony_ci /* Order write of completion info before write of ->state. */ 93562306a36Sopenharmony_ci smp_store_release(&call->_state, state); 93662306a36Sopenharmony_ci wake_up(&call->waitq); 93762306a36Sopenharmony_ci} 93862306a36Sopenharmony_ci 93962306a36Sopenharmony_cistatic inline enum rxrpc_call_state __rxrpc_call_state(const struct rxrpc_call *call) 94062306a36Sopenharmony_ci{ 94162306a36Sopenharmony_ci return call->_state; /* Only inside I/O thread */ 94262306a36Sopenharmony_ci} 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_cistatic inline bool __rxrpc_call_is_complete(const struct rxrpc_call *call) 94562306a36Sopenharmony_ci{ 94662306a36Sopenharmony_ci return __rxrpc_call_state(call) == RXRPC_CALL_COMPLETE; 94762306a36Sopenharmony_ci} 94862306a36Sopenharmony_ci 94962306a36Sopenharmony_cistatic inline enum rxrpc_call_state rxrpc_call_state(const struct rxrpc_call *call) 95062306a36Sopenharmony_ci{ 95162306a36Sopenharmony_ci /* Order read ->state before read of completion info. */ 95262306a36Sopenharmony_ci return smp_load_acquire(&call->_state); 95362306a36Sopenharmony_ci} 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_cistatic inline bool rxrpc_call_is_complete(const struct rxrpc_call *call) 95662306a36Sopenharmony_ci{ 95762306a36Sopenharmony_ci return rxrpc_call_state(call) == RXRPC_CALL_COMPLETE; 95862306a36Sopenharmony_ci} 95962306a36Sopenharmony_ci 96062306a36Sopenharmony_cistatic inline bool rxrpc_call_has_failed(const struct rxrpc_call *call) 96162306a36Sopenharmony_ci{ 96262306a36Sopenharmony_ci return rxrpc_call_is_complete(call) && call->completion != RXRPC_CALL_SUCCEEDED; 96362306a36Sopenharmony_ci} 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_ci/* 96662306a36Sopenharmony_ci * conn_client.c 96762306a36Sopenharmony_ci */ 96862306a36Sopenharmony_ciextern unsigned int rxrpc_reap_client_connections; 96962306a36Sopenharmony_ciextern unsigned long rxrpc_conn_idle_client_expiry; 97062306a36Sopenharmony_ciextern unsigned long rxrpc_conn_idle_client_fast_expiry; 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_civoid rxrpc_purge_client_connections(struct rxrpc_local *local); 97362306a36Sopenharmony_cistruct rxrpc_bundle *rxrpc_get_bundle(struct rxrpc_bundle *, enum rxrpc_bundle_trace); 97462306a36Sopenharmony_civoid rxrpc_put_bundle(struct rxrpc_bundle *, enum rxrpc_bundle_trace); 97562306a36Sopenharmony_ciint rxrpc_look_up_bundle(struct rxrpc_call *call, gfp_t gfp); 97662306a36Sopenharmony_civoid rxrpc_connect_client_calls(struct rxrpc_local *local); 97762306a36Sopenharmony_civoid rxrpc_expose_client_call(struct rxrpc_call *); 97862306a36Sopenharmony_civoid rxrpc_disconnect_client_call(struct rxrpc_bundle *, struct rxrpc_call *); 97962306a36Sopenharmony_civoid rxrpc_deactivate_bundle(struct rxrpc_bundle *bundle); 98062306a36Sopenharmony_civoid rxrpc_put_client_conn(struct rxrpc_connection *, enum rxrpc_conn_trace); 98162306a36Sopenharmony_civoid rxrpc_discard_expired_client_conns(struct rxrpc_local *local); 98262306a36Sopenharmony_civoid rxrpc_clean_up_local_conns(struct rxrpc_local *); 98362306a36Sopenharmony_ci 98462306a36Sopenharmony_ci/* 98562306a36Sopenharmony_ci * conn_event.c 98662306a36Sopenharmony_ci */ 98762306a36Sopenharmony_civoid rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, struct sk_buff *skb, 98862306a36Sopenharmony_ci unsigned int channel); 98962306a36Sopenharmony_ciint rxrpc_abort_conn(struct rxrpc_connection *conn, struct sk_buff *skb, 99062306a36Sopenharmony_ci s32 abort_code, int err, enum rxrpc_abort_reason why); 99162306a36Sopenharmony_civoid rxrpc_process_connection(struct work_struct *); 99262306a36Sopenharmony_civoid rxrpc_process_delayed_final_acks(struct rxrpc_connection *, bool); 99362306a36Sopenharmony_cibool rxrpc_input_conn_packet(struct rxrpc_connection *conn, struct sk_buff *skb); 99462306a36Sopenharmony_civoid rxrpc_input_conn_event(struct rxrpc_connection *conn, struct sk_buff *skb); 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_cistatic inline bool rxrpc_is_conn_aborted(const struct rxrpc_connection *conn) 99762306a36Sopenharmony_ci{ 99862306a36Sopenharmony_ci /* Order reading the abort info after the state check. */ 99962306a36Sopenharmony_ci return smp_load_acquire(&conn->state) == RXRPC_CONN_ABORTED; 100062306a36Sopenharmony_ci} 100162306a36Sopenharmony_ci 100262306a36Sopenharmony_ci/* 100362306a36Sopenharmony_ci * conn_object.c 100462306a36Sopenharmony_ci */ 100562306a36Sopenharmony_ciextern unsigned int rxrpc_connection_expiry; 100662306a36Sopenharmony_ciextern unsigned int rxrpc_closed_conn_expiry; 100762306a36Sopenharmony_ci 100862306a36Sopenharmony_civoid rxrpc_poke_conn(struct rxrpc_connection *conn, enum rxrpc_conn_trace why); 100962306a36Sopenharmony_cistruct rxrpc_connection *rxrpc_alloc_connection(struct rxrpc_net *, gfp_t); 101062306a36Sopenharmony_cistruct rxrpc_connection *rxrpc_find_client_connection_rcu(struct rxrpc_local *, 101162306a36Sopenharmony_ci struct sockaddr_rxrpc *, 101262306a36Sopenharmony_ci struct sk_buff *); 101362306a36Sopenharmony_civoid __rxrpc_disconnect_call(struct rxrpc_connection *, struct rxrpc_call *); 101462306a36Sopenharmony_civoid rxrpc_disconnect_call(struct rxrpc_call *); 101562306a36Sopenharmony_civoid rxrpc_kill_client_conn(struct rxrpc_connection *); 101662306a36Sopenharmony_civoid rxrpc_queue_conn(struct rxrpc_connection *, enum rxrpc_conn_trace); 101762306a36Sopenharmony_civoid rxrpc_see_connection(struct rxrpc_connection *, enum rxrpc_conn_trace); 101862306a36Sopenharmony_cistruct rxrpc_connection *rxrpc_get_connection(struct rxrpc_connection *, 101962306a36Sopenharmony_ci enum rxrpc_conn_trace); 102062306a36Sopenharmony_cistruct rxrpc_connection *rxrpc_get_connection_maybe(struct rxrpc_connection *, 102162306a36Sopenharmony_ci enum rxrpc_conn_trace); 102262306a36Sopenharmony_civoid rxrpc_put_connection(struct rxrpc_connection *, enum rxrpc_conn_trace); 102362306a36Sopenharmony_civoid rxrpc_service_connection_reaper(struct work_struct *); 102462306a36Sopenharmony_civoid rxrpc_destroy_all_connections(struct rxrpc_net *); 102562306a36Sopenharmony_ci 102662306a36Sopenharmony_cistatic inline bool rxrpc_conn_is_client(const struct rxrpc_connection *conn) 102762306a36Sopenharmony_ci{ 102862306a36Sopenharmony_ci return conn->out_clientflag; 102962306a36Sopenharmony_ci} 103062306a36Sopenharmony_ci 103162306a36Sopenharmony_cistatic inline bool rxrpc_conn_is_service(const struct rxrpc_connection *conn) 103262306a36Sopenharmony_ci{ 103362306a36Sopenharmony_ci return !rxrpc_conn_is_client(conn); 103462306a36Sopenharmony_ci} 103562306a36Sopenharmony_ci 103662306a36Sopenharmony_cistatic inline void rxrpc_reduce_conn_timer(struct rxrpc_connection *conn, 103762306a36Sopenharmony_ci unsigned long expire_at) 103862306a36Sopenharmony_ci{ 103962306a36Sopenharmony_ci timer_reduce(&conn->timer, expire_at); 104062306a36Sopenharmony_ci} 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_ci/* 104362306a36Sopenharmony_ci * conn_service.c 104462306a36Sopenharmony_ci */ 104562306a36Sopenharmony_cistruct rxrpc_connection *rxrpc_find_service_conn_rcu(struct rxrpc_peer *, 104662306a36Sopenharmony_ci struct sk_buff *); 104762306a36Sopenharmony_cistruct rxrpc_connection *rxrpc_prealloc_service_connection(struct rxrpc_net *, gfp_t); 104862306a36Sopenharmony_civoid rxrpc_new_incoming_connection(struct rxrpc_sock *, struct rxrpc_connection *, 104962306a36Sopenharmony_ci const struct rxrpc_security *, struct sk_buff *); 105062306a36Sopenharmony_civoid rxrpc_unpublish_service_conn(struct rxrpc_connection *); 105162306a36Sopenharmony_ci 105262306a36Sopenharmony_ci/* 105362306a36Sopenharmony_ci * input.c 105462306a36Sopenharmony_ci */ 105562306a36Sopenharmony_civoid rxrpc_congestion_degrade(struct rxrpc_call *); 105662306a36Sopenharmony_civoid rxrpc_input_call_packet(struct rxrpc_call *, struct sk_buff *); 105762306a36Sopenharmony_civoid rxrpc_implicit_end_call(struct rxrpc_call *, struct sk_buff *); 105862306a36Sopenharmony_ci 105962306a36Sopenharmony_ci/* 106062306a36Sopenharmony_ci * io_thread.c 106162306a36Sopenharmony_ci */ 106262306a36Sopenharmony_ciint rxrpc_encap_rcv(struct sock *, struct sk_buff *); 106362306a36Sopenharmony_civoid rxrpc_error_report(struct sock *); 106462306a36Sopenharmony_cibool rxrpc_direct_abort(struct sk_buff *skb, enum rxrpc_abort_reason why, 106562306a36Sopenharmony_ci s32 abort_code, int err); 106662306a36Sopenharmony_ciint rxrpc_io_thread(void *data); 106762306a36Sopenharmony_cistatic inline void rxrpc_wake_up_io_thread(struct rxrpc_local *local) 106862306a36Sopenharmony_ci{ 106962306a36Sopenharmony_ci wake_up_process(local->io_thread); 107062306a36Sopenharmony_ci} 107162306a36Sopenharmony_ci 107262306a36Sopenharmony_cistatic inline bool rxrpc_protocol_error(struct sk_buff *skb, enum rxrpc_abort_reason why) 107362306a36Sopenharmony_ci{ 107462306a36Sopenharmony_ci return rxrpc_direct_abort(skb, why, RX_PROTOCOL_ERROR, -EPROTO); 107562306a36Sopenharmony_ci} 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_ci/* 107862306a36Sopenharmony_ci * insecure.c 107962306a36Sopenharmony_ci */ 108062306a36Sopenharmony_ciextern const struct rxrpc_security rxrpc_no_security; 108162306a36Sopenharmony_ci 108262306a36Sopenharmony_ci/* 108362306a36Sopenharmony_ci * key.c 108462306a36Sopenharmony_ci */ 108562306a36Sopenharmony_ciextern struct key_type key_type_rxrpc; 108662306a36Sopenharmony_ci 108762306a36Sopenharmony_ciint rxrpc_request_key(struct rxrpc_sock *, sockptr_t , int); 108862306a36Sopenharmony_ciint rxrpc_get_server_data_key(struct rxrpc_connection *, const void *, time64_t, 108962306a36Sopenharmony_ci u32); 109062306a36Sopenharmony_ci 109162306a36Sopenharmony_ci/* 109262306a36Sopenharmony_ci * local_event.c 109362306a36Sopenharmony_ci */ 109462306a36Sopenharmony_civoid rxrpc_gen_version_string(void); 109562306a36Sopenharmony_civoid rxrpc_send_version_request(struct rxrpc_local *local, 109662306a36Sopenharmony_ci struct rxrpc_host_header *hdr, 109762306a36Sopenharmony_ci struct sk_buff *skb); 109862306a36Sopenharmony_ci 109962306a36Sopenharmony_ci/* 110062306a36Sopenharmony_ci * local_object.c 110162306a36Sopenharmony_ci */ 110262306a36Sopenharmony_civoid rxrpc_local_dont_fragment(const struct rxrpc_local *local, bool set); 110362306a36Sopenharmony_cistruct rxrpc_local *rxrpc_lookup_local(struct net *, const struct sockaddr_rxrpc *); 110462306a36Sopenharmony_cistruct rxrpc_local *rxrpc_get_local(struct rxrpc_local *, enum rxrpc_local_trace); 110562306a36Sopenharmony_cistruct rxrpc_local *rxrpc_get_local_maybe(struct rxrpc_local *, enum rxrpc_local_trace); 110662306a36Sopenharmony_civoid rxrpc_put_local(struct rxrpc_local *, enum rxrpc_local_trace); 110762306a36Sopenharmony_cistruct rxrpc_local *rxrpc_use_local(struct rxrpc_local *, enum rxrpc_local_trace); 110862306a36Sopenharmony_civoid rxrpc_unuse_local(struct rxrpc_local *, enum rxrpc_local_trace); 110962306a36Sopenharmony_civoid rxrpc_destroy_local(struct rxrpc_local *local); 111062306a36Sopenharmony_civoid rxrpc_destroy_all_locals(struct rxrpc_net *); 111162306a36Sopenharmony_ci 111262306a36Sopenharmony_cistatic inline bool __rxrpc_use_local(struct rxrpc_local *local, 111362306a36Sopenharmony_ci enum rxrpc_local_trace why) 111462306a36Sopenharmony_ci{ 111562306a36Sopenharmony_ci int r, u; 111662306a36Sopenharmony_ci 111762306a36Sopenharmony_ci r = refcount_read(&local->ref); 111862306a36Sopenharmony_ci u = atomic_fetch_add_unless(&local->active_users, 1, 0); 111962306a36Sopenharmony_ci trace_rxrpc_local(local->debug_id, why, r, u); 112062306a36Sopenharmony_ci return u != 0; 112162306a36Sopenharmony_ci} 112262306a36Sopenharmony_ci 112362306a36Sopenharmony_cistatic inline void rxrpc_see_local(struct rxrpc_local *local, 112462306a36Sopenharmony_ci enum rxrpc_local_trace why) 112562306a36Sopenharmony_ci{ 112662306a36Sopenharmony_ci int r, u; 112762306a36Sopenharmony_ci 112862306a36Sopenharmony_ci r = refcount_read(&local->ref); 112962306a36Sopenharmony_ci u = atomic_read(&local->active_users); 113062306a36Sopenharmony_ci trace_rxrpc_local(local->debug_id, why, r, u); 113162306a36Sopenharmony_ci} 113262306a36Sopenharmony_ci 113362306a36Sopenharmony_ci/* 113462306a36Sopenharmony_ci * misc.c 113562306a36Sopenharmony_ci */ 113662306a36Sopenharmony_ciextern unsigned int rxrpc_max_backlog __read_mostly; 113762306a36Sopenharmony_ciextern unsigned long rxrpc_soft_ack_delay; 113862306a36Sopenharmony_ciextern unsigned long rxrpc_idle_ack_delay; 113962306a36Sopenharmony_ciextern unsigned int rxrpc_rx_window_size; 114062306a36Sopenharmony_ciextern unsigned int rxrpc_rx_mtu; 114162306a36Sopenharmony_ciextern unsigned int rxrpc_rx_jumbo_max; 114262306a36Sopenharmony_ci#ifdef CONFIG_AF_RXRPC_INJECT_RX_DELAY 114362306a36Sopenharmony_ciextern unsigned long rxrpc_inject_rx_delay; 114462306a36Sopenharmony_ci#endif 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci/* 114762306a36Sopenharmony_ci * net_ns.c 114862306a36Sopenharmony_ci */ 114962306a36Sopenharmony_ciextern unsigned int rxrpc_net_id; 115062306a36Sopenharmony_ciextern struct pernet_operations rxrpc_net_ops; 115162306a36Sopenharmony_ci 115262306a36Sopenharmony_cistatic inline struct rxrpc_net *rxrpc_net(struct net *net) 115362306a36Sopenharmony_ci{ 115462306a36Sopenharmony_ci return net_generic(net, rxrpc_net_id); 115562306a36Sopenharmony_ci} 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci/* 115862306a36Sopenharmony_ci * output.c 115962306a36Sopenharmony_ci */ 116062306a36Sopenharmony_ciint rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb); 116162306a36Sopenharmony_ciint rxrpc_send_abort_packet(struct rxrpc_call *); 116262306a36Sopenharmony_ciint rxrpc_send_data_packet(struct rxrpc_call *, struct rxrpc_txbuf *); 116362306a36Sopenharmony_civoid rxrpc_send_conn_abort(struct rxrpc_connection *conn); 116462306a36Sopenharmony_civoid rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb); 116562306a36Sopenharmony_civoid rxrpc_send_keepalive(struct rxrpc_peer *); 116662306a36Sopenharmony_civoid rxrpc_transmit_one(struct rxrpc_call *call, struct rxrpc_txbuf *txb); 116762306a36Sopenharmony_ci 116862306a36Sopenharmony_ci/* 116962306a36Sopenharmony_ci * peer_event.c 117062306a36Sopenharmony_ci */ 117162306a36Sopenharmony_civoid rxrpc_input_error(struct rxrpc_local *, struct sk_buff *); 117262306a36Sopenharmony_civoid rxrpc_peer_keepalive_worker(struct work_struct *); 117362306a36Sopenharmony_ci 117462306a36Sopenharmony_ci/* 117562306a36Sopenharmony_ci * peer_object.c 117662306a36Sopenharmony_ci */ 117762306a36Sopenharmony_cistruct rxrpc_peer *rxrpc_lookup_peer_rcu(struct rxrpc_local *, 117862306a36Sopenharmony_ci const struct sockaddr_rxrpc *); 117962306a36Sopenharmony_cistruct rxrpc_peer *rxrpc_lookup_peer(struct rxrpc_local *local, 118062306a36Sopenharmony_ci struct sockaddr_rxrpc *srx, gfp_t gfp); 118162306a36Sopenharmony_cistruct rxrpc_peer *rxrpc_alloc_peer(struct rxrpc_local *, gfp_t, 118262306a36Sopenharmony_ci enum rxrpc_peer_trace); 118362306a36Sopenharmony_civoid rxrpc_new_incoming_peer(struct rxrpc_local *local, struct rxrpc_peer *peer); 118462306a36Sopenharmony_civoid rxrpc_destroy_all_peers(struct rxrpc_net *); 118562306a36Sopenharmony_cistruct rxrpc_peer *rxrpc_get_peer(struct rxrpc_peer *, enum rxrpc_peer_trace); 118662306a36Sopenharmony_cistruct rxrpc_peer *rxrpc_get_peer_maybe(struct rxrpc_peer *, enum rxrpc_peer_trace); 118762306a36Sopenharmony_civoid rxrpc_put_peer(struct rxrpc_peer *, enum rxrpc_peer_trace); 118862306a36Sopenharmony_ci 118962306a36Sopenharmony_ci/* 119062306a36Sopenharmony_ci * proc.c 119162306a36Sopenharmony_ci */ 119262306a36Sopenharmony_ciextern const struct seq_operations rxrpc_call_seq_ops; 119362306a36Sopenharmony_ciextern const struct seq_operations rxrpc_connection_seq_ops; 119462306a36Sopenharmony_ciextern const struct seq_operations rxrpc_peer_seq_ops; 119562306a36Sopenharmony_ciextern const struct seq_operations rxrpc_local_seq_ops; 119662306a36Sopenharmony_ci 119762306a36Sopenharmony_ci/* 119862306a36Sopenharmony_ci * recvmsg.c 119962306a36Sopenharmony_ci */ 120062306a36Sopenharmony_civoid rxrpc_notify_socket(struct rxrpc_call *); 120162306a36Sopenharmony_ciint rxrpc_recvmsg(struct socket *, struct msghdr *, size_t, int); 120262306a36Sopenharmony_ci 120362306a36Sopenharmony_ci/* 120462306a36Sopenharmony_ci * Abort a call due to a protocol error. 120562306a36Sopenharmony_ci */ 120662306a36Sopenharmony_cistatic inline int rxrpc_abort_eproto(struct rxrpc_call *call, 120762306a36Sopenharmony_ci struct sk_buff *skb, 120862306a36Sopenharmony_ci s32 abort_code, 120962306a36Sopenharmony_ci enum rxrpc_abort_reason why) 121062306a36Sopenharmony_ci{ 121162306a36Sopenharmony_ci struct rxrpc_skb_priv *sp = rxrpc_skb(skb); 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_ci rxrpc_abort_call(call, sp->hdr.seq, abort_code, -EPROTO, why); 121462306a36Sopenharmony_ci return -EPROTO; 121562306a36Sopenharmony_ci} 121662306a36Sopenharmony_ci 121762306a36Sopenharmony_ci/* 121862306a36Sopenharmony_ci * rtt.c 121962306a36Sopenharmony_ci */ 122062306a36Sopenharmony_civoid rxrpc_peer_add_rtt(struct rxrpc_call *, enum rxrpc_rtt_rx_trace, int, 122162306a36Sopenharmony_ci rxrpc_serial_t, rxrpc_serial_t, ktime_t, ktime_t); 122262306a36Sopenharmony_ciunsigned long rxrpc_get_rto_backoff(struct rxrpc_peer *, bool); 122362306a36Sopenharmony_civoid rxrpc_peer_init_rtt(struct rxrpc_peer *); 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_ci/* 122662306a36Sopenharmony_ci * rxkad.c 122762306a36Sopenharmony_ci */ 122862306a36Sopenharmony_ci#ifdef CONFIG_RXKAD 122962306a36Sopenharmony_ciextern const struct rxrpc_security rxkad; 123062306a36Sopenharmony_ci#endif 123162306a36Sopenharmony_ci 123262306a36Sopenharmony_ci/* 123362306a36Sopenharmony_ci * security.c 123462306a36Sopenharmony_ci */ 123562306a36Sopenharmony_ciint __init rxrpc_init_security(void); 123662306a36Sopenharmony_ciconst struct rxrpc_security *rxrpc_security_lookup(u8); 123762306a36Sopenharmony_civoid rxrpc_exit_security(void); 123862306a36Sopenharmony_ciint rxrpc_init_client_call_security(struct rxrpc_call *); 123962306a36Sopenharmony_ciint rxrpc_init_client_conn_security(struct rxrpc_connection *); 124062306a36Sopenharmony_ciconst struct rxrpc_security *rxrpc_get_incoming_security(struct rxrpc_sock *, 124162306a36Sopenharmony_ci struct sk_buff *); 124262306a36Sopenharmony_cistruct key *rxrpc_look_up_server_security(struct rxrpc_connection *, 124362306a36Sopenharmony_ci struct sk_buff *, u32, u32); 124462306a36Sopenharmony_ci 124562306a36Sopenharmony_ci/* 124662306a36Sopenharmony_ci * sendmsg.c 124762306a36Sopenharmony_ci */ 124862306a36Sopenharmony_cibool rxrpc_propose_abort(struct rxrpc_call *call, s32 abort_code, int error, 124962306a36Sopenharmony_ci enum rxrpc_abort_reason why); 125062306a36Sopenharmony_ciint rxrpc_do_sendmsg(struct rxrpc_sock *, struct msghdr *, size_t); 125162306a36Sopenharmony_ci 125262306a36Sopenharmony_ci/* 125362306a36Sopenharmony_ci * server_key.c 125462306a36Sopenharmony_ci */ 125562306a36Sopenharmony_ciextern struct key_type key_type_rxrpc_s; 125662306a36Sopenharmony_ci 125762306a36Sopenharmony_ciint rxrpc_server_keyring(struct rxrpc_sock *, sockptr_t, int); 125862306a36Sopenharmony_ci 125962306a36Sopenharmony_ci/* 126062306a36Sopenharmony_ci * skbuff.c 126162306a36Sopenharmony_ci */ 126262306a36Sopenharmony_civoid rxrpc_kernel_data_consumed(struct rxrpc_call *, struct sk_buff *); 126362306a36Sopenharmony_civoid rxrpc_new_skb(struct sk_buff *, enum rxrpc_skb_trace); 126462306a36Sopenharmony_civoid rxrpc_see_skb(struct sk_buff *, enum rxrpc_skb_trace); 126562306a36Sopenharmony_civoid rxrpc_eaten_skb(struct sk_buff *, enum rxrpc_skb_trace); 126662306a36Sopenharmony_civoid rxrpc_get_skb(struct sk_buff *, enum rxrpc_skb_trace); 126762306a36Sopenharmony_civoid rxrpc_free_skb(struct sk_buff *, enum rxrpc_skb_trace); 126862306a36Sopenharmony_civoid rxrpc_purge_queue(struct sk_buff_head *); 126962306a36Sopenharmony_ci 127062306a36Sopenharmony_ci/* 127162306a36Sopenharmony_ci * stats.c 127262306a36Sopenharmony_ci */ 127362306a36Sopenharmony_ciint rxrpc_stats_show(struct seq_file *seq, void *v); 127462306a36Sopenharmony_ciint rxrpc_stats_clear(struct file *file, char *buf, size_t size); 127562306a36Sopenharmony_ci 127662306a36Sopenharmony_ci#define rxrpc_inc_stat(rxnet, s) atomic_inc(&(rxnet)->s) 127762306a36Sopenharmony_ci#define rxrpc_dec_stat(rxnet, s) atomic_dec(&(rxnet)->s) 127862306a36Sopenharmony_ci 127962306a36Sopenharmony_ci/* 128062306a36Sopenharmony_ci * sysctl.c 128162306a36Sopenharmony_ci */ 128262306a36Sopenharmony_ci#ifdef CONFIG_SYSCTL 128362306a36Sopenharmony_ciextern int __init rxrpc_sysctl_init(void); 128462306a36Sopenharmony_ciextern void rxrpc_sysctl_exit(void); 128562306a36Sopenharmony_ci#else 128662306a36Sopenharmony_cistatic inline int __init rxrpc_sysctl_init(void) { return 0; } 128762306a36Sopenharmony_cistatic inline void rxrpc_sysctl_exit(void) {} 128862306a36Sopenharmony_ci#endif 128962306a36Sopenharmony_ci 129062306a36Sopenharmony_ci/* 129162306a36Sopenharmony_ci * txbuf.c 129262306a36Sopenharmony_ci */ 129362306a36Sopenharmony_ciextern atomic_t rxrpc_nr_txbuf; 129462306a36Sopenharmony_cistruct rxrpc_txbuf *rxrpc_alloc_txbuf(struct rxrpc_call *call, u8 packet_type, 129562306a36Sopenharmony_ci gfp_t gfp); 129662306a36Sopenharmony_civoid rxrpc_get_txbuf(struct rxrpc_txbuf *txb, enum rxrpc_txbuf_trace what); 129762306a36Sopenharmony_civoid rxrpc_see_txbuf(struct rxrpc_txbuf *txb, enum rxrpc_txbuf_trace what); 129862306a36Sopenharmony_civoid rxrpc_put_txbuf(struct rxrpc_txbuf *txb, enum rxrpc_txbuf_trace what); 129962306a36Sopenharmony_ci 130062306a36Sopenharmony_ci/* 130162306a36Sopenharmony_ci * utils.c 130262306a36Sopenharmony_ci */ 130362306a36Sopenharmony_ciint rxrpc_extract_addr_from_skb(struct sockaddr_rxrpc *, struct sk_buff *); 130462306a36Sopenharmony_ci 130562306a36Sopenharmony_cistatic inline bool before(u32 seq1, u32 seq2) 130662306a36Sopenharmony_ci{ 130762306a36Sopenharmony_ci return (s32)(seq1 - seq2) < 0; 130862306a36Sopenharmony_ci} 130962306a36Sopenharmony_cistatic inline bool before_eq(u32 seq1, u32 seq2) 131062306a36Sopenharmony_ci{ 131162306a36Sopenharmony_ci return (s32)(seq1 - seq2) <= 0; 131262306a36Sopenharmony_ci} 131362306a36Sopenharmony_cistatic inline bool after(u32 seq1, u32 seq2) 131462306a36Sopenharmony_ci{ 131562306a36Sopenharmony_ci return (s32)(seq1 - seq2) > 0; 131662306a36Sopenharmony_ci} 131762306a36Sopenharmony_cistatic inline bool after_eq(u32 seq1, u32 seq2) 131862306a36Sopenharmony_ci{ 131962306a36Sopenharmony_ci return (s32)(seq1 - seq2) >= 0; 132062306a36Sopenharmony_ci} 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci/* 132362306a36Sopenharmony_ci * debug tracing 132462306a36Sopenharmony_ci */ 132562306a36Sopenharmony_ciextern unsigned int rxrpc_debug; 132662306a36Sopenharmony_ci 132762306a36Sopenharmony_ci#define dbgprintk(FMT,...) \ 132862306a36Sopenharmony_ci printk("[%-6.6s] "FMT"\n", current->comm ,##__VA_ARGS__) 132962306a36Sopenharmony_ci 133062306a36Sopenharmony_ci#define kenter(FMT,...) dbgprintk("==> %s("FMT")",__func__ ,##__VA_ARGS__) 133162306a36Sopenharmony_ci#define kleave(FMT,...) dbgprintk("<== %s()"FMT"",__func__ ,##__VA_ARGS__) 133262306a36Sopenharmony_ci#define kdebug(FMT,...) dbgprintk(" "FMT ,##__VA_ARGS__) 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci 133562306a36Sopenharmony_ci#if defined(__KDEBUG) 133662306a36Sopenharmony_ci#define _enter(FMT,...) kenter(FMT,##__VA_ARGS__) 133762306a36Sopenharmony_ci#define _leave(FMT,...) kleave(FMT,##__VA_ARGS__) 133862306a36Sopenharmony_ci#define _debug(FMT,...) kdebug(FMT,##__VA_ARGS__) 133962306a36Sopenharmony_ci 134062306a36Sopenharmony_ci#elif defined(CONFIG_AF_RXRPC_DEBUG) 134162306a36Sopenharmony_ci#define RXRPC_DEBUG_KENTER 0x01 134262306a36Sopenharmony_ci#define RXRPC_DEBUG_KLEAVE 0x02 134362306a36Sopenharmony_ci#define RXRPC_DEBUG_KDEBUG 0x04 134462306a36Sopenharmony_ci 134562306a36Sopenharmony_ci#define _enter(FMT,...) \ 134662306a36Sopenharmony_cido { \ 134762306a36Sopenharmony_ci if (unlikely(rxrpc_debug & RXRPC_DEBUG_KENTER)) \ 134862306a36Sopenharmony_ci kenter(FMT,##__VA_ARGS__); \ 134962306a36Sopenharmony_ci} while (0) 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_ci#define _leave(FMT,...) \ 135262306a36Sopenharmony_cido { \ 135362306a36Sopenharmony_ci if (unlikely(rxrpc_debug & RXRPC_DEBUG_KLEAVE)) \ 135462306a36Sopenharmony_ci kleave(FMT,##__VA_ARGS__); \ 135562306a36Sopenharmony_ci} while (0) 135662306a36Sopenharmony_ci 135762306a36Sopenharmony_ci#define _debug(FMT,...) \ 135862306a36Sopenharmony_cido { \ 135962306a36Sopenharmony_ci if (unlikely(rxrpc_debug & RXRPC_DEBUG_KDEBUG)) \ 136062306a36Sopenharmony_ci kdebug(FMT,##__VA_ARGS__); \ 136162306a36Sopenharmony_ci} while (0) 136262306a36Sopenharmony_ci 136362306a36Sopenharmony_ci#else 136462306a36Sopenharmony_ci#define _enter(FMT,...) no_printk("==> %s("FMT")",__func__ ,##__VA_ARGS__) 136562306a36Sopenharmony_ci#define _leave(FMT,...) no_printk("<== %s()"FMT"",__func__ ,##__VA_ARGS__) 136662306a36Sopenharmony_ci#define _debug(FMT,...) no_printk(" "FMT ,##__VA_ARGS__) 136762306a36Sopenharmony_ci#endif 136862306a36Sopenharmony_ci 136962306a36Sopenharmony_ci/* 137062306a36Sopenharmony_ci * debug assertion checking 137162306a36Sopenharmony_ci */ 137262306a36Sopenharmony_ci#if 1 // defined(__KDEBUGALL) 137362306a36Sopenharmony_ci 137462306a36Sopenharmony_ci#define ASSERT(X) \ 137562306a36Sopenharmony_cido { \ 137662306a36Sopenharmony_ci if (unlikely(!(X))) { \ 137762306a36Sopenharmony_ci pr_err("Assertion failed\n"); \ 137862306a36Sopenharmony_ci BUG(); \ 137962306a36Sopenharmony_ci } \ 138062306a36Sopenharmony_ci} while (0) 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_ci#define ASSERTCMP(X, OP, Y) \ 138362306a36Sopenharmony_cido { \ 138462306a36Sopenharmony_ci __typeof__(X) _x = (X); \ 138562306a36Sopenharmony_ci __typeof__(Y) _y = (__typeof__(X))(Y); \ 138662306a36Sopenharmony_ci if (unlikely(!(_x OP _y))) { \ 138762306a36Sopenharmony_ci pr_err("Assertion failed - %lu(0x%lx) %s %lu(0x%lx) is false\n", \ 138862306a36Sopenharmony_ci (unsigned long)_x, (unsigned long)_x, #OP, \ 138962306a36Sopenharmony_ci (unsigned long)_y, (unsigned long)_y); \ 139062306a36Sopenharmony_ci BUG(); \ 139162306a36Sopenharmony_ci } \ 139262306a36Sopenharmony_ci} while (0) 139362306a36Sopenharmony_ci 139462306a36Sopenharmony_ci#define ASSERTIF(C, X) \ 139562306a36Sopenharmony_cido { \ 139662306a36Sopenharmony_ci if (unlikely((C) && !(X))) { \ 139762306a36Sopenharmony_ci pr_err("Assertion failed\n"); \ 139862306a36Sopenharmony_ci BUG(); \ 139962306a36Sopenharmony_ci } \ 140062306a36Sopenharmony_ci} while (0) 140162306a36Sopenharmony_ci 140262306a36Sopenharmony_ci#define ASSERTIFCMP(C, X, OP, Y) \ 140362306a36Sopenharmony_cido { \ 140462306a36Sopenharmony_ci __typeof__(X) _x = (X); \ 140562306a36Sopenharmony_ci __typeof__(Y) _y = (__typeof__(X))(Y); \ 140662306a36Sopenharmony_ci if (unlikely((C) && !(_x OP _y))) { \ 140762306a36Sopenharmony_ci pr_err("Assertion failed - %lu(0x%lx) %s %lu(0x%lx) is false\n", \ 140862306a36Sopenharmony_ci (unsigned long)_x, (unsigned long)_x, #OP, \ 140962306a36Sopenharmony_ci (unsigned long)_y, (unsigned long)_y); \ 141062306a36Sopenharmony_ci BUG(); \ 141162306a36Sopenharmony_ci } \ 141262306a36Sopenharmony_ci} while (0) 141362306a36Sopenharmony_ci 141462306a36Sopenharmony_ci#else 141562306a36Sopenharmony_ci 141662306a36Sopenharmony_ci#define ASSERT(X) \ 141762306a36Sopenharmony_cido { \ 141862306a36Sopenharmony_ci} while (0) 141962306a36Sopenharmony_ci 142062306a36Sopenharmony_ci#define ASSERTCMP(X, OP, Y) \ 142162306a36Sopenharmony_cido { \ 142262306a36Sopenharmony_ci} while (0) 142362306a36Sopenharmony_ci 142462306a36Sopenharmony_ci#define ASSERTIF(C, X) \ 142562306a36Sopenharmony_cido { \ 142662306a36Sopenharmony_ci} while (0) 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_ci#define ASSERTIFCMP(C, X, OP, Y) \ 142962306a36Sopenharmony_cido { \ 143062306a36Sopenharmony_ci} while (0) 143162306a36Sopenharmony_ci 143262306a36Sopenharmony_ci#endif /* __KDEBUGALL */ 1433