| 1 |
|
| 2 | |
| 3 | * INET An implementation of the TCP/IP protocol suite for the LINUX
|
| 4 | * operating system. INET is implemented using the BSD Socket
|
| 5 | * interface as the means of communication with the user level.
|
| 6 | *
|
| 7 | * Definitions for a generic INET TIMEWAIT sock
|
| 8 | *
|
| 9 | * From code originally in net/tcp.h
|
| 10 |
|
| 11 | #ifndef _INET_TIMEWAIT_SOCK_
|
| 12 | #define _INET_TIMEWAIT_SOCK_
|
| 13 |
|
| 14 | #include <linux/list.h>
|
| 15 | #include <linux/timer.h>
|
| 16 | #include <linux/types.h>
|
| 17 | #include <linux/workqueue.h>
|
| 18 |
|
| 19 | #include <net/inet_sock.h>
|
| 20 | #include <net/sock.h>
|
| 21 | #include <net/tcp_states.h>
|
| 22 | #include <net/timewait_sock.h>
|
| 23 |
|
| 24 | #include <linux/atomic.h>
|
| 25 |
|
| 26 | struct inet_bind_bucket;
|
| 27 |
|
| 28 | |
| 29 | * This is a TIME_WAIT sock. It works around the memory consumption
|
| 30 | * problems of sockets in such a state on heavily loaded servers, but
|
| 31 | * without violating the protocol specification.
|
| 32 |
|
| 33 | struct inet_timewait_sock {
|
| 34 | |
| 35 | * Now struct sock also uses sock_common, so please just
|
| 36 | * don't add nothing before this first member (__tw_common) --acme
|
| 37 |
|
| 38 | struct sock_common __tw_common;
|
| 39 | #define tw_family __tw_common.skc_family
|
| 40 | #define tw_state __tw_common.skc_state
|
| 41 | #define tw_reuse __tw_common.skc_reuse
|
| 42 | #define tw_reuseport __tw_common.skc_reuseport
|
| 43 | #define tw_ipv6only __tw_common.skc_ipv6only
|
| 44 | #define tw_bound_dev_if __tw_common.skc_bound_dev_if
|
| 45 | #define tw_node __tw_common.skc_nulls_node
|
| 46 | #define tw_bind_node __tw_common.skc_bind_node
|
| 47 | #define tw_refcnt __tw_common.skc_refcnt
|
| 48 | #define tw_tx_queue_mapping __tw_common.skc_tx_queue_mapping
|
| 49 | #define tw_rx_queue_mapping __tw_common.skc_rx_queue_mapping
|
| 50 | #define tw_hash __tw_common.skc_hash
|
| 51 | #define tw_prot __tw_common.skc_prot
|
| 52 | #define tw_net __tw_common.skc_net
|
| 53 | #define tw_daddr __tw_common.skc_daddr
|
| 54 | #define tw_v6_daddr __tw_common.skc_v6_daddr
|
| 55 | #define tw_rcv_saddr __tw_common.skc_rcv_saddr
|
| 56 | #define tw_v6_rcv_saddr __tw_common.skc_v6_rcv_saddr
|
| 57 | #define tw_dport __tw_common.skc_dport
|
| 58 | #define tw_num __tw_common.skc_num
|
| 59 | #define tw_cookie __tw_common.skc_cookie
|
| 60 | #define tw_dr __tw_common.skc_tw_dr
|
| 61 |
|
| 62 | __u32 tw_mark;
|
| 63 | unsigned char tw_substate;
|
| 64 | unsigned char tw_rcv_wscale;
|
| 65 |
|
| 66 |
|
| 67 |
|
| 68 | __be16 tw_sport;
|
| 69 |
|
| 70 | unsigned int tw_transparent : 1,
|
| 71 | tw_flowlabel : 20,
|
| 72 | tw_usec_ts : 1,
|
| 73 | tw_connect_bind : 1,
|
| 74 | tw_pad : 1,
|
| 75 | tw_tos : 8;
|
| 76 | u32 tw_txhash;
|
| 77 | u32 tw_priority;
|
| 78 | |
| 79 | * @tw_reuse_stamp: Time of entry into %TCP_TIME_WAIT state in msec.
|
| 80 |
|
| 81 | u32 tw_entry_stamp;
|
| 82 | struct timer_list tw_timer;
|
| 83 | struct inet_bind_bucket *tw_tb;
|
| 84 | struct inet_bind2_bucket *tw_tb2;
|
| 85 | #if IS_ENABLED(CONFIG_INET_PSP)
|
| 86 | struct psp_assoc __rcu *psp_assoc;
|
| 87 | #endif
|
| 88 | #ifdef CONFIG_SOCK_VALIDATE_XMIT
|
| 89 | struct sk_buff* (*tw_validate_xmit_skb)(struct sock *sk,
|
| 90 | struct net_device *dev,
|
| 91 | struct sk_buff *skb);
|
| 92 | #endif
|
| 93 | };
|
| 94 | #define tw_tclass tw_tos
|
| 95 |
|
| 96 | static inline struct inet_timewait_sock *inet_twsk(const struct sock *sk)
|
| 97 | {
|
| 98 | return (struct inet_timewait_sock *)sk;
|
| 99 | }
|
| 100 |
|
| 101 | void inet_twsk_free(struct inet_timewait_sock *tw);
|
| 102 | void inet_twsk_put(struct inet_timewait_sock *tw);
|
| 103 |
|
| 104 | void inet_twsk_bind_unhash(struct inet_timewait_sock *tw,
|
| 105 | struct inet_hashinfo *hashinfo);
|
| 106 |
|
| 107 | struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk,
|
| 108 | struct inet_timewait_death_row *dr,
|
| 109 | const int state);
|
| 110 |
|
| 111 | void inet_twsk_hashdance_schedule(struct inet_timewait_sock *tw,
|
| 112 | struct sock *sk,
|
| 113 | struct inet_hashinfo *hashinfo,
|
| 114 | int timeo);
|
| 115 |
|
| 116 | void __inet_twsk_schedule(struct inet_timewait_sock *tw, int timeo,
|
| 117 | bool rearm);
|
| 118 |
|
| 119 | static inline void inet_twsk_reschedule(struct inet_timewait_sock *tw, int timeo)
|
| 120 | {
|
| 121 | __inet_twsk_schedule(tw, timeo, true);
|
| 122 | }
|
| 123 |
|
| 124 | void inet_twsk_deschedule_put(struct inet_timewait_sock *tw);
|
| 125 |
|
| 126 | void inet_twsk_purge(struct inet_hashinfo *hashinfo);
|
| 127 |
|
| 128 | static inline
|
| 129 | struct net *twsk_net(const struct inet_timewait_sock *twsk)
|
| 130 | {
|
| 131 | return read_pnet(&twsk->tw_net);
|
| 132 | }
|
| 133 |
|
| 134 | static inline
|
| 135 | void twsk_net_set(struct inet_timewait_sock *twsk, struct net *net)
|
| 136 | {
|
| 137 | write_pnet(&twsk->tw_net, net);
|
| 138 | }
|
| 139 | #endif
|