|
@@ -591,6 +591,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
|
|
ip_hdr(skb)->saddr, /* XXX */
|
|
|
sizeof(struct tcphdr), IPPROTO_TCP, 0);
|
|
|
arg.csumoffset = offsetof(struct tcphdr, check) / 2;
|
|
|
+ arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0;
|
|
|
|
|
|
net = dev_net(skb->dst->dev);
|
|
|
ip_send_reply(net->ipv4.tcp_sock, skb,
|
|
@@ -606,7 +607,8 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
|
|
|
|
|
static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,
|
|
|
u32 win, u32 ts, int oif,
|
|
|
- struct tcp_md5sig_key *key)
|
|
|
+ struct tcp_md5sig_key *key,
|
|
|
+ int reply_flags)
|
|
|
{
|
|
|
struct tcphdr *th = tcp_hdr(skb);
|
|
|
struct {
|
|
@@ -659,6 +661,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,
|
|
|
ip_hdr(skb)->daddr, &rep.th);
|
|
|
}
|
|
|
#endif
|
|
|
+ arg.flags = reply_flags;
|
|
|
arg.csum = csum_tcpudp_nofold(ip_hdr(skb)->daddr,
|
|
|
ip_hdr(skb)->saddr, /* XXX */
|
|
|
arg.iov[0].iov_len, IPPROTO_TCP, 0);
|
|
@@ -681,7 +684,8 @@ static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)
|
|
|
tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
|
|
|
tcptw->tw_ts_recent,
|
|
|
tw->tw_bound_dev_if,
|
|
|
- tcp_twsk_md5_key(tcptw)
|
|
|
+ tcp_twsk_md5_key(tcptw),
|
|
|
+ tw->tw_transparent ? IP_REPLY_ARG_NOSRCCHECK : 0
|
|
|
);
|
|
|
|
|
|
inet_twsk_put(tw);
|
|
@@ -694,7 +698,8 @@ static void tcp_v4_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
|
|
|
tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd,
|
|
|
req->ts_recent,
|
|
|
0,
|
|
|
- tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->daddr));
|
|
|
+ tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->daddr),
|
|
|
+ inet_rsk(req)->no_srccheck ? IP_REPLY_ARG_NOSRCCHECK : 0);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1244,6 +1249,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
|
|
|
ireq = inet_rsk(req);
|
|
|
ireq->loc_addr = daddr;
|
|
|
ireq->rmt_addr = saddr;
|
|
|
+ ireq->no_srccheck = inet_sk(sk)->transparent;
|
|
|
ireq->opt = tcp_v4_save_options(sk, skb);
|
|
|
if (!want_cookie)
|
|
|
TCP_ECN_create_request(req, tcp_hdr(skb));
|