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

Merge branch 'switchdev-obj'

Jiri Pirko says:

====================
switchdev: bring back switchdev_obj

Second version of the patch extends to a patchset. Basically this patchset
brings object structure back which disappeared with recent Vivien's patchset.
Also it does a bit of naming changes in order to get the things in line.
Also, object id is put back into object structure.
Thanks to Scott and Vivien for review and suggestions.
====================

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

+199 -160
+8 -7
Documentation/networking/switchdev.txt
··· 115 115 ^^^^^^^^^ 116 116 117 117 The switchdev driver must implement the switchdev op switchdev_port_attr_get 118 - for SWITCHDEV_ATTR_PORT_PARENT_ID for each port netdev, returning the same 118 + for SWITCHDEV_ATTR_ID_PORT_PARENT_ID for each port netdev, returning the same 119 119 physical ID for each port of a switch. The ID must be unique between switches 120 120 on the same system. The ID does not need to be unique between switches on 121 121 different systems. ··· 178 178 bridge fdb add ADDR dev DEV [vlan VID] [self] 179 179 180 180 The driver should use the helper switchdev_port_fdb_xxx ops for ndo_fdb_xxx 181 - ops, and handle add/delete/dump of SWITCHDEV_OBJ_PORT_FDB object using 181 + ops, and handle add/delete/dump of SWITCHDEV_OBJ_ID_PORT_FDB object using 182 182 switchdev_port_obj_xxx ops. 183 183 184 184 XXX: what should be done if offloading this rule to hardware fails (for ··· 233 233 device port and on the bridge port, and disable learning_sync. 234 234 235 235 To support learning and learning_sync port attributes, the driver implements 236 - switchdev op switchdev_port_attr_get/set for SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS. 237 - The driver should initialize the attributes to the hardware defaults. 236 + switchdev op switchdev_port_attr_get/set for 237 + SWITCHDEV_ATTR_PORT_ID_BRIDGE_FLAGS. The driver should initialize the attributes 238 + to the hardware defaults. 238 239 239 240 FDB Ageing 240 241 ^^^^^^^^^^ ··· 261 260 Internally or with a third-party STP protocol implementation (e.g. mstpd), the 262 261 bridge driver maintains the STP state for ports, and will notify the switch 263 262 driver of STP state change on a port using the switchdev op 264 - switchdev_attr_port_set for SWITCHDEV_ATTR_PORT_STP_UPDATE. 263 + switchdev_attr_port_set for SWITCHDEV_ATTR_PORT_ID_STP_UPDATE. 265 264 266 265 State is one of BR_STATE_*. The switch driver can use STP state updates to 267 266 update ingress packet filter list for the port. For example, if port is ··· 317 316 switchdev_port_obj_add is used for both adding a new FIB entry to the device, 318 317 or modifying an existing entry on the device. 319 318 320 - XXX: Currently, only SWITCHDEV_OBJ_IPV4_FIB objects are supported. 319 + XXX: Currently, only SWITCHDEV_OBJ_ID_IPV4_FIB objects are supported. 321 320 322 - SWITCHDEV_OBJ_IPV4_FIB object passes: 321 + SWITCHDEV_OBJ_ID_IPV4_FIB object passes: 323 322 324 323 struct switchdev_obj_ipv4_fib { /* IPV4_FIB */ 325 324 u32 dst;
+1 -1
drivers/net/ethernet/mellanox/mlxsw/switchx2.c
··· 868 868 struct mlxsw_sx *mlxsw_sx = mlxsw_sx_port->mlxsw_sx; 869 869 870 870 switch (attr->id) { 871 - case SWITCHDEV_ATTR_PORT_PARENT_ID: 871 + case SWITCHDEV_ATTR_ID_PORT_PARENT_ID: 872 872 attr->u.ppid.id_len = sizeof(mlxsw_sx->hw_id); 873 873 memcpy(&attr->u.ppid.id, &mlxsw_sx->hw_id, attr->u.ppid.id_len); 874 874 break;
+43 -37
drivers/net/ethernet/rocker/rocker.c
··· 4329 4329 const struct rocker *rocker = rocker_port->rocker; 4330 4330 4331 4331 switch (attr->id) { 4332 - case SWITCHDEV_ATTR_PORT_PARENT_ID: 4332 + case SWITCHDEV_ATTR_ID_PORT_PARENT_ID: 4333 4333 attr->u.ppid.id_len = sizeof(rocker->hw.id); 4334 4334 memcpy(&attr->u.ppid.id, &rocker->hw.id, attr->u.ppid.id_len); 4335 4335 break; 4336 - case SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS: 4336 + case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS: 4337 4337 attr->u.brport_flags = rocker_port->brport_flags; 4338 4338 break; 4339 4339 default: ··· 4369 4369 int err = 0; 4370 4370 4371 4371 switch (attr->id) { 4372 - case SWITCHDEV_ATTR_PORT_STP_STATE: 4372 + case SWITCHDEV_ATTR_ID_PORT_STP_STATE: 4373 4373 err = rocker_port_stp_update(rocker_port, trans, 4374 4374 ROCKER_OP_FLAG_NOWAIT, 4375 4375 attr->u.stp_state); 4376 4376 break; 4377 - case SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS: 4377 + case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS: 4378 4378 err = rocker_port_brport_flags_set(rocker_port, trans, 4379 4379 attr->u.brport_flags); 4380 4380 break; ··· 4408 4408 4409 4409 static int rocker_port_vlans_add(struct rocker_port *rocker_port, 4410 4410 struct switchdev_trans *trans, 4411 - const struct switchdev_obj_vlan *vlan) 4411 + const struct switchdev_obj_port_vlan *vlan) 4412 4412 { 4413 4413 u16 vid; 4414 4414 int err; ··· 4425 4425 4426 4426 static int rocker_port_fdb_add(struct rocker_port *rocker_port, 4427 4427 struct switchdev_trans *trans, 4428 - const struct switchdev_obj_fdb *fdb) 4428 + const struct switchdev_obj_port_fdb *fdb) 4429 4429 { 4430 4430 __be16 vlan_id = rocker_port_vid_to_vlan(rocker_port, fdb->vid, NULL); 4431 4431 int flags = 0; ··· 4437 4437 } 4438 4438 4439 4439 static int rocker_port_obj_add(struct net_device *dev, 4440 - enum switchdev_obj_id id, const void *obj, 4440 + const struct switchdev_obj *obj, 4441 4441 struct switchdev_trans *trans) 4442 4442 { 4443 4443 struct rocker_port *rocker_port = netdev_priv(dev); 4444 4444 const struct switchdev_obj_ipv4_fib *fib4; 4445 4445 int err = 0; 4446 4446 4447 - switch (id) { 4448 - case SWITCHDEV_OBJ_PORT_VLAN: 4449 - err = rocker_port_vlans_add(rocker_port, trans, obj); 4447 + switch (obj->id) { 4448 + case SWITCHDEV_OBJ_ID_PORT_VLAN: 4449 + err = rocker_port_vlans_add(rocker_port, trans, 4450 + SWITCHDEV_OBJ_PORT_VLAN(obj)); 4450 4451 break; 4451 - case SWITCHDEV_OBJ_IPV4_FIB: 4452 - fib4 = obj; 4452 + case SWITCHDEV_OBJ_ID_IPV4_FIB: 4453 + fib4 = SWITCHDEV_OBJ_IPV4_FIB(obj); 4453 4454 err = rocker_port_fib_ipv4(rocker_port, trans, 4454 4455 htonl(fib4->dst), fib4->dst_len, 4455 4456 fib4->fi, fib4->tb_id, 0); 4456 4457 break; 4457 - case SWITCHDEV_OBJ_PORT_FDB: 4458 - err = rocker_port_fdb_add(rocker_port, trans, obj); 4458 + case SWITCHDEV_OBJ_ID_PORT_FDB: 4459 + err = rocker_port_fdb_add(rocker_port, trans, 4460 + SWITCHDEV_OBJ_PORT_FDB(obj)); 4459 4461 break; 4460 4462 default: 4461 4463 err = -EOPNOTSUPP; ··· 4482 4480 } 4483 4481 4484 4482 static int rocker_port_vlans_del(struct rocker_port *rocker_port, 4485 - const struct switchdev_obj_vlan *vlan) 4483 + const struct switchdev_obj_port_vlan *vlan) 4486 4484 { 4487 4485 u16 vid; 4488 4486 int err; ··· 4498 4496 4499 4497 static int rocker_port_fdb_del(struct rocker_port *rocker_port, 4500 4498 struct switchdev_trans *trans, 4501 - const struct switchdev_obj_fdb *fdb) 4499 + const struct switchdev_obj_port_fdb *fdb) 4502 4500 { 4503 4501 __be16 vlan_id = rocker_port_vid_to_vlan(rocker_port, fdb->vid, NULL); 4504 4502 int flags = ROCKER_OP_FLAG_NOWAIT | ROCKER_OP_FLAG_REMOVE; ··· 4510 4508 } 4511 4509 4512 4510 static int rocker_port_obj_del(struct net_device *dev, 4513 - enum switchdev_obj_id id, const void *obj) 4511 + const struct switchdev_obj *obj) 4514 4512 { 4515 4513 struct rocker_port *rocker_port = netdev_priv(dev); 4516 4514 const struct switchdev_obj_ipv4_fib *fib4; 4517 4515 int err = 0; 4518 4516 4519 - switch (id) { 4520 - case SWITCHDEV_OBJ_PORT_VLAN: 4521 - err = rocker_port_vlans_del(rocker_port, obj); 4517 + switch (obj->id) { 4518 + case SWITCHDEV_OBJ_ID_PORT_VLAN: 4519 + err = rocker_port_vlans_del(rocker_port, 4520 + SWITCHDEV_OBJ_PORT_VLAN(obj)); 4522 4521 break; 4523 - case SWITCHDEV_OBJ_IPV4_FIB: 4524 - fib4 = obj; 4522 + case SWITCHDEV_OBJ_ID_IPV4_FIB: 4523 + fib4 = SWITCHDEV_OBJ_IPV4_FIB(obj); 4525 4524 err = rocker_port_fib_ipv4(rocker_port, NULL, 4526 4525 htonl(fib4->dst), fib4->dst_len, 4527 4526 fib4->fi, fib4->tb_id, 4528 4527 ROCKER_OP_FLAG_REMOVE); 4529 4528 break; 4530 - case SWITCHDEV_OBJ_PORT_FDB: 4531 - err = rocker_port_fdb_del(rocker_port, NULL, obj); 4529 + case SWITCHDEV_OBJ_ID_PORT_FDB: 4530 + err = rocker_port_fdb_del(rocker_port, NULL, 4531 + SWITCHDEV_OBJ_PORT_FDB(obj)); 4532 4532 break; 4533 4533 default: 4534 4534 err = -EOPNOTSUPP; ··· 4541 4537 } 4542 4538 4543 4539 static int rocker_port_fdb_dump(const struct rocker_port *rocker_port, 4544 - struct switchdev_obj_fdb *fdb, 4545 - int (*cb)(void *obj)) 4540 + struct switchdev_obj_port_fdb *fdb, 4541 + switchdev_obj_dump_cb_t *cb) 4546 4542 { 4547 4543 struct rocker *rocker = rocker_port->rocker; 4548 4544 struct rocker_fdb_tbl_entry *found; ··· 4559 4555 fdb->ndm_state = NUD_REACHABLE; 4560 4556 fdb->vid = rocker_port_vlan_to_vid(rocker_port, 4561 4557 found->key.vlan_id); 4562 - err = cb(fdb); 4558 + err = cb(&fdb->obj); 4563 4559 if (err) 4564 4560 break; 4565 4561 } ··· 4569 4565 } 4570 4566 4571 4567 static int rocker_port_vlan_dump(const struct rocker_port *rocker_port, 4572 - struct switchdev_obj_vlan *vlan, 4573 - int (*cb)(void *obj)) 4568 + struct switchdev_obj_port_vlan *vlan, 4569 + switchdev_obj_dump_cb_t *cb) 4574 4570 { 4575 4571 u16 vid; 4576 4572 int err = 0; ··· 4582 4578 if (rocker_vlan_id_is_internal(htons(vid))) 4583 4579 vlan->flags |= BRIDGE_VLAN_INFO_PVID; 4584 4580 vlan->vid_begin = vlan->vid_end = vid; 4585 - err = cb(vlan); 4581 + err = cb(&vlan->obj); 4586 4582 if (err) 4587 4583 break; 4588 4584 } ··· 4591 4587 } 4592 4588 4593 4589 static int rocker_port_obj_dump(struct net_device *dev, 4594 - enum switchdev_obj_id id, void *obj, 4595 - int (*cb)(void *obj)) 4590 + struct switchdev_obj *obj, 4591 + switchdev_obj_dump_cb_t *cb) 4596 4592 { 4597 4593 const struct rocker_port *rocker_port = netdev_priv(dev); 4598 4594 int err = 0; 4599 4595 4600 - switch (id) { 4601 - case SWITCHDEV_OBJ_PORT_FDB: 4602 - err = rocker_port_fdb_dump(rocker_port, obj, cb); 4596 + switch (obj->id) { 4597 + case SWITCHDEV_OBJ_ID_PORT_FDB: 4598 + err = rocker_port_fdb_dump(rocker_port, 4599 + SWITCHDEV_OBJ_PORT_FDB(obj), cb); 4603 4600 break; 4604 - case SWITCHDEV_OBJ_PORT_VLAN: 4605 - err = rocker_port_vlan_dump(rocker_port, obj, cb); 4601 + case SWITCHDEV_OBJ_ID_PORT_VLAN: 4602 + err = rocker_port_vlan_dump(rocker_port, 4603 + SWITCHDEV_OBJ_PORT_VLAN(obj), cb); 4606 4604 break; 4607 4605 default: 4608 4606 err = -EOPNOTSUPP;
+45 -31
include/net/switchdev.h
··· 39 39 } 40 40 41 41 enum switchdev_attr_id { 42 - SWITCHDEV_ATTR_UNDEFINED, 43 - SWITCHDEV_ATTR_PORT_PARENT_ID, 44 - SWITCHDEV_ATTR_PORT_STP_STATE, 45 - SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS, 42 + SWITCHDEV_ATTR_ID_UNDEFINED, 43 + SWITCHDEV_ATTR_ID_PORT_PARENT_ID, 44 + SWITCHDEV_ATTR_ID_PORT_STP_STATE, 45 + SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, 46 46 }; 47 47 48 48 struct switchdev_attr { ··· 58 58 struct fib_info; 59 59 60 60 enum switchdev_obj_id { 61 - SWITCHDEV_OBJ_UNDEFINED, 62 - SWITCHDEV_OBJ_PORT_VLAN, 63 - SWITCHDEV_OBJ_IPV4_FIB, 64 - SWITCHDEV_OBJ_PORT_FDB, 61 + SWITCHDEV_OBJ_ID_UNDEFINED, 62 + SWITCHDEV_OBJ_ID_PORT_VLAN, 63 + SWITCHDEV_OBJ_ID_IPV4_FIB, 64 + SWITCHDEV_OBJ_ID_PORT_FDB, 65 65 }; 66 66 67 - /* SWITCHDEV_OBJ_PORT_VLAN */ 68 - struct switchdev_obj_vlan { 67 + struct switchdev_obj { 68 + enum switchdev_obj_id id; 69 + }; 70 + 71 + /* SWITCHDEV_OBJ_ID_PORT_VLAN */ 72 + struct switchdev_obj_port_vlan { 73 + struct switchdev_obj obj; 69 74 u16 flags; 70 75 u16 vid_begin; 71 76 u16 vid_end; 72 77 }; 73 78 74 - /* SWITCHDEV_OBJ_IPV4_FIB */ 79 + #define SWITCHDEV_OBJ_PORT_VLAN(obj) \ 80 + container_of(obj, struct switchdev_obj_port_vlan, obj) 81 + 82 + /* SWITCHDEV_OBJ_ID_IPV4_FIB */ 75 83 struct switchdev_obj_ipv4_fib { 84 + struct switchdev_obj obj; 76 85 u32 dst; 77 86 int dst_len; 78 87 struct fib_info *fi; ··· 91 82 u32 tb_id; 92 83 }; 93 84 94 - /* SWITCHDEV_OBJ_PORT_FDB */ 95 - struct switchdev_obj_fdb { 85 + #define SWITCHDEV_OBJ_IPV4_FIB(obj) \ 86 + container_of(obj, struct switchdev_obj_ipv4_fib, obj) 87 + 88 + /* SWITCHDEV_OBJ_ID_PORT_FDB */ 89 + struct switchdev_obj_port_fdb { 90 + struct switchdev_obj obj; 96 91 const unsigned char *addr; 97 92 u16 vid; 98 93 u16 ndm_state; 99 94 }; 100 95 96 + #define SWITCHDEV_OBJ_PORT_FDB(obj) \ 97 + container_of(obj, struct switchdev_obj_port_fdb, obj) 98 + 101 99 void switchdev_trans_item_enqueue(struct switchdev_trans *trans, 102 100 void *data, void (*destructor)(void const *), 103 101 struct switchdev_trans_item *tritem); 104 102 void *switchdev_trans_item_dequeue(struct switchdev_trans *trans); 103 + 104 + typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj); 105 105 106 106 /** 107 107 * struct switchdev_ops - switchdev operations ··· 132 114 struct switchdev_attr *attr, 133 115 struct switchdev_trans *trans); 134 116 int (*switchdev_port_obj_add)(struct net_device *dev, 135 - enum switchdev_obj_id id, 136 - const void *obj, 117 + const struct switchdev_obj *obj, 137 118 struct switchdev_trans *trans); 138 119 int (*switchdev_port_obj_del)(struct net_device *dev, 139 - enum switchdev_obj_id id, 140 - const void *obj); 120 + const struct switchdev_obj *obj); 141 121 int (*switchdev_port_obj_dump)(struct net_device *dev, 142 - enum switchdev_obj_id id, void *obj, 143 - int (*cb)(void *obj)); 122 + struct switchdev_obj *obj, 123 + switchdev_obj_dump_cb_t *cb); 144 124 }; 145 125 146 126 enum switchdev_notifier_type { ··· 168 152 struct switchdev_attr *attr); 169 153 int switchdev_port_attr_set(struct net_device *dev, 170 154 struct switchdev_attr *attr); 171 - int switchdev_port_obj_add(struct net_device *dev, enum switchdev_obj_id id, 172 - const void *obj); 173 - int switchdev_port_obj_del(struct net_device *dev, enum switchdev_obj_id id, 174 - const void *obj); 175 - int switchdev_port_obj_dump(struct net_device *dev, enum switchdev_obj_id id, 176 - void *obj, int (*cb)(void *obj)); 155 + int switchdev_port_obj_add(struct net_device *dev, 156 + const struct switchdev_obj *obj); 157 + int switchdev_port_obj_del(struct net_device *dev, 158 + const struct switchdev_obj *obj); 159 + int switchdev_port_obj_dump(struct net_device *dev, struct switchdev_obj *obj, 160 + switchdev_obj_dump_cb_t *cb); 177 161 int register_switchdev_notifier(struct notifier_block *nb); 178 162 int unregister_switchdev_notifier(struct notifier_block *nb); 179 163 int call_switchdev_notifiers(unsigned long val, struct net_device *dev, ··· 218 202 } 219 203 220 204 static inline int switchdev_port_obj_add(struct net_device *dev, 221 - enum switchdev_obj_id id, 222 - const void *obj) 205 + const struct switchdev_obj *obj) 223 206 { 224 207 return -EOPNOTSUPP; 225 208 } 226 209 227 210 static inline int switchdev_port_obj_del(struct net_device *dev, 228 - enum switchdev_obj_id id, 229 - const void *obj) 211 + const struct switchdev_obj *obj) 230 212 { 231 213 return -EOPNOTSUPP; 232 214 } 233 215 234 216 static inline int switchdev_port_obj_dump(struct net_device *dev, 235 - enum switchdev_obj_id id, void *obj, 236 - int (*cb)(void *obj)) 217 + const struct switchdev_obj *obj, 218 + switchdev_obj_dump_cb_t *cb) 237 219 { 238 220 return -EOPNOTSUPP; 239 221 }
+3 -2
net/bridge/br_fdb.c
··· 133 133 134 134 static void fdb_del_external_learn(struct net_bridge_fdb_entry *f) 135 135 { 136 - struct switchdev_obj_fdb fdb = { 136 + struct switchdev_obj_port_fdb fdb = { 137 + .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, 137 138 .addr = f->addr.addr, 138 139 .vid = f->vlan_id, 139 140 }; 140 141 141 - switchdev_port_obj_del(f->dst->dev, SWITCHDEV_OBJ_PORT_FDB, &fdb); 142 + switchdev_port_obj_del(f->dst->dev, &fdb.obj); 142 143 } 143 144 144 145 static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f)
+1 -1
net/bridge/br_stp.c
··· 40 40 void br_set_state(struct net_bridge_port *p, unsigned int state) 41 41 { 42 42 struct switchdev_attr attr = { 43 - .id = SWITCHDEV_ATTR_PORT_STP_STATE, 43 + .id = SWITCHDEV_ATTR_ID_PORT_STP_STATE, 44 44 .u.stp_state = state, 45 45 }; 46 46 int err;
+6 -4
net/bridge/br_vlan.c
··· 82 82 if (ops->ndo_vlan_rx_add_vid) { 83 83 err = vlan_vid_add(dev, br->vlan_proto, vid); 84 84 } else { 85 - struct switchdev_obj_vlan v = { 85 + struct switchdev_obj_port_vlan v = { 86 + .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, 86 87 .flags = flags, 87 88 .vid_begin = vid, 88 89 .vid_end = vid, 89 90 }; 90 91 91 - err = switchdev_port_obj_add(dev, SWITCHDEV_OBJ_PORT_VLAN, &v); 92 + err = switchdev_port_obj_add(dev, &v.obj); 92 93 if (err == -EOPNOTSUPP) 93 94 err = 0; 94 95 } ··· 132 131 if (ops->ndo_vlan_rx_kill_vid) { 133 132 vlan_vid_del(dev, br->vlan_proto, vid); 134 133 } else { 135 - struct switchdev_obj_vlan v = { 134 + struct switchdev_obj_port_vlan v = { 135 + .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, 136 136 .vid_begin = vid, 137 137 .vid_end = vid, 138 138 }; 139 139 140 - err = switchdev_port_obj_del(dev, SWITCHDEV_OBJ_PORT_VLAN, &v); 140 + err = switchdev_port_obj_del(dev, &v.obj); 141 141 if (err == -EOPNOTSUPP) 142 142 err = 0; 143 143 }
+1 -1
net/core/net-sysfs.c
··· 471 471 472 472 if (dev_isalive(netdev)) { 473 473 struct switchdev_attr attr = { 474 - .id = SWITCHDEV_ATTR_PORT_PARENT_ID, 474 + .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, 475 475 .flags = SWITCHDEV_F_NO_RECURSE, 476 476 }; 477 477
+1 -1
net/core/rtnetlink.c
··· 1025 1025 { 1026 1026 int err; 1027 1027 struct switchdev_attr attr = { 1028 - .id = SWITCHDEV_ATTR_PORT_PARENT_ID, 1028 + .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, 1029 1029 .flags = SWITCHDEV_F_NO_RECURSE, 1030 1030 }; 1031 1031
+41 -31
net/dsa/slave.c
··· 242 242 } 243 243 244 244 static int dsa_slave_port_vlan_add(struct net_device *dev, 245 - const struct switchdev_obj_vlan *vlan, 245 + const struct switchdev_obj_port_vlan *vlan, 246 246 struct switchdev_trans *trans) 247 247 { 248 248 struct dsa_slave_priv *p = netdev_priv(dev); ··· 278 278 } 279 279 280 280 static int dsa_slave_port_vlan_del(struct net_device *dev, 281 - const struct switchdev_obj_vlan *vlan) 281 + const struct switchdev_obj_port_vlan *vlan) 282 282 { 283 283 struct dsa_slave_priv *p = netdev_priv(dev); 284 284 struct dsa_switch *ds = p->parent; ··· 298 298 } 299 299 300 300 static int dsa_slave_port_vlan_dump(struct net_device *dev, 301 - struct switchdev_obj_vlan *vlan, 302 - int (*cb)(void *obj)) 301 + struct switchdev_obj_port_vlan *vlan, 302 + switchdev_obj_dump_cb_t *cb) 303 303 { 304 304 struct dsa_slave_priv *p = netdev_priv(dev); 305 305 struct dsa_switch *ds = p->parent; ··· 332 332 if (test_bit(p->port, untagged)) 333 333 vlan->flags |= BRIDGE_VLAN_INFO_UNTAGGED; 334 334 335 - err = cb(vlan); 335 + err = cb(&vlan->obj); 336 336 if (err) 337 337 break; 338 338 } ··· 341 341 } 342 342 343 343 static int dsa_slave_port_fdb_add(struct net_device *dev, 344 - const struct switchdev_obj_fdb *fdb, 344 + const struct switchdev_obj_port_fdb *fdb, 345 345 struct switchdev_trans *trans) 346 346 { 347 347 struct dsa_slave_priv *p = netdev_priv(dev); ··· 357 357 } 358 358 359 359 static int dsa_slave_port_fdb_del(struct net_device *dev, 360 - const struct switchdev_obj_fdb *fdb) 360 + const struct switchdev_obj_port_fdb *fdb) 361 361 { 362 362 struct dsa_slave_priv *p = netdev_priv(dev); 363 363 struct dsa_switch *ds = p->parent; ··· 370 370 } 371 371 372 372 static int dsa_slave_port_fdb_dump(struct net_device *dev, 373 - struct switchdev_obj_fdb *fdb, 374 - int (*cb)(void *obj)) 373 + struct switchdev_obj_port_fdb *fdb, 374 + switchdev_obj_dump_cb_t *cb) 375 375 { 376 376 struct dsa_slave_priv *p = netdev_priv(dev); 377 377 struct dsa_switch *ds = p->parent; ··· 394 394 fdb->vid = vid; 395 395 fdb->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE; 396 396 397 - ret = cb(fdb); 397 + ret = cb(&fdb->obj); 398 398 if (ret < 0) 399 399 break; 400 400 } ··· 458 458 int ret; 459 459 460 460 switch (attr->id) { 461 - case SWITCHDEV_ATTR_PORT_STP_STATE: 461 + case SWITCHDEV_ATTR_ID_PORT_STP_STATE: 462 462 if (switchdev_trans_ph_prepare(trans)) 463 463 ret = ds->drv->port_stp_update ? 0 : -EOPNOTSUPP; 464 464 else ··· 474 474 } 475 475 476 476 static int dsa_slave_port_obj_add(struct net_device *dev, 477 - enum switchdev_obj_id id, const void *obj, 477 + const struct switchdev_obj *obj, 478 478 struct switchdev_trans *trans) 479 479 { 480 480 int err; ··· 484 484 * supported, return -EOPNOTSUPP. 485 485 */ 486 486 487 - switch (id) { 488 - case SWITCHDEV_OBJ_PORT_FDB: 489 - err = dsa_slave_port_fdb_add(dev, obj, trans); 487 + switch (obj->id) { 488 + case SWITCHDEV_OBJ_ID_PORT_FDB: 489 + err = dsa_slave_port_fdb_add(dev, 490 + SWITCHDEV_OBJ_PORT_FDB(obj), 491 + trans); 490 492 break; 491 - case SWITCHDEV_OBJ_PORT_VLAN: 492 - err = dsa_slave_port_vlan_add(dev, obj, trans); 493 + case SWITCHDEV_OBJ_ID_PORT_VLAN: 494 + err = dsa_slave_port_vlan_add(dev, 495 + SWITCHDEV_OBJ_PORT_VLAN(obj), 496 + trans); 493 497 break; 494 498 default: 495 499 err = -EOPNOTSUPP; ··· 504 500 } 505 501 506 502 static int dsa_slave_port_obj_del(struct net_device *dev, 507 - enum switchdev_obj_id id, const void *obj) 503 + const struct switchdev_obj *obj) 508 504 { 509 505 int err; 510 506 511 - switch (id) { 512 - case SWITCHDEV_OBJ_PORT_FDB: 513 - err = dsa_slave_port_fdb_del(dev, obj); 507 + switch (obj->id) { 508 + case SWITCHDEV_OBJ_ID_PORT_FDB: 509 + err = dsa_slave_port_fdb_del(dev, 510 + SWITCHDEV_OBJ_PORT_FDB(obj)); 514 511 break; 515 - case SWITCHDEV_OBJ_PORT_VLAN: 516 - err = dsa_slave_port_vlan_del(dev, obj); 512 + case SWITCHDEV_OBJ_ID_PORT_VLAN: 513 + err = dsa_slave_port_vlan_del(dev, 514 + SWITCHDEV_OBJ_PORT_VLAN(obj)); 517 515 break; 518 516 default: 519 517 err = -EOPNOTSUPP; ··· 526 520 } 527 521 528 522 static int dsa_slave_port_obj_dump(struct net_device *dev, 529 - enum switchdev_obj_id id, void *obj, 530 - int (*cb)(void *obj)) 523 + struct switchdev_obj *obj, 524 + switchdev_obj_dump_cb_t *cb) 531 525 { 532 526 int err; 533 527 534 - switch (id) { 535 - case SWITCHDEV_OBJ_PORT_FDB: 536 - err = dsa_slave_port_fdb_dump(dev, obj, cb); 528 + switch (obj->id) { 529 + case SWITCHDEV_OBJ_ID_PORT_FDB: 530 + err = dsa_slave_port_fdb_dump(dev, 531 + SWITCHDEV_OBJ_PORT_FDB(obj), 532 + cb); 537 533 break; 538 - case SWITCHDEV_OBJ_PORT_VLAN: 539 - err = dsa_slave_port_vlan_dump(dev, obj, cb); 534 + case SWITCHDEV_OBJ_ID_PORT_VLAN: 535 + err = dsa_slave_port_vlan_dump(dev, 536 + SWITCHDEV_OBJ_PORT_VLAN(obj), 537 + cb); 540 538 break; 541 539 default: 542 540 err = -EOPNOTSUPP; ··· 594 584 struct dsa_switch *ds = p->parent; 595 585 596 586 switch (attr->id) { 597 - case SWITCHDEV_ATTR_PORT_PARENT_ID: 587 + case SWITCHDEV_ATTR_ID_PORT_PARENT_ID: 598 588 attr->u.ppid.id_len = sizeof(ds->index); 599 589 memcpy(&attr->u.ppid.id, &ds->index, attr->u.ppid.id_len); 600 590 break;
+49 -44
net/switchdev/switchdev.c
··· 104 104 struct net_device *lower_dev; 105 105 struct list_head *iter; 106 106 struct switchdev_attr first = { 107 - .id = SWITCHDEV_ATTR_UNDEFINED 107 + .id = SWITCHDEV_ATTR_ID_UNDEFINED 108 108 }; 109 109 int err = -EOPNOTSUPP; 110 110 ··· 124 124 err = switchdev_port_attr_get(lower_dev, attr); 125 125 if (err) 126 126 break; 127 - if (first.id == SWITCHDEV_ATTR_UNDEFINED) 127 + if (first.id == SWITCHDEV_ATTR_ID_UNDEFINED) 128 128 first = *attr; 129 129 else if (memcmp(&first, attr, sizeof(*attr))) 130 130 return -ENODATA; ··· 270 270 EXPORT_SYMBOL_GPL(switchdev_port_attr_set); 271 271 272 272 static int __switchdev_port_obj_add(struct net_device *dev, 273 - enum switchdev_obj_id id, const void *obj, 273 + const struct switchdev_obj *obj, 274 274 struct switchdev_trans *trans) 275 275 { 276 276 const struct switchdev_ops *ops = dev->switchdev_ops; ··· 279 279 int err = -EOPNOTSUPP; 280 280 281 281 if (ops && ops->switchdev_port_obj_add) 282 - return ops->switchdev_port_obj_add(dev, id, obj, trans); 282 + return ops->switchdev_port_obj_add(dev, obj, trans); 283 283 284 284 /* Switch device port(s) may be stacked under 285 285 * bond/team/vlan dev, so recurse down to add object on ··· 287 287 */ 288 288 289 289 netdev_for_each_lower_dev(dev, lower_dev, iter) { 290 - err = __switchdev_port_obj_add(lower_dev, id, obj, trans); 290 + err = __switchdev_port_obj_add(lower_dev, obj, trans); 291 291 if (err) 292 292 break; 293 293 } ··· 308 308 * 309 309 * rtnl_lock must be held. 310 310 */ 311 - int switchdev_port_obj_add(struct net_device *dev, enum switchdev_obj_id id, 312 - const void *obj) 311 + int switchdev_port_obj_add(struct net_device *dev, 312 + const struct switchdev_obj *obj) 313 313 { 314 314 struct switchdev_trans trans; 315 315 int err; ··· 326 326 */ 327 327 328 328 trans.ph_prepare = true; 329 - err = __switchdev_port_obj_add(dev, id, obj, &trans); 329 + err = __switchdev_port_obj_add(dev, obj, &trans); 330 330 if (err) { 331 331 /* Prepare phase failed: abort the transaction. Any 332 332 * resources reserved in the prepare phase are ··· 345 345 */ 346 346 347 347 trans.ph_prepare = false; 348 - err = __switchdev_port_obj_add(dev, id, obj, &trans); 349 - WARN(err, "%s: Commit of object (id=%d) failed.\n", dev->name, id); 348 + err = __switchdev_port_obj_add(dev, obj, &trans); 349 + WARN(err, "%s: Commit of object (id=%d) failed.\n", dev->name, obj->id); 350 350 switchdev_trans_items_warn_destroy(dev, &trans); 351 351 352 352 return err; ··· 360 360 * @id: object ID 361 361 * @obj: object to delete 362 362 */ 363 - int switchdev_port_obj_del(struct net_device *dev, enum switchdev_obj_id id, 364 - const void *obj) 363 + int switchdev_port_obj_del(struct net_device *dev, 364 + const struct switchdev_obj *obj) 365 365 { 366 366 const struct switchdev_ops *ops = dev->switchdev_ops; 367 367 struct net_device *lower_dev; ··· 369 369 int err = -EOPNOTSUPP; 370 370 371 371 if (ops && ops->switchdev_port_obj_del) 372 - return ops->switchdev_port_obj_del(dev, id, obj); 372 + return ops->switchdev_port_obj_del(dev, obj); 373 373 374 374 /* Switch device port(s) may be stacked under 375 375 * bond/team/vlan dev, so recurse down to delete object on ··· 377 377 */ 378 378 379 379 netdev_for_each_lower_dev(dev, lower_dev, iter) { 380 - err = switchdev_port_obj_del(lower_dev, id, obj); 380 + err = switchdev_port_obj_del(lower_dev, obj); 381 381 if (err) 382 382 break; 383 383 } ··· 394 394 * @obj: object to dump 395 395 * @cb: function to call with a filled object 396 396 */ 397 - int switchdev_port_obj_dump(struct net_device *dev, enum switchdev_obj_id id, 398 - void *obj, int (*cb)(void *obj)) 397 + int switchdev_port_obj_dump(struct net_device *dev, struct switchdev_obj *obj, 398 + switchdev_obj_dump_cb_t *cb) 399 399 { 400 400 const struct switchdev_ops *ops = dev->switchdev_ops; 401 401 struct net_device *lower_dev; ··· 403 403 int err = -EOPNOTSUPP; 404 404 405 405 if (ops && ops->switchdev_port_obj_dump) 406 - return ops->switchdev_port_obj_dump(dev, id, obj, cb); 406 + return ops->switchdev_port_obj_dump(dev, obj, cb); 407 407 408 408 /* Switch device port(s) may be stacked under 409 409 * bond/team/vlan dev, so recurse down to dump objects on ··· 411 411 */ 412 412 413 413 netdev_for_each_lower_dev(dev, lower_dev, iter) { 414 - err = switchdev_port_obj_dump(lower_dev, id, obj, cb); 414 + err = switchdev_port_obj_dump(lower_dev, obj, cb); 415 415 break; 416 416 } 417 417 ··· 483 483 EXPORT_SYMBOL_GPL(call_switchdev_notifiers); 484 484 485 485 struct switchdev_vlan_dump { 486 - struct switchdev_obj_vlan vlan; 486 + struct switchdev_obj_port_vlan vlan; 487 487 struct sk_buff *skb; 488 488 u32 filter_mask; 489 489 u16 flags; ··· 521 521 return 0; 522 522 } 523 523 524 - static int switchdev_port_vlan_dump_cb(void *obj) 524 + static int switchdev_port_vlan_dump_cb(struct switchdev_obj *obj) 525 525 { 526 - struct switchdev_obj_vlan *vlan = obj; 526 + struct switchdev_obj_port_vlan *vlan = SWITCHDEV_OBJ_PORT_VLAN(obj); 527 527 struct switchdev_vlan_dump *dump = 528 528 container_of(vlan, struct switchdev_vlan_dump, vlan); 529 529 int err = 0; ··· 577 577 u32 filter_mask) 578 578 { 579 579 struct switchdev_vlan_dump dump = { 580 + .vlan.obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, 580 581 .skb = skb, 581 582 .filter_mask = filter_mask, 582 583 }; ··· 585 584 586 585 if ((filter_mask & RTEXT_FILTER_BRVLAN) || 587 586 (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)) { 588 - err = switchdev_port_obj_dump(dev, SWITCHDEV_OBJ_PORT_VLAN, 589 - &dump.vlan, 587 + err = switchdev_port_obj_dump(dev, &dump.vlan.obj, 590 588 switchdev_port_vlan_dump_cb); 591 589 if (err) 592 590 goto err_out; ··· 611 611 int nlflags) 612 612 { 613 613 struct switchdev_attr attr = { 614 - .id = SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS, 614 + .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, 615 615 }; 616 616 u16 mode = BRIDGE_MODE_UNDEF; 617 617 u32 mask = BR_LEARNING | BR_LEARNING_SYNC; ··· 632 632 unsigned long brport_flag) 633 633 { 634 634 struct switchdev_attr attr = { 635 - .id = SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS, 635 + .id = SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, 636 636 }; 637 637 u8 flag = nla_get_u8(nlattr); 638 638 int err; ··· 699 699 static int switchdev_port_br_afspec(struct net_device *dev, 700 700 struct nlattr *afspec, 701 701 int (*f)(struct net_device *dev, 702 - enum switchdev_obj_id id, 703 - const void *obj)) 702 + const struct switchdev_obj *obj)) 704 703 { 705 704 struct nlattr *attr; 706 705 struct bridge_vlan_info *vinfo; 707 - struct switchdev_obj_vlan vlan = { 0 }; 706 + struct switchdev_obj_port_vlan vlan = { 707 + .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN, 708 + }; 708 709 int rem; 709 710 int err; 710 711 ··· 726 725 vlan.vid_end = vinfo->vid; 727 726 if (vlan.vid_end <= vlan.vid_begin) 728 727 return -EINVAL; 729 - err = f(dev, SWITCHDEV_OBJ_PORT_VLAN, &vlan); 728 + err = f(dev, &vlan.obj); 730 729 if (err) 731 730 return err; 732 731 memset(&vlan, 0, sizeof(vlan)); ··· 735 734 return -EINVAL; 736 735 vlan.vid_begin = vinfo->vid; 737 736 vlan.vid_end = vinfo->vid; 738 - err = f(dev, SWITCHDEV_OBJ_PORT_VLAN, &vlan); 737 + err = f(dev, &vlan.obj); 739 738 if (err) 740 739 return err; 741 740 memset(&vlan, 0, sizeof(vlan)); ··· 820 819 struct net_device *dev, const unsigned char *addr, 821 820 u16 vid, u16 nlm_flags) 822 821 { 823 - struct switchdev_obj_fdb fdb = { 822 + struct switchdev_obj_port_fdb fdb = { 823 + .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, 824 824 .addr = addr, 825 825 .vid = vid, 826 826 }; 827 827 828 - return switchdev_port_obj_add(dev, SWITCHDEV_OBJ_PORT_FDB, &fdb); 828 + return switchdev_port_obj_add(dev, &fdb.obj); 829 829 } 830 830 EXPORT_SYMBOL_GPL(switchdev_port_fdb_add); 831 831 ··· 845 843 struct net_device *dev, const unsigned char *addr, 846 844 u16 vid) 847 845 { 848 - struct switchdev_obj_fdb fdb = { 846 + struct switchdev_obj_port_fdb fdb = { 847 + .obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, 849 848 .addr = addr, 850 849 .vid = vid, 851 850 }; 852 851 853 - return switchdev_port_obj_del(dev, SWITCHDEV_OBJ_PORT_FDB, &fdb); 852 + return switchdev_port_obj_del(dev, &fdb.obj); 854 853 } 855 854 EXPORT_SYMBOL_GPL(switchdev_port_fdb_del); 856 855 857 856 struct switchdev_fdb_dump { 858 - struct switchdev_obj_fdb fdb; 857 + struct switchdev_obj_port_fdb fdb; 859 858 struct net_device *dev; 860 859 struct sk_buff *skb; 861 860 struct netlink_callback *cb; 862 861 int idx; 863 862 }; 864 863 865 - static int switchdev_port_fdb_dump_cb(void *obj) 864 + static int switchdev_port_fdb_dump_cb(struct switchdev_obj *obj) 866 865 { 867 - struct switchdev_obj_fdb *fdb = obj; 866 + struct switchdev_obj_port_fdb *fdb = SWITCHDEV_OBJ_PORT_FDB(obj); 868 867 struct switchdev_fdb_dump *dump = 869 868 container_of(fdb, struct switchdev_fdb_dump, fdb); 870 869 u32 portid = NETLINK_CB(dump->cb->skb).portid; ··· 923 920 struct net_device *filter_dev, int idx) 924 921 { 925 922 struct switchdev_fdb_dump dump = { 923 + .fdb.obj.id = SWITCHDEV_OBJ_ID_PORT_FDB, 926 924 .dev = dev, 927 925 .skb = skb, 928 926 .cb = cb, 929 927 .idx = idx, 930 928 }; 931 929 932 - switchdev_port_obj_dump(dev, SWITCHDEV_OBJ_PORT_FDB, &dump.fdb, 933 - switchdev_port_fdb_dump_cb); 930 + switchdev_port_obj_dump(dev, &dump.fdb.obj, switchdev_port_fdb_dump_cb); 934 931 return dump.idx; 935 932 } 936 933 EXPORT_SYMBOL_GPL(switchdev_port_fdb_dump); ··· 961 958 static struct net_device *switchdev_get_dev_by_nhs(struct fib_info *fi) 962 959 { 963 960 struct switchdev_attr attr = { 964 - .id = SWITCHDEV_ATTR_PORT_PARENT_ID, 961 + .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, 965 962 }; 966 963 struct switchdev_attr prev_attr; 967 964 struct net_device *dev = NULL; ··· 1009 1006 u8 tos, u8 type, u32 nlflags, u32 tb_id) 1010 1007 { 1011 1008 struct switchdev_obj_ipv4_fib ipv4_fib = { 1009 + .obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB, 1012 1010 .dst = dst, 1013 1011 .dst_len = dst_len, 1014 1012 .fi = fi, ··· 1037 1033 if (!dev) 1038 1034 return 0; 1039 1035 1040 - err = switchdev_port_obj_add(dev, SWITCHDEV_OBJ_IPV4_FIB, &ipv4_fib); 1036 + err = switchdev_port_obj_add(dev, &ipv4_fib.obj); 1041 1037 if (!err) 1042 1038 fi->fib_flags |= RTNH_F_OFFLOAD; 1043 1039 ··· 1061 1057 u8 tos, u8 type, u32 tb_id) 1062 1058 { 1063 1059 struct switchdev_obj_ipv4_fib ipv4_fib = { 1060 + .obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB, 1064 1061 .dst = dst, 1065 1062 .dst_len = dst_len, 1066 1063 .fi = fi, ··· 1080 1075 if (!dev) 1081 1076 return 0; 1082 1077 1083 - err = switchdev_port_obj_del(dev, SWITCHDEV_OBJ_IPV4_FIB, &ipv4_fib); 1078 + err = switchdev_port_obj_del(dev, &ipv4_fib.obj); 1084 1079 if (!err) 1085 1080 fi->fib_flags &= ~RTNH_F_OFFLOAD; 1086 1081 ··· 1112 1107 struct net_device *b) 1113 1108 { 1114 1109 struct switchdev_attr a_attr = { 1115 - .id = SWITCHDEV_ATTR_PORT_PARENT_ID, 1110 + .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, 1116 1111 .flags = SWITCHDEV_F_NO_RECURSE, 1117 1112 }; 1118 1113 struct switchdev_attr b_attr = { 1119 - .id = SWITCHDEV_ATTR_PORT_PARENT_ID, 1114 + .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID, 1120 1115 .flags = SWITCHDEV_F_NO_RECURSE, 1121 1116 }; 1122 1117