: Honour sk_bound_dev_if in tcp_v4_send_ack
Subsystems (4)
[TCP]: Honour sk_bound_dev_if in tcp_v4_send_ack
A time_wait socket inherits sk_bound_dev_if from the original socket, but it is not used when sending ACK packets using ip_send_reply.
Fix by passing the oif to ip_send_reply in struct ip_reply_arg and use it for output routing.
---
commit 19b6cbad06d246d48168fc6c493a7c3d9db58e1f
tree a355cf3bf552a5fbab5b874f38a964f5f90a68c5
parent 184b812f7da6726d7ea4ca409c7a8762ff6c6df6
author Patrick McHardy <[email protected]> Fri, 01 Jun 2007 17:52:23 +0200 committer Patrick McHardy <[email protected]> Fri, 01 Jun 2007 17:52:23 +0200
include/net/ip.h | 1 + net/ipv4/ip_output.c | 4 +++- net/ipv4/tcp_ipv4.c | 1 + 3 files changed, 5 insertions(+), 1 deletions(-)
include/net/ip.h +1 -0
@@ -143,6 +143,7 @@ struct ip_reply_arg {__wsum csum;int csumoffset;/* u16 offset of csum in iov[0].iov_base */ /* -1 if not needed */ +int bound_dev_if; }; void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *arg,
net/ipv4/ip_output.c +3 -1
@@ -1352,7 +1352,8 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar } { -struct flowi fl = { .nl_u = { .ip4_u = +struct flowi fl = { .oif = arg->bound_dev_if, + .nl_u = { .ip4_u = { .daddr = daddr, .saddr = rt->rt_spec_dst, .tos =RT_TOS (ip_hdr (skb)->tos) } },
@@ -1376,6 +1377,7 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar inet->tos =ip_hdr (skb)->tos; sk->sk_priority = skb->priority; sk->sk_protocol =ip_hdr (skb)->protocol; + sk->sk_bound_dev_if = arg->bound_dev_if;ip_append_data (sk, ip_reply_glue_bits, arg->iov->iov_base, len,0 , &ipc, rt,MSG_DONTWAIT );if ((skb =skb_peek (&sk->sk_write_queue)) !=NULL ) {
net/ipv4/tcp_ipv4.c +1 -0
@@ -702,6 +702,7 @@ static void tcp_v4_send_ack(struct tcp_timewait_sock *twsk,ip_hdr (skb)->saddr,/* XXX */ arg.iov[0].iov_len, IPPROTO_TCP, 0); arg.csumoffset = offsetof(struct tcphdr , check) /2 ; + arg.bound_dev_if = twsk->tw_sk.tw_bound_dev_if;ip_send_reply (tcp_socket->sk, skb, &arg, arg.iov[0 ].iov_len);
Quoted 7 lines · Patrick McHardy
[TCP]: Honour
sk_bound_dev_ifintcp_v4_send_ackA
time_waitsocket inheritssk_bound_dev_iffrom the original socket, but it is not used when sending ACK packets usingip_send_reply.Fix by passing the oif to
ip_send_replyin structip_reply_argand use it for output routing.
The patch was missing a NULL pointer check in tcp_v4_send_ack for a different code path where twsk == NULL. Fixed version attached.
[TCP]: Honour sk_bound_dev_if in tcp_v4_send_ack
A time_wait socket inherits sk_bound_dev_if from the original socket, but it is not used when sending ACK packets using ip_send_reply.
Fix by passing the oif to ip_send_reply in struct ip_reply_arg and use it for output routing.
---
commit 9f66116df33984809a5cc0ea66a358db684d4346
tree a0b163d17181f1d1fafb4b7517726b5bb414b579
parent ea1601c50bf23af25094511e2a9ce1b755ab9669
author Patrick McHardy <[email protected]> Mon, 04 Jun 2007 17:10:41 +0200 committer Patrick McHardy <[email protected]> Mon, 04 Jun 2007 17:13:17 +0200
include/net/ip.h | 1 + net/ipv4/ip_output.c | 4 +++- net/ipv4/tcp_ipv4.c | 2 ++ 3 files changed, 6 insertions(+), 1 deletions(-)
include/net/ip.h +1 -0
@@ -143,6 +143,7 @@ struct ip_reply_arg {__wsum csum;int csumoffset;/* u16 offset of csum in iov[0].iov_base */ /* -1 if not needed */ +int bound_dev_if; }; void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *arg,
net/ipv4/ip_output.c +3 -1
@@ -1352,7 +1352,8 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar } { -struct flowi fl = { .nl_u = { .ip4_u = +struct flowi fl = { .oif = arg->bound_dev_if, + .nl_u = { .ip4_u = { .daddr = daddr, .saddr = rt->rt_spec_dst, .tos =RT_TOS (ip_hdr (skb)->tos) } },
@@ -1376,6 +1377,7 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar inet->tos =ip_hdr (skb)->tos; sk->sk_priority = skb->priority; sk->sk_protocol =ip_hdr (skb)->protocol; + sk->sk_bound_dev_if = arg->bound_dev_if;ip_append_data (sk, ip_reply_glue_bits, arg->iov->iov_base, len,0 , &ipc, rt,MSG_DONTWAIT );if ((skb =skb_peek (&sk->sk_write_queue)) !=NULL ) {
net/ipv4/tcp_ipv4.c +2 -0
@@ -705,6 +705,8 @@ static void tcp_v4_send_ack(struct tcp_timewait_sock *twsk,ip_hdr (skb)->saddr,/* XXX */ arg.iov[0].iov_len, IPPROTO_TCP, 0); arg.csumoffset = offsetof(struct tcphdr , check) /2 ; +if (twsk) + arg.bound_dev_if = twsk->tw_sk.tw_bound_dev_if;ip_send_reply (tcp_socket->sk, skb, &arg, arg.iov[0 ].iov_len);