diff options
-rw-r--r-- | drivers/infiniband/core/addr.c | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_cm.c | 2 | ||||
-rw-r--r-- | drivers/net/appletalk/ipddp.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c | 3 | ||||
-rw-r--r-- | include/net/route.h | 8 | ||||
-rw-r--r-- | net/atm/clip.c | 4 | ||||
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 4 | ||||
-rw-r--r-- | net/ipv4/ip_forward.c | 2 | ||||
-rw-r--r-- | net/ipv4/ip_output.c | 2 | ||||
-rw-r--r-- | net/ipv4/route.c | 51 | ||||
-rw-r--r-- | net/ipv4/xfrm4_policy.c | 5 | ||||
-rw-r--r-- | net/mpls/mpls_iptunnel.c | 11 |
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 | */ |
117 | static netdev_tx_t ipddp_xmit(struct sk_buff *skb, struct net_device *dev) | 117 | static 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 | ||
321 | out: | 322 | out: |
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 | ||
83 | static inline __be32 rt_nexthop(const struct rtable *rt, __be32 daddr) | 83 | static 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 | ||
474 | packet_routed: | 474 | packet_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 | ||
454 | static void ipv4_confirm_neigh(const struct dst_entry *dst, const void *daddr) | 453 | static 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], |