aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/pptp.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/pptp.c')
-rw-r--r--drivers/net/pptp.c45
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;