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