diff options
Diffstat (limited to 'net/netfilter/ipvs')
-rw-r--r-- | net/netfilter/ipvs/ip_vs_ctl.c | 3 | ||||
-rw-r--r-- | net/netfilter/ipvs/ip_vs_xmit.c | 6 |
2 files changed, 7 insertions, 2 deletions
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 7e7198b51c0..c4ee43710aa 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
@@ -2589,6 +2589,8 @@ __ip_vs_get_timeouts(struct net *net, struct ip_vs_timeout_user *u) | |||
2589 | struct ip_vs_proto_data *pd; | 2589 | struct ip_vs_proto_data *pd; |
2590 | #endif | 2590 | #endif |
2591 | 2591 | ||
2592 | memset(u, 0, sizeof (*u)); | ||
2593 | |||
2592 | #ifdef CONFIG_IP_VS_PROTO_TCP | 2594 | #ifdef CONFIG_IP_VS_PROTO_TCP |
2593 | pd = ip_vs_proto_data_get(net, IPPROTO_TCP); | 2595 | pd = ip_vs_proto_data_get(net, IPPROTO_TCP); |
2594 | u->tcp_timeout = pd->timeout_table[IP_VS_TCP_S_ESTABLISHED] / HZ; | 2596 | u->tcp_timeout = pd->timeout_table[IP_VS_TCP_S_ESTABLISHED] / HZ; |
@@ -2766,7 +2768,6 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) | |||
2766 | { | 2768 | { |
2767 | struct ip_vs_timeout_user t; | 2769 | struct ip_vs_timeout_user t; |
2768 | 2770 | ||
2769 | memset(&t, 0, sizeof(t)); | ||
2770 | __ip_vs_get_timeouts(net, &t); | 2771 | __ip_vs_get_timeouts(net, &t); |
2771 | if (copy_to_user(user, &t, sizeof(t)) != 0) | 2772 | if (copy_to_user(user, &t, sizeof(t)) != 0) |
2772 | ret = -EFAULT; | 2773 | ret = -EFAULT; |
diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c index 90122eb0b04..12008b47e5c 100644 --- a/net/netfilter/ipvs/ip_vs_xmit.c +++ b/net/netfilter/ipvs/ip_vs_xmit.c | |||
@@ -50,6 +50,7 @@ enum { | |||
50 | * local | 50 | * local |
51 | */ | 51 | */ |
52 | IP_VS_RT_MODE_CONNECT = 8, /* Always bind route to saddr */ | 52 | IP_VS_RT_MODE_CONNECT = 8, /* Always bind route to saddr */ |
53 | IP_VS_RT_MODE_KNOWN_NH = 16,/* Route via remote addr */ | ||
53 | }; | 54 | }; |
54 | 55 | ||
55 | /* | 56 | /* |
@@ -113,6 +114,8 @@ static struct rtable *do_output_route4(struct net *net, __be32 daddr, | |||
113 | fl4.daddr = daddr; | 114 | fl4.daddr = daddr; |
114 | fl4.saddr = (rt_mode & IP_VS_RT_MODE_CONNECT) ? *saddr : 0; | 115 | fl4.saddr = (rt_mode & IP_VS_RT_MODE_CONNECT) ? *saddr : 0; |
115 | fl4.flowi4_tos = rtos; | 116 | fl4.flowi4_tos = rtos; |
117 | fl4.flowi4_flags = (rt_mode & IP_VS_RT_MODE_KNOWN_NH) ? | ||
118 | FLOWI_FLAG_KNOWN_NH : 0; | ||
116 | 119 | ||
117 | retry: | 120 | retry: |
118 | rt = ip_route_output_key(net, &fl4); | 121 | rt = ip_route_output_key(net, &fl4); |
@@ -1066,7 +1069,8 @@ ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
1066 | if (!(rt = __ip_vs_get_out_rt(skb, cp->dest, cp->daddr.ip, | 1069 | if (!(rt = __ip_vs_get_out_rt(skb, cp->dest, cp->daddr.ip, |
1067 | RT_TOS(iph->tos), | 1070 | RT_TOS(iph->tos), |
1068 | IP_VS_RT_MODE_LOCAL | | 1071 | IP_VS_RT_MODE_LOCAL | |
1069 | IP_VS_RT_MODE_NON_LOCAL, NULL))) | 1072 | IP_VS_RT_MODE_NON_LOCAL | |
1073 | IP_VS_RT_MODE_KNOWN_NH, NULL))) | ||
1070 | goto tx_error_icmp; | 1074 | goto tx_error_icmp; |
1071 | if (rt->rt_flags & RTCF_LOCAL) { | 1075 | if (rt->rt_flags & RTCF_LOCAL) { |
1072 | ip_rt_put(rt); | 1076 | ip_rt_put(rt); |