• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/net/rxrpc/
1/* AF_RXRPC internal definitions
2 *
3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12#include <rxrpc/packet.h>
13
14#define CHECK_SLAB_OKAY(X) do {} while(0)
15
16#define FCRYPT_BSIZE 8
17struct rxrpc_crypt {
18	union {
19		u8	x[FCRYPT_BSIZE];
20		__be32	n[2];
21	};
22} __attribute__((aligned(8)));
23
24#define rxrpc_queue_work(WS)	queue_work(rxrpc_workqueue, (WS))
25#define rxrpc_queue_delayed_work(WS,D)	\
26	queue_delayed_work(rxrpc_workqueue, (WS), (D))
27
28#define rxrpc_queue_call(CALL)	rxrpc_queue_work(&(CALL)->processor)
29#define rxrpc_queue_conn(CONN)	rxrpc_queue_work(&(CONN)->processor)
30
31/*
32 * sk_state for RxRPC sockets
33 */
34enum {
35	RXRPC_UNCONNECTED = 0,
36	RXRPC_CLIENT_BOUND,		/* client local address bound */
37	RXRPC_CLIENT_CONNECTED,		/* client is connected */
38	RXRPC_SERVER_BOUND,		/* server local address bound */
39	RXRPC_SERVER_LISTENING,		/* server listening for connections */
40	RXRPC_CLOSE,			/* socket is being closed */
41};
42
43/*
44 * RxRPC socket definition
45 */
46struct rxrpc_sock {
47	/* WARNING: sk has to be the first member */
48	struct sock		sk;
49	rxrpc_interceptor_t	interceptor;	/* kernel service Rx interceptor function */
50	struct rxrpc_local	*local;		/* local endpoint */
51	struct rxrpc_transport	*trans;		/* transport handler */
52	struct rxrpc_conn_bundle *bundle;	/* virtual connection bundle */
53	struct rxrpc_connection	*conn;		/* exclusive virtual connection */
54	struct list_head	listen_link;	/* link in the local endpoint's listen list */
55	struct list_head	secureq;	/* calls awaiting connection security clearance */
56	struct list_head	acceptq;	/* calls awaiting acceptance */
57	struct key		*key;		/* security for this socket */
58	struct key		*securities;	/* list of server security descriptors */
59	struct rb_root		calls;		/* outstanding calls on this socket */
60	unsigned long		flags;
61#define RXRPC_SOCK_EXCLUSIVE_CONN	1	/* exclusive connection for a client socket */
62	rwlock_t		call_lock;	/* lock for calls */
63	u32			min_sec_level;	/* minimum security level */
64#define RXRPC_SECURITY_MAX	RXRPC_SECURITY_ENCRYPT
65	struct sockaddr_rxrpc	srx;		/* local address */
66	sa_family_t		proto;		/* protocol created with */
67	__be16			service_id;	/* service ID of local/remote service */
68};
69
70#define rxrpc_sk(__sk) container_of((__sk), struct rxrpc_sock, sk)
71
72/*
73 * RxRPC socket buffer private variables
74 * - max 48 bytes (struct sk_buff::cb)
75 */
76struct rxrpc_skb_priv {
77	struct rxrpc_call	*call;		/* call with which associated */
78	unsigned long		resend_at;	/* time in jiffies at which to resend */
79	union {
80		unsigned	offset;		/* offset into buffer of next read */
81		int		remain;		/* amount of space remaining for next write */
82		u32		error;		/* network error code */
83		bool		need_resend;	/* T if needs resending */
84	};
85
86	struct rxrpc_header	hdr;		/* RxRPC packet header from this packet */
87};
88
89#define rxrpc_skb(__skb) ((struct rxrpc_skb_priv *) &(__skb)->cb)
90
91enum rxrpc_command {
92	RXRPC_CMD_SEND_DATA,		/* send data message */
93	RXRPC_CMD_SEND_ABORT,		/* request abort generation */
94	RXRPC_CMD_ACCEPT,		/* [server] accept incoming call */
95	RXRPC_CMD_REJECT_BUSY,		/* [server] reject a call as busy */
96};
97
98/*
99 * RxRPC security module interface
100 */
101struct rxrpc_security {
102	struct module		*owner;		/* providing module */
103	struct list_head	link;		/* link in master list */
104	const char		*name;		/* name of this service */
105	u8			security_index;	/* security type provided */
106
107	/* initialise a connection's security */
108	int (*init_connection_security)(struct rxrpc_connection *);
109
110	/* prime a connection's packet security */
111	void (*prime_packet_security)(struct rxrpc_connection *);
112
113	/* impose security on a packet */
114	int (*secure_packet)(const struct rxrpc_call *,
115			     struct sk_buff *,
116			     size_t,
117			     void *);
118
119	/* verify the security on a received packet */
120	int (*verify_packet)(const struct rxrpc_call *, struct sk_buff *,
121			     u32 *);
122
123	/* issue a challenge */
124	int (*issue_challenge)(struct rxrpc_connection *);
125
126	/* respond to a challenge */
127	int (*respond_to_challenge)(struct rxrpc_connection *,
128				    struct sk_buff *,
129				    u32 *);
130
131	/* verify a response */
132	int (*verify_response)(struct rxrpc_connection *,
133			       struct sk_buff *,
134			       u32 *);
135
136	/* clear connection security */
137	void (*clear)(struct rxrpc_connection *);
138};
139
140/*
141 * RxRPC local transport endpoint definition
142 * - matched by local port, address and protocol type
143 */
144struct rxrpc_local {
145	struct socket		*socket;	/* my UDP socket */
146	struct work_struct	destroyer;	/* endpoint destroyer */
147	struct work_struct	acceptor;	/* incoming call processor */
148	struct work_struct	rejecter;	/* packet reject writer */
149	struct list_head	services;	/* services listening on this endpoint */
150	struct list_head	link;		/* link in endpoint list */
151	struct rw_semaphore	defrag_sem;	/* control re-enablement of IP DF bit */
152	struct sk_buff_head	accept_queue;	/* incoming calls awaiting acceptance */
153	struct sk_buff_head	reject_queue;	/* packets awaiting rejection */
154	spinlock_t		lock;		/* access lock */
155	rwlock_t		services_lock;	/* lock for services list */
156	atomic_t		usage;
157	int			debug_id;	/* debug ID for printks */
158	volatile char		error_rcvd;	/* T if received ICMP error outstanding */
159	struct sockaddr_rxrpc	srx;		/* local address */
160};
161
162/*
163 * RxRPC remote transport endpoint definition
164 * - matched by remote port, address and protocol type
165 * - holds the connection ID counter for connections between the two endpoints
166 */
167struct rxrpc_peer {
168	struct work_struct	destroyer;	/* peer destroyer */
169	struct list_head	link;		/* link in master peer list */
170	struct list_head	error_targets;	/* targets for net error distribution */
171	spinlock_t		lock;		/* access lock */
172	atomic_t		usage;
173	unsigned		if_mtu;		/* interface MTU for this peer */
174	unsigned		mtu;		/* network MTU for this peer */
175	unsigned		maxdata;	/* data size (MTU - hdrsize) */
176	unsigned short		hdrsize;	/* header size (IP + UDP + RxRPC) */
177	int			debug_id;	/* debug ID for printks */
178	int			net_error;	/* network error distributed */
179	struct sockaddr_rxrpc	srx;		/* remote address */
180
181	/* calculated RTT cache */
182#define RXRPC_RTT_CACHE_SIZE 32
183	suseconds_t		rtt;		/* current RTT estimate (in uS) */
184	unsigned		rtt_point;	/* next entry at which to insert */
185	unsigned		rtt_usage;	/* amount of cache actually used */
186	suseconds_t		rtt_cache[RXRPC_RTT_CACHE_SIZE]; /* calculated RTT cache */
187};
188
189/*
190 * RxRPC point-to-point transport / connection manager definition
191 * - handles a bundle of connections between two endpoints
192 * - matched by { local, peer }
193 */
194struct rxrpc_transport {
195	struct rxrpc_local	*local;		/* local transport endpoint */
196	struct rxrpc_peer	*peer;		/* remote transport endpoint */
197	struct work_struct	error_handler;	/* network error distributor */
198	struct rb_root		bundles;	/* client connection bundles on this transport */
199	struct rb_root		client_conns;	/* client connections on this transport */
200	struct rb_root		server_conns;	/* server connections on this transport */
201	struct list_head	link;		/* link in master session list */
202	struct sk_buff_head	error_queue;	/* error packets awaiting processing */
203	time_t			put_time;	/* time at which to reap */
204	spinlock_t		client_lock;	/* client connection allocation lock */
205	rwlock_t		conn_lock;	/* lock for active/dead connections */
206	atomic_t		usage;
207	int			debug_id;	/* debug ID for printks */
208	unsigned int		conn_idcounter;	/* connection ID counter (client) */
209};
210
211/*
212 * RxRPC client connection bundle
213 * - matched by { transport, service_id, key }
214 */
215struct rxrpc_conn_bundle {
216	struct rb_node		node;		/* node in transport's lookup tree */
217	struct list_head	unused_conns;	/* unused connections in this bundle */
218	struct list_head	avail_conns;	/* available connections in this bundle */
219	struct list_head	busy_conns;	/* busy connections in this bundle */
220	struct key		*key;		/* security for this bundle */
221	wait_queue_head_t	chanwait;	/* wait for channel to become available */
222	atomic_t		usage;
223	int			debug_id;	/* debug ID for printks */
224	unsigned short		num_conns;	/* number of connections in this bundle */
225	__be16			service_id;	/* service ID */
226	u8			security_ix;	/* security type */
227};
228
229/*
230 * RxRPC connection definition
231 * - matched by { transport, service_id, conn_id, direction, key }
232 * - each connection can only handle four simultaneous calls
233 */
234struct rxrpc_connection {
235	struct rxrpc_transport	*trans;		/* transport session */
236	struct rxrpc_conn_bundle *bundle;	/* connection bundle (client) */
237	struct work_struct	processor;	/* connection event processor */
238	struct rb_node		node;		/* node in transport's lookup tree */
239	struct list_head	link;		/* link in master connection list */
240	struct list_head	bundle_link;	/* link in bundle */
241	struct rb_root		calls;		/* calls on this connection */
242	struct sk_buff_head	rx_queue;	/* received conn-level packets */
243	struct rxrpc_call	*channels[RXRPC_MAXCALLS]; /* channels (active calls) */
244	struct rxrpc_security	*security;	/* applied security module */
245	struct key		*key;		/* security for this connection (client) */
246	struct key		*server_key;	/* security for this service */
247	struct crypto_blkcipher	*cipher;	/* encryption handle */
248	struct rxrpc_crypt	csum_iv;	/* packet checksum base */
249	unsigned long		events;
250#define RXRPC_CONN_CHALLENGE	0		/* send challenge packet */
251	time_t			put_time;	/* time at which to reap */
252	rwlock_t		lock;		/* access lock */
253	spinlock_t		state_lock;	/* state-change lock */
254	atomic_t		usage;
255	u32			real_conn_id;	/* connection ID (host-endian) */
256	enum {					/* current state of connection */
257		RXRPC_CONN_UNUSED,		/* - connection not yet attempted */
258		RXRPC_CONN_CLIENT,		/* - client connection */
259		RXRPC_CONN_SERVER_UNSECURED,	/* - server unsecured connection */
260		RXRPC_CONN_SERVER_CHALLENGING,	/* - server challenging for security */
261		RXRPC_CONN_SERVER,		/* - server secured connection */
262		RXRPC_CONN_REMOTELY_ABORTED,	/* - conn aborted by peer */
263		RXRPC_CONN_LOCALLY_ABORTED,	/* - conn aborted locally */
264		RXRPC_CONN_NETWORK_ERROR,	/* - conn terminated by network error */
265	} state;
266	int			error;		/* error code for local abort */
267	int			debug_id;	/* debug ID for printks */
268	unsigned		call_counter;	/* call ID counter */
269	atomic_t		serial;		/* packet serial number counter */
270	atomic_t		hi_serial;	/* highest serial number received */
271	u8			avail_calls;	/* number of calls available */
272	u8			size_align;	/* data size alignment (for security) */
273	u8			header_size;	/* rxrpc + security header size */
274	u8			security_size;	/* security header size */
275	u32			security_level;	/* security level negotiated */
276	u32			security_nonce;	/* response re-use preventer */
277
278	/* the following are all in net order */
279	__be32			epoch;		/* epoch of this connection */
280	__be32			cid;		/* connection ID */
281	__be16			service_id;	/* service ID */
282	u8			security_ix;	/* security type */
283	u8			in_clientflag;	/* RXRPC_CLIENT_INITIATED if we are server */
284	u8			out_clientflag;	/* RXRPC_CLIENT_INITIATED if we are client */
285};
286
287/*
288 * RxRPC call definition
289 * - matched by { connection, call_id }
290 */
291struct rxrpc_call {
292	struct rxrpc_connection	*conn;		/* connection carrying call */
293	struct rxrpc_sock	*socket;	/* socket responsible */
294	struct timer_list	lifetimer;	/* lifetime remaining on call */
295	struct timer_list	deadspan;	/* reap timer for re-ACK'ing, etc  */
296	struct timer_list	ack_timer;	/* ACK generation timer */
297	struct timer_list	resend_timer;	/* Tx resend timer */
298	struct work_struct	destroyer;	/* call destroyer */
299	struct work_struct	processor;	/* packet processor and ACK generator */
300	struct list_head	link;		/* link in master call list */
301	struct list_head	error_link;	/* link in error distribution list */
302	struct list_head	accept_link;	/* calls awaiting acceptance */
303	struct rb_node		sock_node;	/* node in socket call tree */
304	struct rb_node		conn_node;	/* node in connection call tree */
305	struct sk_buff_head	rx_queue;	/* received packets */
306	struct sk_buff_head	rx_oos_queue;	/* packets received out of sequence */
307	struct sk_buff		*tx_pending;	/* Tx socket buffer being filled */
308	wait_queue_head_t	tx_waitq;	/* wait for Tx window space to become available */
309	unsigned long		user_call_ID;	/* user-defined call ID */
310	unsigned long		creation_jif;	/* time of call creation */
311	unsigned long		flags;
312#define RXRPC_CALL_RELEASED	0	/* call has been released - no more message to userspace */
313#define RXRPC_CALL_TERMINAL_MSG	1	/* call has given the socket its final message */
314#define RXRPC_CALL_RCVD_LAST	2	/* all packets received */
315#define RXRPC_CALL_RUN_RTIMER	3	/* Tx resend timer started */
316#define RXRPC_CALL_TX_SOFT_ACK	4	/* sent some soft ACKs */
317#define RXRPC_CALL_PROC_BUSY	5	/* the processor is busy */
318#define RXRPC_CALL_INIT_ACCEPT	6	/* acceptance was initiated */
319#define RXRPC_CALL_HAS_USERID	7	/* has a user ID attached */
320#define RXRPC_CALL_EXPECT_OOS	8	/* expect out of sequence packets */
321	unsigned long		events;
322#define RXRPC_CALL_RCVD_ACKALL	0	/* ACKALL or reply received */
323#define RXRPC_CALL_RCVD_BUSY	1	/* busy packet received */
324#define RXRPC_CALL_RCVD_ABORT	2	/* abort packet received */
325#define RXRPC_CALL_RCVD_ERROR	3	/* network error received */
326#define RXRPC_CALL_ACK_FINAL	4	/* need to generate final ACK (and release call) */
327#define RXRPC_CALL_ACK		5	/* need to generate ACK */
328#define RXRPC_CALL_REJECT_BUSY	6	/* need to generate busy message */
329#define RXRPC_CALL_ABORT	7	/* need to generate abort */
330#define RXRPC_CALL_CONN_ABORT	8	/* local connection abort generated */
331#define RXRPC_CALL_RESEND_TIMER	9	/* Tx resend timer expired */
332#define RXRPC_CALL_RESEND	10	/* Tx resend required */
333#define RXRPC_CALL_DRAIN_RX_OOS	11	/* drain the Rx out of sequence queue */
334#define RXRPC_CALL_LIFE_TIMER	12	/* call's lifetimer ran out */
335#define RXRPC_CALL_ACCEPTED	13	/* incoming call accepted by userspace app */
336#define RXRPC_CALL_SECURED	14	/* incoming call's connection is now secure */
337#define RXRPC_CALL_POST_ACCEPT	15	/* need to post an "accept?" message to the app */
338#define RXRPC_CALL_RELEASE	16	/* need to release the call's resources */
339
340	spinlock_t		lock;
341	rwlock_t		state_lock;	/* lock for state transition */
342	atomic_t		usage;
343	atomic_t		sequence;	/* Tx data packet sequence counter */
344	u32			abort_code;	/* local/remote abort code */
345	enum {					/* current state of call */
346		RXRPC_CALL_CLIENT_SEND_REQUEST,	/* - client sending request phase */
347		RXRPC_CALL_CLIENT_AWAIT_REPLY,	/* - client awaiting reply */
348		RXRPC_CALL_CLIENT_RECV_REPLY,	/* - client receiving reply phase */
349		RXRPC_CALL_CLIENT_FINAL_ACK,	/* - client sending final ACK phase */
350		RXRPC_CALL_SERVER_SECURING,	/* - server securing request connection */
351		RXRPC_CALL_SERVER_ACCEPTING,	/* - server accepting request */
352		RXRPC_CALL_SERVER_RECV_REQUEST,	/* - server receiving request */
353		RXRPC_CALL_SERVER_ACK_REQUEST,	/* - server pending ACK of request */
354		RXRPC_CALL_SERVER_SEND_REPLY,	/* - server sending reply */
355		RXRPC_CALL_SERVER_AWAIT_ACK,	/* - server awaiting final ACK */
356		RXRPC_CALL_COMPLETE,		/* - call completed */
357		RXRPC_CALL_SERVER_BUSY,		/* - call rejected by busy server */
358		RXRPC_CALL_REMOTELY_ABORTED,	/* - call aborted by peer */
359		RXRPC_CALL_LOCALLY_ABORTED,	/* - call aborted locally on error or close */
360		RXRPC_CALL_NETWORK_ERROR,	/* - call terminated by network error */
361		RXRPC_CALL_DEAD,		/* - call is dead */
362	} state;
363	int			debug_id;	/* debug ID for printks */
364	u8			channel;	/* connection channel occupied by this call */
365
366	/* transmission-phase ACK management */
367	u8			acks_head;	/* offset into window of first entry */
368	u8			acks_tail;	/* offset into window of last entry */
369	u8			acks_winsz;	/* size of un-ACK'd window */
370	u8			acks_unacked;	/* lowest unacked packet in last ACK received */
371	int			acks_latest;	/* serial number of latest ACK received */
372	rxrpc_seq_t		acks_hard;	/* highest definitively ACK'd msg seq */
373	unsigned long		*acks_window;	/* sent packet window
374						 * - elements are pointers with LSB set if ACK'd
375						 */
376
377	/* receive-phase ACK management */
378	rxrpc_seq_t		rx_data_expect;	/* next data seq ID expected to be received */
379	rxrpc_seq_t		rx_data_post;	/* next data seq ID expected to be posted */
380	rxrpc_seq_t		rx_data_recv;	/* last data seq ID encountered by recvmsg */
381	rxrpc_seq_t		rx_data_eaten;	/* last data seq ID consumed by recvmsg */
382	rxrpc_seq_t		rx_first_oos;	/* first packet in rx_oos_queue (or 0) */
383	rxrpc_seq_t		ackr_win_top;	/* top of ACK window (rx_data_eaten is bottom) */
384	rxrpc_seq_net_t		ackr_prev_seq;	/* previous sequence number received */
385	u8			ackr_reason;	/* reason to ACK */
386	__be32			ackr_serial;	/* serial of packet being ACK'd */
387	atomic_t		ackr_not_idle;	/* number of packets in Rx queue */
388
389	/* received packet records, 1 bit per record */
390#define RXRPC_ACKR_WINDOW_ASZ DIV_ROUND_UP(RXRPC_MAXACKS, BITS_PER_LONG)
391	unsigned long		ackr_window[RXRPC_ACKR_WINDOW_ASZ + 1];
392
393	/* the following should all be in net order */
394	__be32			cid;		/* connection ID + channel index  */
395	__be32			call_id;	/* call ID on connection  */
396};
397
398/*
399 * locally abort an RxRPC call
400 */
401static inline void rxrpc_abort_call(struct rxrpc_call *call, u32 abort_code)
402{
403	write_lock_bh(&call->state_lock);
404	if (call->state < RXRPC_CALL_COMPLETE) {
405		call->abort_code = abort_code;
406		call->state = RXRPC_CALL_LOCALLY_ABORTED;
407		set_bit(RXRPC_CALL_ABORT, &call->events);
408	}
409	write_unlock_bh(&call->state_lock);
410}
411
412/*
413 * af_rxrpc.c
414 */
415extern atomic_t rxrpc_n_skbs;
416extern __be32 rxrpc_epoch;
417extern atomic_t rxrpc_debug_id;
418extern struct workqueue_struct *rxrpc_workqueue;
419
420/*
421 * ar-accept.c
422 */
423extern void rxrpc_accept_incoming_calls(struct work_struct *);
424extern struct rxrpc_call *rxrpc_accept_call(struct rxrpc_sock *,
425					    unsigned long);
426extern int rxrpc_reject_call(struct rxrpc_sock *);
427
428/*
429 * ar-ack.c
430 */
431extern void __rxrpc_propose_ACK(struct rxrpc_call *, u8, __be32, bool);
432extern void rxrpc_propose_ACK(struct rxrpc_call *, u8, __be32, bool);
433extern void rxrpc_process_call(struct work_struct *);
434
435/*
436 * ar-call.c
437 */
438extern struct kmem_cache *rxrpc_call_jar;
439extern struct list_head rxrpc_calls;
440extern rwlock_t rxrpc_call_lock;
441
442extern struct rxrpc_call *rxrpc_get_client_call(struct rxrpc_sock *,
443						struct rxrpc_transport *,
444						struct rxrpc_conn_bundle *,
445						unsigned long, int, gfp_t);
446extern struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *,
447					      struct rxrpc_connection *,
448					      struct rxrpc_header *, gfp_t);
449extern struct rxrpc_call *rxrpc_find_server_call(struct rxrpc_sock *,
450						 unsigned long);
451extern void rxrpc_release_call(struct rxrpc_call *);
452extern void rxrpc_release_calls_on_socket(struct rxrpc_sock *);
453extern void __rxrpc_put_call(struct rxrpc_call *);
454extern void __exit rxrpc_destroy_all_calls(void);
455
456/*
457 * ar-connection.c
458 */
459extern struct list_head rxrpc_connections;
460extern rwlock_t rxrpc_connection_lock;
461
462extern struct rxrpc_conn_bundle *rxrpc_get_bundle(struct rxrpc_sock *,
463						  struct rxrpc_transport *,
464						  struct key *,
465						  __be16, gfp_t);
466extern void rxrpc_put_bundle(struct rxrpc_transport *,
467			     struct rxrpc_conn_bundle *);
468extern int rxrpc_connect_call(struct rxrpc_sock *, struct rxrpc_transport *,
469			      struct rxrpc_conn_bundle *, struct rxrpc_call *,
470			      gfp_t);
471extern void rxrpc_put_connection(struct rxrpc_connection *);
472extern void __exit rxrpc_destroy_all_connections(void);
473extern struct rxrpc_connection *rxrpc_find_connection(struct rxrpc_transport *,
474						      struct rxrpc_header *);
475extern struct rxrpc_connection *
476rxrpc_incoming_connection(struct rxrpc_transport *, struct rxrpc_header *,
477			  gfp_t);
478
479/*
480 * ar-connevent.c
481 */
482extern void rxrpc_process_connection(struct work_struct *);
483extern void rxrpc_reject_packet(struct rxrpc_local *, struct sk_buff *);
484extern void rxrpc_reject_packets(struct work_struct *);
485
486/*
487 * ar-error.c
488 */
489extern void rxrpc_UDP_error_report(struct sock *);
490extern void rxrpc_UDP_error_handler(struct work_struct *);
491
492/*
493 * ar-input.c
494 */
495extern unsigned long rxrpc_ack_timeout;
496extern const char *rxrpc_pkts[];
497
498extern void rxrpc_data_ready(struct sock *, int);
499extern int rxrpc_queue_rcv_skb(struct rxrpc_call *, struct sk_buff *, bool,
500			       bool);
501extern void rxrpc_fast_process_packet(struct rxrpc_call *, struct sk_buff *);
502
503/*
504 * ar-local.c
505 */
506extern rwlock_t rxrpc_local_lock;
507extern struct rxrpc_local *rxrpc_lookup_local(struct sockaddr_rxrpc *);
508extern void rxrpc_put_local(struct rxrpc_local *);
509extern void __exit rxrpc_destroy_all_locals(void);
510
511/*
512 * ar-key.c
513 */
514extern struct key_type key_type_rxrpc;
515extern struct key_type key_type_rxrpc_s;
516
517extern int rxrpc_request_key(struct rxrpc_sock *, char __user *, int);
518extern int rxrpc_server_keyring(struct rxrpc_sock *, char __user *, int);
519extern int rxrpc_get_server_data_key(struct rxrpc_connection *, const void *,
520				     time_t, u32);
521
522/*
523 * ar-output.c
524 */
525extern int rxrpc_resend_timeout;
526
527extern int rxrpc_send_packet(struct rxrpc_transport *, struct sk_buff *);
528extern int rxrpc_client_sendmsg(struct kiocb *, struct rxrpc_sock *,
529				struct rxrpc_transport *, struct msghdr *,
530				size_t);
531extern int rxrpc_server_sendmsg(struct kiocb *, struct rxrpc_sock *,
532				struct msghdr *, size_t);
533
534/*
535 * ar-peer.c
536 */
537extern struct rxrpc_peer *rxrpc_get_peer(struct sockaddr_rxrpc *, gfp_t);
538extern void rxrpc_put_peer(struct rxrpc_peer *);
539extern struct rxrpc_peer *rxrpc_find_peer(struct rxrpc_local *,
540					  __be32, __be16);
541extern void __exit rxrpc_destroy_all_peers(void);
542
543/*
544 * ar-proc.c
545 */
546extern const char *const rxrpc_call_states[];
547extern const struct file_operations rxrpc_call_seq_fops;
548extern const struct file_operations rxrpc_connection_seq_fops;
549
550/*
551 * ar-recvmsg.c
552 */
553extern void rxrpc_remove_user_ID(struct rxrpc_sock *, struct rxrpc_call *);
554extern int rxrpc_recvmsg(struct kiocb *, struct socket *, struct msghdr *,
555			 size_t, int);
556
557/*
558 * ar-security.c
559 */
560extern int rxrpc_register_security(struct rxrpc_security *);
561extern void rxrpc_unregister_security(struct rxrpc_security *);
562extern int rxrpc_init_client_conn_security(struct rxrpc_connection *);
563extern int rxrpc_init_server_conn_security(struct rxrpc_connection *);
564extern int rxrpc_secure_packet(const struct rxrpc_call *, struct sk_buff *,
565			       size_t, void *);
566extern int rxrpc_verify_packet(const struct rxrpc_call *, struct sk_buff *,
567			       u32 *);
568extern void rxrpc_clear_conn_security(struct rxrpc_connection *);
569
570/*
571 * ar-skbuff.c
572 */
573extern void rxrpc_packet_destructor(struct sk_buff *);
574
575/*
576 * ar-transport.c
577 */
578extern struct rxrpc_transport *rxrpc_get_transport(struct rxrpc_local *,
579						   struct rxrpc_peer *,
580						   gfp_t);
581extern void rxrpc_put_transport(struct rxrpc_transport *);
582extern void __exit rxrpc_destroy_all_transports(void);
583extern struct rxrpc_transport *rxrpc_find_transport(struct rxrpc_local *,
584						    struct rxrpc_peer *);
585
586/*
587 * debug tracing
588 */
589extern unsigned rxrpc_debug;
590
591#define dbgprintk(FMT,...) \
592	printk("[%-6.6s] "FMT"\n", current->comm ,##__VA_ARGS__)
593
594#define kenter(FMT,...)	dbgprintk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
595#define kleave(FMT,...)	dbgprintk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
596#define kdebug(FMT,...)	dbgprintk("    "FMT ,##__VA_ARGS__)
597#define kproto(FMT,...)	dbgprintk("### "FMT ,##__VA_ARGS__)
598#define knet(FMT,...)	dbgprintk("@@@ "FMT ,##__VA_ARGS__)
599
600
601#if defined(__KDEBUG)
602#define _enter(FMT,...)	kenter(FMT,##__VA_ARGS__)
603#define _leave(FMT,...)	kleave(FMT,##__VA_ARGS__)
604#define _debug(FMT,...)	kdebug(FMT,##__VA_ARGS__)
605#define _proto(FMT,...)	kproto(FMT,##__VA_ARGS__)
606#define _net(FMT,...)	knet(FMT,##__VA_ARGS__)
607
608#elif defined(CONFIG_AF_RXRPC_DEBUG)
609#define RXRPC_DEBUG_KENTER	0x01
610#define RXRPC_DEBUG_KLEAVE	0x02
611#define RXRPC_DEBUG_KDEBUG	0x04
612#define RXRPC_DEBUG_KPROTO	0x08
613#define RXRPC_DEBUG_KNET	0x10
614
615#define _enter(FMT,...)					\
616do {							\
617	if (unlikely(rxrpc_debug & RXRPC_DEBUG_KENTER))	\
618		kenter(FMT,##__VA_ARGS__);		\
619} while (0)
620
621#define _leave(FMT,...)					\
622do {							\
623	if (unlikely(rxrpc_debug & RXRPC_DEBUG_KLEAVE))	\
624		kleave(FMT,##__VA_ARGS__);		\
625} while (0)
626
627#define _debug(FMT,...)					\
628do {							\
629	if (unlikely(rxrpc_debug & RXRPC_DEBUG_KDEBUG))	\
630		kdebug(FMT,##__VA_ARGS__);		\
631} while (0)
632
633#define _proto(FMT,...)					\
634do {							\
635	if (unlikely(rxrpc_debug & RXRPC_DEBUG_KPROTO))	\
636		kproto(FMT,##__VA_ARGS__);		\
637} while (0)
638
639#define _net(FMT,...)					\
640do {							\
641	if (unlikely(rxrpc_debug & RXRPC_DEBUG_KNET))	\
642		knet(FMT,##__VA_ARGS__);		\
643} while (0)
644
645#else
646#define _enter(FMT,...)	no_printk("==> %s("FMT")",__func__ ,##__VA_ARGS__)
647#define _leave(FMT,...)	no_printk("<== %s()"FMT"",__func__ ,##__VA_ARGS__)
648#define _debug(FMT,...)	no_printk("    "FMT ,##__VA_ARGS__)
649#define _proto(FMT,...)	no_printk("### "FMT ,##__VA_ARGS__)
650#define _net(FMT,...)	no_printk("@@@ "FMT ,##__VA_ARGS__)
651#endif
652
653/*
654 * debug assertion checking
655 */
656
657#define ASSERT(X)						\
658do {								\
659	if (unlikely(!(X))) {					\
660		printk(KERN_ERR "\n");				\
661		printk(KERN_ERR "RxRPC: Assertion failed\n");	\
662		BUG();						\
663	}							\
664} while(0)
665
666#define ASSERTCMP(X, OP, Y)						\
667do {									\
668	if (unlikely(!((X) OP (Y)))) {					\
669		printk(KERN_ERR "\n");					\
670		printk(KERN_ERR "RxRPC: Assertion failed\n");		\
671		printk(KERN_ERR "%lu " #OP " %lu is false\n",		\
672		       (unsigned long)(X), (unsigned long)(Y));		\
673		printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n",	\
674		       (unsigned long)(X), (unsigned long)(Y));		\
675		BUG();							\
676	}								\
677} while(0)
678
679#define ASSERTIF(C, X)						\
680do {								\
681	if (unlikely((C) && !(X))) {				\
682		printk(KERN_ERR "\n");				\
683		printk(KERN_ERR "RxRPC: Assertion failed\n");	\
684		BUG();						\
685	}							\
686} while(0)
687
688#define ASSERTIFCMP(C, X, OP, Y)					\
689do {									\
690	if (unlikely((C) && !((X) OP (Y)))) {				\
691		printk(KERN_ERR "\n");					\
692		printk(KERN_ERR "RxRPC: Assertion failed\n");		\
693		printk(KERN_ERR "%lu " #OP " %lu is false\n",		\
694		       (unsigned long)(X), (unsigned long)(Y));		\
695		printk(KERN_ERR "0x%lx " #OP " 0x%lx is false\n",	\
696		       (unsigned long)(X), (unsigned long)(Y));		\
697		BUG();							\
698	}								\
699} while(0)
700
701/*
702 * socket buffer accounting / leak finding
703 */
704static inline void __rxrpc_new_skb(struct sk_buff *skb, const char *fn)
705{
706	//_net("new skb %p %s [%d]", skb, fn, atomic_read(&rxrpc_n_skbs));
707	//atomic_inc(&rxrpc_n_skbs);
708}
709
710#define rxrpc_new_skb(skb) __rxrpc_new_skb((skb), __func__)
711
712static inline void __rxrpc_kill_skb(struct sk_buff *skb, const char *fn)
713{
714	//_net("kill skb %p %s [%d]", skb, fn, atomic_read(&rxrpc_n_skbs));
715	//atomic_dec(&rxrpc_n_skbs);
716}
717
718#define rxrpc_kill_skb(skb) __rxrpc_kill_skb((skb), __func__)
719
720static inline void __rxrpc_free_skb(struct sk_buff *skb, const char *fn)
721{
722	if (skb) {
723		CHECK_SLAB_OKAY(&skb->users);
724		//_net("free skb %p %s [%d]",
725		//     skb, fn, atomic_read(&rxrpc_n_skbs));
726		//atomic_dec(&rxrpc_n_skbs);
727		kfree_skb(skb);
728	}
729}
730
731#define rxrpc_free_skb(skb) __rxrpc_free_skb((skb), __func__)
732
733static inline void rxrpc_purge_queue(struct sk_buff_head *list)
734{
735	struct sk_buff *skb;
736	while ((skb = skb_dequeue((list))) != NULL)
737		rxrpc_free_skb(skb);
738}
739
740static inline void __rxrpc_get_local(struct rxrpc_local *local, const char *f)
741{
742	CHECK_SLAB_OKAY(&local->usage);
743	if (atomic_inc_return(&local->usage) == 1)
744		printk("resurrected (%s)\n", f);
745}
746
747#define rxrpc_get_local(LOCAL) __rxrpc_get_local((LOCAL), __func__)
748
749#define rxrpc_get_call(CALL)				\
750do {							\
751	CHECK_SLAB_OKAY(&(CALL)->usage);		\
752	if (atomic_inc_return(&(CALL)->usage) == 1)	\
753		BUG();					\
754} while(0)
755
756#define rxrpc_put_call(CALL)				\
757do {							\
758	__rxrpc_put_call(CALL);				\
759} while(0)
760