Skip to content

Commit bd8762b

Browse files
committed
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 <[email protected]>
2 parents c3fc7ac + 9e8f4a5 commit bd8762b

File tree

11 files changed

+199
-160
lines changed

11 files changed

+199
-160
lines changed

Documentation/networking/switchdev.txt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ Switch ID
115115
^^^^^^^^^
116116

117117
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
119119
physical ID for each port of a switch. The ID must be unique between switches
120120
on the same system. The ID does not need to be unique between switches on
121121
different systems.
@@ -178,7 +178,7 @@ entries are installed, for example, using iproute2 bridge cmd:
178178
bridge fdb add ADDR dev DEV [vlan VID] [self]
179179

180180
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
182182
switchdev_port_obj_xxx ops.
183183

184184
XXX: what should be done if offloading this rule to hardware fails (for
@@ -233,8 +233,9 @@ the bridge's FDB. It's possible, but not optimal, to enable learning on the
233233
device port and on the bridge port, and disable learning_sync.
234234

235235
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.
238239

239240
FDB Ageing
240241
^^^^^^^^^^
@@ -260,7 +261,7 @@ STP State Change on Port
260261
Internally or with a third-party STP protocol implementation (e.g. mstpd), the
261262
bridge driver maintains the STP state for ports, and will notify the switch
262263
driver of STP state change on a port using the switchdev op
263-
switchdev_attr_port_set for SWITCHDEV_ATTR_PORT_STP_UPDATE.
264+
switchdev_attr_port_set for SWITCHDEV_ATTR_PORT_ID_STP_UPDATE.
264265

265266
State is one of BR_STATE_*. The switch driver can use STP state updates to
266267
update ingress packet filter list for the port. For example, if port is
@@ -316,9 +317,9 @@ SWITCHDEV_OBJ_IPV[4|6]_FIB object using switchdev_port_obj_xxx ops.
316317
switchdev_port_obj_add is used for both adding a new FIB entry to the device,
317318
or modifying an existing entry on the device.
318319

319-
XXX: Currently, only SWITCHDEV_OBJ_IPV4_FIB objects are supported.
320+
XXX: Currently, only SWITCHDEV_OBJ_ID_IPV4_FIB objects are supported.
320321

321-
SWITCHDEV_OBJ_IPV4_FIB object passes:
322+
SWITCHDEV_OBJ_ID_IPV4_FIB object passes:
322323

323324
struct switchdev_obj_ipv4_fib { /* IPV4_FIB */
324325
u32 dst;

drivers/net/ethernet/mellanox/mlxsw/switchx2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,7 @@ static int mlxsw_sx_port_attr_get(struct net_device *dev,
868868
struct mlxsw_sx *mlxsw_sx = mlxsw_sx_port->mlxsw_sx;
869869

870870
switch (attr->id) {
871-
case SWITCHDEV_ATTR_PORT_PARENT_ID:
871+
case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
872872
attr->u.ppid.id_len = sizeof(mlxsw_sx->hw_id);
873873
memcpy(&attr->u.ppid.id, &mlxsw_sx->hw_id, attr->u.ppid.id_len);
874874
break;

drivers/net/ethernet/rocker/rocker.c

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4329,11 +4329,11 @@ static int rocker_port_attr_get(struct net_device *dev,
43294329
const struct rocker *rocker = rocker_port->rocker;
43304330

43314331
switch (attr->id) {
4332-
case SWITCHDEV_ATTR_PORT_PARENT_ID:
4332+
case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
43334333
attr->u.ppid.id_len = sizeof(rocker->hw.id);
43344334
memcpy(&attr->u.ppid.id, &rocker->hw.id, attr->u.ppid.id_len);
43354335
break;
4336-
case SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS:
4336+
case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
43374337
attr->u.brport_flags = rocker_port->brport_flags;
43384338
break;
43394339
default:
@@ -4369,12 +4369,12 @@ static int rocker_port_attr_set(struct net_device *dev,
43694369
int err = 0;
43704370

43714371
switch (attr->id) {
4372-
case SWITCHDEV_ATTR_PORT_STP_STATE:
4372+
case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
43734373
err = rocker_port_stp_update(rocker_port, trans,
43744374
ROCKER_OP_FLAG_NOWAIT,
43754375
attr->u.stp_state);
43764376
break;
4377-
case SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS:
4377+
case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
43784378
err = rocker_port_brport_flags_set(rocker_port, trans,
43794379
attr->u.brport_flags);
43804380
break;
@@ -4408,7 +4408,7 @@ static int rocker_port_vlan_add(struct rocker_port *rocker_port,
44084408

44094409
static int rocker_port_vlans_add(struct rocker_port *rocker_port,
44104410
struct switchdev_trans *trans,
4411-
const struct switchdev_obj_vlan *vlan)
4411+
const struct switchdev_obj_port_vlan *vlan)
44124412
{
44134413
u16 vid;
44144414
int err;
@@ -4425,7 +4425,7 @@ static int rocker_port_vlans_add(struct rocker_port *rocker_port,
44254425

44264426
static int rocker_port_fdb_add(struct rocker_port *rocker_port,
44274427
struct switchdev_trans *trans,
4428-
const struct switchdev_obj_fdb *fdb)
4428+
const struct switchdev_obj_port_fdb *fdb)
44294429
{
44304430
__be16 vlan_id = rocker_port_vid_to_vlan(rocker_port, fdb->vid, NULL);
44314431
int flags = 0;
@@ -4437,25 +4437,27 @@ static int rocker_port_fdb_add(struct rocker_port *rocker_port,
44374437
}
44384438

44394439
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,
44414441
struct switchdev_trans *trans)
44424442
{
44434443
struct rocker_port *rocker_port = netdev_priv(dev);
44444444
const struct switchdev_obj_ipv4_fib *fib4;
44454445
int err = 0;
44464446

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));
44504451
break;
4451-
case SWITCHDEV_OBJ_IPV4_FIB:
4452-
fib4 = obj;
4452+
case SWITCHDEV_OBJ_ID_IPV4_FIB:
4453+
fib4 = SWITCHDEV_OBJ_IPV4_FIB(obj);
44534454
err = rocker_port_fib_ipv4(rocker_port, trans,
44544455
htonl(fib4->dst), fib4->dst_len,
44554456
fib4->fi, fib4->tb_id, 0);
44564457
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));
44594461
break;
44604462
default:
44614463
err = -EOPNOTSUPP;
@@ -4480,7 +4482,7 @@ static int rocker_port_vlan_del(struct rocker_port *rocker_port,
44804482
}
44814483

44824484
static int rocker_port_vlans_del(struct rocker_port *rocker_port,
4483-
const struct switchdev_obj_vlan *vlan)
4485+
const struct switchdev_obj_port_vlan *vlan)
44844486
{
44854487
u16 vid;
44864488
int err;
@@ -4496,7 +4498,7 @@ static int rocker_port_vlans_del(struct rocker_port *rocker_port,
44964498

44974499
static int rocker_port_fdb_del(struct rocker_port *rocker_port,
44984500
struct switchdev_trans *trans,
4499-
const struct switchdev_obj_fdb *fdb)
4501+
const struct switchdev_obj_port_fdb *fdb)
45004502
{
45014503
__be16 vlan_id = rocker_port_vid_to_vlan(rocker_port, fdb->vid, NULL);
45024504
int flags = ROCKER_OP_FLAG_NOWAIT | ROCKER_OP_FLAG_REMOVE;
@@ -4508,25 +4510,27 @@ static int rocker_port_fdb_del(struct rocker_port *rocker_port,
45084510
}
45094511

45104512
static int rocker_port_obj_del(struct net_device *dev,
4511-
enum switchdev_obj_id id, const void *obj)
4513+
const struct switchdev_obj *obj)
45124514
{
45134515
struct rocker_port *rocker_port = netdev_priv(dev);
45144516
const struct switchdev_obj_ipv4_fib *fib4;
45154517
int err = 0;
45164518

4517-
switch (id) {
4518-
case SWITCHDEV_OBJ_PORT_VLAN:
4519-
err = rocker_port_vlans_del(rocker_port, obj);
4519+
switch (obj->id) {
4520+
case SWITCHDEV_OBJ_ID_PORT_VLAN:
4521+
err = rocker_port_vlans_del(rocker_port,
4522+
SWITCHDEV_OBJ_PORT_VLAN(obj));
45204523
break;
4521-
case SWITCHDEV_OBJ_IPV4_FIB:
4522-
fib4 = obj;
4524+
case SWITCHDEV_OBJ_ID_IPV4_FIB:
4525+
fib4 = SWITCHDEV_OBJ_IPV4_FIB(obj);
45234526
err = rocker_port_fib_ipv4(rocker_port, NULL,
45244527
htonl(fib4->dst), fib4->dst_len,
45254528
fib4->fi, fib4->tb_id,
45264529
ROCKER_OP_FLAG_REMOVE);
45274530
break;
4528-
case SWITCHDEV_OBJ_PORT_FDB:
4529-
err = rocker_port_fdb_del(rocker_port, NULL, obj);
4531+
case SWITCHDEV_OBJ_ID_PORT_FDB:
4532+
err = rocker_port_fdb_del(rocker_port, NULL,
4533+
SWITCHDEV_OBJ_PORT_FDB(obj));
45304534
break;
45314535
default:
45324536
err = -EOPNOTSUPP;
@@ -4537,8 +4541,8 @@ static int rocker_port_obj_del(struct net_device *dev,
45374541
}
45384542

45394543
static int rocker_port_fdb_dump(const struct rocker_port *rocker_port,
4540-
struct switchdev_obj_fdb *fdb,
4541-
int (*cb)(void *obj))
4544+
struct switchdev_obj_port_fdb *fdb,
4545+
switchdev_obj_dump_cb_t *cb)
45424546
{
45434547
struct rocker *rocker = rocker_port->rocker;
45444548
struct rocker_fdb_tbl_entry *found;
@@ -4555,7 +4559,7 @@ static int rocker_port_fdb_dump(const struct rocker_port *rocker_port,
45554559
fdb->ndm_state = NUD_REACHABLE;
45564560
fdb->vid = rocker_port_vlan_to_vid(rocker_port,
45574561
found->key.vlan_id);
4558-
err = cb(fdb);
4562+
err = cb(&fdb->obj);
45594563
if (err)
45604564
break;
45614565
}
@@ -4565,8 +4569,8 @@ static int rocker_port_fdb_dump(const struct rocker_port *rocker_port,
45654569
}
45664570

45674571
static int rocker_port_vlan_dump(const struct rocker_port *rocker_port,
4568-
struct switchdev_obj_vlan *vlan,
4569-
int (*cb)(void *obj))
4572+
struct switchdev_obj_port_vlan *vlan,
4573+
switchdev_obj_dump_cb_t *cb)
45704574
{
45714575
u16 vid;
45724576
int err = 0;
@@ -4578,7 +4582,7 @@ static int rocker_port_vlan_dump(const struct rocker_port *rocker_port,
45784582
if (rocker_vlan_id_is_internal(htons(vid)))
45794583
vlan->flags |= BRIDGE_VLAN_INFO_PVID;
45804584
vlan->vid_begin = vlan->vid_end = vid;
4581-
err = cb(vlan);
4585+
err = cb(&vlan->obj);
45824586
if (err)
45834587
break;
45844588
}
@@ -4587,18 +4591,20 @@ static int rocker_port_vlan_dump(const struct rocker_port *rocker_port,
45874591
}
45884592

45894593
static int rocker_port_obj_dump(struct net_device *dev,
4590-
enum switchdev_obj_id id, void *obj,
4591-
int (*cb)(void *obj))
4594+
struct switchdev_obj *obj,
4595+
switchdev_obj_dump_cb_t *cb)
45924596
{
45934597
const struct rocker_port *rocker_port = netdev_priv(dev);
45944598
int err = 0;
45954599

4596-
switch (id) {
4597-
case SWITCHDEV_OBJ_PORT_FDB:
4598-
err = rocker_port_fdb_dump(rocker_port, obj, cb);
4600+
switch (obj->id) {
4601+
case SWITCHDEV_OBJ_ID_PORT_FDB:
4602+
err = rocker_port_fdb_dump(rocker_port,
4603+
SWITCHDEV_OBJ_PORT_FDB(obj), cb);
45994604
break;
4600-
case SWITCHDEV_OBJ_PORT_VLAN:
4601-
err = rocker_port_vlan_dump(rocker_port, obj, cb);
4605+
case SWITCHDEV_OBJ_ID_PORT_VLAN:
4606+
err = rocker_port_vlan_dump(rocker_port,
4607+
SWITCHDEV_OBJ_PORT_VLAN(obj), cb);
46024608
break;
46034609
default:
46044610
err = -EOPNOTSUPP;

0 commit comments

Comments
 (0)