xref: /linux-6.15/include/net/request_sock.h (revision 60236fdd)
12e6599cbSArnaldo Carvalho de Melo /*
22e6599cbSArnaldo Carvalho de Melo  * NET		Generic infrastructure for Network protocols.
32e6599cbSArnaldo Carvalho de Melo  *
42e6599cbSArnaldo Carvalho de Melo  *		Definitions for request_sock
52e6599cbSArnaldo Carvalho de Melo  *
62e6599cbSArnaldo Carvalho de Melo  * Authors:	Arnaldo Carvalho de Melo <[email protected]>
72e6599cbSArnaldo Carvalho de Melo  *
82e6599cbSArnaldo Carvalho de Melo  * 		From code originally in include/net/tcp.h
92e6599cbSArnaldo Carvalho de Melo  *
102e6599cbSArnaldo Carvalho de Melo  *		This program is free software; you can redistribute it and/or
112e6599cbSArnaldo Carvalho de Melo  *		modify it under the terms of the GNU General Public License
122e6599cbSArnaldo Carvalho de Melo  *		as published by the Free Software Foundation; either version
132e6599cbSArnaldo Carvalho de Melo  *		2 of the License, or (at your option) any later version.
142e6599cbSArnaldo Carvalho de Melo  */
152e6599cbSArnaldo Carvalho de Melo #ifndef _REQUEST_SOCK_H
162e6599cbSArnaldo Carvalho de Melo #define _REQUEST_SOCK_H
172e6599cbSArnaldo Carvalho de Melo 
182e6599cbSArnaldo Carvalho de Melo #include <linux/slab.h>
192e6599cbSArnaldo Carvalho de Melo #include <linux/types.h>
202e6599cbSArnaldo Carvalho de Melo #include <net/sock.h>
212e6599cbSArnaldo Carvalho de Melo 
22*60236fddSArnaldo Carvalho de Melo struct request_sock;
232e6599cbSArnaldo Carvalho de Melo struct sk_buff;
242e6599cbSArnaldo Carvalho de Melo struct dst_entry;
252e6599cbSArnaldo Carvalho de Melo struct proto;
262e6599cbSArnaldo Carvalho de Melo 
27*60236fddSArnaldo Carvalho de Melo struct request_sock_ops {
282e6599cbSArnaldo Carvalho de Melo 	int		family;
292e6599cbSArnaldo Carvalho de Melo 	kmem_cache_t	*slab;
302e6599cbSArnaldo Carvalho de Melo 	int		obj_size;
312e6599cbSArnaldo Carvalho de Melo 	int		(*rtx_syn_ack)(struct sock *sk,
32*60236fddSArnaldo Carvalho de Melo 				       struct request_sock *req,
332e6599cbSArnaldo Carvalho de Melo 				       struct dst_entry *dst);
342e6599cbSArnaldo Carvalho de Melo 	void		(*send_ack)(struct sk_buff *skb,
35*60236fddSArnaldo Carvalho de Melo 				    struct request_sock *req);
362e6599cbSArnaldo Carvalho de Melo 	void		(*send_reset)(struct sk_buff *skb);
37*60236fddSArnaldo Carvalho de Melo 	void		(*destructor)(struct request_sock *req);
382e6599cbSArnaldo Carvalho de Melo };
392e6599cbSArnaldo Carvalho de Melo 
40*60236fddSArnaldo Carvalho de Melo /* struct request_sock - mini sock to represent a connection request
412e6599cbSArnaldo Carvalho de Melo  */
42*60236fddSArnaldo Carvalho de Melo struct request_sock {
43*60236fddSArnaldo Carvalho de Melo 	struct request_sock		*dl_next; /* Must be first member! */
442e6599cbSArnaldo Carvalho de Melo 	u16				mss;
452e6599cbSArnaldo Carvalho de Melo 	u8				retrans;
462e6599cbSArnaldo Carvalho de Melo 	u8				__pad;
472e6599cbSArnaldo Carvalho de Melo 	/* The following two fields can be easily recomputed I think -AK */
482e6599cbSArnaldo Carvalho de Melo 	u32				window_clamp; /* window clamp at creation time */
492e6599cbSArnaldo Carvalho de Melo 	u32				rcv_wnd;	  /* rcv_wnd offered first time */
502e6599cbSArnaldo Carvalho de Melo 	u32				ts_recent;
512e6599cbSArnaldo Carvalho de Melo 	unsigned long			expires;
52*60236fddSArnaldo Carvalho de Melo 	struct request_sock_ops		*rsk_ops;
532e6599cbSArnaldo Carvalho de Melo 	struct sock			*sk;
542e6599cbSArnaldo Carvalho de Melo };
552e6599cbSArnaldo Carvalho de Melo 
56*60236fddSArnaldo Carvalho de Melo static inline struct request_sock *reqsk_alloc(struct request_sock_ops *ops)
572e6599cbSArnaldo Carvalho de Melo {
58*60236fddSArnaldo Carvalho de Melo 	struct request_sock *req = kmem_cache_alloc(ops->slab, SLAB_ATOMIC);
592e6599cbSArnaldo Carvalho de Melo 
602e6599cbSArnaldo Carvalho de Melo 	if (req != NULL)
61*60236fddSArnaldo Carvalho de Melo 		req->rsk_ops = ops;
622e6599cbSArnaldo Carvalho de Melo 
632e6599cbSArnaldo Carvalho de Melo 	return req;
642e6599cbSArnaldo Carvalho de Melo }
652e6599cbSArnaldo Carvalho de Melo 
66*60236fddSArnaldo Carvalho de Melo static inline void __reqsk_free(struct request_sock *req)
672e6599cbSArnaldo Carvalho de Melo {
68*60236fddSArnaldo Carvalho de Melo 	kmem_cache_free(req->rsk_ops->slab, req);
692e6599cbSArnaldo Carvalho de Melo }
702e6599cbSArnaldo Carvalho de Melo 
71*60236fddSArnaldo Carvalho de Melo static inline void reqsk_free(struct request_sock *req)
722e6599cbSArnaldo Carvalho de Melo {
73*60236fddSArnaldo Carvalho de Melo 	req->rsk_ops->destructor(req);
74*60236fddSArnaldo Carvalho de Melo 	__reqsk_free(req);
752e6599cbSArnaldo Carvalho de Melo }
762e6599cbSArnaldo Carvalho de Melo 
772e6599cbSArnaldo Carvalho de Melo #endif /* _REQUEST_SOCK_H */
78