aboutsummaryrefslogtreecommitdiffstats
path: root/net/decnet/dn_route.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/decnet/dn_route.c')
-rw-r--r--net/decnet/dn_route.c300
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);
112static struct dst_entry *dn_dst_check(struct dst_entry *, __u32); 112static struct dst_entry *dn_dst_check(struct dst_entry *, __u32);
113static unsigned int dn_dst_default_advmss(const struct dst_entry *dst); 113static unsigned int dn_dst_default_advmss(const struct dst_entry *dst);
114static unsigned int dn_dst_default_mtu(const struct dst_entry *dst); 114static unsigned int dn_dst_default_mtu(const struct dst_entry *dst);
115static void dn_dst_destroy(struct dst_entry *);
115static struct dst_entry *dn_dst_negative_advice(struct dst_entry *); 116static struct dst_entry *dn_dst_negative_advice(struct dst_entry *);
116static void dn_dst_link_failure(struct sk_buff *); 117static void dn_dst_link_failure(struct sk_buff *);
117static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu); 118static 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
144static void dn_dst_destroy(struct dst_entry *dst)
145{
146 dst_destroy_metrics_generic(dst);
147}
148
141static __inline__ unsigned dn_hash(__le16 src, __le16 dst) 149static __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
277static inline int compare_keys(struct flowi *fl1, struct flowi *fl2) 285static 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
287static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route **rp) 295static 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
898static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *oldflp, int try_hard) 906static 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
1113make_route: 1124make_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
1157done: 1168done:
@@ -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 */
1185static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *flp, int flags) 1196static 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
1211static int dn_route_output_key(struct dst_entry **pprt, struct flowi *flp, int flags) 1222static 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
1222int dn_route_output_sock(struct dst_entry **pprt, struct flowi *fl, struct sock *sk, int flags) 1238int 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
1377make_route: 1401make_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)