aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/ip_gre.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-03-12 00:00:52 -0500
committerDavid S. Miller <davem@davemloft.net>2011-03-12 18:08:42 -0500
commit78fbfd8a653ca972afe479517a40661bfff6d8c3 (patch)
tree9dccc5c16bf269d53d8499064ec95a998e84c646 /net/ipv4/ip_gre.c
parent1561747ddf9d28185548687b11aae7074d6129c4 (diff)
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: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ip_gre.c')
-rw-r--r--net/ipv4/ip_gre.c49
1 files changed, 17 insertions, 32 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 71465955520b..da5941f18c3c 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -769,20 +769,12 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
769 tos = ipv6_get_dsfield((struct ipv6hdr *)old_iph); 769 tos = ipv6_get_dsfield((struct ipv6hdr *)old_iph);
770 } 770 }
771 771
772 { 772 rt = ip_route_output_gre(dev_net(dev), dst, tiph->saddr,
773 struct flowi fl = { 773 tunnel->parms.o_key, RT_TOS(tos),
774 .oif = tunnel->parms.link, 774 tunnel->parms.link);
775 .fl4_dst = dst, 775 if (IS_ERR(rt)) {
776 .fl4_src = tiph->saddr, 776 dev->stats.tx_carrier_errors++;
777 .fl4_tos = RT_TOS(tos), 777 goto tx_error;
778 .proto = IPPROTO_GRE,
779 .fl_gre_key = tunnel->parms.o_key
780 };
781 rt = ip_route_output_key(dev_net(dev), &fl);
782 if (IS_ERR(rt)) {
783 dev->stats.tx_carrier_errors++;
784 goto tx_error;
785 }
786 } 778 }
787 tdev = rt->dst.dev; 779 tdev = rt->dst.dev;
788 780
@@ -946,15 +938,11 @@ static int ipgre_tunnel_bind_dev(struct net_device *dev)
946 /* Guess output device to choose reasonable mtu and needed_headroom */ 938 /* Guess output device to choose reasonable mtu and needed_headroom */
947 939
948 if (iph->daddr) { 940 if (iph->daddr) {
949 struct flowi fl = { 941 struct rtable *rt = ip_route_output_gre(dev_net(dev),
950 .oif = tunnel->parms.link, 942 iph->daddr, iph->saddr,
951 .fl4_dst = iph->daddr, 943 tunnel->parms.o_key,
952 .fl4_src = iph->saddr, 944 RT_TOS(iph->tos),
953 .fl4_tos = RT_TOS(iph->tos), 945 tunnel->parms.link);
954 .proto = IPPROTO_GRE,
955 .fl_gre_key = tunnel->parms.o_key
956 };
957 struct rtable *rt = ip_route_output_key(dev_net(dev), &fl);
958 946
959 if (!IS_ERR(rt)) { 947 if (!IS_ERR(rt)) {
960 tdev = rt->dst.dev; 948 tdev = rt->dst.dev;
@@ -1208,15 +1196,12 @@ static int ipgre_open(struct net_device *dev)
1208 struct ip_tunnel *t = netdev_priv(dev); 1196 struct ip_tunnel *t = netdev_priv(dev);
1209 1197
1210 if (ipv4_is_multicast(t->parms.iph.daddr)) { 1198 if (ipv4_is_multicast(t->parms.iph.daddr)) {
1211 struct flowi fl = { 1199 struct rtable *rt = ip_route_output_gre(dev_net(dev),
1212 .oif = t->parms.link, 1200 t->parms.iph.daddr,
1213 .fl4_dst = t->parms.iph.daddr, 1201 t->parms.iph.saddr,
1214 .fl4_src = t->parms.iph.saddr, 1202 t->parms.o_key,
1215 .fl4_tos = RT_TOS(t->parms.iph.tos), 1203 RT_TOS(t->parms.iph.tos),
1216 .proto = IPPROTO_GRE, 1204 t->parms.link);
1217 .fl_gre_key = t->parms.o_key
1218 };
1219 struct rtable *rt = ip_route_output_key(dev_net(dev), &fl);
1220 1205
1221 if (IS_ERR(rt)) 1206 if (IS_ERR(rt))
1222 return -EADDRNOTAVAIL; 1207 return -EADDRNOTAVAIL;