switchdev: don't use anonymous union on switchdev attr/obj structs
Older gcc versions (e.g. gcc version 4.4.6) don't like anonymous unions
which was causing build issues on the newly added switchdev attr/obj
structs. Fix this by using named union on structs.
Signed-off-by: Scott Feldman <sfeldma@gmail.com>
Reported-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c
index ca53393..f0a9cb4 100644
--- a/drivers/net/ethernet/rocker/rocker.c
+++ b/drivers/net/ethernet/rocker/rocker.c
@@ -4339,11 +4339,11 @@
switch (attr->id) {
case SWITCHDEV_ATTR_PORT_PARENT_ID:
- attr->ppid.id_len = sizeof(rocker->hw.id);
- memcpy(&attr->ppid.id, &rocker->hw.id, attr->ppid.id_len);
+ attr->u.ppid.id_len = sizeof(rocker->hw.id);
+ memcpy(&attr->u.ppid.id, &rocker->hw.id, attr->u.ppid.id_len);
break;
case SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS:
- attr->brport_flags = rocker_port->brport_flags;
+ attr->u.brport_flags = rocker_port->brport_flags;
break;
default:
return -EOPNOTSUPP;
@@ -4400,11 +4400,11 @@
switch (attr->id) {
case SWITCHDEV_ATTR_PORT_STP_STATE:
err = rocker_port_stp_update(rocker_port, attr->trans,
- attr->stp_state);
+ attr->u.stp_state);
break;
case SWITCHDEV_ATTR_PORT_BRIDGE_FLAGS:
err = rocker_port_brport_flags_set(rocker_port, attr->trans,
- attr->brport_flags);
+ attr->u.brport_flags);
break;
default:
err = -EOPNOTSUPP;
@@ -4466,10 +4466,10 @@
switch (obj->id) {
case SWITCHDEV_OBJ_PORT_VLAN:
err = rocker_port_vlans_add(rocker_port, obj->trans,
- &obj->vlan);
+ &obj->u.vlan);
break;
case SWITCHDEV_OBJ_IPV4_FIB:
- fib4 = &obj->ipv4_fib;
+ fib4 = &obj->u.ipv4_fib;
err = rocker_port_fib_ipv4(rocker_port, obj->trans,
htonl(fib4->dst), fib4->dst_len,
fib4->fi, fib4->tb_id, 0);
@@ -4520,10 +4520,10 @@
switch (obj->id) {
case SWITCHDEV_OBJ_PORT_VLAN:
- err = rocker_port_vlans_del(rocker_port, &obj->vlan);
+ err = rocker_port_vlans_del(rocker_port, &obj->u.vlan);
break;
case SWITCHDEV_OBJ_IPV4_FIB:
- fib4 = &obj->ipv4_fib;
+ fib4 = &obj->u.ipv4_fib;
err = rocker_port_fib_ipv4(rocker_port, SWITCHDEV_TRANS_NONE,
htonl(fib4->dst), fib4->dst_len,
fib4->fi, fib4->tb_id,
diff --git a/include/net/switchdev.h b/include/net/switchdev.h
index 9f9a7cc5..ea5b1c2 100644
--- a/include/net/switchdev.h
+++ b/include/net/switchdev.h
@@ -38,7 +38,7 @@
struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */
u8 stp_state; /* PORT_STP_STATE */
unsigned long brport_flags; /* PORT_BRIDGE_FLAGS */
- };
+ } u;
};
struct fib_info;
@@ -67,7 +67,7 @@
u32 nlflags;
u32 tb_id;
} ipv4_fib;
- };
+ } u;
};
/**
diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c
index b9300da..45f1ff1 100644
--- a/net/bridge/br_stp.c
+++ b/net/bridge/br_stp.c
@@ -41,7 +41,7 @@
{
struct switchdev_attr attr = {
.id = SWITCHDEV_ATTR_PORT_STP_STATE,
- .stp_state = state,
+ .u.stp_state = state,
};
int err;
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 5a9ce96..18b34d7 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -465,8 +465,8 @@
ret = switchdev_port_attr_get(netdev, &attr);
if (!ret)
- ret = sprintf(buf, "%*phN\n", attr.ppid.id_len,
- attr.ppid.id);
+ ret = sprintf(buf, "%*phN\n", attr.u.ppid.id_len,
+ attr.u.ppid.id);
}
rtnl_unlock();
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index c6c6b2c..141ccc3 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1016,7 +1016,8 @@
return err;
}
- if (nla_put(skb, IFLA_PHYS_SWITCH_ID, attr.ppid.id_len, attr.ppid.id))
+ if (nla_put(skb, IFLA_PHYS_SWITCH_ID, attr.u.ppid.id_len,
+ attr.u.ppid.id))
return -EMSGSIZE;
return 0;
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 3fb5210..04ffad3 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -353,7 +353,7 @@
switch (attr->id) {
case SWITCHDEV_ATTR_PORT_STP_STATE:
if (attr->trans == SWITCHDEV_TRANS_COMMIT)
- ret = dsa_slave_stp_update(dev, attr->stp_state);
+ ret = dsa_slave_stp_update(dev, attr->u.stp_state);
break;
default:
ret = -EOPNOTSUPP;
@@ -408,8 +408,8 @@
switch (attr->id) {
case SWITCHDEV_ATTR_PORT_PARENT_ID:
- attr->ppid.id_len = sizeof(ds->index);
- memcpy(&attr->ppid.id, &ds->index, attr->ppid.id_len);
+ attr->u.ppid.id_len = sizeof(ds->index);
+ memcpy(&attr->u.ppid.id, &ds->index, attr->u.ppid.id_len);
break;
default:
return -EOPNOTSUPP;
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c
index 77f1b6e..0409f9b 100644
--- a/net/switchdev/switchdev.c
+++ b/net/switchdev/switchdev.c
@@ -383,7 +383,7 @@
return err;
return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode,
- attr.brport_flags, mask, nlflags);
+ attr.u.brport_flags, mask, nlflags);
}
EXPORT_SYMBOL_GPL(switchdev_port_bridge_getlink);
@@ -402,9 +402,9 @@
return err;
if (flag)
- attr.brport_flags |= brport_flag;
+ attr.u.brport_flags |= brport_flag;
else
- attr.brport_flags &= ~brport_flag;
+ attr.u.brport_flags &= ~brport_flag;
return switchdev_port_attr_set(dev, &attr);
}
@@ -466,6 +466,7 @@
struct switchdev_obj obj = {
.id = SWITCHDEV_OBJ_PORT_VLAN,
};
+ struct switchdev_obj_vlan *vlan = &obj.u.vlan;
int rem;
int err;
@@ -475,30 +476,30 @@
if (nla_len(attr) != sizeof(struct bridge_vlan_info))
return -EINVAL;
vinfo = nla_data(attr);
- obj.vlan.flags = vinfo->flags;
+ vlan->flags = vinfo->flags;
if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) {
- if (obj.vlan.vid_start)
+ if (vlan->vid_start)
return -EINVAL;
- obj.vlan.vid_start = vinfo->vid;
+ vlan->vid_start = vinfo->vid;
} else if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_END) {
- if (!obj.vlan.vid_start)
+ if (!vlan->vid_start)
return -EINVAL;
- obj.vlan.vid_end = vinfo->vid;
- if (obj.vlan.vid_end <= obj.vlan.vid_start)
+ vlan->vid_end = vinfo->vid;
+ if (vlan->vid_end <= vlan->vid_start)
return -EINVAL;
err = f(dev, &obj);
if (err)
return err;
- memset(&obj.vlan, 0, sizeof(obj.vlan));
+ memset(vlan, 0, sizeof(*vlan));
} else {
- if (obj.vlan.vid_start)
+ if (vlan->vid_start)
return -EINVAL;
- obj.vlan.vid_start = vinfo->vid;
- obj.vlan.vid_end = vinfo->vid;
+ vlan->vid_start = vinfo->vid;
+ vlan->vid_end = vinfo->vid;
err = f(dev, &obj);
if (err)
return err;
- memset(&obj.vlan, 0, sizeof(obj.vlan));
+ memset(vlan, 0, sizeof(*vlan));
}
}
@@ -613,10 +614,10 @@
return NULL;
if (nhsel > 0) {
- if (prev_attr.ppid.id_len != attr.ppid.id_len)
+ if (prev_attr.u.ppid.id_len != attr.u.ppid.id_len)
return NULL;
- if (memcmp(prev_attr.ppid.id, attr.ppid.id,
- attr.ppid.id_len))
+ if (memcmp(prev_attr.u.ppid.id, attr.u.ppid.id,
+ attr.u.ppid.id_len))
return NULL;
}
@@ -644,7 +645,7 @@
{
struct switchdev_obj fib_obj = {
.id = SWITCHDEV_OBJ_IPV4_FIB,
- .ipv4_fib = {
+ .u.ipv4_fib = {
.dst = dst,
.dst_len = dst_len,
.fi = fi,
@@ -698,7 +699,7 @@
{
struct switchdev_obj fib_obj = {
.id = SWITCHDEV_OBJ_IPV4_FIB,
- .ipv4_fib = {
+ .u.ipv4_fib = {
.dst = dst,
.dst_len = dst_len,
.fi = fi,