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: Octavian Purdila <octavian.purdila@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
936b8bdb53
Коммит
d6274bd8d6
|
@ -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,
|
||||||
* 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,
|
||||||
|
|
||||||
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 = {
|
||||||
#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)
|
||||||
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 @@ out:
|
||||||
|
|
||||||
|
|
||||||
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 @@ done:
|
||||||
|
|
||||||
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,
|
||||||
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 = {
|
||||||
#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)
|
||||||
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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче