tcp_ipv4.c (e21e696edb498c7f7eed42ba3096f6bbe13927b6) tcp_ipv4.c (3ab5aee7fe840b5b1b35a8d1ac11c3de5281e611)
1/*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Implementation of the Transmission Control Protocol(TCP).
7 *
8 * IPv4 specific functions

--- 1125 unchanged lines hidden (view full) ---

1134 * so we need to calculate the checksum.
1135 */
1136 genhash = tcp_v4_md5_hash_skb(newhash,
1137 hash_expected,
1138 NULL, NULL, skb);
1139
1140 if (genhash || memcmp(hash_location, newhash, 16) != 0) {
1141 if (net_ratelimit()) {
1/*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Implementation of the Transmission Control Protocol(TCP).
7 *
8 * IPv4 specific functions

--- 1125 unchanged lines hidden (view full) ---

1134 * so we need to calculate the checksum.
1135 */
1136 genhash = tcp_v4_md5_hash_skb(newhash,
1137 hash_expected,
1138 NULL, NULL, skb);
1139
1140 if (genhash || memcmp(hash_location, newhash, 16) != 0) {
1141 if (net_ratelimit()) {
1142 printk(KERN_INFO "MD5 Hash failed for "
1143 "(" NIPQUAD_FMT ", %d)->(" NIPQUAD_FMT ", %d)%s\n",
1144 NIPQUAD(iph->saddr), ntohs(th->source),
1145 NIPQUAD(iph->daddr), ntohs(th->dest),
1142 printk(KERN_INFO "MD5 Hash failed for (%pI4, %d)->(%pI4, %d)%s\n",
1143 &iph->saddr, ntohs(th->source),
1144 &iph->daddr, ntohs(th->dest),
1146 genhash ? " tcp_v4_calc_md5_hash failed" : "");
1147 }
1148 return 1;
1149 }
1150 return 0;
1151}
1152
1153#endif

--- 138 unchanged lines hidden (view full) ---

1292 (!dst || !dst_metric(dst, RTAX_RTT))) {
1293 /* Without syncookies last quarter of
1294 * backlog is filled with destinations,
1295 * proven to be alive.
1296 * It means that we continue to communicate
1297 * to destinations, already remembered
1298 * to the moment of synflood.
1299 */
1145 genhash ? " tcp_v4_calc_md5_hash failed" : "");
1146 }
1147 return 1;
1148 }
1149 return 0;
1150}
1151
1152#endif

--- 138 unchanged lines hidden (view full) ---

1291 (!dst || !dst_metric(dst, RTAX_RTT))) {
1292 /* Without syncookies last quarter of
1293 * backlog is filled with destinations,
1294 * proven to be alive.
1295 * It means that we continue to communicate
1296 * to destinations, already remembered
1297 * to the moment of synflood.
1298 */
1300 LIMIT_NETDEBUG(KERN_DEBUG "TCP: drop open "
1301 "request from " NIPQUAD_FMT "/%u\n",
1302 NIPQUAD(saddr),
1303 ntohs(tcp_hdr(skb)->source));
1299 LIMIT_NETDEBUG(KERN_DEBUG "TCP: drop open request from %pI4/%u\n",
1300 &saddr, ntohs(tcp_hdr(skb)->source));
1304 goto drop_and_release;
1305 }
1306
1307 isn = tcp_v4_init_sequence(skb);
1308 }
1309 tcp_rsk(req)->snt_isn = isn;
1310
1311 if (__tcp_v4_send_synack(sk, req, dst) || want_cookie)

--- 543 unchanged lines hidden (view full) ---

1855 atomic_dec(&tcp_sockets_allocated);
1856}
1857
1858EXPORT_SYMBOL(tcp_v4_destroy_sock);
1859
1860#ifdef CONFIG_PROC_FS
1861/* Proc filesystem TCP sock list dumping. */
1862
1301 goto drop_and_release;
1302 }
1303
1304 isn = tcp_v4_init_sequence(skb);
1305 }
1306 tcp_rsk(req)->snt_isn = isn;
1307
1308 if (__tcp_v4_send_synack(sk, req, dst) || want_cookie)

--- 543 unchanged lines hidden (view full) ---

1852 atomic_dec(&tcp_sockets_allocated);
1853}
1854
1855EXPORT_SYMBOL(tcp_v4_destroy_sock);
1856
1857#ifdef CONFIG_PROC_FS
1858/* Proc filesystem TCP sock list dumping. */
1859
1863static inline struct inet_timewait_sock *tw_head(struct hlist_head *head)
1860static inline struct inet_timewait_sock *tw_head(struct hlist_nulls_head *head)
1864{
1861{
1865 return hlist_empty(head) ? NULL :
1862 return hlist_nulls_empty(head) ? NULL :
1866 list_entry(head->first, struct inet_timewait_sock, tw_node);
1867}
1868
1869static inline struct inet_timewait_sock *tw_next(struct inet_timewait_sock *tw)
1870{
1863 list_entry(head->first, struct inet_timewait_sock, tw_node);
1864}
1865
1866static inline struct inet_timewait_sock *tw_next(struct inet_timewait_sock *tw)
1867{
1871 return tw->tw_node.next ?
1872 hlist_entry(tw->tw_node.next, typeof(*tw), tw_node) : NULL;
1868 return !is_a_nulls(tw->tw_node.next) ?
1869 hlist_nulls_entry(tw->tw_node.next, typeof(*tw), tw_node) : NULL;
1873}
1874
1875static void *listening_get_next(struct seq_file *seq, void *cur)
1876{
1877 struct inet_connection_sock *icsk;
1878 struct hlist_node *node;
1879 struct sock *sk = cur;
1870}
1871
1872static void *listening_get_next(struct seq_file *seq, void *cur)
1873{
1874 struct inet_connection_sock *icsk;
1875 struct hlist_node *node;
1876 struct sock *sk = cur;
1880 struct tcp_iter_state* st = seq->private;
1877 struct tcp_iter_state *st = seq->private;
1881 struct net *net = seq_file_net(seq);
1882
1883 if (!sk) {
1884 st->bucket = 0;
1885 sk = sk_head(&tcp_hashinfo.listening_hash[0]);
1886 goto get_sk;
1887 }
1888

--- 63 unchanged lines hidden (view full) ---

1952 rc = listening_get_next(seq, rc);
1953 --*pos;
1954 }
1955 return rc;
1956}
1957
1958static inline int empty_bucket(struct tcp_iter_state *st)
1959{
1878 struct net *net = seq_file_net(seq);
1879
1880 if (!sk) {
1881 st->bucket = 0;
1882 sk = sk_head(&tcp_hashinfo.listening_hash[0]);
1883 goto get_sk;
1884 }
1885

--- 63 unchanged lines hidden (view full) ---

1949 rc = listening_get_next(seq, rc);
1950 --*pos;
1951 }
1952 return rc;
1953}
1954
1955static inline int empty_bucket(struct tcp_iter_state *st)
1956{
1960 return hlist_empty(&tcp_hashinfo.ehash[st->bucket].chain) &&
1961 hlist_empty(&tcp_hashinfo.ehash[st->bucket].twchain);
1957 return hlist_nulls_empty(&tcp_hashinfo.ehash[st->bucket].chain) &&
1958 hlist_nulls_empty(&tcp_hashinfo.ehash[st->bucket].twchain);
1962}
1963
1964static void *established_get_first(struct seq_file *seq)
1965{
1959}
1960
1961static void *established_get_first(struct seq_file *seq)
1962{
1966 struct tcp_iter_state* st = seq->private;
1963 struct tcp_iter_state *st = seq->private;
1967 struct net *net = seq_file_net(seq);
1968 void *rc = NULL;
1969
1970 for (st->bucket = 0; st->bucket < tcp_hashinfo.ehash_size; ++st->bucket) {
1971 struct sock *sk;
1964 struct net *net = seq_file_net(seq);
1965 void *rc = NULL;
1966
1967 for (st->bucket = 0; st->bucket < tcp_hashinfo.ehash_size; ++st->bucket) {
1968 struct sock *sk;
1972 struct hlist_node *node;
1969 struct hlist_nulls_node *node;
1973 struct inet_timewait_sock *tw;
1974 rwlock_t *lock = inet_ehash_lockp(&tcp_hashinfo, st->bucket);
1975
1976 /* Lockless fast path for the common case of empty buckets */
1977 if (empty_bucket(st))
1978 continue;
1979
1980 read_lock_bh(lock);
1970 struct inet_timewait_sock *tw;
1971 rwlock_t *lock = inet_ehash_lockp(&tcp_hashinfo, st->bucket);
1972
1973 /* Lockless fast path for the common case of empty buckets */
1974 if (empty_bucket(st))
1975 continue;
1976
1977 read_lock_bh(lock);
1981 sk_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) {
1978 sk_nulls_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) {
1982 if (sk->sk_family != st->family ||
1983 !net_eq(sock_net(sk), net)) {
1984 continue;
1985 }
1986 rc = sk;
1987 goto out;
1988 }
1989 st->state = TCP_SEQ_STATE_TIME_WAIT;

--- 12 unchanged lines hidden (view full) ---

2002out:
2003 return rc;
2004}
2005
2006static void *established_get_next(struct seq_file *seq, void *cur)
2007{
2008 struct sock *sk = cur;
2009 struct inet_timewait_sock *tw;
1979 if (sk->sk_family != st->family ||
1980 !net_eq(sock_net(sk), net)) {
1981 continue;
1982 }
1983 rc = sk;
1984 goto out;
1985 }
1986 st->state = TCP_SEQ_STATE_TIME_WAIT;

--- 12 unchanged lines hidden (view full) ---

1999out:
2000 return rc;
2001}
2002
2003static void *established_get_next(struct seq_file *seq, void *cur)
2004{
2005 struct sock *sk = cur;
2006 struct inet_timewait_sock *tw;
2010 struct hlist_node *node;
2011 struct tcp_iter_state* st = seq->private;
2007 struct hlist_nulls_node *node;
2008 struct tcp_iter_state *st = seq->private;
2012 struct net *net = seq_file_net(seq);
2013
2014 ++st->num;
2015
2016 if (st->state == TCP_SEQ_STATE_TIME_WAIT) {
2017 tw = cur;
2018 tw = tw_next(tw);
2019get_tw:

--- 10 unchanged lines hidden (view full) ---

2030 /* Look for next non empty bucket */
2031 while (++st->bucket < tcp_hashinfo.ehash_size &&
2032 empty_bucket(st))
2033 ;
2034 if (st->bucket >= tcp_hashinfo.ehash_size)
2035 return NULL;
2036
2037 read_lock_bh(inet_ehash_lockp(&tcp_hashinfo, st->bucket));
2009 struct net *net = seq_file_net(seq);
2010
2011 ++st->num;
2012
2013 if (st->state == TCP_SEQ_STATE_TIME_WAIT) {
2014 tw = cur;
2015 tw = tw_next(tw);
2016get_tw:

--- 10 unchanged lines hidden (view full) ---

2027 /* Look for next non empty bucket */
2028 while (++st->bucket < tcp_hashinfo.ehash_size &&
2029 empty_bucket(st))
2030 ;
2031 if (st->bucket >= tcp_hashinfo.ehash_size)
2032 return NULL;
2033
2034 read_lock_bh(inet_ehash_lockp(&tcp_hashinfo, st->bucket));
2038 sk = sk_head(&tcp_hashinfo.ehash[st->bucket].chain);
2035 sk = sk_nulls_head(&tcp_hashinfo.ehash[st->bucket].chain);
2039 } else
2036 } else
2040 sk = sk_next(sk);
2037 sk = sk_nulls_next(sk);
2041
2038
2042 sk_for_each_from(sk, node) {
2039 sk_nulls_for_each_from(sk, node) {
2043 if (sk->sk_family == st->family && net_eq(sock_net(sk), net))
2044 goto found;
2045 }
2046
2047 st->state = TCP_SEQ_STATE_TIME_WAIT;
2048 tw = tw_head(&tcp_hashinfo.ehash[st->bucket].twchain);
2049 goto get_tw;
2050found:

--- 11 unchanged lines hidden (view full) ---

2062 --pos;
2063 }
2064 return rc;
2065}
2066
2067static void *tcp_get_idx(struct seq_file *seq, loff_t pos)
2068{
2069 void *rc;
2040 if (sk->sk_family == st->family && net_eq(sock_net(sk), net))
2041 goto found;
2042 }
2043
2044 st->state = TCP_SEQ_STATE_TIME_WAIT;
2045 tw = tw_head(&tcp_hashinfo.ehash[st->bucket].twchain);
2046 goto get_tw;
2047found:

--- 11 unchanged lines hidden (view full) ---

2059 --pos;
2060 }
2061 return rc;
2062}
2063
2064static void *tcp_get_idx(struct seq_file *seq, loff_t pos)
2065{
2066 void *rc;
2070 struct tcp_iter_state* st = seq->private;
2067 struct tcp_iter_state *st = seq->private;
2071
2072 inet_listen_lock(&tcp_hashinfo);
2073 st->state = TCP_SEQ_STATE_LISTENING;
2074 rc = listening_get_idx(seq, &pos);
2075
2076 if (!rc) {
2077 inet_listen_unlock(&tcp_hashinfo);
2078 st->state = TCP_SEQ_STATE_ESTABLISHED;
2079 rc = established_get_idx(seq, pos);
2080 }
2081
2082 return rc;
2083}
2084
2085static void *tcp_seq_start(struct seq_file *seq, loff_t *pos)
2086{
2068
2069 inet_listen_lock(&tcp_hashinfo);
2070 st->state = TCP_SEQ_STATE_LISTENING;
2071 rc = listening_get_idx(seq, &pos);
2072
2073 if (!rc) {
2074 inet_listen_unlock(&tcp_hashinfo);
2075 st->state = TCP_SEQ_STATE_ESTABLISHED;
2076 rc = established_get_idx(seq, pos);
2077 }
2078
2079 return rc;
2080}
2081
2082static void *tcp_seq_start(struct seq_file *seq, loff_t *pos)
2083{
2087 struct tcp_iter_state* st = seq->private;
2084 struct tcp_iter_state *st = seq->private;
2088 st->state = TCP_SEQ_STATE_LISTENING;
2089 st->num = 0;
2090 return *pos ? tcp_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
2091}
2092
2093static void *tcp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2094{
2095 void *rc = NULL;
2085 st->state = TCP_SEQ_STATE_LISTENING;
2086 st->num = 0;
2087 return *pos ? tcp_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
2088}
2089
2090static void *tcp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2091{
2092 void *rc = NULL;
2096 struct tcp_iter_state* st;
2093 struct tcp_iter_state *st;
2097
2098 if (v == SEQ_START_TOKEN) {
2099 rc = tcp_get_idx(seq, 0);
2100 goto out;
2101 }
2102 st = seq->private;
2103
2104 switch (st->state) {

--- 13 unchanged lines hidden (view full) ---

2118 }
2119out:
2120 ++*pos;
2121 return rc;
2122}
2123
2124static void tcp_seq_stop(struct seq_file *seq, void *v)
2125{
2094
2095 if (v == SEQ_START_TOKEN) {
2096 rc = tcp_get_idx(seq, 0);
2097 goto out;
2098 }
2099 st = seq->private;
2100
2101 switch (st->state) {

--- 13 unchanged lines hidden (view full) ---

2115 }
2116out:
2117 ++*pos;
2118 return rc;
2119}
2120
2121static void tcp_seq_stop(struct seq_file *seq, void *v)
2122{
2126 struct tcp_iter_state* st = seq->private;
2123 struct tcp_iter_state *st = seq->private;
2127
2128 switch (st->state) {
2129 case TCP_SEQ_STATE_OPENREQ:
2130 if (v) {
2131 struct inet_connection_sock *icsk = inet_csk(st->syn_wait_sk);
2132 read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
2133 }
2134 case TCP_SEQ_STATE_LISTENING:

--- 144 unchanged lines hidden (view full) ---

2279 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0,
2280 atomic_read(&tw->tw_refcnt), tw, len);
2281}
2282
2283#define TMPSZ 150
2284
2285static int tcp4_seq_show(struct seq_file *seq, void *v)
2286{
2124
2125 switch (st->state) {
2126 case TCP_SEQ_STATE_OPENREQ:
2127 if (v) {
2128 struct inet_connection_sock *icsk = inet_csk(st->syn_wait_sk);
2129 read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
2130 }
2131 case TCP_SEQ_STATE_LISTENING:

--- 144 unchanged lines hidden (view full) ---

2276 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0,
2277 atomic_read(&tw->tw_refcnt), tw, len);
2278}
2279
2280#define TMPSZ 150
2281
2282static int tcp4_seq_show(struct seq_file *seq, void *v)
2283{
2287 struct tcp_iter_state* st;
2284 struct tcp_iter_state *st;
2288 int len;
2289
2290 if (v == SEQ_START_TOKEN) {
2291 seq_printf(seq, "%-*s\n", TMPSZ - 1,
2292 " sl local_address rem_address st tx_queue "
2293 "rx_queue tr tm->when retrnsmt uid timeout "
2294 "inode");
2295 goto out;

--- 77 unchanged lines hidden (view full) ---

2373 .orphan_count = &tcp_orphan_count,
2374 .memory_allocated = &tcp_memory_allocated,
2375 .memory_pressure = &tcp_memory_pressure,
2376 .sysctl_mem = sysctl_tcp_mem,
2377 .sysctl_wmem = sysctl_tcp_wmem,
2378 .sysctl_rmem = sysctl_tcp_rmem,
2379 .max_header = MAX_TCP_HEADER,
2380 .obj_size = sizeof(struct tcp_sock),
2285 int len;
2286
2287 if (v == SEQ_START_TOKEN) {
2288 seq_printf(seq, "%-*s\n", TMPSZ - 1,
2289 " sl local_address rem_address st tx_queue "
2290 "rx_queue tr tm->when retrnsmt uid timeout "
2291 "inode");
2292 goto out;

--- 77 unchanged lines hidden (view full) ---

2370 .orphan_count = &tcp_orphan_count,
2371 .memory_allocated = &tcp_memory_allocated,
2372 .memory_pressure = &tcp_memory_pressure,
2373 .sysctl_mem = sysctl_tcp_mem,
2374 .sysctl_wmem = sysctl_tcp_wmem,
2375 .sysctl_rmem = sysctl_tcp_rmem,
2376 .max_header = MAX_TCP_HEADER,
2377 .obj_size = sizeof(struct tcp_sock),
2378 .slab_flags = SLAB_DESTROY_BY_RCU,
2381 .twsk_prot = &tcp_timewait_sock_ops,
2382 .rsk_prot = &tcp_request_sock_ops,
2383 .h.hashinfo = &tcp_hashinfo,
2384#ifdef CONFIG_COMPAT
2385 .compat_setsockopt = compat_tcp_setsockopt,
2386 .compat_getsockopt = compat_tcp_getsockopt,
2387#endif
2388};

--- 41 unchanged lines hidden ---
2379 .twsk_prot = &tcp_timewait_sock_ops,
2380 .rsk_prot = &tcp_request_sock_ops,
2381 .h.hashinfo = &tcp_hashinfo,
2382#ifdef CONFIG_COMPAT
2383 .compat_setsockopt = compat_tcp_setsockopt,
2384 .compat_getsockopt = compat_tcp_getsockopt,
2385#endif
2386};

--- 41 unchanged lines hidden ---