diff options
Diffstat (limited to 'net/decnet/dn_route.c')
-rw-r--r-- | net/decnet/dn_route.c | 300 |
1 files changed, 162 insertions, 138 deletions
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 5e636365d33c..9f09d4fc2880 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -112,6 +112,7 @@ static int dn_dst_gc(struct dst_ops *ops); | |||
112 | static struct dst_entry *dn_dst_check(struct dst_entry *, __u32); | 112 | static struct dst_entry *dn_dst_check(struct dst_entry *, __u32); |
113 | static unsigned int dn_dst_default_advmss(const struct dst_entry *dst); | 113 | static unsigned int dn_dst_default_advmss(const struct dst_entry *dst); |
114 | static unsigned int dn_dst_default_mtu(const struct dst_entry *dst); | 114 | static unsigned int dn_dst_default_mtu(const struct dst_entry *dst); |
115 | static void dn_dst_destroy(struct dst_entry *); | ||
115 | static struct dst_entry *dn_dst_negative_advice(struct dst_entry *); | 116 | static struct dst_entry *dn_dst_negative_advice(struct dst_entry *); |
116 | static void dn_dst_link_failure(struct sk_buff *); | 117 | static void dn_dst_link_failure(struct sk_buff *); |
117 | static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu); | 118 | static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu); |
@@ -133,11 +134,18 @@ static struct dst_ops dn_dst_ops = { | |||
133 | .check = dn_dst_check, | 134 | .check = dn_dst_check, |
134 | .default_advmss = dn_dst_default_advmss, | 135 | .default_advmss = dn_dst_default_advmss, |
135 | .default_mtu = dn_dst_default_mtu, | 136 | .default_mtu = dn_dst_default_mtu, |
137 | .cow_metrics = dst_cow_metrics_generic, | ||
138 | .destroy = dn_dst_destroy, | ||
136 | .negative_advice = dn_dst_negative_advice, | 139 | .negative_advice = dn_dst_negative_advice, |
137 | .link_failure = dn_dst_link_failure, | 140 | .link_failure = dn_dst_link_failure, |
138 | .update_pmtu = dn_dst_update_pmtu, | 141 | .update_pmtu = dn_dst_update_pmtu, |
139 | }; | 142 | }; |
140 | 143 | ||
144 | static void dn_dst_destroy(struct dst_entry *dst) | ||
145 | { | ||
146 | dst_destroy_metrics_generic(dst); | ||
147 | } | ||
148 | |||
141 | static __inline__ unsigned dn_hash(__le16 src, __le16 dst) | 149 | static __inline__ unsigned dn_hash(__le16 src, __le16 dst) |
142 | { | 150 | { |
143 | __u16 tmp = (__u16 __force)(src ^ dst); | 151 | __u16 tmp = (__u16 __force)(src ^ dst); |
@@ -274,14 +282,14 @@ static void dn_dst_link_failure(struct sk_buff *skb) | |||
274 | { | 282 | { |
275 | } | 283 | } |
276 | 284 | ||
277 | static inline int compare_keys(struct flowi *fl1, struct flowi *fl2) | 285 | static inline int compare_keys(struct flowidn *fl1, struct flowidn *fl2) |
278 | { | 286 | { |
279 | return ((fl1->fld_dst ^ fl2->fld_dst) | | 287 | return ((fl1->daddr ^ fl2->daddr) | |
280 | (fl1->fld_src ^ fl2->fld_src) | | 288 | (fl1->saddr ^ fl2->saddr) | |
281 | (fl1->mark ^ fl2->mark) | | 289 | (fl1->flowidn_mark ^ fl2->flowidn_mark) | |
282 | (fl1->fld_scope ^ fl2->fld_scope) | | 290 | (fl1->flowidn_scope ^ fl2->flowidn_scope) | |
283 | (fl1->oif ^ fl2->oif) | | 291 | (fl1->flowidn_oif ^ fl2->flowidn_oif) | |
284 | (fl1->iif ^ fl2->iif)) == 0; | 292 | (fl1->flowidn_iif ^ fl2->flowidn_iif)) == 0; |
285 | } | 293 | } |
286 | 294 | ||
287 | static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route **rp) | 295 | static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route **rp) |
@@ -295,7 +303,7 @@ static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route * | |||
295 | spin_lock_bh(&dn_rt_hash_table[hash].lock); | 303 | spin_lock_bh(&dn_rt_hash_table[hash].lock); |
296 | while ((rth = rcu_dereference_protected(*rthp, | 304 | while ((rth = rcu_dereference_protected(*rthp, |
297 | lockdep_is_held(&dn_rt_hash_table[hash].lock))) != NULL) { | 305 | lockdep_is_held(&dn_rt_hash_table[hash].lock))) != NULL) { |
298 | if (compare_keys(&rth->fl, &rt->fl)) { | 306 | if (compare_keys(&rth->fld, &rt->fld)) { |
299 | /* Put it first */ | 307 | /* Put it first */ |
300 | *rthp = rth->dst.dn_next; | 308 | *rthp = rth->dst.dn_next; |
301 | rcu_assign_pointer(rth->dst.dn_next, | 309 | rcu_assign_pointer(rth->dst.dn_next, |
@@ -814,14 +822,14 @@ static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res) | |||
814 | { | 822 | { |
815 | struct dn_fib_info *fi = res->fi; | 823 | struct dn_fib_info *fi = res->fi; |
816 | struct net_device *dev = rt->dst.dev; | 824 | struct net_device *dev = rt->dst.dev; |
825 | unsigned int mss_metric; | ||
817 | struct neighbour *n; | 826 | struct neighbour *n; |
818 | unsigned int metric; | ||
819 | 827 | ||
820 | if (fi) { | 828 | if (fi) { |
821 | if (DN_FIB_RES_GW(*res) && | 829 | if (DN_FIB_RES_GW(*res) && |
822 | DN_FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK) | 830 | DN_FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK) |
823 | rt->rt_gateway = DN_FIB_RES_GW(*res); | 831 | rt->rt_gateway = DN_FIB_RES_GW(*res); |
824 | dst_import_metrics(&rt->dst, fi->fib_metrics); | 832 | dst_init_metrics(&rt->dst, fi->fib_metrics, true); |
825 | } | 833 | } |
826 | rt->rt_type = res->type; | 834 | rt->rt_type = res->type; |
827 | 835 | ||
@@ -834,10 +842,10 @@ static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res) | |||
834 | 842 | ||
835 | if (dst_metric(&rt->dst, RTAX_MTU) > rt->dst.dev->mtu) | 843 | if (dst_metric(&rt->dst, RTAX_MTU) > rt->dst.dev->mtu) |
836 | dst_metric_set(&rt->dst, RTAX_MTU, rt->dst.dev->mtu); | 844 | dst_metric_set(&rt->dst, RTAX_MTU, rt->dst.dev->mtu); |
837 | metric = dst_metric_raw(&rt->dst, RTAX_ADVMSS); | 845 | mss_metric = dst_metric_raw(&rt->dst, RTAX_ADVMSS); |
838 | if (metric) { | 846 | if (mss_metric) { |
839 | unsigned int mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->dst)); | 847 | unsigned int mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->dst)); |
840 | if (metric > mss) | 848 | if (mss_metric > mss) |
841 | dst_metric_set(&rt->dst, RTAX_ADVMSS, mss); | 849 | dst_metric_set(&rt->dst, RTAX_ADVMSS, mss); |
842 | } | 850 | } |
843 | return 0; | 851 | return 0; |
@@ -895,14 +903,16 @@ static inline __le16 dn_fib_rules_map_destination(__le16 daddr, struct dn_fib_re | |||
895 | return (daddr&~mask)|res->fi->fib_nh->nh_gw; | 903 | return (daddr&~mask)|res->fi->fib_nh->nh_gw; |
896 | } | 904 | } |
897 | 905 | ||
898 | static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *oldflp, int try_hard) | 906 | static int dn_route_output_slow(struct dst_entry **pprt, const struct flowidn *oldflp, int try_hard) |
899 | { | 907 | { |
900 | struct flowi fl = { .fld_dst = oldflp->fld_dst, | 908 | struct flowidn fld = { |
901 | .fld_src = oldflp->fld_src, | 909 | .daddr = oldflp->daddr, |
902 | .fld_scope = RT_SCOPE_UNIVERSE, | 910 | .saddr = oldflp->saddr, |
903 | .mark = oldflp->mark, | 911 | .flowidn_scope = RT_SCOPE_UNIVERSE, |
904 | .iif = init_net.loopback_dev->ifindex, | 912 | .flowidn_mark = oldflp->flowidn_mark, |
905 | .oif = oldflp->oif }; | 913 | .flowidn_iif = init_net.loopback_dev->ifindex, |
914 | .flowidn_oif = oldflp->flowidn_oif, | ||
915 | }; | ||
906 | struct dn_route *rt = NULL; | 916 | struct dn_route *rt = NULL; |
907 | struct net_device *dev_out = NULL, *dev; | 917 | struct net_device *dev_out = NULL, *dev; |
908 | struct neighbour *neigh = NULL; | 918 | struct neighbour *neigh = NULL; |
@@ -916,13 +926,14 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old | |||
916 | if (decnet_debug_level & 16) | 926 | if (decnet_debug_level & 16) |
917 | printk(KERN_DEBUG | 927 | printk(KERN_DEBUG |
918 | "dn_route_output_slow: dst=%04x src=%04x mark=%d" | 928 | "dn_route_output_slow: dst=%04x src=%04x mark=%d" |
919 | " iif=%d oif=%d\n", le16_to_cpu(oldflp->fld_dst), | 929 | " iif=%d oif=%d\n", le16_to_cpu(oldflp->daddr), |
920 | le16_to_cpu(oldflp->fld_src), | 930 | le16_to_cpu(oldflp->saddr), |
921 | oldflp->mark, init_net.loopback_dev->ifindex, oldflp->oif); | 931 | oldflp->flowidn_mark, init_net.loopback_dev->ifindex, |
932 | oldflp->flowidn_oif); | ||
922 | 933 | ||
923 | /* If we have an output interface, verify its a DECnet device */ | 934 | /* If we have an output interface, verify its a DECnet device */ |
924 | if (oldflp->oif) { | 935 | if (oldflp->flowidn_oif) { |
925 | dev_out = dev_get_by_index(&init_net, oldflp->oif); | 936 | dev_out = dev_get_by_index(&init_net, oldflp->flowidn_oif); |
926 | err = -ENODEV; | 937 | err = -ENODEV; |
927 | if (dev_out && dev_out->dn_ptr == NULL) { | 938 | if (dev_out && dev_out->dn_ptr == NULL) { |
928 | dev_put(dev_out); | 939 | dev_put(dev_out); |
@@ -933,11 +944,11 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old | |||
933 | } | 944 | } |
934 | 945 | ||
935 | /* If we have a source address, verify that its a local address */ | 946 | /* If we have a source address, verify that its a local address */ |
936 | if (oldflp->fld_src) { | 947 | if (oldflp->saddr) { |
937 | err = -EADDRNOTAVAIL; | 948 | err = -EADDRNOTAVAIL; |
938 | 949 | ||
939 | if (dev_out) { | 950 | if (dev_out) { |
940 | if (dn_dev_islocal(dev_out, oldflp->fld_src)) | 951 | if (dn_dev_islocal(dev_out, oldflp->saddr)) |
941 | goto source_ok; | 952 | goto source_ok; |
942 | dev_put(dev_out); | 953 | dev_put(dev_out); |
943 | goto out; | 954 | goto out; |
@@ -946,11 +957,11 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old | |||
946 | for_each_netdev_rcu(&init_net, dev) { | 957 | for_each_netdev_rcu(&init_net, dev) { |
947 | if (!dev->dn_ptr) | 958 | if (!dev->dn_ptr) |
948 | continue; | 959 | continue; |
949 | if (!dn_dev_islocal(dev, oldflp->fld_src)) | 960 | if (!dn_dev_islocal(dev, oldflp->saddr)) |
950 | continue; | 961 | continue; |
951 | if ((dev->flags & IFF_LOOPBACK) && | 962 | if ((dev->flags & IFF_LOOPBACK) && |
952 | oldflp->fld_dst && | 963 | oldflp->daddr && |
953 | !dn_dev_islocal(dev, oldflp->fld_dst)) | 964 | !dn_dev_islocal(dev, oldflp->daddr)) |
954 | continue; | 965 | continue; |
955 | 966 | ||
956 | dev_out = dev; | 967 | dev_out = dev; |
@@ -965,22 +976,22 @@ source_ok: | |||
965 | } | 976 | } |
966 | 977 | ||
967 | /* No destination? Assume its local */ | 978 | /* No destination? Assume its local */ |
968 | if (!fl.fld_dst) { | 979 | if (!fld.daddr) { |
969 | fl.fld_dst = fl.fld_src; | 980 | fld.daddr = fld.saddr; |
970 | 981 | ||
971 | err = -EADDRNOTAVAIL; | 982 | err = -EADDRNOTAVAIL; |
972 | if (dev_out) | 983 | if (dev_out) |
973 | dev_put(dev_out); | 984 | dev_put(dev_out); |
974 | dev_out = init_net.loopback_dev; | 985 | dev_out = init_net.loopback_dev; |
975 | dev_hold(dev_out); | 986 | dev_hold(dev_out); |
976 | if (!fl.fld_dst) { | 987 | if (!fld.daddr) { |
977 | fl.fld_dst = | 988 | fld.daddr = |
978 | fl.fld_src = dnet_select_source(dev_out, 0, | 989 | fld.saddr = dnet_select_source(dev_out, 0, |
979 | RT_SCOPE_HOST); | 990 | RT_SCOPE_HOST); |
980 | if (!fl.fld_dst) | 991 | if (!fld.daddr) |
981 | goto out; | 992 | goto out; |
982 | } | 993 | } |
983 | fl.oif = init_net.loopback_dev->ifindex; | 994 | fld.flowidn_oif = init_net.loopback_dev->ifindex; |
984 | res.type = RTN_LOCAL; | 995 | res.type = RTN_LOCAL; |
985 | goto make_route; | 996 | goto make_route; |
986 | } | 997 | } |
@@ -989,8 +1000,8 @@ source_ok: | |||
989 | printk(KERN_DEBUG | 1000 | printk(KERN_DEBUG |
990 | "dn_route_output_slow: initial checks complete." | 1001 | "dn_route_output_slow: initial checks complete." |
991 | " dst=%o4x src=%04x oif=%d try_hard=%d\n", | 1002 | " dst=%o4x src=%04x oif=%d try_hard=%d\n", |
992 | le16_to_cpu(fl.fld_dst), le16_to_cpu(fl.fld_src), | 1003 | le16_to_cpu(fld.daddr), le16_to_cpu(fld.saddr), |
993 | fl.oif, try_hard); | 1004 | fld.flowidn_oif, try_hard); |
994 | 1005 | ||
995 | /* | 1006 | /* |
996 | * N.B. If the kernel is compiled without router support then | 1007 | * N.B. If the kernel is compiled without router support then |
@@ -998,7 +1009,7 @@ source_ok: | |||
998 | * will always be executed. | 1009 | * will always be executed. |
999 | */ | 1010 | */ |
1000 | err = -ESRCH; | 1011 | err = -ESRCH; |
1001 | if (try_hard || (err = dn_fib_lookup(&fl, &res)) != 0) { | 1012 | if (try_hard || (err = dn_fib_lookup(&fld, &res)) != 0) { |
1002 | struct dn_dev *dn_db; | 1013 | struct dn_dev *dn_db; |
1003 | if (err != -ESRCH) | 1014 | if (err != -ESRCH) |
1004 | goto out; | 1015 | goto out; |
@@ -1013,19 +1024,19 @@ source_ok: | |||
1013 | * here | 1024 | * here |
1014 | */ | 1025 | */ |
1015 | if (!try_hard) { | 1026 | if (!try_hard) { |
1016 | neigh = neigh_lookup_nodev(&dn_neigh_table, &init_net, &fl.fld_dst); | 1027 | neigh = neigh_lookup_nodev(&dn_neigh_table, &init_net, &fld.daddr); |
1017 | if (neigh) { | 1028 | if (neigh) { |
1018 | if ((oldflp->oif && | 1029 | if ((oldflp->flowidn_oif && |
1019 | (neigh->dev->ifindex != oldflp->oif)) || | 1030 | (neigh->dev->ifindex != oldflp->flowidn_oif)) || |
1020 | (oldflp->fld_src && | 1031 | (oldflp->saddr && |
1021 | (!dn_dev_islocal(neigh->dev, | 1032 | (!dn_dev_islocal(neigh->dev, |
1022 | oldflp->fld_src)))) { | 1033 | oldflp->saddr)))) { |
1023 | neigh_release(neigh); | 1034 | neigh_release(neigh); |
1024 | neigh = NULL; | 1035 | neigh = NULL; |
1025 | } else { | 1036 | } else { |
1026 | if (dev_out) | 1037 | if (dev_out) |
1027 | dev_put(dev_out); | 1038 | dev_put(dev_out); |
1028 | if (dn_dev_islocal(neigh->dev, fl.fld_dst)) { | 1039 | if (dn_dev_islocal(neigh->dev, fld.daddr)) { |
1029 | dev_out = init_net.loopback_dev; | 1040 | dev_out = init_net.loopback_dev; |
1030 | res.type = RTN_LOCAL; | 1041 | res.type = RTN_LOCAL; |
1031 | } else { | 1042 | } else { |
@@ -1045,7 +1056,7 @@ source_ok: | |||
1045 | goto out; | 1056 | goto out; |
1046 | dn_db = rcu_dereference_raw(dev_out->dn_ptr); | 1057 | dn_db = rcu_dereference_raw(dev_out->dn_ptr); |
1047 | /* Possible improvement - check all devices for local addr */ | 1058 | /* Possible improvement - check all devices for local addr */ |
1048 | if (dn_dev_islocal(dev_out, fl.fld_dst)) { | 1059 | if (dn_dev_islocal(dev_out, fld.daddr)) { |
1049 | dev_put(dev_out); | 1060 | dev_put(dev_out); |
1050 | dev_out = init_net.loopback_dev; | 1061 | dev_out = init_net.loopback_dev; |
1051 | dev_hold(dev_out); | 1062 | dev_hold(dev_out); |
@@ -1061,16 +1072,16 @@ select_source: | |||
1061 | if (neigh) | 1072 | if (neigh) |
1062 | gateway = ((struct dn_neigh *)neigh)->addr; | 1073 | gateway = ((struct dn_neigh *)neigh)->addr; |
1063 | if (gateway == 0) | 1074 | if (gateway == 0) |
1064 | gateway = fl.fld_dst; | 1075 | gateway = fld.daddr; |
1065 | if (fl.fld_src == 0) { | 1076 | if (fld.saddr == 0) { |
1066 | fl.fld_src = dnet_select_source(dev_out, gateway, | 1077 | fld.saddr = dnet_select_source(dev_out, gateway, |
1067 | res.type == RTN_LOCAL ? | 1078 | res.type == RTN_LOCAL ? |
1068 | RT_SCOPE_HOST : | 1079 | RT_SCOPE_HOST : |
1069 | RT_SCOPE_LINK); | 1080 | RT_SCOPE_LINK); |
1070 | if (fl.fld_src == 0 && res.type != RTN_LOCAL) | 1081 | if (fld.saddr == 0 && res.type != RTN_LOCAL) |
1071 | goto e_addr; | 1082 | goto e_addr; |
1072 | } | 1083 | } |
1073 | fl.oif = dev_out->ifindex; | 1084 | fld.flowidn_oif = dev_out->ifindex; |
1074 | goto make_route; | 1085 | goto make_route; |
1075 | } | 1086 | } |
1076 | free_res = 1; | 1087 | free_res = 1; |
@@ -1079,61 +1090,61 @@ select_source: | |||
1079 | goto e_inval; | 1090 | goto e_inval; |
1080 | 1091 | ||
1081 | if (res.type == RTN_LOCAL) { | 1092 | if (res.type == RTN_LOCAL) { |
1082 | if (!fl.fld_src) | 1093 | if (!fld.saddr) |
1083 | fl.fld_src = fl.fld_dst; | 1094 | fld.saddr = fld.daddr; |
1084 | if (dev_out) | 1095 | if (dev_out) |
1085 | dev_put(dev_out); | 1096 | dev_put(dev_out); |
1086 | dev_out = init_net.loopback_dev; | 1097 | dev_out = init_net.loopback_dev; |
1087 | dev_hold(dev_out); | 1098 | dev_hold(dev_out); |
1088 | fl.oif = dev_out->ifindex; | 1099 | fld.flowidn_oif = dev_out->ifindex; |
1089 | if (res.fi) | 1100 | if (res.fi) |
1090 | dn_fib_info_put(res.fi); | 1101 | dn_fib_info_put(res.fi); |
1091 | res.fi = NULL; | 1102 | res.fi = NULL; |
1092 | goto make_route; | 1103 | goto make_route; |
1093 | } | 1104 | } |
1094 | 1105 | ||
1095 | if (res.fi->fib_nhs > 1 && fl.oif == 0) | 1106 | if (res.fi->fib_nhs > 1 && fld.flowidn_oif == 0) |
1096 | dn_fib_select_multipath(&fl, &res); | 1107 | dn_fib_select_multipath(&fld, &res); |
1097 | 1108 | ||
1098 | /* | 1109 | /* |
1099 | * We could add some logic to deal with default routes here and | 1110 | * We could add some logic to deal with default routes here and |
1100 | * get rid of some of the special casing above. | 1111 | * get rid of some of the special casing above. |
1101 | */ | 1112 | */ |
1102 | 1113 | ||
1103 | if (!fl.fld_src) | 1114 | if (!fld.saddr) |
1104 | fl.fld_src = DN_FIB_RES_PREFSRC(res); | 1115 | fld.saddr = DN_FIB_RES_PREFSRC(res); |
1105 | 1116 | ||
1106 | if (dev_out) | 1117 | if (dev_out) |
1107 | dev_put(dev_out); | 1118 | dev_put(dev_out); |
1108 | dev_out = DN_FIB_RES_DEV(res); | 1119 | dev_out = DN_FIB_RES_DEV(res); |
1109 | dev_hold(dev_out); | 1120 | dev_hold(dev_out); |
1110 | fl.oif = dev_out->ifindex; | 1121 | fld.flowidn_oif = dev_out->ifindex; |
1111 | gateway = DN_FIB_RES_GW(res); | 1122 | gateway = DN_FIB_RES_GW(res); |
1112 | 1123 | ||
1113 | make_route: | 1124 | make_route: |
1114 | if (dev_out->flags & IFF_LOOPBACK) | 1125 | if (dev_out->flags & IFF_LOOPBACK) |
1115 | flags |= RTCF_LOCAL; | 1126 | flags |= RTCF_LOCAL; |
1116 | 1127 | ||
1117 | rt = dst_alloc(&dn_dst_ops); | 1128 | rt = dst_alloc(&dn_dst_ops, 0); |
1118 | if (rt == NULL) | 1129 | if (rt == NULL) |
1119 | goto e_nobufs; | 1130 | goto e_nobufs; |
1120 | 1131 | ||
1121 | atomic_set(&rt->dst.__refcnt, 1); | 1132 | atomic_set(&rt->dst.__refcnt, 1); |
1122 | rt->dst.flags = DST_HOST; | 1133 | rt->dst.flags = DST_HOST; |
1123 | 1134 | ||
1124 | rt->fl.fld_src = oldflp->fld_src; | 1135 | rt->fld.saddr = oldflp->saddr; |
1125 | rt->fl.fld_dst = oldflp->fld_dst; | 1136 | rt->fld.daddr = oldflp->daddr; |
1126 | rt->fl.oif = oldflp->oif; | 1137 | rt->fld.flowidn_oif = oldflp->flowidn_oif; |
1127 | rt->fl.iif = 0; | 1138 | rt->fld.flowidn_iif = 0; |
1128 | rt->fl.mark = oldflp->mark; | 1139 | rt->fld.flowidn_mark = oldflp->flowidn_mark; |
1129 | 1140 | ||
1130 | rt->rt_saddr = fl.fld_src; | 1141 | rt->rt_saddr = fld.saddr; |
1131 | rt->rt_daddr = fl.fld_dst; | 1142 | rt->rt_daddr = fld.daddr; |
1132 | rt->rt_gateway = gateway ? gateway : fl.fld_dst; | 1143 | rt->rt_gateway = gateway ? gateway : fld.daddr; |
1133 | rt->rt_local_src = fl.fld_src; | 1144 | rt->rt_local_src = fld.saddr; |
1134 | 1145 | ||
1135 | rt->rt_dst_map = fl.fld_dst; | 1146 | rt->rt_dst_map = fld.daddr; |
1136 | rt->rt_src_map = fl.fld_src; | 1147 | rt->rt_src_map = fld.saddr; |
1137 | 1148 | ||
1138 | rt->dst.dev = dev_out; | 1149 | rt->dst.dev = dev_out; |
1139 | dev_hold(dev_out); | 1150 | dev_hold(dev_out); |
@@ -1151,7 +1162,7 @@ make_route: | |||
1151 | if (err) | 1162 | if (err) |
1152 | goto e_neighbour; | 1163 | goto e_neighbour; |
1153 | 1164 | ||
1154 | hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); | 1165 | hash = dn_hash(rt->fld.saddr, rt->fld.daddr); |
1155 | dn_insert_route(rt, hash, (struct dn_route **)pprt); | 1166 | dn_insert_route(rt, hash, (struct dn_route **)pprt); |
1156 | 1167 | ||
1157 | done: | 1168 | done: |
@@ -1182,20 +1193,20 @@ e_neighbour: | |||
1182 | /* | 1193 | /* |
1183 | * N.B. The flags may be moved into the flowi at some future stage. | 1194 | * N.B. The flags may be moved into the flowi at some future stage. |
1184 | */ | 1195 | */ |
1185 | static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *flp, int flags) | 1196 | static int __dn_route_output_key(struct dst_entry **pprt, const struct flowidn *flp, int flags) |
1186 | { | 1197 | { |
1187 | unsigned hash = dn_hash(flp->fld_src, flp->fld_dst); | 1198 | unsigned hash = dn_hash(flp->saddr, flp->daddr); |
1188 | struct dn_route *rt = NULL; | 1199 | struct dn_route *rt = NULL; |
1189 | 1200 | ||
1190 | if (!(flags & MSG_TRYHARD)) { | 1201 | if (!(flags & MSG_TRYHARD)) { |
1191 | rcu_read_lock_bh(); | 1202 | rcu_read_lock_bh(); |
1192 | for (rt = rcu_dereference_bh(dn_rt_hash_table[hash].chain); rt; | 1203 | for (rt = rcu_dereference_bh(dn_rt_hash_table[hash].chain); rt; |
1193 | rt = rcu_dereference_bh(rt->dst.dn_next)) { | 1204 | rt = rcu_dereference_bh(rt->dst.dn_next)) { |
1194 | if ((flp->fld_dst == rt->fl.fld_dst) && | 1205 | if ((flp->daddr == rt->fld.daddr) && |
1195 | (flp->fld_src == rt->fl.fld_src) && | 1206 | (flp->saddr == rt->fld.saddr) && |
1196 | (flp->mark == rt->fl.mark) && | 1207 | (flp->flowidn_mark == rt->fld.flowidn_mark) && |
1197 | dn_is_output_route(rt) && | 1208 | dn_is_output_route(rt) && |
1198 | (rt->fl.oif == flp->oif)) { | 1209 | (rt->fld.flowidn_oif == flp->flowidn_oif)) { |
1199 | dst_use(&rt->dst, jiffies); | 1210 | dst_use(&rt->dst, jiffies); |
1200 | rcu_read_unlock_bh(); | 1211 | rcu_read_unlock_bh(); |
1201 | *pprt = &rt->dst; | 1212 | *pprt = &rt->dst; |
@@ -1208,25 +1219,36 @@ static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *fl | |||
1208 | return dn_route_output_slow(pprt, flp, flags); | 1219 | return dn_route_output_slow(pprt, flp, flags); |
1209 | } | 1220 | } |
1210 | 1221 | ||
1211 | static int dn_route_output_key(struct dst_entry **pprt, struct flowi *flp, int flags) | 1222 | static int dn_route_output_key(struct dst_entry **pprt, struct flowidn *flp, int flags) |
1212 | { | 1223 | { |
1213 | int err; | 1224 | int err; |
1214 | 1225 | ||
1215 | err = __dn_route_output_key(pprt, flp, flags); | 1226 | err = __dn_route_output_key(pprt, flp, flags); |
1216 | if (err == 0 && flp->proto) { | 1227 | if (err == 0 && flp->flowidn_proto) { |
1217 | err = xfrm_lookup(&init_net, pprt, flp, NULL, 0); | 1228 | *pprt = xfrm_lookup(&init_net, *pprt, |
1229 | flowidn_to_flowi(flp), NULL, 0); | ||
1230 | if (IS_ERR(*pprt)) { | ||
1231 | err = PTR_ERR(*pprt); | ||
1232 | *pprt = NULL; | ||
1233 | } | ||
1218 | } | 1234 | } |
1219 | return err; | 1235 | return err; |
1220 | } | 1236 | } |
1221 | 1237 | ||
1222 | int dn_route_output_sock(struct dst_entry **pprt, struct flowi *fl, struct sock *sk, int flags) | 1238 | int dn_route_output_sock(struct dst_entry **pprt, struct flowidn *fl, struct sock *sk, int flags) |
1223 | { | 1239 | { |
1224 | int err; | 1240 | int err; |
1225 | 1241 | ||
1226 | err = __dn_route_output_key(pprt, fl, flags & MSG_TRYHARD); | 1242 | err = __dn_route_output_key(pprt, fl, flags & MSG_TRYHARD); |
1227 | if (err == 0 && fl->proto) { | 1243 | if (err == 0 && fl->flowidn_proto) { |
1228 | err = xfrm_lookup(&init_net, pprt, fl, sk, | 1244 | if (!(flags & MSG_DONTWAIT)) |
1229 | (flags & MSG_DONTWAIT) ? 0 : XFRM_LOOKUP_WAIT); | 1245 | fl->flowidn_flags |= FLOWI_FLAG_CAN_SLEEP; |
1246 | *pprt = xfrm_lookup(&init_net, *pprt, | ||
1247 | flowidn_to_flowi(fl), sk, 0); | ||
1248 | if (IS_ERR(*pprt)) { | ||
1249 | err = PTR_ERR(*pprt); | ||
1250 | *pprt = NULL; | ||
1251 | } | ||
1230 | } | 1252 | } |
1231 | return err; | 1253 | return err; |
1232 | } | 1254 | } |
@@ -1243,11 +1265,13 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
1243 | int flags = 0; | 1265 | int flags = 0; |
1244 | __le16 gateway = 0; | 1266 | __le16 gateway = 0; |
1245 | __le16 local_src = 0; | 1267 | __le16 local_src = 0; |
1246 | struct flowi fl = { .fld_dst = cb->dst, | 1268 | struct flowidn fld = { |
1247 | .fld_src = cb->src, | 1269 | .daddr = cb->dst, |
1248 | .fld_scope = RT_SCOPE_UNIVERSE, | 1270 | .saddr = cb->src, |
1249 | .mark = skb->mark, | 1271 | .flowidn_scope = RT_SCOPE_UNIVERSE, |
1250 | .iif = skb->dev->ifindex }; | 1272 | .flowidn_mark = skb->mark, |
1273 | .flowidn_iif = skb->dev->ifindex, | ||
1274 | }; | ||
1251 | struct dn_fib_res res = { .fi = NULL, .type = RTN_UNREACHABLE }; | 1275 | struct dn_fib_res res = { .fi = NULL, .type = RTN_UNREACHABLE }; |
1252 | int err = -EINVAL; | 1276 | int err = -EINVAL; |
1253 | int free_res = 0; | 1277 | int free_res = 0; |
@@ -1258,7 +1282,7 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
1258 | goto out; | 1282 | goto out; |
1259 | 1283 | ||
1260 | /* Zero source addresses are not allowed */ | 1284 | /* Zero source addresses are not allowed */ |
1261 | if (fl.fld_src == 0) | 1285 | if (fld.saddr == 0) |
1262 | goto out; | 1286 | goto out; |
1263 | 1287 | ||
1264 | /* | 1288 | /* |
@@ -1272,7 +1296,7 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
1272 | if (dn_dev_islocal(in_dev, cb->src)) | 1296 | if (dn_dev_islocal(in_dev, cb->src)) |
1273 | goto out; | 1297 | goto out; |
1274 | 1298 | ||
1275 | err = dn_fib_lookup(&fl, &res); | 1299 | err = dn_fib_lookup(&fld, &res); |
1276 | if (err) { | 1300 | if (err) { |
1277 | if (err != -ESRCH) | 1301 | if (err != -ESRCH) |
1278 | goto out; | 1302 | goto out; |
@@ -1284,7 +1308,7 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
1284 | 1308 | ||
1285 | res.type = RTN_LOCAL; | 1309 | res.type = RTN_LOCAL; |
1286 | } else { | 1310 | } else { |
1287 | __le16 src_map = fl.fld_src; | 1311 | __le16 src_map = fld.saddr; |
1288 | free_res = 1; | 1312 | free_res = 1; |
1289 | 1313 | ||
1290 | out_dev = DN_FIB_RES_DEV(res); | 1314 | out_dev = DN_FIB_RES_DEV(res); |
@@ -1297,22 +1321,22 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
1297 | dev_hold(out_dev); | 1321 | dev_hold(out_dev); |
1298 | 1322 | ||
1299 | if (res.r) | 1323 | if (res.r) |
1300 | src_map = fl.fld_src; /* no NAT support for now */ | 1324 | src_map = fld.saddr; /* no NAT support for now */ |
1301 | 1325 | ||
1302 | gateway = DN_FIB_RES_GW(res); | 1326 | gateway = DN_FIB_RES_GW(res); |
1303 | if (res.type == RTN_NAT) { | 1327 | if (res.type == RTN_NAT) { |
1304 | fl.fld_dst = dn_fib_rules_map_destination(fl.fld_dst, &res); | 1328 | fld.daddr = dn_fib_rules_map_destination(fld.daddr, &res); |
1305 | dn_fib_res_put(&res); | 1329 | dn_fib_res_put(&res); |
1306 | free_res = 0; | 1330 | free_res = 0; |
1307 | if (dn_fib_lookup(&fl, &res)) | 1331 | if (dn_fib_lookup(&fld, &res)) |
1308 | goto e_inval; | 1332 | goto e_inval; |
1309 | free_res = 1; | 1333 | free_res = 1; |
1310 | if (res.type != RTN_UNICAST) | 1334 | if (res.type != RTN_UNICAST) |
1311 | goto e_inval; | 1335 | goto e_inval; |
1312 | flags |= RTCF_DNAT; | 1336 | flags |= RTCF_DNAT; |
1313 | gateway = fl.fld_dst; | 1337 | gateway = fld.daddr; |
1314 | } | 1338 | } |
1315 | fl.fld_src = src_map; | 1339 | fld.saddr = src_map; |
1316 | } | 1340 | } |
1317 | 1341 | ||
1318 | switch(res.type) { | 1342 | switch(res.type) { |
@@ -1326,8 +1350,8 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
1326 | if (dn_db->parms.forwarding == 0) | 1350 | if (dn_db->parms.forwarding == 0) |
1327 | goto e_inval; | 1351 | goto e_inval; |
1328 | 1352 | ||
1329 | if (res.fi->fib_nhs > 1 && fl.oif == 0) | 1353 | if (res.fi->fib_nhs > 1 && fld.flowidn_oif == 0) |
1330 | dn_fib_select_multipath(&fl, &res); | 1354 | dn_fib_select_multipath(&fld, &res); |
1331 | 1355 | ||
1332 | /* | 1356 | /* |
1333 | * Check for out_dev == in_dev. We use the RTCF_DOREDIRECT | 1357 | * Check for out_dev == in_dev. We use the RTCF_DOREDIRECT |
@@ -1345,8 +1369,8 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
1345 | break; | 1369 | break; |
1346 | case RTN_LOCAL: | 1370 | case RTN_LOCAL: |
1347 | flags |= RTCF_LOCAL; | 1371 | flags |= RTCF_LOCAL; |
1348 | fl.fld_src = cb->dst; | 1372 | fld.saddr = cb->dst; |
1349 | fl.fld_dst = cb->src; | 1373 | fld.daddr = cb->src; |
1350 | 1374 | ||
1351 | /* Routing tables gave us a gateway */ | 1375 | /* Routing tables gave us a gateway */ |
1352 | if (gateway) | 1376 | if (gateway) |
@@ -1375,25 +1399,25 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
1375 | } | 1399 | } |
1376 | 1400 | ||
1377 | make_route: | 1401 | make_route: |
1378 | rt = dst_alloc(&dn_dst_ops); | 1402 | rt = dst_alloc(&dn_dst_ops, 0); |
1379 | if (rt == NULL) | 1403 | if (rt == NULL) |
1380 | goto e_nobufs; | 1404 | goto e_nobufs; |
1381 | 1405 | ||
1382 | rt->rt_saddr = fl.fld_src; | 1406 | rt->rt_saddr = fld.saddr; |
1383 | rt->rt_daddr = fl.fld_dst; | 1407 | rt->rt_daddr = fld.daddr; |
1384 | rt->rt_gateway = fl.fld_dst; | 1408 | rt->rt_gateway = fld.daddr; |
1385 | if (gateway) | 1409 | if (gateway) |
1386 | rt->rt_gateway = gateway; | 1410 | rt->rt_gateway = gateway; |
1387 | rt->rt_local_src = local_src ? local_src : rt->rt_saddr; | 1411 | rt->rt_local_src = local_src ? local_src : rt->rt_saddr; |
1388 | 1412 | ||
1389 | rt->rt_dst_map = fl.fld_dst; | 1413 | rt->rt_dst_map = fld.daddr; |
1390 | rt->rt_src_map = fl.fld_src; | 1414 | rt->rt_src_map = fld.saddr; |
1391 | 1415 | ||
1392 | rt->fl.fld_src = cb->src; | 1416 | rt->fld.saddr = cb->src; |
1393 | rt->fl.fld_dst = cb->dst; | 1417 | rt->fld.daddr = cb->dst; |
1394 | rt->fl.oif = 0; | 1418 | rt->fld.flowidn_oif = 0; |
1395 | rt->fl.iif = in_dev->ifindex; | 1419 | rt->fld.flowidn_iif = in_dev->ifindex; |
1396 | rt->fl.mark = fl.mark; | 1420 | rt->fld.flowidn_mark = fld.flowidn_mark; |
1397 | 1421 | ||
1398 | rt->dst.flags = DST_HOST; | 1422 | rt->dst.flags = DST_HOST; |
1399 | rt->dst.neighbour = neigh; | 1423 | rt->dst.neighbour = neigh; |
@@ -1423,7 +1447,7 @@ make_route: | |||
1423 | if (err) | 1447 | if (err) |
1424 | goto e_neighbour; | 1448 | goto e_neighbour; |
1425 | 1449 | ||
1426 | hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); | 1450 | hash = dn_hash(rt->fld.saddr, rt->fld.daddr); |
1427 | dn_insert_route(rt, hash, &rt); | 1451 | dn_insert_route(rt, hash, &rt); |
1428 | skb_dst_set(skb, &rt->dst); | 1452 | skb_dst_set(skb, &rt->dst); |
1429 | 1453 | ||
@@ -1463,11 +1487,11 @@ static int dn_route_input(struct sk_buff *skb) | |||
1463 | rcu_read_lock(); | 1487 | rcu_read_lock(); |
1464 | for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt != NULL; | 1488 | for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt != NULL; |
1465 | rt = rcu_dereference(rt->dst.dn_next)) { | 1489 | rt = rcu_dereference(rt->dst.dn_next)) { |
1466 | if ((rt->fl.fld_src == cb->src) && | 1490 | if ((rt->fld.saddr == cb->src) && |
1467 | (rt->fl.fld_dst == cb->dst) && | 1491 | (rt->fld.daddr == cb->dst) && |
1468 | (rt->fl.oif == 0) && | 1492 | (rt->fld.flowidn_oif == 0) && |
1469 | (rt->fl.mark == skb->mark) && | 1493 | (rt->fld.flowidn_mark == skb->mark) && |
1470 | (rt->fl.iif == cb->iif)) { | 1494 | (rt->fld.flowidn_iif == cb->iif)) { |
1471 | dst_use(&rt->dst, jiffies); | 1495 | dst_use(&rt->dst, jiffies); |
1472 | rcu_read_unlock(); | 1496 | rcu_read_unlock(); |
1473 | skb_dst_set(skb, (struct dst_entry *)rt); | 1497 | skb_dst_set(skb, (struct dst_entry *)rt); |
@@ -1503,9 +1527,9 @@ static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, | |||
1503 | if (rt->rt_flags & RTCF_NOTIFY) | 1527 | if (rt->rt_flags & RTCF_NOTIFY) |
1504 | r->rtm_flags |= RTM_F_NOTIFY; | 1528 | r->rtm_flags |= RTM_F_NOTIFY; |
1505 | RTA_PUT(skb, RTA_DST, 2, &rt->rt_daddr); | 1529 | RTA_PUT(skb, RTA_DST, 2, &rt->rt_daddr); |
1506 | if (rt->fl.fld_src) { | 1530 | if (rt->fld.saddr) { |
1507 | r->rtm_src_len = 16; | 1531 | r->rtm_src_len = 16; |
1508 | RTA_PUT(skb, RTA_SRC, 2, &rt->fl.fld_src); | 1532 | RTA_PUT(skb, RTA_SRC, 2, &rt->fld.saddr); |
1509 | } | 1533 | } |
1510 | if (rt->dst.dev) | 1534 | if (rt->dst.dev) |
1511 | RTA_PUT(skb, RTA_OIF, sizeof(int), &rt->dst.dev->ifindex); | 1535 | RTA_PUT(skb, RTA_OIF, sizeof(int), &rt->dst.dev->ifindex); |
@@ -1524,7 +1548,7 @@ static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, | |||
1524 | rt->dst.error) < 0) | 1548 | rt->dst.error) < 0) |
1525 | goto rtattr_failure; | 1549 | goto rtattr_failure; |
1526 | if (dn_is_input_route(rt)) | 1550 | if (dn_is_input_route(rt)) |
1527 | RTA_PUT(skb, RTA_IIF, sizeof(int), &rt->fl.iif); | 1551 | RTA_PUT(skb, RTA_IIF, sizeof(int), &rt->fld.flowidn_iif); |
1528 | 1552 | ||
1529 | nlh->nlmsg_len = skb_tail_pointer(skb) - b; | 1553 | nlh->nlmsg_len = skb_tail_pointer(skb) - b; |
1530 | return skb->len; | 1554 | return skb->len; |
@@ -1547,13 +1571,13 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1547 | struct dn_skb_cb *cb; | 1571 | struct dn_skb_cb *cb; |
1548 | int err; | 1572 | int err; |
1549 | struct sk_buff *skb; | 1573 | struct sk_buff *skb; |
1550 | struct flowi fl; | 1574 | struct flowidn fld; |
1551 | 1575 | ||
1552 | if (!net_eq(net, &init_net)) | 1576 | if (!net_eq(net, &init_net)) |
1553 | return -EINVAL; | 1577 | return -EINVAL; |
1554 | 1578 | ||
1555 | memset(&fl, 0, sizeof(fl)); | 1579 | memset(&fld, 0, sizeof(fld)); |
1556 | fl.proto = DNPROTO_NSP; | 1580 | fld.flowidn_proto = DNPROTO_NSP; |
1557 | 1581 | ||
1558 | skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); | 1582 | skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); |
1559 | if (skb == NULL) | 1583 | if (skb == NULL) |
@@ -1562,15 +1586,15 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1562 | cb = DN_SKB_CB(skb); | 1586 | cb = DN_SKB_CB(skb); |
1563 | 1587 | ||
1564 | if (rta[RTA_SRC-1]) | 1588 | if (rta[RTA_SRC-1]) |
1565 | memcpy(&fl.fld_src, RTA_DATA(rta[RTA_SRC-1]), 2); | 1589 | memcpy(&fld.saddr, RTA_DATA(rta[RTA_SRC-1]), 2); |
1566 | if (rta[RTA_DST-1]) | 1590 | if (rta[RTA_DST-1]) |
1567 | memcpy(&fl.fld_dst, RTA_DATA(rta[RTA_DST-1]), 2); | 1591 | memcpy(&fld.daddr, RTA_DATA(rta[RTA_DST-1]), 2); |
1568 | if (rta[RTA_IIF-1]) | 1592 | if (rta[RTA_IIF-1]) |
1569 | memcpy(&fl.iif, RTA_DATA(rta[RTA_IIF-1]), sizeof(int)); | 1593 | memcpy(&fld.flowidn_iif, RTA_DATA(rta[RTA_IIF-1]), sizeof(int)); |
1570 | 1594 | ||
1571 | if (fl.iif) { | 1595 | if (fld.flowidn_iif) { |
1572 | struct net_device *dev; | 1596 | struct net_device *dev; |
1573 | if ((dev = dev_get_by_index(&init_net, fl.iif)) == NULL) { | 1597 | if ((dev = dev_get_by_index(&init_net, fld.flowidn_iif)) == NULL) { |
1574 | kfree_skb(skb); | 1598 | kfree_skb(skb); |
1575 | return -ENODEV; | 1599 | return -ENODEV; |
1576 | } | 1600 | } |
@@ -1581,8 +1605,8 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1581 | } | 1605 | } |
1582 | skb->protocol = htons(ETH_P_DNA_RT); | 1606 | skb->protocol = htons(ETH_P_DNA_RT); |
1583 | skb->dev = dev; | 1607 | skb->dev = dev; |
1584 | cb->src = fl.fld_src; | 1608 | cb->src = fld.saddr; |
1585 | cb->dst = fl.fld_dst; | 1609 | cb->dst = fld.daddr; |
1586 | local_bh_disable(); | 1610 | local_bh_disable(); |
1587 | err = dn_route_input(skb); | 1611 | err = dn_route_input(skb); |
1588 | local_bh_enable(); | 1612 | local_bh_enable(); |
@@ -1594,8 +1618,8 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1594 | int oif = 0; | 1618 | int oif = 0; |
1595 | if (rta[RTA_OIF - 1]) | 1619 | if (rta[RTA_OIF - 1]) |
1596 | memcpy(&oif, RTA_DATA(rta[RTA_OIF - 1]), sizeof(int)); | 1620 | memcpy(&oif, RTA_DATA(rta[RTA_OIF - 1]), sizeof(int)); |
1597 | fl.oif = oif; | 1621 | fld.flowidn_oif = oif; |
1598 | err = dn_route_output_key((struct dst_entry **)&rt, &fl, 0); | 1622 | err = dn_route_output_key((struct dst_entry **)&rt, &fld, 0); |
1599 | } | 1623 | } |
1600 | 1624 | ||
1601 | if (skb->dev) | 1625 | if (skb->dev) |