Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv4: Remove flowi from struct rtable.

The only necessary parts are the src/dst addresses, the
interface indexes, the TOS, and the mark.

The rest is unnecessary bloat, which amounts to nearly
50 bytes on 64-bit.

Signed-off-by: David S. Miller <davem@davemloft.net>

+146 -94
+13 -9
include/net/route.h
··· 53 53 struct rtable { 54 54 struct dst_entry dst; 55 55 56 - /* Cache lookup keys */ 57 - struct flowi fl; 56 + /* Lookup key. */ 57 + __be32 rt_key_dst; 58 + __be32 rt_key_src; 58 59 59 60 int rt_genid; 60 61 unsigned rt_flags; 61 62 __u16 rt_type; 63 + __u8 rt_tos; 62 64 63 65 __be32 rt_dst; /* Path destination */ 64 66 __be32 rt_src; /* Path source */ 65 67 int rt_iif; 68 + int rt_oif; 69 + __u32 rt_mark; 66 70 67 71 /* Info on neighbour */ 68 72 __be32 rt_gateway; ··· 80 76 81 77 static inline bool rt_is_input_route(struct rtable *rt) 82 78 { 83 - return rt->fl.iif != 0; 79 + return rt->rt_iif != 0; 84 80 } 85 81 86 82 static inline bool rt_is_output_route(struct rtable *rt) 87 83 { 88 - return rt->fl.iif == 0; 84 + return rt->rt_iif == 0; 89 85 } 90 86 91 87 struct ip_rt_acct { ··· 216 212 __be16 dport, struct sock *sk) 217 213 { 218 214 if (sport != orig_sport || dport != orig_dport) { 219 - struct flowi fl = { .oif = rt->fl.oif, 220 - .mark = rt->fl.mark, 221 - .fl4_dst = rt->fl.fl4_dst, 222 - .fl4_src = rt->fl.fl4_src, 223 - .fl4_tos = rt->fl.fl4_tos, 215 + struct flowi fl = { .oif = rt->rt_oif, 216 + .mark = rt->rt_mark, 217 + .fl4_dst = rt->rt_key_dst, 218 + .fl4_src = rt->rt_key_src, 219 + .fl4_tos = rt->rt_tos, 224 220 .proto = protocol, 225 221 .fl_ip_sport = sport, 226 222 .fl_ip_dport = dport };
+1 -1
net/ipv4/icmp.c
··· 563 563 rcu_read_lock(); 564 564 if (rt_is_input_route(rt) && 565 565 net->ipv4.sysctl_icmp_errors_use_inbound_ifaddr) 566 - dev = dev_get_by_index_rcu(net, rt->fl.iif); 566 + dev = dev_get_by_index_rcu(net, rt->rt_iif); 567 567 568 568 if (dev) 569 569 saddr = inet_select_addr(dev, 0, RT_SCOPE_LINK);
+41 -11
net/ipv4/ipmr.c
··· 1813 1813 if (IPCB(skb)->flags & IPSKB_FORWARDED) 1814 1814 goto dont_forward; 1815 1815 1816 - err = ipmr_fib_lookup(net, &skb_rtable(skb)->fl, &mrt); 1817 - if (err < 0) { 1818 - kfree_skb(skb); 1819 - return err; 1816 + { 1817 + struct rtable *rt = skb_rtable(skb); 1818 + struct flowi fl = { 1819 + .fl4_dst = rt->rt_key_dst, 1820 + .fl4_src = rt->rt_key_src, 1821 + .fl4_tos = rt->rt_tos, 1822 + .oif = rt->rt_oif, 1823 + .iif = rt->rt_iif, 1824 + .mark = rt->rt_mark, 1825 + }; 1826 + err = ipmr_fib_lookup(net, &fl, &mrt); 1827 + if (err < 0) { 1828 + kfree_skb(skb); 1829 + return err; 1830 + } 1820 1831 } 1821 - 1822 1832 if (!local) { 1823 1833 if (IPCB(skb)->opt.router_alert) { 1824 1834 if (ip_call_ra_chain(skb)) ··· 1956 1946 1957 1947 pim = igmp_hdr(skb); 1958 1948 1959 - if (ipmr_fib_lookup(net, &skb_rtable(skb)->fl, &mrt) < 0) 1960 - goto drop; 1961 - 1949 + { 1950 + struct rtable *rt = skb_rtable(skb); 1951 + struct flowi fl = { 1952 + .fl4_dst = rt->rt_key_dst, 1953 + .fl4_src = rt->rt_key_src, 1954 + .fl4_tos = rt->rt_tos, 1955 + .oif = rt->rt_oif, 1956 + .iif = rt->rt_iif, 1957 + .mark = rt->rt_mark, 1958 + }; 1959 + if (ipmr_fib_lookup(net, &fl, &mrt) < 0) 1960 + goto drop; 1961 + } 1962 1962 if (!mrt->mroute_do_pim || 1963 1963 pim->group != PIM_V1_VERSION || pim->code != PIM_V1_REGISTER) 1964 1964 goto drop; ··· 1998 1978 csum_fold(skb_checksum(skb, 0, skb->len, 0)))) 1999 1979 goto drop; 2000 1980 2001 - if (ipmr_fib_lookup(net, &skb_rtable(skb)->fl, &mrt) < 0) 2002 - goto drop; 2003 - 1981 + { 1982 + struct rtable *rt = skb_rtable(skb); 1983 + struct flowi fl = { 1984 + .fl4_dst = rt->rt_key_dst, 1985 + .fl4_src = rt->rt_key_src, 1986 + .fl4_tos = rt->rt_tos, 1987 + .oif = rt->rt_oif, 1988 + .iif = rt->rt_iif, 1989 + .mark = rt->rt_mark, 1990 + }; 1991 + if (ipmr_fib_lookup(net, &fl, &mrt) < 0) 1992 + goto drop; 1993 + } 2004 1994 if (__pim_rcv(mrt, skb, sizeof(*pim))) { 2005 1995 drop: 2006 1996 kfree_skb(skb);
+83 -70
net/ipv4/route.c
··· 424 424 dst_metric(&r->dst, RTAX_WINDOW), 425 425 (int)((dst_metric(&r->dst, RTAX_RTT) >> 3) + 426 426 dst_metric(&r->dst, RTAX_RTTVAR)), 427 - r->fl.fl4_tos, 427 + r->rt_tos, 428 428 r->dst.hh ? atomic_read(&r->dst.hh->hh_refcnt) : -1, 429 429 r->dst.hh ? (r->dst.hh->hh_output == 430 430 dev_queue_xmit) : 0, ··· 711 711 net->ipv4.sysctl_rt_cache_rebuild_count; 712 712 } 713 713 714 - static inline bool compare_hash_inputs(const struct flowi *fl1, 715 - const struct flowi *fl2) 714 + static inline bool compare_hash_inputs(const struct rtable *rt1, 715 + const struct rtable *rt2) 716 716 { 717 - return ((((__force u32)fl1->fl4_dst ^ (__force u32)fl2->fl4_dst) | 718 - ((__force u32)fl1->fl4_src ^ (__force u32)fl2->fl4_src) | 719 - (fl1->iif ^ fl2->iif)) == 0); 717 + return ((((__force u32)rt1->rt_key_dst ^ (__force u32)rt2->rt_key_dst) | 718 + ((__force u32)rt1->rt_key_src ^ (__force u32)rt2->rt_key_src) | 719 + (rt1->rt_iif ^ rt2->rt_iif)) == 0); 720 720 } 721 721 722 - static inline int compare_keys(struct flowi *fl1, struct flowi *fl2) 722 + static inline int compare_keys(struct rtable *rt1, struct rtable *rt2) 723 723 { 724 - return (((__force u32)fl1->fl4_dst ^ (__force u32)fl2->fl4_dst) | 725 - ((__force u32)fl1->fl4_src ^ (__force u32)fl2->fl4_src) | 726 - (fl1->mark ^ fl2->mark) | 727 - (*(u16 *)&fl1->fl4_tos ^ *(u16 *)&fl2->fl4_tos) | 728 - (fl1->oif ^ fl2->oif) | 729 - (fl1->iif ^ fl2->iif)) == 0; 724 + return (((__force u32)rt1->rt_key_dst ^ (__force u32)rt2->rt_key_dst) | 725 + ((__force u32)rt1->rt_key_src ^ (__force u32)rt2->rt_key_src) | 726 + (rt1->rt_mark ^ rt2->rt_mark) | 727 + (rt1->rt_tos ^ rt2->rt_tos) | 728 + (rt1->rt_oif ^ rt2->rt_oif) | 729 + (rt1->rt_iif ^ rt2->rt_iif)) == 0; 730 730 } 731 731 732 732 static inline int compare_netns(struct rtable *rt1, struct rtable *rt2) ··· 813 813 const struct rtable *aux = head; 814 814 815 815 while (aux != rth) { 816 - if (compare_hash_inputs(&aux->fl, &rth->fl)) 816 + if (compare_hash_inputs(aux, rth)) 817 817 return 0; 818 818 aux = rcu_dereference_protected(aux->dst.rt_next, 1); 819 819 } ··· 1073 1073 rt_free(rth); 1074 1074 continue; 1075 1075 } 1076 - if (compare_keys(&rth->fl, &rt->fl) && compare_netns(rth, rt)) { 1076 + if (compare_keys(rth, rt) && compare_netns(rth, rt)) { 1077 1077 /* Put it first */ 1078 1078 *rthp = rth->dst.rt_next; 1079 1079 /* ··· 1136 1136 rt_emergency_hash_rebuild(net); 1137 1137 spin_unlock_bh(rt_hash_lock_addr(hash)); 1138 1138 1139 - hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src, 1139 + hash = rt_hash(rt->rt_key_dst, rt->rt_key_src, 1140 1140 ifindex, rt_genid(net)); 1141 1141 goto restart; 1142 1142 } ··· 1344 1344 ip_rt_put(rt); 1345 1345 ret = NULL; 1346 1346 } else if (rt->rt_flags & RTCF_REDIRECTED) { 1347 - unsigned hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src, 1348 - rt->fl.oif, 1347 + unsigned hash = rt_hash(rt->rt_key_dst, rt->rt_key_src, 1348 + rt->rt_oif, 1349 1349 rt_genid(dev_net(dst->dev))); 1350 1350 #if RT_CACHE_DEBUG >= 1 1351 1351 printk(KERN_DEBUG "ipv4_negative_advice: redirect to %pI4/%02x dropped\n", 1352 - &rt->rt_dst, rt->fl.fl4_tos); 1352 + &rt->rt_dst, rt->rt_tos); 1353 1353 #endif 1354 1354 rt_del(hash, rt); 1355 1355 ret = NULL; ··· 1697 1697 if (rt_is_output_route(rt)) 1698 1698 src = rt->rt_src; 1699 1699 else { 1700 + struct flowi fl = { 1701 + .fl4_dst = rt->rt_key_dst, 1702 + .fl4_src = rt->rt_key_src, 1703 + .fl4_tos = rt->rt_tos, 1704 + .oif = rt->rt_oif, 1705 + .iif = rt->rt_iif, 1706 + .mark = rt->rt_mark, 1707 + }; 1708 + 1700 1709 rcu_read_lock(); 1701 - if (fib_lookup(dev_net(rt->dst.dev), &rt->fl, &res) == 0) 1710 + if (fib_lookup(dev_net(rt->dst.dev), &fl, &res) == 0) 1702 1711 src = FIB_RES_PREFSRC(res); 1703 1712 else 1704 1713 src = inet_select_addr(rt->dst.dev, rt->rt_gateway, ··· 1757 1748 return mtu; 1758 1749 } 1759 1750 1760 - static void rt_init_metrics(struct rtable *rt, struct fib_info *fi) 1751 + static void rt_init_metrics(struct rtable *rt, const struct flowi *oldflp, 1752 + struct fib_info *fi) 1761 1753 { 1762 1754 struct inet_peer *peer; 1763 1755 int create = 0; ··· 1766 1756 /* If a peer entry exists for this destination, we must hook 1767 1757 * it up in order to get at cached metrics. 1768 1758 */ 1769 - if (rt->fl.flags & FLOWI_FLAG_PRECOW_METRICS) 1759 + if (oldflp && (oldflp->flags & FLOWI_FLAG_PRECOW_METRICS)) 1770 1760 create = 1; 1771 1761 1772 1762 rt->peer = peer = inet_getpeer_v4(rt->rt_dst, create); ··· 1793 1783 } 1794 1784 } 1795 1785 1796 - static void rt_set_nexthop(struct rtable *rt, const struct fib_result *res, 1786 + static void rt_set_nexthop(struct rtable *rt, const struct flowi *oldflp, 1787 + const struct fib_result *res, 1797 1788 struct fib_info *fi, u16 type, u32 itag) 1798 1789 { 1799 1790 struct dst_entry *dst = &rt->dst; ··· 1803 1792 if (FIB_RES_GW(*res) && 1804 1793 FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK) 1805 1794 rt->rt_gateway = FIB_RES_GW(*res); 1806 - rt_init_metrics(rt, fi); 1795 + rt_init_metrics(rt, oldflp, fi); 1807 1796 #ifdef CONFIG_IP_ROUTE_CLASSID 1808 1797 dst->tclassid = FIB_RES_NH(*res).nh_tclassid; 1809 1798 #endif ··· 1872 1861 1873 1862 rth->dst.output = ip_rt_bug; 1874 1863 1875 - rth->fl.fl4_dst = daddr; 1864 + rth->rt_key_dst = daddr; 1876 1865 rth->rt_dst = daddr; 1877 - rth->fl.fl4_tos = tos; 1878 - rth->fl.mark = skb->mark; 1879 - rth->fl.fl4_src = saddr; 1866 + rth->rt_tos = tos; 1867 + rth->rt_mark = skb->mark; 1868 + rth->rt_key_src = saddr; 1880 1869 rth->rt_src = saddr; 1881 1870 #ifdef CONFIG_IP_ROUTE_CLASSID 1882 1871 rth->dst.tclassid = itag; 1883 1872 #endif 1884 - rth->rt_iif = 1885 - rth->fl.iif = dev->ifindex; 1873 + rth->rt_iif = dev->ifindex; 1886 1874 rth->dst.dev = init_net.loopback_dev; 1887 1875 dev_hold(rth->dst.dev); 1888 - rth->fl.oif = 0; 1876 + rth->rt_oif = 0; 1889 1877 rth->rt_gateway = daddr; 1890 1878 rth->rt_spec_dst= spec_dst; 1891 1879 rth->rt_genid = rt_genid(dev_net(dev)); ··· 2009 1999 goto cleanup; 2010 2000 } 2011 2001 2012 - rth->fl.fl4_dst = daddr; 2002 + rth->rt_key_dst = daddr; 2013 2003 rth->rt_dst = daddr; 2014 - rth->fl.fl4_tos = tos; 2015 - rth->fl.mark = skb->mark; 2016 - rth->fl.fl4_src = saddr; 2004 + rth->rt_tos = tos; 2005 + rth->rt_mark = skb->mark; 2006 + rth->rt_key_src = saddr; 2017 2007 rth->rt_src = saddr; 2018 2008 rth->rt_gateway = daddr; 2019 - rth->rt_iif = 2020 - rth->fl.iif = in_dev->dev->ifindex; 2009 + rth->rt_iif = in_dev->dev->ifindex; 2021 2010 rth->dst.dev = (out_dev)->dev; 2022 2011 dev_hold(rth->dst.dev); 2023 - rth->fl.oif = 0; 2012 + rth->rt_oif = 0; 2024 2013 rth->rt_spec_dst= spec_dst; 2025 2014 2026 2015 rth->dst.input = ip_forward; 2027 2016 rth->dst.output = ip_output; 2028 2017 rth->rt_genid = rt_genid(dev_net(rth->dst.dev)); 2029 2018 2030 - rt_set_nexthop(rth, res, res->fi, res->type, itag); 2019 + rt_set_nexthop(rth, NULL, res, res->fi, res->type, itag); 2031 2020 2032 2021 rth->rt_flags = flags; 2033 2022 ··· 2181 2172 rth->dst.output= ip_rt_bug; 2182 2173 rth->rt_genid = rt_genid(net); 2183 2174 2184 - rth->fl.fl4_dst = daddr; 2175 + rth->rt_key_dst = daddr; 2185 2176 rth->rt_dst = daddr; 2186 - rth->fl.fl4_tos = tos; 2187 - rth->fl.mark = skb->mark; 2188 - rth->fl.fl4_src = saddr; 2177 + rth->rt_tos = tos; 2178 + rth->rt_mark = skb->mark; 2179 + rth->rt_key_src = saddr; 2189 2180 rth->rt_src = saddr; 2190 2181 #ifdef CONFIG_IP_ROUTE_CLASSID 2191 2182 rth->dst.tclassid = itag; 2192 2183 #endif 2193 - rth->rt_iif = 2194 - rth->fl.iif = dev->ifindex; 2184 + rth->rt_iif = dev->ifindex; 2195 2185 rth->dst.dev = net->loopback_dev; 2196 2186 dev_hold(rth->dst.dev); 2197 2187 rth->rt_gateway = daddr; ··· 2269 2261 2270 2262 for (rth = rcu_dereference(rt_hash_table[hash].chain); rth; 2271 2263 rth = rcu_dereference(rth->dst.rt_next)) { 2272 - if ((((__force u32)rth->fl.fl4_dst ^ (__force u32)daddr) | 2273 - ((__force u32)rth->fl.fl4_src ^ (__force u32)saddr) | 2274 - (rth->fl.iif ^ iif) | 2275 - rth->fl.oif | 2276 - (rth->fl.fl4_tos ^ tos)) == 0 && 2277 - rth->fl.mark == skb->mark && 2264 + if ((((__force u32)rth->rt_key_dst ^ (__force u32)daddr) | 2265 + ((__force u32)rth->rt_key_src ^ (__force u32)saddr) | 2266 + (rth->rt_iif ^ iif) | 2267 + rth->rt_oif | 2268 + (rth->rt_tos ^ tos)) == 0 && 2269 + rth->rt_mark == skb->mark && 2278 2270 net_eq(dev_net(rth->dst.dev), net) && 2279 2271 !rt_is_expired(rth)) { 2280 2272 if (noref) { ··· 2382 2374 if (!rth) 2383 2375 return ERR_PTR(-ENOBUFS); 2384 2376 2385 - rth->fl.fl4_dst = oldflp->fl4_dst; 2386 - rth->fl.fl4_tos = tos; 2387 - rth->fl.fl4_src = oldflp->fl4_src; 2388 - rth->fl.oif = oldflp->oif; 2389 - rth->fl.mark = oldflp->mark; 2377 + rth->rt_key_dst = oldflp->fl4_dst; 2378 + rth->rt_tos = tos; 2379 + rth->rt_key_src = oldflp->fl4_src; 2380 + rth->rt_oif = oldflp->oif; 2381 + rth->rt_mark = oldflp->mark; 2390 2382 rth->rt_dst = fl->fl4_dst; 2391 2383 rth->rt_src = fl->fl4_src; 2392 2384 rth->rt_iif = 0; ··· 2424 2416 #endif 2425 2417 } 2426 2418 2427 - rt_set_nexthop(rth, res, fi, type, 0); 2419 + rt_set_nexthop(rth, oldflp, res, fi, type, 0); 2428 2420 2429 2421 rth->rt_flags = flags; 2430 2422 return rth; ··· 2637 2629 rcu_read_lock_bh(); 2638 2630 for (rth = rcu_dereference_bh(rt_hash_table[hash].chain); rth; 2639 2631 rth = rcu_dereference_bh(rth->dst.rt_next)) { 2640 - if (rth->fl.fl4_dst == flp->fl4_dst && 2641 - rth->fl.fl4_src == flp->fl4_src && 2632 + if (rth->rt_key_dst == flp->fl4_dst && 2633 + rth->rt_key_src == flp->fl4_src && 2642 2634 rt_is_output_route(rth) && 2643 - rth->fl.oif == flp->oif && 2644 - rth->fl.mark == flp->mark && 2645 - !((rth->fl.fl4_tos ^ flp->fl4_tos) & 2635 + rth->rt_oif == flp->oif && 2636 + rth->rt_mark == flp->mark && 2637 + !((rth->rt_tos ^ flp->fl4_tos) & 2646 2638 (IPTOS_RT_MASK | RTO_ONLINK)) && 2647 2639 net_eq(dev_net(rth->dst.dev), net) && 2648 2640 !rt_is_expired(rth)) { ··· 2701 2693 if (new->dev) 2702 2694 dev_hold(new->dev); 2703 2695 2704 - rt->fl = ort->fl; 2696 + rt->rt_key_dst = ort->rt_key_dst; 2697 + rt->rt_key_src = ort->rt_key_src; 2698 + rt->rt_tos = ort->rt_tos; 2699 + rt->rt_iif = ort->rt_iif; 2700 + rt->rt_oif = ort->rt_oif; 2701 + rt->rt_mark = ort->rt_mark; 2705 2702 2706 2703 rt->rt_genid = rt_genid(net); 2707 2704 rt->rt_flags = ort->rt_flags; ··· 2769 2756 r->rtm_family = AF_INET; 2770 2757 r->rtm_dst_len = 32; 2771 2758 r->rtm_src_len = 0; 2772 - r->rtm_tos = rt->fl.fl4_tos; 2759 + r->rtm_tos = rt->rt_tos; 2773 2760 r->rtm_table = RT_TABLE_MAIN; 2774 2761 NLA_PUT_U32(skb, RTA_TABLE, RT_TABLE_MAIN); 2775 2762 r->rtm_type = rt->rt_type; ··· 2781 2768 2782 2769 NLA_PUT_BE32(skb, RTA_DST, rt->rt_dst); 2783 2770 2784 - if (rt->fl.fl4_src) { 2771 + if (rt->rt_key_src) { 2785 2772 r->rtm_src_len = 32; 2786 - NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); 2773 + NLA_PUT_BE32(skb, RTA_SRC, rt->rt_key_src); 2787 2774 } 2788 2775 if (rt->dst.dev) 2789 2776 NLA_PUT_U32(skb, RTA_OIF, rt->dst.dev->ifindex); ··· 2793 2780 #endif 2794 2781 if (rt_is_input_route(rt)) 2795 2782 NLA_PUT_BE32(skb, RTA_PREFSRC, rt->rt_spec_dst); 2796 - else if (rt->rt_src != rt->fl.fl4_src) 2783 + else if (rt->rt_src != rt->rt_key_src) 2797 2784 NLA_PUT_BE32(skb, RTA_PREFSRC, rt->rt_src); 2798 2785 2799 2786 if (rt->rt_dst != rt->rt_gateway) ··· 2802 2789 if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0) 2803 2790 goto nla_put_failure; 2804 2791 2805 - if (rt->fl.mark) 2806 - NLA_PUT_BE32(skb, RTA_MARK, rt->fl.mark); 2792 + if (rt->rt_mark) 2793 + NLA_PUT_BE32(skb, RTA_MARK, rt->rt_mark); 2807 2794 2808 2795 error = rt->dst.error; 2809 2796 expires = (rt->peer && rt->peer->pmtu_expires) ? ··· 2837 2824 } 2838 2825 } else 2839 2826 #endif 2840 - NLA_PUT_U32(skb, RTA_IIF, rt->fl.iif); 2827 + NLA_PUT_U32(skb, RTA_IIF, rt->rt_iif); 2841 2828 } 2842 2829 2843 2830 if (rtnl_put_cacheinfo(skb, &rt->dst, id, ts, tsage,
+6 -1
net/ipv4/xfrm4_policy.c
··· 70 70 { 71 71 struct rtable *rt = (struct rtable *)xdst->route; 72 72 73 - xdst->u.rt.fl = *fl; 73 + rt->rt_key_dst = fl->fl4_dst; 74 + rt->rt_key_src = fl->fl4_src; 75 + rt->rt_tos = fl->fl4_tos; 76 + rt->rt_iif = fl->iif; 77 + rt->rt_oif = fl->oif; 78 + rt->rt_mark = fl->mark; 74 79 75 80 xdst->u.dst.dev = dev; 76 81 dev_hold(dev);
+1 -1
net/sched/cls_route.c
··· 143 143 if (head == NULL) 144 144 goto old_method; 145 145 146 - iif = ((struct rtable *)dst)->fl.iif; 146 + iif = ((struct rtable *)dst)->rt_iif; 147 147 148 148 h = route4_fastmap_hash(id, iif); 149 149 if (id == head->fastmap[h].id &&
+1 -1
net/sched/em_meta.c
··· 264 264 if (unlikely(skb_rtable(skb) == NULL)) 265 265 *err = -1; 266 266 else 267 - dst->value = skb_rtable(skb)->fl.iif; 267 + dst->value = skb_rtable(skb)->rt_iif; 268 268 } 269 269 270 270 /**************************************************************************