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