diff options
author | Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 2005-06-19 01:47:59 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-06-19 01:47:59 -0400 |
commit | 0e87506fcc734647c7b2497eee4eb81e785c857a (patch) | |
tree | bb8863c59fdef2628f17b6773c52801792a57722 /include/net/tcp.h | |
parent | 60236fdd08b2169045a3bbfc5ffe1576e6c3c17b (diff) |
[NET] Generalise tcp_listen_opt
This chunks out the accept_queue and tcp_listen_opt code and moves
them to net/core/request_sock.c and include/net/request_sock.h, to
make it useful for other transport protocols, DCCP being the first one
to use it.
Next patches will rename tcp_listen_opt to accept_sock and remove the
inline tcp functions that just call a reqsk_queue_ function.
Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/tcp.h')
-rw-r--r-- | include/net/tcp.h | 46 |
1 files changed, 8 insertions, 38 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h index 6663086a5e35..a2e323c54457 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -1686,71 +1686,41 @@ static inline int tcp_full_space(const struct sock *sk) | |||
1686 | static inline void tcp_acceptq_queue(struct sock *sk, struct request_sock *req, | 1686 | static inline void tcp_acceptq_queue(struct sock *sk, struct request_sock *req, |
1687 | struct sock *child) | 1687 | struct sock *child) |
1688 | { | 1688 | { |
1689 | struct tcp_sock *tp = tcp_sk(sk); | 1689 | reqsk_queue_add(&tcp_sk(sk)->accept_queue, req, sk, child); |
1690 | |||
1691 | req->sk = child; | ||
1692 | sk_acceptq_added(sk); | ||
1693 | |||
1694 | if (!tp->accept_queue_tail) { | ||
1695 | tp->accept_queue = req; | ||
1696 | } else { | ||
1697 | tp->accept_queue_tail->dl_next = req; | ||
1698 | } | ||
1699 | tp->accept_queue_tail = req; | ||
1700 | req->dl_next = NULL; | ||
1701 | } | 1690 | } |
1702 | 1691 | ||
1703 | struct tcp_listen_opt | ||
1704 | { | ||
1705 | u8 max_qlen_log; /* log_2 of maximal queued SYNs */ | ||
1706 | int qlen; | ||
1707 | int qlen_young; | ||
1708 | int clock_hand; | ||
1709 | u32 hash_rnd; | ||
1710 | struct request_sock *syn_table[TCP_SYNQ_HSIZE]; | ||
1711 | }; | ||
1712 | |||
1713 | static inline void | 1692 | static inline void |
1714 | tcp_synq_removed(struct sock *sk, struct request_sock *req) | 1693 | tcp_synq_removed(struct sock *sk, struct request_sock *req) |
1715 | { | 1694 | { |
1716 | struct tcp_listen_opt *lopt = tcp_sk(sk)->listen_opt; | 1695 | if (reqsk_queue_removed(&tcp_sk(sk)->accept_queue, req) == 0) |
1717 | |||
1718 | if (--lopt->qlen == 0) | ||
1719 | tcp_delete_keepalive_timer(sk); | 1696 | tcp_delete_keepalive_timer(sk); |
1720 | if (req->retrans == 0) | ||
1721 | lopt->qlen_young--; | ||
1722 | } | 1697 | } |
1723 | 1698 | ||
1724 | static inline void tcp_synq_added(struct sock *sk) | 1699 | static inline void tcp_synq_added(struct sock *sk) |
1725 | { | 1700 | { |
1726 | struct tcp_listen_opt *lopt = tcp_sk(sk)->listen_opt; | 1701 | if (reqsk_queue_added(&tcp_sk(sk)->accept_queue) == 0) |
1727 | |||
1728 | if (lopt->qlen++ == 0) | ||
1729 | tcp_reset_keepalive_timer(sk, TCP_TIMEOUT_INIT); | 1702 | tcp_reset_keepalive_timer(sk, TCP_TIMEOUT_INIT); |
1730 | lopt->qlen_young++; | ||
1731 | } | 1703 | } |
1732 | 1704 | ||
1733 | static inline int tcp_synq_len(struct sock *sk) | 1705 | static inline int tcp_synq_len(struct sock *sk) |
1734 | { | 1706 | { |
1735 | return tcp_sk(sk)->listen_opt->qlen; | 1707 | return reqsk_queue_len(&tcp_sk(sk)->accept_queue); |
1736 | } | 1708 | } |
1737 | 1709 | ||
1738 | static inline int tcp_synq_young(struct sock *sk) | 1710 | static inline int tcp_synq_young(struct sock *sk) |
1739 | { | 1711 | { |
1740 | return tcp_sk(sk)->listen_opt->qlen_young; | 1712 | return reqsk_queue_len_young(&tcp_sk(sk)->accept_queue); |
1741 | } | 1713 | } |
1742 | 1714 | ||
1743 | static inline int tcp_synq_is_full(struct sock *sk) | 1715 | static inline int tcp_synq_is_full(struct sock *sk) |
1744 | { | 1716 | { |
1745 | return tcp_synq_len(sk) >> tcp_sk(sk)->listen_opt->max_qlen_log; | 1717 | return reqsk_queue_is_full(&tcp_sk(sk)->accept_queue); |
1746 | } | 1718 | } |
1747 | 1719 | ||
1748 | static inline void tcp_synq_unlink(struct tcp_sock *tp, struct request_sock *req, | 1720 | static inline void tcp_synq_unlink(struct tcp_sock *tp, struct request_sock *req, |
1749 | struct request_sock **prev) | 1721 | struct request_sock **prev) |
1750 | { | 1722 | { |
1751 | write_lock(&tp->syn_wait_lock); | 1723 | reqsk_queue_unlink(&tp->accept_queue, req, prev); |
1752 | *prev = req->dl_next; | ||
1753 | write_unlock(&tp->syn_wait_lock); | ||
1754 | } | 1724 | } |
1755 | 1725 | ||
1756 | static inline void tcp_synq_drop(struct sock *sk, struct request_sock *req, | 1726 | static inline void tcp_synq_drop(struct sock *sk, struct request_sock *req, |