diff options
author | Jiri Pirko <jiri@mellanox.com> | 2016-09-26 06:52:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-09-28 04:48:00 -0400 |
commit | 347e3b28c1ba24c1ae2f30290d8247480ab9ce14 (patch) | |
tree | b84cd9ae18da57455f7e3ede13c2ef6522eecff8 /net/switchdev | |
parent | 936bd486564aa3edb52313aa7c2e7381e0bcaba3 (diff) |
switchdev: remove FIB offload infrastructure
Since this is now taken care of by FIB notifier, remove the code, with
all unused dependencies.
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/switchdev')
-rw-r--r-- | net/switchdev/switchdev.c | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index abd8d2a38a7d..02beb35f577f 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/workqueue.h> | 21 | #include <linux/workqueue.h> |
22 | #include <linux/if_vlan.h> | 22 | #include <linux/if_vlan.h> |
23 | #include <linux/rtnetlink.h> | 23 | #include <linux/rtnetlink.h> |
24 | #include <net/ip_fib.h> | ||
25 | #include <net/switchdev.h> | 24 | #include <net/switchdev.h> |
26 | 25 | ||
27 | /** | 26 | /** |
@@ -344,8 +343,6 @@ static size_t switchdev_obj_size(const struct switchdev_obj *obj) | |||
344 | switch (obj->id) { | 343 | switch (obj->id) { |
345 | case SWITCHDEV_OBJ_ID_PORT_VLAN: | 344 | case SWITCHDEV_OBJ_ID_PORT_VLAN: |
346 | return sizeof(struct switchdev_obj_port_vlan); | 345 | return sizeof(struct switchdev_obj_port_vlan); |
347 | case SWITCHDEV_OBJ_ID_IPV4_FIB: | ||
348 | return sizeof(struct switchdev_obj_ipv4_fib); | ||
349 | case SWITCHDEV_OBJ_ID_PORT_FDB: | 346 | case SWITCHDEV_OBJ_ID_PORT_FDB: |
350 | return sizeof(struct switchdev_obj_port_fdb); | 347 | return sizeof(struct switchdev_obj_port_fdb); |
351 | case SWITCHDEV_OBJ_ID_PORT_MDB: | 348 | case SWITCHDEV_OBJ_ID_PORT_MDB: |
@@ -1108,184 +1105,6 @@ int switchdev_port_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb, | |||
1108 | } | 1105 | } |
1109 | EXPORT_SYMBOL_GPL(switchdev_port_fdb_dump); | 1106 | EXPORT_SYMBOL_GPL(switchdev_port_fdb_dump); |
1110 | 1107 | ||
1111 | static struct net_device *switchdev_get_lowest_dev(struct net_device *dev) | ||
1112 | { | ||
1113 | const struct switchdev_ops *ops = dev->switchdev_ops; | ||
1114 | struct net_device *lower_dev; | ||
1115 | struct net_device *port_dev; | ||
1116 | struct list_head *iter; | ||
1117 | |||
1118 | /* Recusively search down until we find a sw port dev. | ||
1119 | * (A sw port dev supports switchdev_port_attr_get). | ||
1120 | */ | ||
1121 | |||
1122 | if (ops && ops->switchdev_port_attr_get) | ||
1123 | return dev; | ||
1124 | |||
1125 | netdev_for_each_lower_dev(dev, lower_dev, iter) { | ||
1126 | port_dev = switchdev_get_lowest_dev(lower_dev); | ||
1127 | if (port_dev) | ||
1128 | return port_dev; | ||
1129 | } | ||
1130 | |||
1131 | return NULL; | ||
1132 | } | ||
1133 | |||
1134 | static struct net_device *switchdev_get_dev_by_nhs(struct fib_info *fi) | ||
1135 | { | ||
1136 | struct switchdev_attr attr = { | ||
1137 | .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, | ||
1138 | }; | ||
1139 | struct switchdev_attr prev_attr; | ||
1140 | struct net_device *dev = NULL; | ||
1141 | int nhsel; | ||
1142 | |||
1143 | ASSERT_RTNL(); | ||
1144 | |||
1145 | /* For this route, all nexthop devs must be on the same switch. */ | ||
1146 | |||
1147 | for (nhsel = 0; nhsel < fi->fib_nhs; nhsel++) { | ||
1148 | const struct fib_nh *nh = &fi->fib_nh[nhsel]; | ||
1149 | |||
1150 | if (!nh->nh_dev) | ||
1151 | return NULL; | ||
1152 | |||
1153 | dev = switchdev_get_lowest_dev(nh->nh_dev); | ||
1154 | if (!dev) | ||
1155 | return NULL; | ||
1156 | |||
1157 | attr.orig_dev = dev; | ||
1158 | if (switchdev_port_attr_get(dev, &attr)) | ||
1159 | return NULL; | ||
1160 | |||
1161 | if (nhsel > 0 && | ||
1162 | !netdev_phys_item_id_same(&prev_attr.u.ppid, &attr.u.ppid)) | ||
1163 | return NULL; | ||
1164 | |||
1165 | prev_attr = attr; | ||
1166 | } | ||
1167 | |||
1168 | return dev; | ||
1169 | } | ||
1170 | |||
1171 | /** | ||
1172 | * switchdev_fib_ipv4_add - Add/modify switch IPv4 route entry | ||
1173 | * | ||
1174 | * @dst: route's IPv4 destination address | ||
1175 | * @dst_len: destination address length (prefix length) | ||
1176 | * @fi: route FIB info structure | ||
1177 | * @tos: route TOS | ||
1178 | * @type: route type | ||
1179 | * @nlflags: netlink flags passed in (NLM_F_*) | ||
1180 | * @tb_id: route table ID | ||
1181 | * | ||
1182 | * Add/modify switch IPv4 route entry. | ||
1183 | */ | ||
1184 | int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi, | ||
1185 | u8 tos, u8 type, u32 nlflags, u32 tb_id) | ||
1186 | { | ||
1187 | struct switchdev_obj_ipv4_fib ipv4_fib = { | ||
1188 | .obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB, | ||
1189 | .dst = dst, | ||
1190 | .dst_len = dst_len, | ||
1191 | .fi = fi, | ||
1192 | .tos = tos, | ||
1193 | .type = type, | ||
1194 | .nlflags = nlflags, | ||
1195 | .tb_id = tb_id, | ||
1196 | }; | ||
1197 | struct net_device *dev; | ||
1198 | int err = 0; | ||
1199 | |||
1200 | /* Don't offload route if using custom ip rules or if | ||
1201 | * IPv4 FIB offloading has been disabled completely. | ||
1202 | */ | ||
1203 | |||
1204 | #ifdef CONFIG_IP_MULTIPLE_TABLES | ||
1205 | if (fi->fib_net->ipv4.fib_has_custom_rules) | ||
1206 | return 0; | ||
1207 | #endif | ||
1208 | |||
1209 | if (fi->fib_net->ipv4.fib_offload_disabled) | ||
1210 | return 0; | ||
1211 | |||
1212 | dev = switchdev_get_dev_by_nhs(fi); | ||
1213 | if (!dev) | ||
1214 | return 0; | ||
1215 | |||
1216 | ipv4_fib.obj.orig_dev = dev; | ||
1217 | err = switchdev_port_obj_add(dev, &ipv4_fib.obj); | ||
1218 | if (!err) | ||
1219 | fib_info_offload_inc(fi); | ||
1220 | |||
1221 | return err == -EOPNOTSUPP ? 0 : err; | ||
1222 | } | ||
1223 | EXPORT_SYMBOL_GPL(switchdev_fib_ipv4_add); | ||
1224 | |||
1225 | /** | ||
1226 | * switchdev_fib_ipv4_del - Delete IPv4 route entry from switch | ||
1227 | * | ||
1228 | * @dst: route's IPv4 destination address | ||
1229 | * @dst_len: destination address length (prefix length) | ||
1230 | * @fi: route FIB info structure | ||
1231 | * @tos: route TOS | ||
1232 | * @type: route type | ||
1233 | * @tb_id: route table ID | ||
1234 | * | ||
1235 | * Delete IPv4 route entry from switch device. | ||
1236 | */ | ||
1237 | int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi, | ||
1238 | u8 tos, u8 type, u32 tb_id) | ||
1239 | { | ||
1240 | struct switchdev_obj_ipv4_fib ipv4_fib = { | ||
1241 | .obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB, | ||
1242 | .dst = dst, | ||
1243 | .dst_len = dst_len, | ||
1244 | .fi = fi, | ||
1245 | .tos = tos, | ||
1246 | .type = type, | ||
1247 | .nlflags = 0, | ||
1248 | .tb_id = tb_id, | ||
1249 | }; | ||
1250 | struct net_device *dev; | ||
1251 | int err = 0; | ||
1252 | |||
1253 | if (!(fi->fib_flags & RTNH_F_OFFLOAD)) | ||
1254 | return 0; | ||
1255 | |||
1256 | dev = switchdev_get_dev_by_nhs(fi); | ||
1257 | if (!dev) | ||
1258 | return 0; | ||
1259 | |||
1260 | ipv4_fib.obj.orig_dev = dev; | ||
1261 | err = switchdev_port_obj_del(dev, &ipv4_fib.obj); | ||
1262 | if (!err) | ||
1263 | fib_info_offload_dec(fi); | ||
1264 | |||
1265 | return err == -EOPNOTSUPP ? 0 : err; | ||
1266 | } | ||
1267 | EXPORT_SYMBOL_GPL(switchdev_fib_ipv4_del); | ||
1268 | |||
1269 | /** | ||
1270 | * switchdev_fib_ipv4_abort - Abort an IPv4 FIB operation | ||
1271 | * | ||
1272 | * @fi: route FIB info structure | ||
1273 | */ | ||
1274 | void switchdev_fib_ipv4_abort(struct fib_info *fi) | ||
1275 | { | ||
1276 | /* There was a problem installing this route to the offload | ||
1277 | * device. For now, until we come up with more refined | ||
1278 | * policy handling, abruptly end IPv4 fib offloading for | ||
1279 | * for entire net by flushing offload device(s) of all | ||
1280 | * IPv4 routes, and mark IPv4 fib offloading broken from | ||
1281 | * this point forward. | ||
1282 | */ | ||
1283 | |||
1284 | fib_flush_external(fi->fib_net); | ||
1285 | fi->fib_net->ipv4.fib_offload_disabled = true; | ||
1286 | } | ||
1287 | EXPORT_SYMBOL_GPL(switchdev_fib_ipv4_abort); | ||
1288 | |||
1289 | bool switchdev_port_same_parent_id(struct net_device *a, | 1108 | bool switchdev_port_same_parent_id(struct net_device *a, |
1290 | struct net_device *b) | 1109 | struct net_device *b) |
1291 | { | 1110 | { |