summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/core/addr.c2
-rw-r--r--drivers/infiniband/hw/nes/nes_cm.c2
-rw-r--r--drivers/net/appletalk/ipddp.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c3
-rw-r--r--include/net/route.h8
-rw-r--r--net/atm/clip.c4
-rw-r--r--net/ipv4/inet_connection_sock.c4
-rw-r--r--net/ipv4/ip_forward.c2
-rw-r--r--net/ipv4/ip_output.c2
-rw-r--r--net/ipv4/route.c51
-rw-r--r--net/ipv4/xfrm4_policy.c5
-rw-r--r--net/mpls/mpls_iptunnel.c11
13 files changed, 57 insertions, 45 deletions
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index 2649e0f2ff65..f5ecb660fe7d 100644
--- a/drivers/infiniband/core/addr.c
+++ b/drivers/infiniband/core/addr.c
@@ -351,7 +351,7 @@ static bool has_gateway(const struct dst_entry *dst, sa_family_t family)
351 351
352 if (family == AF_INET) { 352 if (family == AF_INET) {
353 rt = container_of(dst, struct rtable, dst); 353 rt = container_of(dst, struct rtable, dst);
354 return rt->rt_uses_gateway; 354 return rt->rt_gw_family == AF_INET;
355 } 355 }
356 356
357 rt6 = container_of(dst, struct rt6_info, dst); 357 rt6 = container_of(dst, struct rt6_info, dst);
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
index 032883180f65..0010a3ed64f1 100644
--- a/drivers/infiniband/hw/nes/nes_cm.c
+++ b/drivers/infiniband/hw/nes/nes_cm.c
@@ -1407,7 +1407,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
1407 if (neigh->nud_state & NUD_VALID) { 1407 if (neigh->nud_state & NUD_VALID) {
1408 nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X" 1408 nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X"
1409 " is %pM, Gateway is 0x%08X \n", dst_ip, 1409 " is %pM, Gateway is 0x%08X \n", dst_ip,
1410 neigh->ha, ntohl(rt->rt_gateway)); 1410 neigh->ha, ntohl(rt->rt_gw4));
1411 1411
1412 if (arpindex >= 0) { 1412 if (arpindex >= 0) {
1413 if (ether_addr_equal(nesadapter->arp_table[arpindex].mac_addr, neigh->ha)) { 1413 if (ether_addr_equal(nesadapter->arp_table[arpindex].mac_addr, neigh->ha)) {
diff --git a/drivers/net/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c
index 3d27616d9c85..51cf5eca9c7f 100644
--- a/drivers/net/appletalk/ipddp.c
+++ b/drivers/net/appletalk/ipddp.c
@@ -116,11 +116,15 @@ static struct net_device * __init ipddp_init(void)
116 */ 116 */
117static netdev_tx_t ipddp_xmit(struct sk_buff *skb, struct net_device *dev) 117static netdev_tx_t ipddp_xmit(struct sk_buff *skb, struct net_device *dev)
118{ 118{
119 __be32 paddr = skb_rtable(skb)->rt_gateway; 119 struct rtable *rtable = skb_rtable(skb);
120 __be32 paddr = 0;
120 struct ddpehdr *ddp; 121 struct ddpehdr *ddp;
121 struct ipddp_route *rt; 122 struct ipddp_route *rt;
122 struct atalk_addr *our_addr; 123 struct atalk_addr *our_addr;
123 124
125 if (rtable->rt_gw_family == AF_INET)
126 paddr = rtable->rt_gw4;
127
124 spin_lock(&ipddp_route_lock); 128 spin_lock(&ipddp_route_lock);
125 129
126 /* 130 /*
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
index 9ab3bd904295..b9d5830e8344 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
@@ -70,7 +70,7 @@ static int mlx5e_route_lookup_ipv4(struct mlx5e_priv *priv,
70 if (ret) 70 if (ret)
71 return ret; 71 return ret;
72 72
73 if (mlx5_lag_is_multipath(mdev) && !rt->rt_gateway) 73 if (mlx5_lag_is_multipath(mdev) && rt->rt_gw_family != AF_INET)
74 return -ENETUNREACH; 74 return -ENETUNREACH;
75#else 75#else
76 return -EOPNOTSUPP; 76 return -EOPNOTSUPP;
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
index 536c23c578c3..133a497e3457 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
@@ -316,7 +316,8 @@ mlxsw_sp_span_gretap4_route(const struct net_device *to_dev,
316 316
317 dev = rt->dst.dev; 317 dev = rt->dst.dev;
318 *saddrp = fl4.saddr; 318 *saddrp = fl4.saddr;
319 *daddrp = rt->rt_gateway; 319 if (rt->rt_gw_family == AF_INET)
320 *daddrp = rt->rt_gw4;
320 321
321out: 322out:
322 ip_rt_put(rt); 323 ip_rt_put(rt);
diff --git a/include/net/route.h b/include/net/route.h
index 9883dc82f723..96912b099c08 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -55,12 +55,12 @@ struct rtable {
55 unsigned int rt_flags; 55 unsigned int rt_flags;
56 __u16 rt_type; 56 __u16 rt_type;
57 __u8 rt_is_input; 57 __u8 rt_is_input;
58 __u8 rt_uses_gateway; 58 u8 rt_gw_family;
59 59
60 int rt_iif; 60 int rt_iif;
61 61
62 /* Info on neighbour */ 62 /* Info on neighbour */
63 __be32 rt_gateway; 63 __be32 rt_gw4;
64 64
65 /* Miscellaneous cached information */ 65 /* Miscellaneous cached information */
66 u32 rt_mtu_locked:1, 66 u32 rt_mtu_locked:1,
@@ -82,8 +82,8 @@ static inline bool rt_is_output_route(const struct rtable *rt)
82 82
83static inline __be32 rt_nexthop(const struct rtable *rt, __be32 daddr) 83static inline __be32 rt_nexthop(const struct rtable *rt, __be32 daddr)
84{ 84{
85 if (rt->rt_gateway) 85 if (rt->rt_gw_family == AF_INET)
86 return rt->rt_gateway; 86 return rt->rt_gw4;
87 return daddr; 87 return daddr;
88} 88}
89 89
diff --git a/net/atm/clip.c b/net/atm/clip.c
index d795b9c5aea4..b9e67e589a7b 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -345,8 +345,8 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
345 return NETDEV_TX_OK; 345 return NETDEV_TX_OK;
346 } 346 }
347 rt = (struct rtable *) dst; 347 rt = (struct rtable *) dst;
348 if (rt->rt_gateway) 348 if (rt->rt_gw_family == AF_INET)
349 daddr = &rt->rt_gateway; 349 daddr = &rt->rt_gw4;
350 else 350 else
351 daddr = &ip_hdr(skb)->daddr; 351 daddr = &ip_hdr(skb)->daddr;
352 n = dst_neigh_lookup(dst, daddr); 352 n = dst_neigh_lookup(dst, daddr);
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index 6ea523d71947..a175e3e7ae97 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -564,7 +564,7 @@ struct dst_entry *inet_csk_route_req(const struct sock *sk,
564 rt = ip_route_output_flow(net, fl4, sk); 564 rt = ip_route_output_flow(net, fl4, sk);
565 if (IS_ERR(rt)) 565 if (IS_ERR(rt))
566 goto no_route; 566 goto no_route;
567 if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway) 567 if (opt && opt->opt.is_strictroute && rt->rt_gw_family)
568 goto route_err; 568 goto route_err;
569 rcu_read_unlock(); 569 rcu_read_unlock();
570 return &rt->dst; 570 return &rt->dst;
@@ -602,7 +602,7 @@ struct dst_entry *inet_csk_route_child_sock(const struct sock *sk,
602 rt = ip_route_output_flow(net, fl4, sk); 602 rt = ip_route_output_flow(net, fl4, sk);
603 if (IS_ERR(rt)) 603 if (IS_ERR(rt))
604 goto no_route; 604 goto no_route;
605 if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway) 605 if (opt && opt->opt.is_strictroute && rt->rt_gw_family)
606 goto route_err; 606 goto route_err;
607 return &rt->dst; 607 return &rt->dst;
608 608
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c
index 00ec819f949b..06f6f280b9ff 100644
--- a/net/ipv4/ip_forward.c
+++ b/net/ipv4/ip_forward.c
@@ -123,7 +123,7 @@ int ip_forward(struct sk_buff *skb)
123 123
124 rt = skb_rtable(skb); 124 rt = skb_rtable(skb);
125 125
126 if (opt->is_strictroute && rt->rt_uses_gateway) 126 if (opt->is_strictroute && rt->rt_gw_family)
127 goto sr_failed; 127 goto sr_failed;
128 128
129 IPCB(skb)->flags |= IPSKB_FORWARDED; 129 IPCB(skb)->flags |= IPSKB_FORWARDED;
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 10b35328cfbc..a2bd4a6d9e6b 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -472,7 +472,7 @@ int __ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
472 skb_dst_set_noref(skb, &rt->dst); 472 skb_dst_set_noref(skb, &rt->dst);
473 473
474packet_routed: 474packet_routed:
475 if (inet_opt && inet_opt->opt.is_strictroute && rt->rt_uses_gateway) 475 if (inet_opt && inet_opt->opt.is_strictroute && rt->rt_gw_family)
476 goto no_route; 476 goto no_route;
477 477
478 /* OK, we know where to send it, allocate and build IP header. */ 478 /* OK, we know where to send it, allocate and build IP header. */
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index e7338e421796..b77b4950d0c7 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -434,14 +434,13 @@ static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst,
434 struct sk_buff *skb, 434 struct sk_buff *skb,
435 const void *daddr) 435 const void *daddr)
436{ 436{
437 const struct rtable *rt = container_of(dst, struct rtable, dst);
437 struct net_device *dev = dst->dev; 438 struct net_device *dev = dst->dev;
438 const __be32 *pkey = daddr; 439 const __be32 *pkey = daddr;
439 const struct rtable *rt;
440 struct neighbour *n; 440 struct neighbour *n;
441 441
442 rt = (const struct rtable *) dst; 442 if (rt->rt_gw_family == AF_INET)
443 if (rt->rt_gateway) 443 pkey = (const __be32 *) &rt->rt_gw4;
444 pkey = (const __be32 *) &rt->rt_gateway;
445 else if (skb) 444 else if (skb)
446 pkey = &ip_hdr(skb)->daddr; 445 pkey = &ip_hdr(skb)->daddr;
447 446
@@ -453,13 +452,12 @@ static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst,
453 452
454static void ipv4_confirm_neigh(const struct dst_entry *dst, const void *daddr) 453static void ipv4_confirm_neigh(const struct dst_entry *dst, const void *daddr)
455{ 454{
455 const struct rtable *rt = container_of(dst, struct rtable, dst);
456 struct net_device *dev = dst->dev; 456 struct net_device *dev = dst->dev;
457 const __be32 *pkey = daddr; 457 const __be32 *pkey = daddr;
458 const struct rtable *rt;
459 458
460 rt = (const struct rtable *)dst; 459 if (rt->rt_gw_family == AF_INET)
461 if (rt->rt_gateway) 460 pkey = (const __be32 *)&rt->rt_gw4;
462 pkey = (const __be32 *)&rt->rt_gateway;
463 else if (!daddr || 461 else if (!daddr ||
464 (rt->rt_flags & 462 (rt->rt_flags &
465 (RTCF_MULTICAST | RTCF_BROADCAST | RTCF_LOCAL))) 463 (RTCF_MULTICAST | RTCF_BROADCAST | RTCF_LOCAL)))
@@ -629,8 +627,8 @@ static void fill_route_from_fnhe(struct rtable *rt, struct fib_nh_exception *fnh
629 627
630 if (fnhe->fnhe_gw) { 628 if (fnhe->fnhe_gw) {
631 rt->rt_flags |= RTCF_REDIRECTED; 629 rt->rt_flags |= RTCF_REDIRECTED;
632 rt->rt_gateway = fnhe->fnhe_gw; 630 rt->rt_gw_family = AF_INET;
633 rt->rt_uses_gateway = 1; 631 rt->rt_gw4 = fnhe->fnhe_gw;
634 } 632 }
635} 633}
636 634
@@ -747,7 +745,7 @@ static void __ip_do_redirect(struct rtable *rt, struct sk_buff *skb, struct flow
747 return; 745 return;
748 } 746 }
749 747
750 if (rt->rt_gateway != old_gw) 748 if (rt->rt_gw_family != AF_INET || rt->rt_gw4 != old_gw)
751 return; 749 return;
752 750
753 in_dev = __in_dev_get_rcu(dev); 751 in_dev = __in_dev_get_rcu(dev);
@@ -1282,7 +1280,7 @@ static unsigned int ipv4_mtu(const struct dst_entry *dst)
1282 mtu = READ_ONCE(dst->dev->mtu); 1280 mtu = READ_ONCE(dst->dev->mtu);
1283 1281
1284 if (unlikely(ip_mtu_locked(dst))) { 1282 if (unlikely(ip_mtu_locked(dst))) {
1285 if (rt->rt_uses_gateway && mtu > 576) 1283 if (rt->rt_gw_family && mtu > 576)
1286 mtu = 576; 1284 mtu = 576;
1287 } 1285 }
1288 1286
@@ -1410,8 +1408,10 @@ static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe,
1410 orig = NULL; 1408 orig = NULL;
1411 } 1409 }
1412 fill_route_from_fnhe(rt, fnhe); 1410 fill_route_from_fnhe(rt, fnhe);
1413 if (!rt->rt_gateway) 1411 if (!rt->rt_gw4) {
1414 rt->rt_gateway = daddr; 1412 rt->rt_gw4 = daddr;
1413 rt->rt_gw_family = AF_INET;
1414 }
1415 1415
1416 if (do_cache) { 1416 if (do_cache) {
1417 dst_hold(&rt->dst); 1417 dst_hold(&rt->dst);
@@ -1538,8 +1538,8 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
1538 struct fib_nh *nh = container_of(nhc, struct fib_nh, nh_common); 1538 struct fib_nh *nh = container_of(nhc, struct fib_nh, nh_common);
1539 1539
1540 if (nh->fib_nh_gw4 && nh->fib_nh_scope == RT_SCOPE_LINK) { 1540 if (nh->fib_nh_gw4 && nh->fib_nh_scope == RT_SCOPE_LINK) {
1541 rt->rt_gateway = nh->fib_nh_gw4; 1541 rt->rt_gw4 = nh->fib_nh_gw4;
1542 rt->rt_uses_gateway = 1; 1542 rt->rt_gw_family = AF_INET;
1543 } 1543 }
1544 ip_dst_init_metrics(&rt->dst, fi->fib_metrics); 1544 ip_dst_init_metrics(&rt->dst, fi->fib_metrics);
1545 1545
@@ -1557,8 +1557,10 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
1557 * However, if we are unsuccessful at storing this 1557 * However, if we are unsuccessful at storing this
1558 * route into the cache we really need to set it. 1558 * route into the cache we really need to set it.
1559 */ 1559 */
1560 if (!rt->rt_gateway) 1560 if (!rt->rt_gw4) {
1561 rt->rt_gateway = daddr; 1561 rt->rt_gw_family = AF_INET;
1562 rt->rt_gw4 = daddr;
1563 }
1562 rt_add_uncached_list(rt); 1564 rt_add_uncached_list(rt);
1563 } 1565 }
1564 } else 1566 } else
@@ -1591,8 +1593,8 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
1591 rt->rt_iif = 0; 1593 rt->rt_iif = 0;
1592 rt->rt_pmtu = 0; 1594 rt->rt_pmtu = 0;
1593 rt->rt_mtu_locked = 0; 1595 rt->rt_mtu_locked = 0;
1594 rt->rt_gateway = 0; 1596 rt->rt_gw_family = 0;
1595 rt->rt_uses_gateway = 0; 1597 rt->rt_gw4 = 0;
1596 INIT_LIST_HEAD(&rt->rt_uncached); 1598 INIT_LIST_HEAD(&rt->rt_uncached);
1597 1599
1598 rt->dst.output = ip_output; 1600 rt->dst.output = ip_output;
@@ -2595,8 +2597,9 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
2595 rt->rt_genid = rt_genid_ipv4(net); 2597 rt->rt_genid = rt_genid_ipv4(net);
2596 rt->rt_flags = ort->rt_flags; 2598 rt->rt_flags = ort->rt_flags;
2597 rt->rt_type = ort->rt_type; 2599 rt->rt_type = ort->rt_type;
2598 rt->rt_gateway = ort->rt_gateway; 2600 rt->rt_gw_family = ort->rt_gw_family;
2599 rt->rt_uses_gateway = ort->rt_uses_gateway; 2601 if (rt->rt_gw_family == AF_INET)
2602 rt->rt_gw4 = ort->rt_gw4;
2600 2603
2601 INIT_LIST_HEAD(&rt->rt_uncached); 2604 INIT_LIST_HEAD(&rt->rt_uncached);
2602 } 2605 }
@@ -2675,8 +2678,8 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
2675 if (nla_put_in_addr(skb, RTA_PREFSRC, fl4->saddr)) 2678 if (nla_put_in_addr(skb, RTA_PREFSRC, fl4->saddr))
2676 goto nla_put_failure; 2679 goto nla_put_failure;
2677 } 2680 }
2678 if (rt->rt_uses_gateway && 2681 if (rt->rt_gw_family == AF_INET &&
2679 nla_put_in_addr(skb, RTA_GATEWAY, rt->rt_gateway)) 2682 nla_put_in_addr(skb, RTA_GATEWAY, rt->rt_gw4))
2680 goto nla_put_failure; 2683 goto nla_put_failure;
2681 2684
2682 expires = rt->dst.expires; 2685 expires = rt->dst.expires;
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
index d73a6d6652f6..ee53a91526e5 100644
--- a/net/ipv4/xfrm4_policy.c
+++ b/net/ipv4/xfrm4_policy.c
@@ -97,8 +97,9 @@ static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
97 xdst->u.rt.rt_flags = rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST | 97 xdst->u.rt.rt_flags = rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST |
98 RTCF_LOCAL); 98 RTCF_LOCAL);
99 xdst->u.rt.rt_type = rt->rt_type; 99 xdst->u.rt.rt_type = rt->rt_type;
100 xdst->u.rt.rt_gateway = rt->rt_gateway; 100 xdst->u.rt.rt_gw_family = rt->rt_gw_family;
101 xdst->u.rt.rt_uses_gateway = rt->rt_uses_gateway; 101 if (rt->rt_gw_family == AF_INET)
102 xdst->u.rt.rt_gw4 = rt->rt_gw4;
102 xdst->u.rt.rt_pmtu = rt->rt_pmtu; 103 xdst->u.rt.rt_pmtu = rt->rt_pmtu;
103 xdst->u.rt.rt_mtu_locked = rt->rt_mtu_locked; 104 xdst->u.rt.rt_mtu_locked = rt->rt_mtu_locked;
104 INIT_LIST_HEAD(&xdst->u.rt.rt_uncached); 105 INIT_LIST_HEAD(&xdst->u.rt.rt_uncached);
diff --git a/net/mpls/mpls_iptunnel.c b/net/mpls/mpls_iptunnel.c
index f3a8557494d6..1f61b4e53686 100644
--- a/net/mpls/mpls_iptunnel.c
+++ b/net/mpls/mpls_iptunnel.c
@@ -137,10 +137,13 @@ static int mpls_xmit(struct sk_buff *skb)
137 137
138 mpls_stats_inc_outucastpkts(out_dev, skb); 138 mpls_stats_inc_outucastpkts(out_dev, skb);
139 139
140 if (rt) 140 if (rt) {
141 err = neigh_xmit(NEIGH_ARP_TABLE, out_dev, &rt->rt_gateway, 141 if (rt->rt_gw_family == AF_INET)
142 skb); 142 err = neigh_xmit(NEIGH_ARP_TABLE, out_dev, &rt->rt_gw4,
143 else if (rt6) { 143 skb);
144 else
145 err = -EAFNOSUPPORT;
146 } else if (rt6) {
144 if (ipv6_addr_v4mapped(&rt6->rt6i_gateway)) { 147 if (ipv6_addr_v4mapped(&rt6->rt6i_gateway)) {
145 /* 6PE (RFC 4798) */ 148 /* 6PE (RFC 4798) */
146 err = neigh_xmit(NEIGH_ARP_TABLE, out_dev, &rt6->rt6i_gateway.s6_addr32[3], 149 err = neigh_xmit(NEIGH_ARP_TABLE, out_dev, &rt6->rt6i_gateway.s6_addr32[3],