diff options
Diffstat (limited to 'drivers/net/pptp.c')
-rw-r--r-- | drivers/net/pptp.c | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/drivers/net/pptp.c b/drivers/net/pptp.c index 164cfad6ce79..51dfcf8023c7 100644 --- a/drivers/net/pptp.c +++ b/drivers/net/pptp.c | |||
@@ -175,7 +175,6 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
175 | struct pptp_opt *opt = &po->proto.pptp; | 175 | struct pptp_opt *opt = &po->proto.pptp; |
176 | struct pptp_gre_header *hdr; | 176 | struct pptp_gre_header *hdr; |
177 | unsigned int header_len = sizeof(*hdr); | 177 | unsigned int header_len = sizeof(*hdr); |
178 | int err = 0; | ||
179 | int islcp; | 178 | int islcp; |
180 | int len; | 179 | int len; |
181 | unsigned char *data; | 180 | unsigned char *data; |
@@ -190,18 +189,14 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
190 | if (sk_pppox(po)->sk_state & PPPOX_DEAD) | 189 | if (sk_pppox(po)->sk_state & PPPOX_DEAD) |
191 | goto tx_error; | 190 | goto tx_error; |
192 | 191 | ||
193 | { | 192 | rt = ip_route_output_ports(&init_net, NULL, |
194 | struct flowi fl = { .oif = 0, | 193 | opt->dst_addr.sin_addr.s_addr, |
195 | .nl_u = { | 194 | opt->src_addr.sin_addr.s_addr, |
196 | .ip4_u = { | 195 | 0, 0, IPPROTO_GRE, |
197 | .daddr = opt->dst_addr.sin_addr.s_addr, | 196 | RT_TOS(0), 0); |
198 | .saddr = opt->src_addr.sin_addr.s_addr, | 197 | if (IS_ERR(rt)) |
199 | .tos = RT_TOS(0) } }, | 198 | goto tx_error; |
200 | .proto = IPPROTO_GRE }; | 199 | |
201 | err = ip_route_output_key(&init_net, &rt, &fl); | ||
202 | if (err) | ||
203 | goto tx_error; | ||
204 | } | ||
205 | tdev = rt->dst.dev; | 200 | tdev = rt->dst.dev; |
206 | 201 | ||
207 | max_headroom = LL_RESERVED_SPACE(tdev) + sizeof(*iph) + sizeof(*hdr) + 2; | 202 | max_headroom = LL_RESERVED_SPACE(tdev) + sizeof(*iph) + sizeof(*hdr) + 2; |
@@ -468,21 +463,17 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
468 | po->chan.private = sk; | 463 | po->chan.private = sk; |
469 | po->chan.ops = &pptp_chan_ops; | 464 | po->chan.ops = &pptp_chan_ops; |
470 | 465 | ||
471 | { | 466 | rt = ip_route_output_ports(&init_net, sk, |
472 | struct flowi fl = { | 467 | opt->dst_addr.sin_addr.s_addr, |
473 | .nl_u = { | 468 | opt->src_addr.sin_addr.s_addr, |
474 | .ip4_u = { | 469 | 0, 0, |
475 | .daddr = opt->dst_addr.sin_addr.s_addr, | 470 | IPPROTO_GRE, RT_CONN_FLAGS(sk), 0); |
476 | .saddr = opt->src_addr.sin_addr.s_addr, | 471 | if (IS_ERR(rt)) { |
477 | .tos = RT_CONN_FLAGS(sk) } }, | 472 | error = -EHOSTUNREACH; |
478 | .proto = IPPROTO_GRE }; | 473 | goto end; |
479 | security_sk_classify_flow(sk, &fl); | ||
480 | if (ip_route_output_key(&init_net, &rt, &fl)) { | ||
481 | error = -EHOSTUNREACH; | ||
482 | goto end; | ||
483 | } | ||
484 | sk_setup_caps(sk, &rt->dst); | ||
485 | } | 474 | } |
475 | sk_setup_caps(sk, &rt->dst); | ||
476 | |||
486 | po->chan.mtu = dst_mtu(&rt->dst); | 477 | po->chan.mtu = dst_mtu(&rt->dst); |
487 | if (!po->chan.mtu) | 478 | if (!po->chan.mtu) |
488 | po->chan.mtu = PPP_MTU; | 479 | po->chan.mtu = PPP_MTU; |