|
@@ -769,20 +769,12 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
|
|
|
tos = ipv6_get_dsfield((struct ipv6hdr *)old_iph);
|
|
|
}
|
|
|
|
|
|
- {
|
|
|
- struct flowi fl = {
|
|
|
- .oif = tunnel->parms.link,
|
|
|
- .fl4_dst = dst,
|
|
|
- .fl4_src = tiph->saddr,
|
|
|
- .fl4_tos = RT_TOS(tos),
|
|
|
- .proto = IPPROTO_GRE,
|
|
|
- .fl_gre_key = tunnel->parms.o_key
|
|
|
- };
|
|
|
- rt = ip_route_output_key(dev_net(dev), &fl);
|
|
|
- if (IS_ERR(rt)) {
|
|
|
- dev->stats.tx_carrier_errors++;
|
|
|
- goto tx_error;
|
|
|
- }
|
|
|
+ rt = ip_route_output_gre(dev_net(dev), dst, tiph->saddr,
|
|
|
+ tunnel->parms.o_key, RT_TOS(tos),
|
|
|
+ tunnel->parms.link);
|
|
|
+ if (IS_ERR(rt)) {
|
|
|
+ dev->stats.tx_carrier_errors++;
|
|
|
+ goto tx_error;
|
|
|
}
|
|
|
tdev = rt->dst.dev;
|
|
|
|
|
@@ -946,15 +938,11 @@ static int ipgre_tunnel_bind_dev(struct net_device *dev)
|
|
|
/* Guess output device to choose reasonable mtu and needed_headroom */
|
|
|
|
|
|
if (iph->daddr) {
|
|
|
- struct flowi fl = {
|
|
|
- .oif = tunnel->parms.link,
|
|
|
- .fl4_dst = iph->daddr,
|
|
|
- .fl4_src = iph->saddr,
|
|
|
- .fl4_tos = RT_TOS(iph->tos),
|
|
|
- .proto = IPPROTO_GRE,
|
|
|
- .fl_gre_key = tunnel->parms.o_key
|
|
|
- };
|
|
|
- struct rtable *rt = ip_route_output_key(dev_net(dev), &fl);
|
|
|
+ struct rtable *rt = ip_route_output_gre(dev_net(dev),
|
|
|
+ iph->daddr, iph->saddr,
|
|
|
+ tunnel->parms.o_key,
|
|
|
+ RT_TOS(iph->tos),
|
|
|
+ tunnel->parms.link);
|
|
|
|
|
|
if (!IS_ERR(rt)) {
|
|
|
tdev = rt->dst.dev;
|
|
@@ -1208,15 +1196,12 @@ static int ipgre_open(struct net_device *dev)
|
|
|
struct ip_tunnel *t = netdev_priv(dev);
|
|
|
|
|
|
if (ipv4_is_multicast(t->parms.iph.daddr)) {
|
|
|
- struct flowi fl = {
|
|
|
- .oif = t->parms.link,
|
|
|
- .fl4_dst = t->parms.iph.daddr,
|
|
|
- .fl4_src = t->parms.iph.saddr,
|
|
|
- .fl4_tos = RT_TOS(t->parms.iph.tos),
|
|
|
- .proto = IPPROTO_GRE,
|
|
|
- .fl_gre_key = t->parms.o_key
|
|
|
- };
|
|
|
- struct rtable *rt = ip_route_output_key(dev_net(dev), &fl);
|
|
|
+ struct rtable *rt = ip_route_output_gre(dev_net(dev),
|
|
|
+ t->parms.iph.daddr,
|
|
|
+ t->parms.iph.saddr,
|
|
|
+ t->parms.o_key,
|
|
|
+ RT_TOS(t->parms.iph.tos),
|
|
|
+ t->parms.link);
|
|
|
|
|
|
if (IS_ERR(rt))
|
|
|
return -EADDRNOTAVAIL;
|