xref: /linux-6.15/include/net/request_sock.h (revision 2e6599cb)
1*2e6599cbSArnaldo Carvalho de Melo /*
2*2e6599cbSArnaldo Carvalho de Melo  * NET		Generic infrastructure for Network protocols.
3*2e6599cbSArnaldo Carvalho de Melo  *
4*2e6599cbSArnaldo Carvalho de Melo  *		Definitions for request_sock
5*2e6599cbSArnaldo Carvalho de Melo  *
6*2e6599cbSArnaldo Carvalho de Melo  * Authors:	Arnaldo Carvalho de Melo <[email protected]>
7*2e6599cbSArnaldo Carvalho de Melo  *
8*2e6599cbSArnaldo Carvalho de Melo  * 		From code originally in include/net/tcp.h
9*2e6599cbSArnaldo Carvalho de Melo  *
10*2e6599cbSArnaldo Carvalho de Melo  *		This program is free software; you can redistribute it and/or
11*2e6599cbSArnaldo Carvalho de Melo  *		modify it under the terms of the GNU General Public License
12*2e6599cbSArnaldo Carvalho de Melo  *		as published by the Free Software Foundation; either version
13*2e6599cbSArnaldo Carvalho de Melo  *		2 of the License, or (at your option) any later version.
14*2e6599cbSArnaldo Carvalho de Melo  */
15*2e6599cbSArnaldo Carvalho de Melo #ifndef _REQUEST_SOCK_H
16*2e6599cbSArnaldo Carvalho de Melo #define _REQUEST_SOCK_H
17*2e6599cbSArnaldo Carvalho de Melo 
18*2e6599cbSArnaldo Carvalho de Melo #include <linux/slab.h>
19*2e6599cbSArnaldo Carvalho de Melo #include <linux/types.h>
20*2e6599cbSArnaldo Carvalho de Melo #include <net/sock.h>
21*2e6599cbSArnaldo Carvalho de Melo 
22*2e6599cbSArnaldo Carvalho de Melo struct open_request;
23*2e6599cbSArnaldo Carvalho de Melo struct sk_buff;
24*2e6599cbSArnaldo Carvalho de Melo struct dst_entry;
25*2e6599cbSArnaldo Carvalho de Melo struct proto;
26*2e6599cbSArnaldo Carvalho de Melo 
27*2e6599cbSArnaldo Carvalho de Melo struct or_calltable {
28*2e6599cbSArnaldo Carvalho de Melo 	int		family;
29*2e6599cbSArnaldo Carvalho de Melo 	kmem_cache_t	*slab;
30*2e6599cbSArnaldo Carvalho de Melo 	int		obj_size;
31*2e6599cbSArnaldo Carvalho de Melo 	int		(*rtx_syn_ack)(struct sock *sk,
32*2e6599cbSArnaldo Carvalho de Melo 				       struct open_request *req,
33*2e6599cbSArnaldo Carvalho de Melo 				       struct dst_entry *dst);
34*2e6599cbSArnaldo Carvalho de Melo 	void		(*send_ack)(struct sk_buff *skb,
35*2e6599cbSArnaldo Carvalho de Melo 				    struct open_request *req);
36*2e6599cbSArnaldo Carvalho de Melo 	void		(*send_reset)(struct sk_buff *skb);
37*2e6599cbSArnaldo Carvalho de Melo 	void		(*destructor)(struct open_request *req);
38*2e6599cbSArnaldo Carvalho de Melo };
39*2e6599cbSArnaldo Carvalho de Melo 
40*2e6599cbSArnaldo Carvalho de Melo /* struct open_request - mini sock to represent a connection request
41*2e6599cbSArnaldo Carvalho de Melo  */
42*2e6599cbSArnaldo Carvalho de Melo struct open_request {
43*2e6599cbSArnaldo Carvalho de Melo 	struct open_request		*dl_next; /* Must be first member! */
44*2e6599cbSArnaldo Carvalho de Melo 	u16				mss;
45*2e6599cbSArnaldo Carvalho de Melo 	u8				retrans;
46*2e6599cbSArnaldo Carvalho de Melo 	u8				__pad;
47*2e6599cbSArnaldo Carvalho de Melo 	/* The following two fields can be easily recomputed I think -AK */
48*2e6599cbSArnaldo Carvalho de Melo 	u32				window_clamp; /* window clamp at creation time */
49*2e6599cbSArnaldo Carvalho de Melo 	u32				rcv_wnd;	  /* rcv_wnd offered first time */
50*2e6599cbSArnaldo Carvalho de Melo 	u32				ts_recent;
51*2e6599cbSArnaldo Carvalho de Melo 	unsigned long			expires;
52*2e6599cbSArnaldo Carvalho de Melo 	struct or_calltable		*class;
53*2e6599cbSArnaldo Carvalho de Melo 	struct sock			*sk;
54*2e6599cbSArnaldo Carvalho de Melo };
55*2e6599cbSArnaldo Carvalho de Melo 
56*2e6599cbSArnaldo Carvalho de Melo static inline struct open_request *tcp_openreq_alloc(struct or_calltable *class)
57*2e6599cbSArnaldo Carvalho de Melo {
58*2e6599cbSArnaldo Carvalho de Melo 	struct open_request *req = kmem_cache_alloc(class->slab, SLAB_ATOMIC);
59*2e6599cbSArnaldo Carvalho de Melo 
60*2e6599cbSArnaldo Carvalho de Melo 	if (req != NULL)
61*2e6599cbSArnaldo Carvalho de Melo 		req->class = class;
62*2e6599cbSArnaldo Carvalho de Melo 
63*2e6599cbSArnaldo Carvalho de Melo 	return req;
64*2e6599cbSArnaldo Carvalho de Melo }
65*2e6599cbSArnaldo Carvalho de Melo 
66*2e6599cbSArnaldo Carvalho de Melo static inline void tcp_openreq_fastfree(struct open_request *req)
67*2e6599cbSArnaldo Carvalho de Melo {
68*2e6599cbSArnaldo Carvalho de Melo 	kmem_cache_free(req->class->slab, req);
69*2e6599cbSArnaldo Carvalho de Melo }
70*2e6599cbSArnaldo Carvalho de Melo 
71*2e6599cbSArnaldo Carvalho de Melo static inline void tcp_openreq_free(struct open_request *req)
72*2e6599cbSArnaldo Carvalho de Melo {
73*2e6599cbSArnaldo Carvalho de Melo 	req->class->destructor(req);
74*2e6599cbSArnaldo Carvalho de Melo 	tcp_openreq_fastfree(req);
75*2e6599cbSArnaldo Carvalho de Melo }
76*2e6599cbSArnaldo Carvalho de Melo 
77*2e6599cbSArnaldo Carvalho de Melo #endif /* _REQUEST_SOCK_H */
78