ipv4: Kill 'rt_src' from 'struct rtable'
authorDavid Miller <davem@davemloft.net>
Sun, 1 Jul 2012 02:02:59 +0000 (02:02 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Jul 2012 20:31:00 +0000 (13:31 -0700)
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/route.h
net/ipv4/route.c
net/ipv4/xfrm4_policy.c

index 935fa59630b0c533b45a975a099747704130e827..85d1093e42dea3c1a8dcabda1461848e113c9c4c 100644 (file)
@@ -49,7 +49,6 @@ struct rtable {
        __u16                   rt_type;
 
        __be32                  rt_dst; /* Path destination     */
-       __be32                  rt_src; /* Path source          */
        int                     rt_route_iif;
        int                     rt_iif;
        int                     rt_oif;
index c89d690acdfaf1e04c621fd14b6bbfb0c86d0137..fc1199dc23e7f7ad3e212759b4f8e9c9df5c3f43 100644 (file)
@@ -1272,7 +1272,6 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
        rth->rt_flags   = RTCF_MULTICAST;
        rth->rt_type    = RTN_MULTICAST;
        rth->rt_dst     = daddr;
-       rth->rt_src     = saddr;
        rth->rt_route_iif = dev->ifindex;
        rth->rt_iif     = dev->ifindex;
        rth->rt_oif     = 0;
@@ -1393,7 +1392,6 @@ static int __mkroute_input(struct sk_buff *skb,
        rth->rt_flags = flags;
        rth->rt_type = res->type;
        rth->rt_dst     = daddr;
-       rth->rt_src     = saddr;
        rth->rt_route_iif = in_dev->dev->ifindex;
        rth->rt_iif     = in_dev->dev->ifindex;
        rth->rt_oif     = 0;
@@ -1561,7 +1559,6 @@ local_input:
        rth->rt_flags   = flags|RTCF_LOCAL;
        rth->rt_type    = res.type;
        rth->rt_dst     = daddr;
-       rth->rt_src     = saddr;
        rth->rt_route_iif = dev->ifindex;
        rth->rt_iif     = dev->ifindex;
        rth->rt_oif     = 0;
@@ -1714,7 +1711,6 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
        rth->rt_flags   = flags;
        rth->rt_type    = type;
        rth->rt_dst     = fl4->daddr;
-       rth->rt_src     = fl4->saddr;
        rth->rt_route_iif = 0;
        rth->rt_iif     = orig_oif ? : dev_out->ifindex;
        rth->rt_oif     = orig_oif;
@@ -2005,7 +2001,6 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
                rt->rt_flags = ort->rt_flags;
                rt->rt_type = ort->rt_type;
                rt->rt_dst = ort->rt_dst;
-               rt->rt_src = ort->rt_src;
                rt->rt_gateway = ort->rt_gateway;
                rt->fi = ort->fi;
                if (rt->fi)
@@ -2036,7 +2031,7 @@ struct rtable *ip_route_output_flow(struct net *net, struct flowi4 *flp4,
 }
 EXPORT_SYMBOL_GPL(ip_route_output_flow);
 
-static int rt_fill_info(struct net *net,  __be32 src, u8 tos,
+static int rt_fill_info(struct net *net,  __be32 src, struct flowi4 *fl4,
                        struct sk_buff *skb, u32 pid, u32 seq, int event,
                        int nowait, unsigned int flags)
 {
@@ -2055,7 +2050,7 @@ static int rt_fill_info(struct net *net,  __be32 src, u8 tos,
        r->rtm_family    = AF_INET;
        r->rtm_dst_len  = 32;
        r->rtm_src_len  = 0;
-       r->rtm_tos      = tos;
+       r->rtm_tos      = fl4->flowi4_tos;
        r->rtm_table    = RT_TABLE_MAIN;
        if (nla_put_u32(skb, RTA_TABLE, RT_TABLE_MAIN))
                goto nla_put_failure;
@@ -2082,11 +2077,11 @@ static int rt_fill_info(struct net *net,  __be32 src, u8 tos,
                goto nla_put_failure;
 #endif
        if (!rt_is_input_route(rt) &&
-           rt->rt_src != src) {
-               if (nla_put_be32(skb, RTA_PREFSRC, rt->rt_src))
+           fl4->saddr != src) {
+               if (nla_put_be32(skb, RTA_PREFSRC, fl4->saddr))
                        goto nla_put_failure;
        }
-       if (rt->rt_dst != rt->rt_gateway &&
+       if (fl4->daddr != rt->rt_gateway &&
            nla_put_be32(skb, RTA_GATEWAY, rt->rt_gateway))
                goto nla_put_failure;
 
@@ -2116,7 +2111,7 @@ static int rt_fill_info(struct net *net,  __be32 src, u8 tos,
                if (ipv4_is_multicast(dst) && !ipv4_is_local_multicast(dst) &&
                    IPV4_DEVCONF_ALL(net, MC_FORWARDING)) {
                        int err = ipmr_get_route(net, skb,
-                                                rt->rt_src, rt->rt_dst,
+                                                fl4->saddr, fl4->daddr,
                                                 r, nowait);
                        if (err <= 0) {
                                if (!nowait) {
@@ -2151,6 +2146,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
        struct rtmsg *rtm;
        struct nlattr *tb[RTA_MAX+1];
        struct rtable *rt = NULL;
+       struct flowi4 fl4;
        __be32 dst = 0;
        __be32 src = 0;
        u32 iif;
@@ -2185,6 +2181,13 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
        iif = tb[RTA_IIF] ? nla_get_u32(tb[RTA_IIF]) : 0;
        mark = tb[RTA_MARK] ? nla_get_u32(tb[RTA_MARK]) : 0;
 
+       memset(&fl4, 0, sizeof(fl4));
+       fl4.daddr = dst;
+       fl4.saddr = src;
+       fl4.flowi4_tos = rtm->rtm_tos;
+       fl4.flowi4_oif = tb[RTA_OIF] ? nla_get_u32(tb[RTA_OIF]) : 0;
+       fl4.flowi4_mark = mark;
+
        if (iif) {
                struct net_device *dev;
 
@@ -2205,13 +2208,6 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
                if (err == 0 && rt->dst.error)
                        err = -rt->dst.error;
        } else {
-               struct flowi4 fl4 = {
-                       .daddr = dst,
-                       .saddr = src,
-                       .flowi4_tos = rtm->rtm_tos,
-                       .flowi4_oif = tb[RTA_OIF] ? nla_get_u32(tb[RTA_OIF]) : 0,
-                       .flowi4_mark = mark,
-               };
                rt = ip_route_output_key(net, &fl4);
 
                err = 0;
@@ -2226,7 +2222,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
        if (rtm->rtm_flags & RTM_F_NOTIFY)
                rt->rt_flags |= RTCF_NOTIFY;
 
-       err = rt_fill_info(net, src, rtm->rtm_tos, skb,
+       err = rt_fill_info(net, src, &fl4, skb,
                           NETLINK_CB(in_skb).pid, nlh->nlmsg_seq,
                           RTM_NEWROUTE, 0, 0);
        if (err <= 0)
index 2a8d5cfc340fd4c7d206418ec3c4f893854df856..00d49e415113909692962ea2c1cdfb5b7c953a6b 100644 (file)
@@ -92,7 +92,6 @@ static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
        xdst->u.rt.rt_flags = rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST |
                                              RTCF_LOCAL);
        xdst->u.rt.rt_type = rt->rt_type;
-       xdst->u.rt.rt_src = rt->rt_src;
        xdst->u.rt.rt_dst = rt->rt_dst;
        xdst->u.rt.rt_gateway = rt->rt_gateway;
        xdst->u.rt.rt_pmtu = rt->rt_pmtu;