diff options
Diffstat (limited to 'net/ipv4/af_inet.c')
-rw-r--r-- | net/ipv4/af_inet.c | 46 |
1 files changed, 17 insertions, 29 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 45b89d7bda5a..807d83c02ef6 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1101,23 +1101,20 @@ int sysctl_ip_dynaddr __read_mostly; | |||
1101 | static int inet_sk_reselect_saddr(struct sock *sk) | 1101 | static int inet_sk_reselect_saddr(struct sock *sk) |
1102 | { | 1102 | { |
1103 | struct inet_sock *inet = inet_sk(sk); | 1103 | struct inet_sock *inet = inet_sk(sk); |
1104 | int err; | ||
1105 | struct rtable *rt; | ||
1106 | __be32 old_saddr = inet->inet_saddr; | 1104 | __be32 old_saddr = inet->inet_saddr; |
1107 | __be32 new_saddr; | ||
1108 | __be32 daddr = inet->inet_daddr; | 1105 | __be32 daddr = inet->inet_daddr; |
1106 | struct rtable *rt; | ||
1107 | __be32 new_saddr; | ||
1109 | 1108 | ||
1110 | if (inet->opt && inet->opt->srr) | 1109 | if (inet->opt && inet->opt->srr) |
1111 | daddr = inet->opt->faddr; | 1110 | daddr = inet->opt->faddr; |
1112 | 1111 | ||
1113 | /* Query new route. */ | 1112 | /* Query new route. */ |
1114 | err = ip_route_connect(&rt, daddr, 0, | 1113 | rt = ip_route_connect(daddr, 0, RT_CONN_FLAGS(sk), |
1115 | RT_CONN_FLAGS(sk), | 1114 | sk->sk_bound_dev_if, sk->sk_protocol, |
1116 | sk->sk_bound_dev_if, | 1115 | inet->inet_sport, inet->inet_dport, sk, false); |
1117 | sk->sk_protocol, | 1116 | if (IS_ERR(rt)) |
1118 | inet->inet_sport, inet->inet_dport, sk, 0); | 1117 | return PTR_ERR(rt); |
1119 | if (err) | ||
1120 | return err; | ||
1121 | 1118 | ||
1122 | sk_setup_caps(sk, &rt->dst); | 1119 | sk_setup_caps(sk, &rt->dst); |
1123 | 1120 | ||
@@ -1160,25 +1157,16 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
1160 | daddr = inet->inet_daddr; | 1157 | daddr = inet->inet_daddr; |
1161 | if (inet->opt && inet->opt->srr) | 1158 | if (inet->opt && inet->opt->srr) |
1162 | daddr = inet->opt->faddr; | 1159 | daddr = inet->opt->faddr; |
1163 | { | 1160 | rt = ip_route_output_ports(sock_net(sk), sk, daddr, inet->inet_saddr, |
1164 | struct flowi fl = { | 1161 | inet->inet_dport, inet->inet_sport, |
1165 | .oif = sk->sk_bound_dev_if, | 1162 | sk->sk_protocol, RT_CONN_FLAGS(sk), |
1166 | .mark = sk->sk_mark, | 1163 | sk->sk_bound_dev_if); |
1167 | .fl4_dst = daddr, | 1164 | if (!IS_ERR(rt)) { |
1168 | .fl4_src = inet->inet_saddr, | 1165 | err = 0; |
1169 | .fl4_tos = RT_CONN_FLAGS(sk), | ||
1170 | .proto = sk->sk_protocol, | ||
1171 | .flags = inet_sk_flowi_flags(sk), | ||
1172 | .fl_ip_sport = inet->inet_sport, | ||
1173 | .fl_ip_dport = inet->inet_dport, | ||
1174 | }; | ||
1175 | |||
1176 | security_sk_classify_flow(sk, &fl); | ||
1177 | err = ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0); | ||
1178 | } | ||
1179 | if (!err) | ||
1180 | sk_setup_caps(sk, &rt->dst); | 1166 | sk_setup_caps(sk, &rt->dst); |
1181 | else { | 1167 | } else { |
1168 | err = PTR_ERR(rt); | ||
1169 | |||
1182 | /* Routing failed... */ | 1170 | /* Routing failed... */ |
1183 | sk->sk_route_caps = 0; | 1171 | sk->sk_route_caps = 0; |
1184 | /* | 1172 | /* |
@@ -1231,7 +1219,7 @@ out: | |||
1231 | return err; | 1219 | return err; |
1232 | } | 1220 | } |
1233 | 1221 | ||
1234 | static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features) | 1222 | static struct sk_buff *inet_gso_segment(struct sk_buff *skb, u32 features) |
1235 | { | 1223 | { |
1236 | struct sk_buff *segs = ERR_PTR(-EINVAL); | 1224 | struct sk_buff *segs = ERR_PTR(-EINVAL); |
1237 | struct iphdr *iph; | 1225 | struct iphdr *iph; |