提交 d6274bd8 编写于 作者: O Octavian Purdila 提交者: David S. Miller

tcp: add send_synack method to tcp_request_sock_ops

Create a new tcp_request_sock_ops method to unify the IPv4/IPv6
signature for tcp_v[46]_send_synack. This allows us to later unify
tcp_v4_rtx_synack with tcp_v6_rtx_synack and tcp_v4_conn_request with
tcp_v4_conn_request.
Signed-off-by: NOctavian Purdila <octavian.purdila@intel.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 936b8bdb
...@@ -1609,6 +1609,9 @@ struct tcp_request_sock_ops { ...@@ -1609,6 +1609,9 @@ struct tcp_request_sock_ops {
const struct request_sock *req, const struct request_sock *req,
bool *strict); bool *strict);
__u32 (*init_seq)(const struct sk_buff *skb); __u32 (*init_seq)(const struct sk_buff *skb);
int (*send_synack)(struct sock *sk, struct dst_entry *dst,
struct flowi *fl, struct request_sock *req,
u16 queue_mapping, struct tcp_fastopen_cookie *foc);
}; };
#ifdef CONFIG_SYN_COOKIES #ifdef CONFIG_SYN_COOKIES
......
...@@ -814,6 +814,7 @@ static void tcp_v4_reqsk_send_ack(struct sock *sk, struct sk_buff *skb, ...@@ -814,6 +814,7 @@ static void tcp_v4_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
* socket. * socket.
*/ */
static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst, static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst,
struct flowi *fl,
struct request_sock *req, struct request_sock *req,
u16 queue_mapping, u16 queue_mapping,
struct tcp_fastopen_cookie *foc) struct tcp_fastopen_cookie *foc)
...@@ -846,7 +847,8 @@ static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst, ...@@ -846,7 +847,8 @@ static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst,
static int tcp_v4_rtx_synack(struct sock *sk, struct request_sock *req) static int tcp_v4_rtx_synack(struct sock *sk, struct request_sock *req)
{ {
int res = tcp_v4_send_synack(sk, NULL, req, 0, NULL); const struct tcp_request_sock_ops *af_ops = tcp_rsk(req)->af_specific;
int res = af_ops->send_synack(sk, NULL, NULL, req, 0, NULL);
if (!res) { if (!res) {
TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS);
...@@ -1285,6 +1287,7 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = { ...@@ -1285,6 +1287,7 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {
#endif #endif
.route_req = tcp_v4_route_req, .route_req = tcp_v4_route_req,
.init_seq = tcp_v4_init_sequence, .init_seq = tcp_v4_init_sequence,
.send_synack = tcp_v4_send_synack,
}; };
int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
...@@ -1404,8 +1407,8 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) ...@@ -1404,8 +1407,8 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
tcp_openreq_init_rwin(req, sk, dst); tcp_openreq_init_rwin(req, sk, dst);
fastopen = !want_cookie && fastopen = !want_cookie &&
tcp_try_fastopen(sk, skb, req, &foc, dst); tcp_try_fastopen(sk, skb, req, &foc, dst);
err = tcp_v4_send_synack(sk, dst, req, err = af_ops->send_synack(sk, dst, NULL, req,
skb_get_queue_mapping(skb), &foc); skb_get_queue_mapping(skb), &foc);
if (!fastopen) { if (!fastopen) {
if (err || want_cookie) if (err || want_cookie)
goto drop_and_free; goto drop_and_free;
......
...@@ -470,13 +470,14 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, ...@@ -470,13 +470,14 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
static int tcp_v6_send_synack(struct sock *sk, struct dst_entry *dst, static int tcp_v6_send_synack(struct sock *sk, struct dst_entry *dst,
struct flowi6 *fl6, struct flowi *fl,
struct request_sock *req, struct request_sock *req,
u16 queue_mapping, u16 queue_mapping,
struct tcp_fastopen_cookie *foc) struct tcp_fastopen_cookie *foc)
{ {
struct inet_request_sock *ireq = inet_rsk(req); struct inet_request_sock *ireq = inet_rsk(req);
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
struct flowi6 *fl6 = &fl->u.ip6;
struct sk_buff *skb; struct sk_buff *skb;
int err = -ENOMEM; int err = -ENOMEM;
...@@ -507,10 +508,11 @@ static int tcp_v6_send_synack(struct sock *sk, struct dst_entry *dst, ...@@ -507,10 +508,11 @@ static int tcp_v6_send_synack(struct sock *sk, struct dst_entry *dst,
static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req) static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req)
{ {
struct flowi6 fl6; const struct tcp_request_sock_ops *af_ops = tcp_rsk(req)->af_specific;
struct flowi fl;
int res; int res;
res = tcp_v6_send_synack(sk, NULL, &fl6, req, 0, NULL); res = af_ops->send_synack(sk, NULL, &fl, req, 0, NULL);
if (!res) { if (!res) {
TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS);
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNRETRANS); NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNRETRANS);
...@@ -754,7 +756,6 @@ static struct dst_entry *tcp_v6_route_req(struct sock *sk, struct flowi *fl, ...@@ -754,7 +756,6 @@ static struct dst_entry *tcp_v6_route_req(struct sock *sk, struct flowi *fl,
return inet6_csk_route_req(sk, &fl->u.ip6, req); return inet6_csk_route_req(sk, &fl->u.ip6, req);
} }
struct request_sock_ops tcp6_request_sock_ops __read_mostly = { struct request_sock_ops tcp6_request_sock_ops __read_mostly = {
.family = AF_INET6, .family = AF_INET6,
.obj_size = sizeof(struct tcp6_request_sock), .obj_size = sizeof(struct tcp6_request_sock),
...@@ -776,6 +777,7 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = { ...@@ -776,6 +777,7 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {
#endif #endif
.route_req = tcp_v6_route_req, .route_req = tcp_v6_route_req,
.init_seq = tcp_v6_init_sequence, .init_seq = tcp_v6_init_sequence,
.send_synack = tcp_v6_send_synack,
}; };
static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
...@@ -1128,8 +1130,8 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) ...@@ -1128,8 +1130,8 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
tcp_openreq_init_rwin(req, sk, dst); tcp_openreq_init_rwin(req, sk, dst);
fastopen = !want_cookie && fastopen = !want_cookie &&
tcp_try_fastopen(sk, skb, req, &foc, dst); tcp_try_fastopen(sk, skb, req, &foc, dst);
err = tcp_v6_send_synack(sk, dst, &fl6, req, err = af_ops->send_synack(sk, dst, (struct flowi *)&fl6, req,
skb_get_queue_mapping(skb), &foc); skb_get_queue_mapping(skb), &foc);
if (!fastopen) { if (!fastopen) {
if (err || want_cookie) if (err || want_cookie)
goto drop_and_free; goto drop_and_free;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册