Commit 78fbfd8a authored by David S. Miller's avatar David S. Miller
Browse files

ipv4: Create and use route lookup helpers.



The idea here is this minimizes the number of places one has to edit
in order to make changes to how flows are defined and used.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1561747d
...@@ -183,17 +183,11 @@ static int addr4_resolve(struct sockaddr_in *src_in, ...@@ -183,17 +183,11 @@ static int addr4_resolve(struct sockaddr_in *src_in,
{ {
__be32 src_ip = src_in->sin_addr.s_addr; __be32 src_ip = src_in->sin_addr.s_addr;
__be32 dst_ip = dst_in->sin_addr.s_addr; __be32 dst_ip = dst_in->sin_addr.s_addr;
struct flowi fl;
struct rtable *rt; struct rtable *rt;
struct neighbour *neigh; struct neighbour *neigh;
int ret; int ret;
memset(&fl, 0, sizeof fl); rt = ip_route_output(&init_net, dst_ip, src_ip, 0, addr->bound_dev_if);
fl.nl_u.ip4_u.daddr = dst_ip;
fl.nl_u.ip4_u.saddr = src_ip;
fl.oif = addr->bound_dev_if;
rt = ip_route_output_key(&init_net, &fl);
if (IS_ERR(rt)) { if (IS_ERR(rt)) {
ret = PTR_ERR(rt); ret = PTR_ERR(rt);
goto out; goto out;
......
...@@ -338,23 +338,10 @@ static struct rtable *find_route(struct t3cdev *dev, __be32 local_ip, ...@@ -338,23 +338,10 @@ static struct rtable *find_route(struct t3cdev *dev, __be32 local_ip,
__be16 peer_port, u8 tos) __be16 peer_port, u8 tos)
{ {
struct rtable *rt; struct rtable *rt;
struct flowi fl = {
.oif = 0, rt = ip_route_output_ports(&init_net, NULL, peer_ip, local_ip,
.nl_u = { peer_port, local_port, IPPROTO_TCP,
.ip4_u = { tos, 0);
.daddr = peer_ip,
.saddr = local_ip,
.tos = tos}
},
.proto = IPPROTO_TCP,
.uli_u = {
.ports = {
.sport = local_port,
.dport = peer_port}
}
};
rt = ip_route_output_flow(&init_net, &fl, NULL);
if (IS_ERR(rt)) if (IS_ERR(rt))
return NULL; return NULL;
return rt; return rt;
......
...@@ -315,23 +315,10 @@ static struct rtable *find_route(struct c4iw_dev *dev, __be32 local_ip, ...@@ -315,23 +315,10 @@ static struct rtable *find_route(struct c4iw_dev *dev, __be32 local_ip,
__be16 peer_port, u8 tos) __be16 peer_port, u8 tos)
{ {
struct rtable *rt; struct rtable *rt;
struct flowi fl = {
.oif = 0, rt = ip_route_output_ports(&init_net, NULL, peer_ip, local_ip,
.nl_u = { peer_port, local_port, IPPROTO_TCP,
.ip4_u = { tos, 0);
.daddr = peer_ip,
.saddr = local_ip,
.tos = tos}
},
.proto = IPPROTO_TCP,
.uli_u = {
.ports = {
.sport = local_port,
.dport = peer_port}
}
};
rt = ip_route_output_flow(&init_net, &fl, NULL);
if (IS_ERR(rt)) if (IS_ERR(rt))
return NULL; return NULL;
return rt; return rt;
......
...@@ -1104,15 +1104,12 @@ static inline int mini_cm_accelerated(struct nes_cm_core *cm_core, ...@@ -1104,15 +1104,12 @@ static inline int mini_cm_accelerated(struct nes_cm_core *cm_core,
static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex) static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex)
{ {
struct rtable *rt; struct rtable *rt;
struct flowi fl;
struct neighbour *neigh; struct neighbour *neigh;
int rc = arpindex; int rc = arpindex;
struct net_device *netdev; struct net_device *netdev;
struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter; struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
memset(&fl, 0, sizeof fl); rt = ip_route_output(&init_net, htonl(dst_ip), 0, 0, 0);
fl.nl_u.ip4_u.daddr = htonl(dst_ip);
rt = ip_route_output_key(&init_net, &fl);
if (IS_ERR(rt)) { if (IS_ERR(rt)) {
printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n", printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n",
__func__, dst_ip); __func__, dst_ip);
......
...@@ -2676,7 +2676,6 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) ...@@ -2676,7 +2676,6 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
__be32 *targets = bond->params.arp_targets; __be32 *targets = bond->params.arp_targets;
struct vlan_entry *vlan; struct vlan_entry *vlan;
struct net_device *vlan_dev; struct net_device *vlan_dev;
struct flowi fl;
struct rtable *rt; struct rtable *rt;
for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) { for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
...@@ -2695,15 +2694,12 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) ...@@ -2695,15 +2694,12 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
* determine which VLAN interface would be used, so we * determine which VLAN interface would be used, so we
* can tag the ARP with the proper VLAN tag. * can tag the ARP with the proper VLAN tag.
*/ */
memset(&fl, 0, sizeof(fl)); rt = ip_route_output(dev_net(bond->dev), targets[i], 0,
fl.fl4_dst = targets[i]; RTO_ONLINK, 0);
fl.fl4_tos = RTO_ONLINK;
rt = ip_route_output_key(dev_net(bond->dev), &fl);
if (IS_ERR(rt)) { if (IS_ERR(rt)) {
if (net_ratelimit()) { if (net_ratelimit()) {
pr_warning("%s: no route to arp_ip_target %pI4\n", pr_warning("%s: no route to arp_ip_target %pI4\n",
bond->dev->name, &fl.fl4_dst); bond->dev->name, &targets[i]);
} }
continue; continue;
} }
...@@ -2739,7 +2735,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) ...@@ -2739,7 +2735,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
if (net_ratelimit()) { if (net_ratelimit()) {
pr_warning("%s: no path to arp_ip_target %pI4 via rt.dev %s\n", pr_warning("%s: no path to arp_ip_target %pI4 via rt.dev %s\n",
bond->dev->name, &fl.fl4_dst, bond->dev->name, &targets[i],
rt->dst.dev ? rt->dst.dev->name : "NULL"); rt->dst.dev ? rt->dst.dev->name : "NULL");
} }
ip_rt_put(rt); ip_rt_put(rt);
......
...@@ -3407,20 +3407,14 @@ static int cnic_get_v4_route(struct sockaddr_in *dst_addr, ...@@ -3407,20 +3407,14 @@ static int cnic_get_v4_route(struct sockaddr_in *dst_addr,
struct dst_entry **dst) struct dst_entry **dst)
{ {
#if defined(CONFIG_INET) #if defined(CONFIG_INET)
struct flowi fl;
int err;
struct rtable *rt; struct rtable *rt;
memset(&fl, 0, sizeof(fl)); rt = ip_route_output(&init_net, dst_addr->sin_addr.s_addr, 0, 0, 0);
fl.nl_u.ip4_u.daddr = dst_addr->sin_addr.s_addr; if (!IS_ERR(rt)) {
rt = ip_route_output_key(&init_net, &fl);
err = 0;
if (!IS_ERR(rt))
*dst = &rt->dst; *dst = &rt->dst;
else return 0;
err = PTR_ERR(rt); }
return err; return PTR_ERR(rt);
#else #else
return -ENETUNREACH; return -ENETUNREACH;
#endif #endif
......
...@@ -189,18 +189,14 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb) ...@@ -189,18 +189,14 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
if (sk_pppox(po)->sk_state & PPPOX_DEAD) if (sk_pppox(po)->sk_state & PPPOX_DEAD)
goto tx_error; goto tx_error;
{ rt = ip_route_output_ports(&init_net, NULL,
struct flowi fl = { .oif = 0, opt->dst_addr.sin_addr.s_addr,
.nl_u = { opt->src_addr.sin_addr.s_addr,
.ip4_u = { 0, 0, IPPROTO_GRE,
.daddr = opt->dst_addr.sin_addr.s_addr, RT_TOS(0), 0);
.saddr = opt->src_addr.sin_addr.s_addr, if (IS_ERR(rt))
.tos = RT_TOS(0) } }, goto tx_error;
.proto = IPPROTO_GRE };
rt = ip_route_output_key(&init_net, &fl);
if (IS_ERR(rt))
goto tx_error;
}
tdev = rt->dst.dev; tdev = rt->dst.dev;
max_headroom = LL_RESERVED_SPACE(tdev) + sizeof(*iph) + sizeof(*hdr) + 2; max_headroom = LL_RESERVED_SPACE(tdev) + sizeof(*iph) + sizeof(*hdr) + 2;
...@@ -467,22 +463,17 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr, ...@@ -467,22 +463,17 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
po->chan.private = sk; po->chan.private = sk;
po->chan.ops = &pptp_chan_ops; po->chan.ops = &pptp_chan_ops;
{ rt = ip_route_output_ports(&init_net, sk,
struct flowi fl = { opt->dst_addr.sin_addr.s_addr,
.nl_u = { opt->src_addr.sin_addr.s_addr,
.ip4_u = { 0, 0,
.daddr = opt->dst_addr.sin_addr.s_addr, IPPROTO_GRE, RT_CONN_FLAGS(sk), 0);
.saddr = opt->src_addr.sin_addr.s_addr, if (IS_ERR(rt)) {
.tos = RT_CONN_FLAGS(sk) } }, error = -EHOSTUNREACH;
.proto = IPPROTO_GRE }; goto end;
security_sk_classify_flow(sk, &fl);
rt = ip_route_output_key(&init_net, &fl);
if (IS_ERR(rt)) {
error = -EHOSTUNREACH;
goto end;
}
sk_setup_caps(sk, &rt->dst);
} }
sk_setup_caps(sk, &rt->dst);
po->chan.mtu = dst_mtu(&rt->dst); po->chan.mtu = dst_mtu(&rt->dst);
if (!po->chan.mtu) if (!po->chan.mtu)
po->chan.mtu = PPP_MTU; po->chan.mtu = PPP_MTU;
......
...@@ -451,26 +451,12 @@ static struct cxgbi_sock *cxgbi_sock_create(struct cxgbi_device *cdev) ...@@ -451,26 +451,12 @@ static struct cxgbi_sock *cxgbi_sock_create(struct cxgbi_device *cdev)
} }
static struct rtable *find_route_ipv4(__be32 saddr, __be32 daddr, static struct rtable *find_route_ipv4(__be32 saddr, __be32 daddr,
__be16 sport, __be16 dport, u8 tos) __be16 sport, __be16 dport, u8 tos)
{ {
struct rtable *rt; struct rtable *rt;
struct flowi fl = {
.oif = 0,
.nl_u = {
.ip4_u = {
.daddr = daddr,
.saddr = saddr,
.tos = tos }
},
.proto = IPPROTO_TCP,
.uli_u = {
.ports = {
.sport = sport,
.dport = dport }
}
};
rt = ip_route_output_flow(&init_net, &fl, NULL); rt = ip_route_output_ports(&init_net, NULL, daddr, saddr,
dport, sport, IPPROTO_TCP, tos, 0);
if (IS_ERR(rt)) if (IS_ERR(rt))
return NULL; return NULL;
......
...@@ -132,6 +132,54 @@ static inline struct rtable *ip_route_output_key(struct net *net, struct flowi * ...@@ -132,6 +132,54 @@ static inline struct rtable *ip_route_output_key(struct net *net, struct flowi *
return ip_route_output_flow(net, flp, NULL); return ip_route_output_flow(net, flp, NULL);
} }
static inline struct rtable *ip_route_output(struct net *net, __be32 daddr,
__be32 saddr, u8 tos, int oif)
{
struct flowi fl = {
.oif = oif,
.fl4_dst = daddr,
.fl4_src = saddr,
.fl4_tos = tos,
};
return ip_route_output_key(net, &fl);
}
static inline struct rtable *ip_route_output_ports(struct net *net, struct sock *sk,
__be32 daddr, __be32 saddr,
__be16 dport, __be16 sport,
__u8 proto, __u8 tos, int oif)
{
struct flowi fl = {
.oif = oif,
.flags = sk ? inet_sk_flowi_flags(sk) : 0,
.mark = sk ? sk->sk_mark : 0,
.fl4_dst = daddr,
.fl4_src = saddr,
.fl4_tos = tos,
.proto = proto,
.fl_ip_dport = dport,
.fl_ip_sport = sport,
};
if (sk)
security_sk_classify_flow(sk, &fl);
return ip_route_output_flow(net, &fl, sk);
}
static inline struct rtable *ip_route_output_gre(struct net *net,
__be32 daddr, __be32 saddr,
__be32 gre_key, __u8 tos, int oif)
{
struct flowi fl = {
.oif = oif,
.fl4_dst = daddr,
.fl4_src = saddr,
.fl4_tos = tos,
.proto = IPPROTO_GRE,
.fl_gre_key = gre_key,
};
return ip_route_output_key(net, &fl);
}
extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src, extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src,
u8 tos, struct net_device *devin, bool noref); u8 tos, struct net_device *devin, bool noref);
......
...@@ -502,8 +502,6 @@ static int clip_setentry(struct atm_vcc *vcc, __be32 ip) ...@@ -502,8 +502,6 @@ static int clip_setentry(struct atm_vcc *vcc, __be32 ip)
struct atmarp_entry *entry; struct atmarp_entry *entry;
int error; int error;
struct clip_vcc *clip_vcc; struct clip_vcc *clip_vcc;
struct flowi fl = { .fl4_dst = ip,
.fl4_tos = 1 };
struct rtable *rt; struct rtable *rt;
if (vcc->push != clip_push) { if (vcc->push != clip_push) {
...@@ -520,7 +518,7 @@ static int clip_setentry(struct atm_vcc *vcc, __be32 ip) ...@@ -520,7 +518,7 @@ static int clip_setentry(struct atm_vcc *vcc, __be32 ip)
unlink_clip_vcc(clip_vcc); unlink_clip_vcc(clip_vcc);
return 0; return 0;
} }
rt = ip_route_output_key(&init_net, &fl); rt = ip_route_output(&init_net, ip, 0, 1, 0);
if (IS_ERR(rt)) if (IS_ERR(rt))
return PTR_ERR(rt); return PTR_ERR(rt);
neigh = __neigh_lookup(&clip_tbl, &ip, rt->dst.dev, 1); neigh = __neigh_lookup(&clip_tbl, &ip, rt->dst.dev, 1);
......
...@@ -412,10 +412,6 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) ...@@ -412,10 +412,6 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING; nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING;
if (dnat_took_place(skb)) { if (dnat_took_place(skb)) {
if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) { if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) {
struct flowi fl = {
.fl4_dst = iph->daddr,
.fl4_tos = RT_TOS(iph->tos),
};
struct in_device *in_dev = __in_dev_get_rcu(dev); struct in_device *in_dev = __in_dev_get_rcu(dev);
/* If err equals -EHOSTUNREACH the error is due to a /* If err equals -EHOSTUNREACH the error is due to a
...@@ -428,7 +424,8 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) ...@@ -428,7 +424,8 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
if (err != -EHOSTUNREACH || !in_dev || IN_DEV_FORWARD(in_dev)) if (err != -EHOSTUNREACH || !in_dev || IN_DEV_FORWARD(in_dev))
goto free_skb; goto free_skb;
rt = ip_route_output_key(dev_net(dev), &fl); rt = ip_route_output(dev_net(dev), iph->daddr, 0,
RT_TOS(iph->tos), 0);
if (!IS_ERR(rt)) { if (!IS_ERR(rt)) {
/* - Bridged-and-DNAT'ed traffic doesn't /* - Bridged-and-DNAT'ed traffic doesn't
* require ip_forwarding. */ * require ip_forwarding. */
......
...@@ -1157,22 +1157,10 @@ int inet_sk_rebuild_header(struct sock *sk) ...@@ -1157,22 +1157,10 @@ int inet_sk_rebuild_header(struct sock *sk)
daddr = inet->inet_daddr; daddr = inet->inet_daddr;
if (inet->opt && inet->opt->srr) if (inet->opt && inet->opt->srr)
daddr = inet->opt->faddr; daddr = inet->opt->faddr;
{ rt = ip_route_output_ports(sock_net(sk), sk, daddr, inet->inet_saddr,
struct flowi fl = { inet->inet_dport, inet->inet_sport,
.oif = sk->sk_bound_dev_if, sk->sk_protocol, RT_CONN_FLAGS(sk),
.mark = sk->sk_mark, sk->sk_bound_dev_if);
.fl4_dst = daddr,
.fl4_src = inet->inet_saddr,
.fl4_tos = RT_CONN_FLAGS(sk),
.proto = sk->sk_protocol,
.flags = inet_sk_flowi_flags(sk),
.fl_ip_sport = inet->inet_sport,
.fl_ip_dport = inet->inet_dport,
};
security_sk_classify_flow(sk, &fl);
rt = ip_route_output_flow(sock_net(sk), &fl, sk);
}
if (!IS_ERR(rt)) { if (!IS_ERR(rt)) {
err = 0; err = 0;
sk_setup_caps(sk, &rt->dst); sk_setup_caps(sk, &rt->dst);
......
...@@ -433,14 +433,12 @@ static int arp_ignore(struct in_device *in_dev, __be32 sip, __be32 tip) ...@@ -433,14 +433,12 @@ static int arp_ignore(struct in_device *in_dev, __be32 sip, __be32 tip)
static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev) static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)
{ {
struct flowi fl = { .fl4_dst = sip,
.fl4_src = tip };
struct rtable *rt; struct rtable *rt;
int flag = 0; int flag = 0;
/*unsigned long now; */ /*unsigned long now; */
struct net *net = dev_net(dev); struct net *net = dev_net(dev);
rt = ip_route_output_key(net, &fl); rt = ip_route_output(net, sip, tip, 0, 0);
if (IS_ERR(rt)) if (IS_ERR(rt))
return 1; return 1;
if (rt->dst.dev != dev) { if (rt->dst.dev != dev) {
...@@ -1062,9 +1060,7 @@ static int arp_req_set(struct net *net, struct arpreq *r, ...@@ -1062,9 +1060,7 @@ static int arp_req_set(struct net *net, struct arpreq *r,
if (r->arp_flags & ATF_PERM) if (r->arp_flags & ATF_PERM)
r->arp_flags |= ATF_COM; r->arp_flags |= ATF_COM;
if (dev == NULL) { if (dev == NULL) {
struct flowi fl = { .fl4_dst = ip, struct rtable *rt = ip_route_output(net, ip, 0, RTO_ONLINK, 0);
.fl4_tos = RTO_ONLINK };
struct rtable *rt = ip_route_output_key(net, &fl);
if (IS_ERR(rt)) if (IS_ERR(rt))
return PTR_ERR(rt); return PTR_ERR(rt);
...@@ -1185,9 +1181,7 @@ static int arp_req_delete(struct net *net, struct arpreq *r, ...@@ -1185,9 +1181,7 @@ static int arp_req_delete(struct net *net, struct arpreq *r,
ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr; ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr;
if (dev == NULL) { if (dev == NULL) {
struct flowi fl = { .fl4_dst = ip, struct rtable *rt = ip_route_output(net, ip, 0, RTO_ONLINK, 0);
.fl4_tos = RTO_ONLINK };
struct rtable *rt = ip_route_output_key(net, &fl);
if (IS_ERR(rt)) if (IS_ERR(rt))
return PTR_ERR(rt); return PTR_ERR(rt);
dev = rt->dst.dev; dev = rt->dst.dev;
......
...@@ -321,15 +321,12 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size) ...@@ -321,15 +321,12 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
} }
igmp_skb_size(skb) = size; igmp_skb_size(skb) = size;
{ rt = ip_route_output_ports(net, NULL, IGMPV3_ALL_MCR, 0,
struct flowi fl = { .oif = dev->ifindex, 0, 0,
.fl4_dst = IGMPV3_ALL_MCR, IPPROTO_IGMP, 0, dev->ifindex);
.proto = IPPROTO_IGMP }; if (IS_ERR(rt)) {
rt = ip_route_output_key(net, &fl); kfree_skb(skb);
if (IS_ERR(rt)) { return NULL;
kfree_skb(skb);
return NULL;
}
} }
if (rt->rt_src == 0) { if (rt->rt_src == 0) {
kfree_skb(skb); kfree_skb(skb);
...@@ -667,14 +664,12 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, ...@@ -667,14 +664,12 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
else else
dst = group; dst = group;
{ rt = ip_route_output_ports(net, NULL, dst, 0,
struct flowi fl = { .oif = dev->ifindex, 0, 0,
.fl4_dst = dst, IPPROTO_IGMP, 0, dev->ifindex);
.proto = IPPROTO_IGMP }; if (IS_ERR(rt))
rt = ip_route_output_key(net, &fl); return -1;
if (IS_ERR(rt))
return -1;
}
if (rt->rt_src == 0) { if (rt->rt_src == 0) {
ip_rt_put(rt); ip_rt_put(rt);
return -1; return -1;
...@@ -1441,7 +1436,6 @@ void ip_mc_destroy_dev(struct in_device *in_dev) ...@@ -1441,7 +1436,6 @@ void ip_mc_destroy_dev(struct in_device *in_dev)
/* RTNL is locked */ /* RTNL is locked */
static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr) static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr)
{ {
struct flowi fl = { .fl4_dst = imr->imr_multiaddr.s_addr };
struct net_device *dev = NULL; struct net_device *dev = NULL;
struct in_device *idev = NULL; struct in_device *idev = NULL;
...@@ -1456,7 +1450,9 @@ static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr) ...@@ -1456,7 +1450,9 @@ static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr)
} }
if (!dev) { if (!dev) {
struct rtable *rt = ip_route_output_key(net, &fl); struct rtable *rt = ip_route_output(net,
imr->imr_multiaddr.s_addr,
0, 0, 0);
if (!IS_ERR(rt)) { if (!IS_ERR(rt)) {
dev = rt->dst.dev; dev = rt->dst.dev;
ip_rt_put(rt); ip_rt_put(rt);
......
...@@ -769,20 +769,12 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev ...@@ -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); tos = ipv6_get_dsfield((struct ipv6hdr *)old_iph);
} }
{ rt = ip_route_output_gre(dev_net(dev), dst, tiph->saddr,
struct flowi fl = { tunnel->parms.o_key, RT_TOS(tos),